Skip to content

Commit 92c6805

Browse files
committed
review: fix tab alignment, rename buildTelemetryParam, validate --seq, add tests
1 parent a213e33 commit 92c6805

4 files changed

Lines changed: 64 additions & 8 deletions

File tree

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,9 @@ Commands with JSON output support:
212212
- `--start-url <url>` - Initial page to open on launch
213213
- `--pool-id <id>` - Acquire a browser from the specified pool (mutually exclusive with --pool-name; ignores other session flags)
214214
- `--pool-name <name>` - Acquire a browser from the pool name (mutually exclusive with --pool-id; ignores other session flags)
215-
- `--telemetry=all` - Enable telemetry for all categories; `--telemetry=off` to disable; `--telemetry=network=on,page=off` for per-category
215+
- `--telemetry=all` - Enable telemetry for all categories
216+
- `--telemetry=off` - Disable telemetry
217+
- `--telemetry=<list>` - Per-category config, e.g. `--telemetry=network=on,page=off`
216218
- `--output json`, `-o json` - Output raw JSON object
217219
- _Note: When a pool is specified, omit other session configuration flags—pool settings determine profile, proxy, viewport, etc._
218220
- `kernel browsers delete <id>` - Delete a browser

cmd/browsers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ func (b BrowsersCmd) Create(ctx context.Context, in BrowsersCreateInput) error {
426426
}
427427

428428
if in.Telemetry != "" {
429-
t, err := applyTelemetryParam(in.Telemetry)
429+
t, err := buildTelemetryParam(in.Telemetry)
430430
if err != nil {
431431
return err
432432
}
@@ -627,7 +627,7 @@ func (b BrowsersCmd) Update(ctx context.Context, in BrowsersUpdateInput) error {
627627

628628
// Handle telemetry changes
629629
if in.Telemetry != "" {
630-
t, err := applyTelemetryParam(in.Telemetry)
630+
t, err := buildTelemetryParam(in.Telemetry)
631631
if err != nil {
632632
return err
633633
}

cmd/browsers_telemetry.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ func parseTelemetryCategories(s string) (kernel.BrowserTelemetryCategoriesConfig
6464
return p, nil
6565
}
6666

67-
// applyTelemetryParam converts a --telemetry flag value to the API param.
68-
func applyTelemetryParam(s string) (kernel.BrowserTelemetryRequestConfigParam, error) {
67+
// buildTelemetryParam converts a --telemetry flag value to the API param.
68+
func buildTelemetryParam(s string) (kernel.BrowserTelemetryRequestConfigParam, error) {
6969
switch s {
7070
case "all":
7171
return kernel.BrowserTelemetryRequestConfigParam{Enabled: kernel.Opt(true)}, nil
@@ -120,6 +120,9 @@ func (b BrowsersCmd) TelemetryStream(ctx context.Context, in BrowsersTelemetrySt
120120
if err != nil {
121121
return util.CleanedUpSdkError{Err: err}
122122
}
123+
if in.Seq < -1 {
124+
return fmt.Errorf("--seq must be >= 0 (use --seq=0 to resume from the beginning, or omit to stream from now)")
125+
}
123126
params := kernel.BrowserTelemetryStreamParams{}
124127
if in.Seq >= 0 {
125128
params.LastEventID = kernel.Opt(strconv.FormatInt(in.Seq, 10))
@@ -142,7 +145,7 @@ func (b BrowsersCmd) TelemetryStream(ctx context.Context, in BrowsersTelemetrySt
142145
continue
143146
}
144147
ts := time.UnixMicro(ev.Event.Ts).Local().Format("15:04:05")
145-
pterm.Printf("%s %-11s %s\n", ts, "["+cat+"]", ev.Event.Type)
148+
pterm.Printf("%s\t[%s]\t%s\n", ts, cat, ev.Event.Type)
146149
}
147150
if err := stream.Err(); err != nil {
148151
return util.CleanedUpSdkError{Err: err}

cmd/browsers_telemetry_test.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package cmd
22

33
import (
4+
"bytes"
45
"context"
56
"encoding/json"
7+
"io"
8+
"os"
69
"testing"
710

811
kernel "github.com/kernel/kernel-go-sdk"
@@ -11,6 +14,24 @@ import (
1114
"github.com/stretchr/testify/assert"
1215
)
1316

17+
// captureStdout redirects os.Stdout for the duration of the test and returns
18+
// the captured output. Needed for paths that use fmt.Println rather than pterm.
19+
func captureStdout(t *testing.T, fn func()) string {
20+
t.Helper()
21+
r, w, err := os.Pipe()
22+
if err != nil {
23+
t.Fatalf("os.Pipe: %v", err)
24+
}
25+
old := os.Stdout
26+
os.Stdout = w
27+
fn()
28+
w.Close()
29+
os.Stdout = old
30+
var buf bytes.Buffer
31+
io.Copy(&buf, r)
32+
return buf.String()
33+
}
34+
1435
type FakeBrowserTelemetryService struct {
1536
StreamFunc func() *ssestream.Stream[kernel.BrowserTelemetryStreamResponse]
1637
}
@@ -101,13 +122,43 @@ func TestTelemetryStream_EventsFlow_JSON(t *testing.T) {
101122
}}
102123
b := BrowsersCmd{browsers: fakeBrowsers, telemetry: fakeTelemetry}
103124

125+
var err error
126+
out := captureStdout(t, func() {
127+
err = b.TelemetryStream(context.Background(), BrowsersTelemetryStreamInput{
128+
Identifier: "session123",
129+
Output: "json",
130+
Seq: -1,
131+
})
132+
})
133+
134+
assert.NoError(t, err)
135+
assert.Contains(t, out, "network_response")
136+
}
137+
138+
type capturingTelemetryService struct {
139+
captured kernel.BrowserTelemetryStreamParams
140+
}
141+
142+
func (c *capturingTelemetryService) StreamStreaming(ctx context.Context, id string, query kernel.BrowserTelemetryStreamParams, opts ...option.RequestOption) *ssestream.Stream[kernel.BrowserTelemetryStreamResponse] {
143+
c.captured = query
144+
return makeStream([]kernel.BrowserTelemetryStreamResponse{})
145+
}
146+
147+
func TestTelemetryStream_SeqZeroSetsLastEventID(t *testing.T) {
148+
fakeBrowsers := &FakeBrowsersService{GetFunc: func(ctx context.Context, id string, query kernel.BrowserGetParams, opts ...option.RequestOption) (*kernel.BrowserGetResponse, error) {
149+
return &kernel.BrowserGetResponse{SessionID: id}, nil
150+
}}
151+
capSvc := &capturingTelemetryService{}
152+
b := BrowsersCmd{browsers: fakeBrowsers, telemetry: capSvc}
153+
104154
err := b.TelemetryStream(context.Background(), BrowsersTelemetryStreamInput{
105155
Identifier: "session123",
106-
Output: "json",
107-
Seq: -1,
156+
Seq: 0,
108157
})
109158

110159
assert.NoError(t, err)
160+
assert.True(t, capSvc.captured.LastEventID.Valid())
161+
assert.Equal(t, "0", capSvc.captured.LastEventID.Value)
111162
}
112163

113164
func makeEvent(t *testing.T, raw string) kernel.BrowserTelemetryEventUnion {

0 commit comments

Comments
 (0)