mirror of https://github.com/gorilla/websocket
Mirror of https://github.com/gorilla/websocket
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.1 KiB
82 lines
2.1 KiB
// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package websocket |
|
|
|
import ( |
|
"bytes" |
|
"compress/flate" |
|
"math/rand" |
|
"testing" |
|
) |
|
|
|
var preparedMessageTests = []struct { |
|
messageType int |
|
isServer bool |
|
enableWriteCompression bool |
|
compressionLevel int |
|
}{ |
|
// Server |
|
{TextMessage, true, false, flate.BestSpeed}, |
|
{TextMessage, true, true, flate.BestSpeed}, |
|
{TextMessage, true, true, flate.BestCompression}, |
|
{PingMessage, true, false, flate.BestSpeed}, |
|
{PingMessage, true, true, flate.BestSpeed}, |
|
|
|
// Client |
|
{TextMessage, false, false, flate.BestSpeed}, |
|
{TextMessage, false, true, flate.BestSpeed}, |
|
{TextMessage, false, true, flate.BestCompression}, |
|
{PingMessage, false, false, flate.BestSpeed}, |
|
{PingMessage, false, true, flate.BestSpeed}, |
|
} |
|
|
|
func TestPreparedMessage(t *testing.T) { |
|
testRand := rand.New(rand.NewSource(99)) |
|
prevMaskRand := maskRand |
|
maskRand = testRand |
|
defer func() { maskRand = prevMaskRand }() |
|
|
|
for _, tt := range preparedMessageTests { |
|
var data = []byte("this is a test") |
|
var buf bytes.Buffer |
|
c := newTestConn(nil, &buf, tt.isServer) |
|
if tt.enableWriteCompression { |
|
c.newCompressionWriter = compressNoContextTakeover |
|
} |
|
|
|
if err := c.SetCompressionLevel(tt.compressionLevel); err != nil { |
|
t.Fatal(err) |
|
} |
|
|
|
// Seed random number generator for consistent frame mask. |
|
testRand.Seed(1234) |
|
|
|
if err := c.WriteMessage(tt.messageType, data); err != nil { |
|
t.Fatal(err) |
|
} |
|
want := buf.String() |
|
|
|
pm, err := NewPreparedMessage(tt.messageType, data) |
|
if err != nil { |
|
t.Fatal(err) |
|
} |
|
|
|
// Scribble on data to ensure that NewPreparedMessage takes a snapshot. |
|
copy(data, "hello world") |
|
|
|
// Seed random number generator for consistent frame mask. |
|
testRand.Seed(1234) |
|
|
|
buf.Reset() |
|
if err := c.WritePreparedMessage(pm); err != nil { |
|
t.Fatal(err) |
|
} |
|
got := buf.String() |
|
|
|
if got != want { |
|
t.Errorf("write message != prepared message, got %#v, want %#v", got, want) |
|
} |
|
} |
|
}
|
|
|