github.com/jshiv/can-go@v0.2.1-0.20210224011015-069e90e90bdf/pkg/candebug/http_test.go (about)

     1  package candebug
     2  
     3  import (
     4  	"io/ioutil"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"go.einride.tech/can"
    12  	"go.einride.tech/can/pkg/descriptor"
    13  	"go.einride.tech/can/pkg/generated"
    14  	"gotest.tools/v3/assert"
    15  )
    16  
    17  func TestServeMessagesHTTP_Single(t *testing.T) {
    18  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    19  		ServeMessagesHTTP(w, r, []generated.Message{
    20  			&testMessage{
    21  				frame:      can.Frame{ID: 100, Length: 1},
    22  				descriptor: newDriverHeartbeatDescriptor(),
    23  			},
    24  		})
    25  	}))
    26  	res, err := http.Get(ts.URL)
    27  	assert.NilError(t, err)
    28  	response, err := ioutil.ReadAll(res.Body)
    29  	assert.NilError(t, err)
    30  	assert.NilError(t, res.Body.Close())
    31  	const expected = `
    32  DriverHeartbeat
    33  ===============
    34  ID: 100 (0x64)
    35  Sender: DRIVER
    36  SendType: Cyclic
    37  CycleTime: 100ms
    38  DelayTime: 2s
    39  ===============
    40  Command: 0 (0x0) None
    41  `
    42  	assert.Equal(t, strings.TrimSpace(expected), string(response))
    43  }
    44  
    45  func TestServeMessagesHTTP_Multi(t *testing.T) {
    46  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    47  		ServeMessagesHTTP(w, r, []generated.Message{
    48  			&testMessage{
    49  				frame:      can.Frame{ID: 100, Length: 1},
    50  				descriptor: newDriverHeartbeatDescriptor(),
    51  			},
    52  			&testMessage{
    53  				frame:      can.Frame{ID: 100, Length: 1, Data: can.Data{0x01}},
    54  				descriptor: newDriverHeartbeatDescriptor(),
    55  			},
    56  		})
    57  	}))
    58  	res, err := http.Get(ts.URL)
    59  	assert.NilError(t, err)
    60  	response, err := ioutil.ReadAll(res.Body)
    61  	assert.NilError(t, err)
    62  	assert.NilError(t, res.Body.Close())
    63  	const expected = `
    64  DriverHeartbeat
    65  ===============
    66  ID: 100 (0x64)
    67  Sender: DRIVER
    68  SendType: Cyclic
    69  CycleTime: 100ms
    70  DelayTime: 2s
    71  ===============
    72  Command: 0 (0x0) None
    73  
    74  
    75  DriverHeartbeat
    76  ===============
    77  ID: 100 (0x64)
    78  Sender: DRIVER
    79  SendType: Cyclic
    80  CycleTime: 100ms
    81  DelayTime: 2s
    82  ===============
    83  Command: 1 (0x1) Sync
    84  `
    85  	assert.Equal(t, strings.TrimSpace(expected), string(response))
    86  }
    87  
    88  type testMessage struct {
    89  	frame      can.Frame
    90  	descriptor *descriptor.Message
    91  }
    92  
    93  func (m *testMessage) Frame() can.Frame {
    94  	return m.frame
    95  }
    96  
    97  func (m *testMessage) Descriptor() *descriptor.Message {
    98  	return m.descriptor
    99  }
   100  
   101  func (m *testMessage) MarshalFrame() (can.Frame, error) {
   102  	panic("should not be called")
   103  }
   104  
   105  func (testMessage) Reset() {
   106  	panic("should not be called")
   107  }
   108  
   109  func (testMessage) String() string {
   110  	panic("should not be called")
   111  }
   112  
   113  func (testMessage) UnmarshalFrame(can.Frame) error {
   114  	panic("should not be called")
   115  }
   116  
   117  func newDriverHeartbeatDescriptor() *descriptor.Message {
   118  	return &descriptor.Message{
   119  		Name:        "DriverHeartbeat",
   120  		SenderNode:  "DRIVER",
   121  		ID:          100,
   122  		Length:      1,
   123  		Description: "Sync message used to synchronize the controllers",
   124  		SendType:    descriptor.SendTypeCyclic,
   125  		CycleTime:   100 * time.Millisecond,
   126  		DelayTime:   2 * time.Second,
   127  		Signals: []*descriptor.Signal{
   128  			{
   129  				Name:   "Command",
   130  				Start:  0,
   131  				Length: 8,
   132  				Scale:  1,
   133  				ValueDescriptions: []*descriptor.ValueDescription{
   134  					{Value: 0, Description: "None"},
   135  					{Value: 1, Description: "Sync"},
   136  					{Value: 2, Description: "Reboot"},
   137  				},
   138  				ReceiverNodes: []string{"SENSOR", "MOTOR"},
   139  			},
   140  		},
   141  	}
   142  }