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  }