func TestWebsocketQuery(t *testing.T) { w := test.GetWorld(t) pn := w.NewPermanode(t) test.MustRunCmd(t, w.Cmd("camput", "attr", pn.String(), "tag", "foo")) check := func(err error) { if err != nil { t.Fatal(err) } } const bufSize = 1 << 20 c, err := net.Dial("tcp", w.Addr()) if err != nil { t.Fatalf("Dial: %v", err) } wc, _, err := websocket.NewClient(c, &url.URL{Host: w.Addr(), Path: w.SearchHandlerPath() + "ws"}, nil, bufSize, bufSize) check(err) msg, err := wc.NextWriter(websocket.TextMessage) check(err) _, err = msg.Write([]byte(`{"tag": "foo", "query": { "expression": "tag:foo" }}`)) check(err) check(msg.Close()) errc := make(chan error, 1) go func() { inType, inMsg, err := wc.ReadMessage() if err != nil { errc <- err return } if !strings.HasPrefix(string(inMsg), `{"tag":"_status"`) { errc <- fmt.Errorf("unexpected message type=%d msg=%q, wanted status update", inType, inMsg) return } inType, inMsg, err = wc.ReadMessage() if err != nil { errc <- err return } if strings.Contains(string(inMsg), pn.String()) { errc <- nil return } errc <- fmt.Errorf("unexpected message type=%d msg=%q", inType, inMsg) }() select { case err := <-errc: if err != nil { t.Error(err) } case <-time.After(5 * time.Second): t.Error("timeout") } }
func TestClientServer(t *testing.T) { s := httptest.NewServer(wsHandler{t}) defer s.Close() u, _ := url.Parse(s.URL) c, err := net.Dial("tcp", u.Host) if err != nil { t.Fatalf("Dial: %v", err) } ws, resp, err := websocket.NewClient(c, u, http.Header{"Origin": {s.URL}}, 1024, 1024) if err != nil { t.Fatalf("NewClient: %v", err) } defer ws.Close() var sessionID string for _, c := range resp.Cookies() { if c.Name == "sessionID" { sessionID = c.Value } } if sessionID != "1234" { t.Error("Set-Cookie not received from the server.") } w, _ := ws.NextWriter(websocket.TextMessage) io.WriteString(w, "HELLO") w.Close() ws.SetReadDeadline(time.Now().Add(1 * time.Second)) op, r, err := ws.NextReader() if err != nil { t.Fatalf("NextReader: %v", err) } if op != websocket.TextMessage { t.Fatalf("op=%d, want %d", op, websocket.TextMessage) } b, err := ioutil.ReadAll(r) if err != nil { t.Fatalf("ReadAll: %v", err) } if string(b) != "HELLO" { t.Fatalf("message=%s, want %s", b, "HELLO") } }