package resp

import (
	"fmt"
	"net"
	"os"
	"sync"
	"testing"
	"time"
)

func TestServer(t *testing.T) {
	// Use the example server in example_test
	go func() {
		ExampleServer()
	}()
	if os.Getenv("WAIT_ON_TEST_SERVER") == "1" {
		select {}
	}
	time.Sleep(time.Millisecond * 50)

	n := 75

	// Open N connections and do a bunch of stuff.
	var wg sync.WaitGroup
	wg.Add(n)
	for i := 0; i < n; i++ {
		go func(i int) {
			defer func() {
				wg.Done()
			}()
			nconn, err := net.Dial("tcp", ":6380")
			if err != nil {
				t.Fatal(err)
			}
			defer nconn.Close()
			conn := NewConn(nconn)

			// PING
			if err := conn.WriteMultiBulk("PING"); err != nil {
				t.Fatal(err)
			}
			val, _, err := conn.ReadValue()
			if err != nil {
				t.Fatal(err)
			}
			if val.String() != "PONG" {
				t.Fatalf("expecting 'PONG', got '%s'", val)
			}

			key := fmt.Sprintf("key:%d", i)

			// SET
			if err := conn.WriteMultiBulk("SET", key, 123.4); err != nil {
				t.Fatal(err)
			}
			val, _, err = conn.ReadValue()
			if err != nil {
				t.Fatal(err)
			}
			if val.String() != "OK" {
				t.Fatalf("expecting 'OK', got '%s'", val)
			}

			// GET
			if err := conn.WriteMultiBulk("GET", key); err != nil {
				t.Fatal(err)
			}
			val, _, err = conn.ReadValue()
			if err != nil {
				t.Fatal(err)
			}
			if val.Float() != 123.4 {
				t.Fatalf("expecting '123.4', got '%s'", val)
			}

			// QUIT
			if err := conn.WriteMultiBulk("QUIT"); err != nil {
				t.Fatal(err)
			}
			val, _, err = conn.ReadValue()
			if err != nil {
				t.Fatal(err)
			}
			if val.String() != "OK" {
				t.Fatalf("expecting 'OK', got '%s'", val)
			}

		}(i)
	}
	wg.Wait()
}