@@ -8,12 +8,14 @@ import (
8
8
"time"
9
9
10
10
"github.com/google/uuid"
11
+ "github.com/stretchr/testify/assert"
11
12
"github.com/stretchr/testify/require"
12
13
"golang.org/x/xerrors"
13
14
"tailscale.com/tailcfg"
14
15
15
16
"cdr.dev/slog"
16
17
"cdr.dev/slog/sloggers/slogtest"
18
+ "github.com/coder/coder/v2/clock"
17
19
"github.com/coder/coder/v2/tailnet"
18
20
"github.com/coder/coder/v2/tailnet/proto"
19
21
"github.com/coder/coder/v2/tailnet/tailnettest"
@@ -28,12 +30,16 @@ func TestClientService_ServeClient_V2(t *testing.T) {
28
30
coordPtr .Store (& coord )
29
31
logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
30
32
derpMap := & tailcfg.DERPMap {Regions :map [int ]* tailcfg.DERPRegion {999 : {RegionCode :"test" }}}
33
+
34
+ telemetryEvents := make (chan []* proto.TelemetryEvent ,64 )
31
35
uut ,err := tailnet .NewClientService (tailnet.ClientServiceOptions {
32
- Logger :logger ,
33
- CoordPtr :& coordPtr ,
34
- DERPMapUpdateFrequency :time .Millisecond ,
35
- DERPMapFn :func ()* tailcfg.DERPMap {return derpMap },
36
- NetworkTelemetryHandler :func (batch []* proto.TelemetryEvent ) {},
36
+ Logger :logger ,
37
+ CoordPtr :& coordPtr ,
38
+ DERPMapUpdateFrequency :time .Millisecond ,
39
+ DERPMapFn :func ()* tailcfg.DERPMap {return derpMap },
40
+ NetworkTelemetryHandler :func (batch []* proto.TelemetryEvent ) {
41
+ telemetryEvents <- batch
42
+ },
37
43
})
38
44
require .NoError (t ,err )
39
45
@@ -100,7 +106,23 @@ func TestClientService_ServeClient_V2(t *testing.T) {
100
106
require .NoError (t ,err )
101
107
102
108
// PostTelemetry
103
- // TODO: write test
109
+ telemetryReq := & proto.TelemetryRequest {
110
+ Events : []* proto.TelemetryEvent {
111
+ {
112
+ Id : []byte ("hi" ),
113
+ },
114
+ {
115
+ Id : []byte ("bye" ),
116
+ },
117
+ },
118
+ }
119
+ res ,err := client .PostTelemetry (ctx ,telemetryReq )
120
+ require .NoError (t ,err )
121
+ require .NotNil (t ,res )
122
+ gotEvents := testutil .RequireRecvCtx (ctx ,t ,telemetryEvents )
123
+ require .Len (t ,gotEvents ,2 )
124
+ require .Equal (t ,"hi" ,string (gotEvents [0 ].Id ))
125
+ require .Equal (t ,"bye" ,string (gotEvents [1 ].Id ))
104
126
105
127
// RPCs closed; we need to close the Conn to end the session.
106
128
err = c .Close ()
@@ -154,3 +176,51 @@ func TestClientService_ServeClient_V1(t *testing.T) {
154
176
err = testutil .RequireRecvCtx (ctx ,t ,errCh )
155
177
require .ErrorIs (t ,err ,expectedError )
156
178
}
179
+
180
+ func TestNetworkTelemetryBatcher (t * testing.T ) {
181
+ t .Parallel ()
182
+
183
+ var (
184
+ events = make (chan []* proto.TelemetryEvent ,64 )
185
+ mClock = clock .NewMock (t )
186
+ b = tailnet .NewNetworkTelemetryBatcher (mClock ,time .Millisecond ,3 ,func (batch []* proto.TelemetryEvent ) {
187
+ assert .LessOrEqual (t ,len (batch ),3 )
188
+ events <- batch
189
+ })
190
+ )
191
+
192
+ b .Handler ([]* proto.TelemetryEvent {
193
+ {Id : []byte ("1" )},
194
+ {Id : []byte ("2" )},
195
+ })
196
+ b .Handler ([]* proto.TelemetryEvent {
197
+ {Id : []byte ("3" )},
198
+ {Id : []byte ("4" )},
199
+ })
200
+
201
+ // Should overflow and send a batch.
202
+ ctx := testutil .Context (t ,testutil .WaitShort )
203
+ batch := testutil .RequireRecvCtx (ctx ,t ,events )
204
+ require .Len (t ,batch ,3 )
205
+ require .Equal (t ,"1" ,string (batch [0 ].Id ))
206
+ require .Equal (t ,"2" ,string (batch [1 ].Id ))
207
+ require .Equal (t ,"3" ,string (batch [2 ].Id ))
208
+
209
+ // Should send any pending events when the ticker fires.
210
+ mClock .Advance (time .Millisecond )
211
+ batch = testutil .RequireRecvCtx (ctx ,t ,events )
212
+ require .Len (t ,batch ,1 )
213
+ require .Equal (t ,"4" ,string (batch [0 ].Id ))
214
+
215
+ // Should send any pending events when closed.
216
+ b .Handler ([]* proto.TelemetryEvent {
217
+ {Id : []byte ("5" )},
218
+ {Id : []byte ("6" )},
219
+ })
220
+ err := b .Close ()
221
+ require .NoError (t ,err )
222
+ batch = testutil .RequireRecvCtx (ctx ,t ,events )
223
+ require .Len (t ,batch ,2 )
224
+ require .Equal (t ,"5" ,string (batch [0 ].Id ))
225
+ require .Equal (t ,"6" ,string (batch [1 ].Id ))
226
+ }