26f897c1ec
release / release-please (push) Failing after 1m49s
docs / build (push) Failing after 6m34s
release / build-and-upload (arm64, linux) (push) Has been cancelled
release / build-and-upload (arm64, windows) (push) Has been cancelled
release / build-darwin (amd64, darwin) (push) Has been cancelled
release / checksums (push) Has been cancelled
release / finalize (push) Has been cancelled
release / build-darwin (arm64, darwin) (push) Has been cancelled
release / build-and-upload (amd64, linux) (push) Has been cancelled
release / build-and-upload (amd64, windows) (push) Has been cancelled
docs / deploy (push) Has been cancelled
69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package daemon
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/kunchenguid/no-mistakes/internal/telemetry"
|
|
)
|
|
|
|
type recordedTelemetryEvent struct {
|
|
name string
|
|
fields telemetry.Fields
|
|
}
|
|
|
|
type telemetryRecorder struct {
|
|
mu sync.Mutex
|
|
events []recordedTelemetryEvent
|
|
}
|
|
|
|
func (r *telemetryRecorder) Track(name string, fields telemetry.Fields) {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
|
|
clone := make(telemetry.Fields, len(fields))
|
|
for k, v := range fields {
|
|
clone[k] = v
|
|
}
|
|
r.events = append(r.events, recordedTelemetryEvent{name: name, fields: clone})
|
|
}
|
|
|
|
func (r *telemetryRecorder) Pageview(path string, fields telemetry.Fields) {
|
|
r.Track("pageview", fields)
|
|
}
|
|
|
|
func (r *telemetryRecorder) Close(context.Context) error { return nil }
|
|
|
|
func (r *telemetryRecorder) find(name, field string, want any) *recordedTelemetryEvent {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
|
|
for i := len(r.events) - 1; i >= 0; i-- {
|
|
e := r.events[i]
|
|
if e.name != name {
|
|
continue
|
|
}
|
|
if field == "" || fmt.Sprint(e.fields[field]) == fmt.Sprint(want) {
|
|
cp := e
|
|
return &cp
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func waitForTelemetryEvent(t *testing.T, recorder *telemetryRecorder, name, field string, want any) *recordedTelemetryEvent {
|
|
t.Helper()
|
|
|
|
deadline := time.Now().Add(5 * time.Second)
|
|
for time.Now().Before(deadline) {
|
|
if event := recorder.find(name, field, want); event != nil {
|
|
return event
|
|
}
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
return nil
|
|
}
|