@@ -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
+ }
0 commit comments