TestWriteSingleFrameCompressed verifies that Conn.Write sends compressed messages in a single frame instead of multiple frames, and that messages below the flateThreshold are sent uncompressed. This is a regression test for https://github.com/coder/websocket/issues/435
(t *testing.T)
| 69 | // below the flateThreshold are sent uncompressed. |
| 70 | // This is a regression test for https://github.com/coder/websocket/issues/435 |
| 71 | func TestWriteSingleFrameCompressed(t *testing.T) { |
| 72 | t.Parallel() |
| 73 | |
| 74 | var ( |
| 75 | flateThreshold = 64 |
| 76 | |
| 77 | largeMsg = []byte(strings.Repeat("hello world ", 100)) |
| 78 | smallMsg = []byte("small message") |
| 79 | ) |
| 80 | |
| 81 | testCases := []struct { |
| 82 | name string |
| 83 | mode CompressionMode |
| 84 | msg []byte |
| 85 | wantRsv1 bool // true = compressed, false = uncompressed |
| 86 | }{ |
| 87 | {"ContextTakeover/AboveThreshold", CompressionContextTakeover, largeMsg, true}, |
| 88 | {"NoContextTakeover/AboveThreshold", CompressionNoContextTakeover, largeMsg, true}, |
| 89 | {"ContextTakeover/BelowThreshold", CompressionContextTakeover, smallMsg, false}, |
| 90 | {"NoContextTakeover/BelowThreshold", CompressionNoContextTakeover, smallMsg, false}, |
| 91 | } |
| 92 | |
| 93 | for _, tc := range testCases { |
| 94 | t.Run(tc.name, func(t *testing.T) { |
| 95 | t.Parallel() |
| 96 | |
| 97 | clientConn, serverConn := net.Pipe() |
| 98 | defer clientConn.Close() |
| 99 | defer serverConn.Close() |
| 100 | |
| 101 | c := newConn(connConfig{ |
| 102 | rwc: clientConn, |
| 103 | client: true, |
| 104 | copts: tc.mode.opts(), |
| 105 | flateThreshold: flateThreshold, |
| 106 | br: bufio.NewReader(clientConn), |
| 107 | bw: bufio.NewWriterSize(clientConn, 4096), |
| 108 | }) |
| 109 | |
| 110 | ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100) |
| 111 | defer cancel() |
| 112 | |
| 113 | writeDone := make(chan error, 1) |
| 114 | go func() { |
| 115 | writeDone <- c.Write(ctx, MessageText, tc.msg) |
| 116 | }() |
| 117 | |
| 118 | reader := bufio.NewReader(serverConn) |
| 119 | readBuf := make([]byte, 8) |
| 120 | |
| 121 | h, err := readFrameHeader(reader, readBuf) |
| 122 | assert.Success(t, err) |
| 123 | |
| 124 | _, err = io.CopyN(io.Discard, reader, h.payloadLength) |
| 125 | assert.Success(t, err) |
| 126 | |
| 127 | assert.Equal(t, "opcode", opText, h.opcode) |
| 128 | assert.Equal(t, "rsv1 (compressed)", tc.wantRsv1, h.rsv1) |
nothing calls this directly
no test coverage detected
searching dependent graphs…