67 lines
2.7 KiB
Go
67 lines
2.7 KiB
Go
package companion
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestClientStreamLogEventsUsesComponentSessionBodyAndSSE(t *testing.T) {
|
|
stamp := time.Date(2026, 8, 31, 2, 0, 0, 0, time.UTC)
|
|
config := loadTestConfig(t)
|
|
client := newTestClient(t, config, roundTripFunc(func(request *http.Request) (*http.Response, error) {
|
|
if request.Method != http.MethodPost || request.URL.Scheme != "https" || request.URL.Host != "platform.example.test" || request.URL.Path != logEventsPath {
|
|
t.Fatalf("unexpected log stream request: %s %s", request.Method, request.URL.String())
|
|
}
|
|
if request.Header.Get("Authorization") != "" {
|
|
t.Fatalf("component session must stay in the typed JSON body, got Authorization header")
|
|
}
|
|
if request.Header.Get("Accept") != "text/event-stream" || request.Header.Get("Content-Type") != "application/json" {
|
|
t.Fatalf("unexpected log stream headers: %+v", request.Header)
|
|
}
|
|
var body logStreamRequest
|
|
decodeRequest(t, request, &body)
|
|
if body.SessionToken != "session-token" {
|
|
t.Fatalf("unexpected session token body: %#v", body)
|
|
}
|
|
logPayload, _ := json.Marshal(LogStreamEvent{ServerInstanceID: "server-1", StreamID: "stream-1", Source: "process", StreamKey: "stdout", LogSessionID: "session-live", SessionStartedAt: stamp, LatestSeq: 7, Entry: LogEntry{Seq: 7, Timestamp: stamp.Add(time.Second), Line: "SCUM LOGIN 76561198000000001 10.0.0.1", Redacted: true}})
|
|
bodyText := strings.Join([]string{
|
|
"event: ready",
|
|
"data: {\"serverInstanceId\":\"server-1\"}",
|
|
"",
|
|
"event: log",
|
|
"data: " + string(logPayload),
|
|
"",
|
|
": heartbeat",
|
|
"",
|
|
}, "\n")
|
|
return &http.Response{StatusCode: http.StatusOK, Header: http.Header{"Content-Type": []string{"text/event-stream"}}, Body: io.NopCloser(strings.NewReader(bodyText)), Request: request}, nil
|
|
}), stamp)
|
|
client.mu.Lock()
|
|
client.sessionToken = "session-token"
|
|
client.sessionExpiresAt = stamp.Add(time.Hour)
|
|
client.mu.Unlock()
|
|
|
|
var events []LogStreamEvent
|
|
if err := client.StreamLogEvents(context.Background(), func(event LogStreamEvent) error {
|
|
events = append(events, event)
|
|
return nil
|
|
}); err != nil {
|
|
t.Fatalf("stream log events: %v", err)
|
|
}
|
|
if len(events) != 1 || events[0].Entry.Seq != 7 || events[0].Entry.Line != "SCUM LOGIN 76561198000000001 10.0.0.1" {
|
|
t.Fatalf("unexpected streamed log events: %#v", events)
|
|
}
|
|
}
|
|
|
|
func TestReadLogEventStreamRejectsMalformedLogEvent(t *testing.T) {
|
|
err := readLogEventStream(context.Background(), strings.NewReader("event: log\ndata: {not-json}\n\n"), func(LogStreamEvent) error { return nil })
|
|
if err == nil || !strings.Contains(err.Error(), "decode log event") {
|
|
t.Fatalf("expected malformed log event rejection, got %v", err)
|
|
}
|
|
}
|