repo_description: Package gorilla/websocket is a fast, well-tested and widely used WebSocket implementation for Go.
repo_topics: go golang gorilla gorilla-web-toolkit websocket websockets
code: // 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 for %+v", tt)
  		}
  	}
  }
  