Verify Home sessions through call stream and ICE routes
1 file changed,
+66
−0
internal/meet/home_release_test.go+66 −0
CI passed — run details
diff --git a/internal/meet/home_release_test.go b/internal/meet/home_release_test.go| index b3a8da2..047a64a 100644 |
| --- a/internal/meet/home_release_test.go |
| +++ b/internal/meet/home_release_test.go |
| @@ -1,11 +1,16 @@ |
| package meet |
| import ( |
| + "bufio" |
| + "context" |
| + "encoding/json" |
| "net/http" |
| "net/http/httptest" |
| + "net/url" |
| "regexp" |
| "strings" |
| "testing" |
| + "time" |
| ) |
| func TestHomeConnectionKeepsCurrentCallAndAgentRoutes(t *testing.T) { |
| @@ -26,6 +31,67 @@ func TestHomeConnectionKeepsCurrentCallAndAgentRoutes(t *testing.T) { |
| if w := f.do("GET", target, ""); w.Code != 200 { |
| t.Fatalf("call page: %d", w.Code) |
| } |
| + room := strings.TrimSuffix(target, "/join") |
| + if w := f.do("GET", room+"/stream?probe=1", ""); w.Code != http.StatusNoContent { |
| + t.Fatalf("Home stream probe: %d", w.Code) |
| + } |
| + server := httptest.NewServer(f.handler) |
| + defer server.Close() |
| + ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second) |
| + defer cancel() |
| + req, err := http.NewRequestWithContext(ctx, "GET", server.URL+room+"/stream", nil) |
| + if err != nil { |
| + t.Fatal(err) |
| + } |
| + origin, _ := url.Parse(homeTestOrigin) |
| + req.Host = origin.Host |
| + req.Header.Set("Accept", "text/event-stream") |
| + for _, c := range f.cookies { |
| + req.AddCookie(c) |
| + } |
| + resp, err := server.Client().Do(req) |
| + if err != nil { |
| + t.Fatal(err) |
| + } |
| + defer resp.Body.Close() |
| + if resp.StatusCode != 200 { |
| + t.Fatalf("Home stream: %d", resp.StatusCode) |
| + } |
| + scanner := bufio.NewScanner(resp.Body) |
| + var hello struct{ Peer string } |
| + for scanner.Scan() { |
| + if strings.HasPrefix(scanner.Text(), "data:") { |
| + if err := json.Unmarshal([]byte(strings.TrimSpace(strings.TrimPrefix(scanner.Text(), "data:"))), &hello); err != nil { |
| + t.Fatal(err) |
| + } |
| + if hello.Peer != "" { |
| + break |
| + } |
| + } |
| + } |
| + if hello.Peer == "" { |
| + t.Fatalf("Home stream missing hello: %v", scanner.Err()) |
| + } |
| + payload, err := json.Marshal(map[string]string{"type": "join", "peer": hello.Peer}) |
| + if err != nil { |
| + t.Fatal(err) |
| + } |
| + signal := httptest.NewRequest("POST", homeTestOrigin+room+"/signal", strings.NewReader(string(payload))) |
| + signal.Header.Set("Origin", homeTestOrigin) |
| + signal.Header.Set("Content-Type", "application/json") |
| + for _, c := range f.cookies { |
| + signal.AddCookie(c) |
| + } |
| + joined := httptest.NewRecorder() |
| + f.handler.ServeHTTP(joined, signal) |
| + if joined.Code != 200 { |
| + t.Fatalf("Home join signal: %d", joined.Code) |
| + } |
| + if w := f.do("GET", room+"/ice?peer="+hello.Peer, ""); w.Code != 200 { |
| + t.Fatalf("Home admitted ICE: %d", w.Code) |
| + } |
| + resp.Body.Close() |
| + cancel() |
| if w := f.do("GET", "/settings", ""); w.Code != 200 || !strings.Contains(w.Body.String(), "alice@example.test") { |
| t.Fatalf("settings lost existing principal: %d", w.Code) |
| } |