// 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"

	"v.io/v23/context"
)

func TestAcceptsAreNotSerialized(t *testing.T) {
	ctx, _ := context.RootContext()
	ln, err := HybridListener(ctx, "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(ctx, ln.Addr().Network(), ln.Addr().String(), time.Second)
	if err != nil {
		t.Fatal(err)
	}
	conn.Close()
}

func TestNonWebsocketRequest(t *testing.T) {
	ctx, _ := context.RootContext()
	ln, err := HybridListener(ctx, "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)
	}
}
