github.com/xmidt-org/webpa-common@v1.11.9/device/device_test.go (about) 1 package device 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 "github.com/xmidt-org/webpa-common/logging" 12 "github.com/xmidt-org/wrp-go/v3" 13 ) 14 15 func TestDevice(t *testing.T) { 16 var ( 17 assert = assert.New(t) 18 require = require.New(t) 19 expectedConnectedAt = time.Now().UTC() 20 expectedUpTime = 15 * time.Hour 21 22 testData = []struct { 23 expectedID ID 24 expectedQueueSize int 25 }{ 26 { 27 ID("ID 1"), 28 50, 29 }, 30 { 31 ID("ID 2"), 32 27, 33 }, 34 { 35 ID("ID 3"), 36 137, 37 }, 38 { 39 ID("ID 4"), 40 2, 41 }, 42 } 43 ) 44 45 for _, record := range testData { 46 t.Logf("%v", record) 47 48 var ( 49 ctx, cancel = context.WithCancel(context.Background()) 50 testMessage = new(wrp.Message) 51 device = newDevice(deviceOptions{ 52 ID: record.expectedID, 53 QueueSize: record.expectedQueueSize, 54 ConnectedAt: expectedConnectedAt, 55 Logger: logging.NewTestLogger(nil, t), 56 Metadata: new(Metadata), 57 }) 58 ) 59 60 require.NotNil(device) 61 assert.NotNil(device.Metadata()) 62 device.statistics = NewStatistics(func() time.Time { return expectedConnectedAt.Add(expectedUpTime) }, expectedConnectedAt) 63 64 assert.Equal(string(record.expectedID), device.String()) 65 actualConnectedAt := device.Statistics().ConnectedAt() 66 assert.Equal(expectedConnectedAt, actualConnectedAt) 67 68 assert.Equal(record.expectedID, device.ID()) 69 assert.False(device.Closed()) 70 71 assert.Equal(record.expectedID, device.ID()) 72 assert.Equal(actualConnectedAt, device.Statistics().ConnectedAt()) 73 assert.False(device.Closed()) 74 75 data, err := device.MarshalJSON() 76 require.NotEmpty(data) 77 require.NoError(err) 78 79 assert.JSONEq( 80 fmt.Sprintf( 81 `{"id": "%s", "pending": 0, "statistics": {"duplications": 0, "bytesSent": 0, "messagesSent": 0, "bytesReceived": 0, "messagesReceived": 0, "connectedAt": "%s", "upTime": "%s"}}`, 82 record.expectedID, 83 expectedConnectedAt.UTC().Format(time.RFC3339Nano), 84 expectedUpTime, 85 ), 86 string(data), 87 ) 88 89 for repeat := 0; repeat < record.expectedQueueSize; repeat++ { 90 go func() { 91 request := (&Request{Message: testMessage}).WithContext(ctx) 92 device.Send(request) 93 }() 94 } 95 96 cancel() 97 98 assert.False(device.Closed()) 99 device.requestClose(CloseReason{Text: "test"}) 100 assert.True(device.Closed()) 101 device.requestClose(CloseReason{Text: "test"}) 102 assert.True(device.Closed()) 103 104 response, err := device.Send(&Request{Message: testMessage}) 105 assert.Nil(response) 106 assert.Error(err) 107 } 108 }