transfer.sh/vendor/github.com/google/martian/marbl/handler_test.go
2019-03-17 20:19:56 +01:00

111 lines
2.6 KiB
Go

// Copyright 2015 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package marbl
import (
"fmt"
"math/rand"
"net"
"net/http"
"strconv"
"testing"
"time"
"golang.org/x/net/websocket"
)
func TestStreamsInSentOrder(t *testing.T) {
//t.Skip("skipping test to deflake.")
l, err := net.Listen("tcp", "localhost:0")
if err != nil {
t.Fatalf("net.Listen(): got %v, want no error", err)
}
handler := NewHandler()
go http.Serve(l, handler)
ws, err := websocket.Dial(fmt.Sprintf("ws://%s", l.Addr()), "", "http://localhost/")
if err != nil {
t.Fatalf("websocket.Dial(): got %v, want no error", err)
}
var iterations int64 = 5000
go func() {
for i := int64(0); i < iterations; i++ {
hex := strconv.FormatInt(int64(i), 16)
handler.Write([]byte(hex))
}
}()
for i := int64(0); i < iterations; i++ {
var bytes []byte
err = websocket.Message.Receive(ws, &bytes)
if err != nil {
t.Fatalf("websocket.Conn.Read(): got %v, want no error", err)
}
parsed, err := strconv.ParseInt(string(bytes), 16, 64)
if err != nil {
t.Fatalf("strconv.ParseInt(): got %v, want no error", err)
}
if parsed != i {
t.Errorf("Messages arrived out of order, expected %d got %d", i, parsed)
}
}
}
func TestUnreadsDontBlock(t *testing.T) {
l, err := net.Listen("tcp", "localhost:0")
if err != nil {
t.Fatalf("net.Listen(): got %v, want no error", err)
}
handler := NewHandler()
go http.Serve(l, handler)
_, err = websocket.Dial(fmt.Sprintf("ws://%s", l.Addr()), "", "http://localhost/")
if err != nil {
t.Fatalf("websocket.Dial(): got %v, want no error", err)
}
bytes := make([]byte, 1024)
_, err = rand.Read(bytes)
if err != nil {
t.Fatalf("rand.Read(): got %v, want no error", err)
}
var iterations int64 = 50000
for i := int64(0); i < iterations; i++ {
to := doOrTimeout(3*time.Second, func() {
handler.Write(bytes)
})
if to {
t.Fatalf("handler.Write() Timed out")
}
}
}
func doOrTimeout(d time.Duration, f func()) bool {
done := make(chan interface{})
go func() {
f()
done <- 1
}()
select {
case <-done:
return false
case <-time.After(d):
return true
}
}