//go:build ignore // +build ignore // Smoke test: ws client connects, exchanges a few messages, exits. // Run: go run ./smoke_test.go package main import ( "encoding/json" "fmt" "net/url" "os" "time" "github.com/gorilla/websocket" ) func main() { u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} ws, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { fmt.Println("dial:", err) os.Exit(1) } defer ws.Close() // channel reader go func() { for { _, msg, err := ws.ReadMessage() if err != nil { fmt.Println("read err:", err) return } var env struct { Type string `json:"type"` Seq uint64 `json:"seq"` TSMs int64 `json:"ts_ms"` Payload json.RawMessage `json:"payload"` } if err := json.Unmarshal(msg, &env); err != nil { fmt.Println("json err:", err) continue } if env.Type == "race_snapshot" { fmt.Printf("[rx] %s tick=%d cars=%d ts=%d\n", env.Type, 0, countCars(env.Payload), env.TSMs) } else { fmt.Printf("[rx] %s seq=%d payload=%s\n", env.Type, env.Seq, string(env.Payload)) } } }() send := func(t string, p map[string]any) { env := map[string]any{ "type": t, "seq": 1, "ts_ms": time.Now().UnixMilli(), "payload": p, } b, _ := json.Marshal(env) if err := ws.WriteMessage(websocket.TextMessage, b); err != nil { fmt.Println("write err:", err) } fmt.Println("[tx]", t) } send("client_hello", map[string]any{ "version": "x0gp/0.1", "token": "", "locale": "ru", }) time.Sleep(200 * time.Millisecond) send("join_race", map[string]any{ "race_id": "demo-race", "car_slot": 0, "car_name": "smoke-test", }) time.Sleep(200 * time.Millisecond) for i := 0; i < 30; i++ { send("input_state", map[string]any{ "steering": 0.5, "throttle": 1.0, "brake": 0.0, "gear": 1, }) time.Sleep(33 * time.Millisecond) } send("ping", map[string]any{"client_ts_ms": time.Now().UnixMilli()}) time.Sleep(200 * time.Millisecond) send("leave_race", map[string]any{}) // give server time to push last snapshots time.Sleep(500 * time.Millisecond) fmt.Println("done") } func countCars(raw json.RawMessage) int { var s struct { Cars []map[string]any `json:"cars"` } _ = json.Unmarshal(raw, &s) return len(s.Cars) }