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

package benchmark

import (
	"io"
	"net"
	"testing"

	"v.io/x/ref/runtime/internal/lib/websocket"

	"v.io/v23/context"
)

// benchmarkWS sets up nConns WS connections and measures throughput.
func benchmarkWSH(b *testing.B, protocol string, nConns int) {
	ctx, _ := context.RootContext()
	rchan := make(chan net.Conn, nConns)
	wchan := make(chan net.Conn, nConns)
	ln, err := websocket.HybridListener(ctx, "wsh", "127.0.0.1:0")
	if err != nil {
		b.Fatalf("websocket.HybridListener failed: %v", err)
		return
	}
	defer ln.Close()
	// One goroutine to dial nConns connections.
	go func() {
		for i := 0; i < nConns; i++ {
			var conn net.Conn
			var err error
			switch protocol {
			case "tcp":
				conn, err = net.Dial("tcp", ln.Addr().String())
			case "ws":
				conn, err = websocket.Dial(ctx, "ws", ln.Addr().String(), 0)
			}
			if err != nil {
				b.Fatalf("Dial(%q, %q) failed: %v", protocol, ln.Addr(), err)
				wchan <- nil
				return
			}
			if protocol == "tcp" {
				// Write a dummy byte since wsh waits for magic byte forever.
				conn.Write([]byte("."))
			}
			wchan <- conn
		}
		close(wchan)
	}()
	// One goroutine to accept nConns connections.
	go func() {
		for i := 0; i < nConns; i++ {
			conn, err := ln.Accept()
			if err != nil {
				b.Fatalf("Accept failed: %v", err)
				rchan <- nil
				return
			}
			if protocol == "tcp" {
				// Read a dummy byte.
				conn.Read(make([]byte, 1))
			}
			rchan <- conn
		}
		close(rchan)
	}()

	var readers []io.ReadCloser
	var writers []io.WriteCloser
	for r := range rchan {
		readers = append(readers, r)
	}
	for w := range wchan {
		writers = append(writers, w)
	}
	if b.Failed() {
		return
	}
	(&throughputTester{b: b, readers: readers, writers: writers}).Run()
}
