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

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

	"v.io/v23/context"
)

func TestAcceptsAreNotSerialized(t *testing.T) {
	ctx, _ := context.RootContext()
	ln, err := WSH{}.Listen(ctx, "wsh", "127.0.0.1:0")
	if err != nil {
		t.Fatal(err)
	}
	portscan := make(chan struct{})

	// Goroutine that continuously accepts connections.
	go func() {
		for {
			conn, err := ln.Accept(ctx)
			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 := WS{}.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 := WSH{}.Listen(ctx, "wsh", "127.0.0.1:0")
	if err != nil {
		t.Fatal(err)
	}

	// Goroutine that continuously accepts connections.
	go func() {
		for {
			_, err := ln.Accept(ctx)
			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)
	}
}
