// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build !nacl

package websocket

import (
	"bytes"
	"log"
	"net"
	"strings"
	"testing"
	"time"
)

func TestAcceptsAreNotSerialized(t *testing.T) {
	ln, err := HybridListener("wsh", "127.0.0.1:0")
	if err != nil {
		t.Fatal(err)
	}
	defer func() { go ln.Close() }()
	portscan := make(chan struct{})

	// Goroutine that continuously accepts connections.
	go func() {
		for {
			conn, err := ln.Accept()
			if err != nil {
				return
			}
			defer conn.Close()
		}
	}()

	// Imagine some client was port scanning and thus opened a TCP
	// connection (but never sent the bytes)
	go func() {
		conn, err := net.Dial("tcp", ln.Addr().String())
		if err != nil {
			t.Error(err)
		}
		close(portscan)
		// Keep the connection alive by blocking on a read.  (The read
		// should return once the test exits).
		conn.Read(make([]byte, 1024))
	}()
	// Another client that dials a legitimate connection should not be
	// blocked on the portscanner.
	// (Wait for the portscanner to establish the TCP connection first).
	<-portscan
	conn, err := Dial(ln.Addr().Network(), ln.Addr().String(), time.Second)
	if err != nil {
		t.Fatal(err)
	}
	conn.Close()
}

func TestNonWebsocketRequest(t *testing.T) {
	ln, err := HybridListener("wsh", "127.0.0.1:0")
	if err != nil {
		t.Fatal(err)
	}
	defer func() { go ln.Close() }()

	// Goroutine that continuously accepts connections.
	go func() {
		for {
			_, err := ln.Accept()
			if err != nil {
				return
			}
		}
	}()

	var out bytes.Buffer
	log.SetOutput(&out)

	// Imagine some client keeps sending non-websocket requests.
	conn, err := net.Dial("tcp", ln.Addr().String())
	if err != nil {
		t.Error(err)
	}
	for i := 0; i < 2; i++ {
		conn.Write([]byte("GET / HTTP/1.1\r\n\r\n"))
		conn.Read(make([]byte, 1024))
	}

	logs := out.String()
	if strings.Contains(logs, "panic") {
		t.Errorf("Unexpected panic:\n%s", logs)
	}
}
