Skip to content

Commit b62ec04

Browse files
committed
Moved integration tests one level up. Factored test functions. Added server tests.
1 parent 74d4e2a commit b62ec04

File tree

12 files changed

+442
-233
lines changed

12 files changed

+442
-233
lines changed
File renamed without changes.
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package testsuite
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/require"
8+
"github.com/vmihailenco/msgpack/v5"
9+
"go.bug.st/serial"
10+
)
11+
12+
func TestRPCClient(t *testing.T) {
13+
// Get the upload port to upload the sketch
14+
rpcPort, debugPort := UploadSketchAndGetRPCAndDebugPorts(t)
15+
16+
// Connect to the RPC serial port
17+
_rpcSer, err := serial.Open(rpcPort, &serial.Mode{BaudRate: 115200})
18+
rpcSer := &DebugStream{Upstream: _rpcSer, Portname: rpcPort}
19+
require.NoError(t, err)
20+
t.Cleanup(func() { rpcSer.Close() })
21+
in := msgpack.NewDecoder(rpcSer)
22+
out := msgpack.NewEncoder(rpcSer)
23+
out.UseCompactInts(true)
24+
25+
// Connect to the Debug serial port
26+
debugSer, err := serial.Open(debugPort, &serial.Mode{BaudRate: 115200})
27+
require.NoError(t, err)
28+
t.Cleanup(func() { debugSer.Close() })
29+
expectDebug := func(s string) { Expect(t, debugSer, s) }
30+
31+
// Timeout fallback: close the connection after 10 seconds, if the test do not go through
32+
go func() {
33+
time.Sleep(10 * time.Second)
34+
rpcSer.Close()
35+
debugSer.Close()
36+
}()
37+
38+
// 1: Receive an RPC call to the "mult" method with 2 arguments
39+
// and send back the result
40+
t.Run("RPCClientCallFloatArgs", func(t *testing.T) {
41+
arr, err := in.DecodeSlice()
42+
require.NoError(t, err)
43+
require.Equal(t, []any{int8(0), int8(1), "mult", []any{2.0, 3.0}}, arr)
44+
err = out.Encode([]any{1, 1, nil, 6.0})
45+
require.NoError(t, err)
46+
expectDebug("mult(2.0, 3.0)\r\n")
47+
expectDebug("-> 6.00\r\n")
48+
})
49+
50+
// 2: Receive an RPC call to the "mult" method with 1 argument (wrong number of arguments)
51+
// and send back an error with [int, string] format
52+
t.Run("RPCClientCallFloatArgsError", func(t *testing.T) {
53+
arr, err := in.DecodeSlice()
54+
require.NoError(t, err)
55+
require.Equal(t, []any{int8(0), int8(2), "mult", []any{2.0}}, arr)
56+
err = out.Encode([]any{1, 2, []any{1, "missing parameter"}, nil})
57+
require.NoError(t, err)
58+
expectDebug("mult(2.0)\r\n")
59+
expectDebug("-> error\r\n")
60+
})
61+
62+
// 3, 4: Receive an RPC call to the "or" method with 1 or 2 arguments
63+
// and send back the result
64+
t.Run("RPCClientCallBoolArgs", func(t *testing.T) {
65+
arr, err := in.DecodeSlice()
66+
require.NoError(t, err)
67+
require.Equal(t, []any{int8(0), int8(3), "or", []any{true, false}}, arr)
68+
err = out.Encode([]any{1, 3, nil, true})
69+
require.NoError(t, err)
70+
expectDebug("or(true, false)\r\n")
71+
expectDebug("-> true\r\n")
72+
73+
arr, err = in.DecodeSlice()
74+
require.NoError(t, err)
75+
require.Equal(t, []any{int8(0), int8(4), "or", []any{false}}, arr)
76+
err = out.Encode([]any{1, 4, nil, false})
77+
require.NoError(t, err)
78+
expectDebug("or(false)\r\n")
79+
expectDebug("-> false\r\n")
80+
})
81+
82+
// 5: Receive an RPC call to the "mult" method with 1 argument (wrong number of arguments)
83+
// and send back an error with [int, string] format with a long string
84+
t.Run("RPCClientCallFloatArgsErrorWithLongString", func(t *testing.T) {
85+
arr, err := in.DecodeSlice()
86+
require.NoError(t, err)
87+
require.Equal(t, []any{int8(0), int8(5), "mult", []any{2.0}}, arr)
88+
err = out.Encode([]any{1, 5, []any{2, "method get_led_state not available"}, nil})
89+
require.NoError(t, err)
90+
expectDebug("mult(2.0)\r\n")
91+
expectDebug("-> error\r\n")
92+
})
93+
94+
// RPC: Receive an RPC call to the "mult" method with 1 argument (wrong number of arguments)
95+
// and send back a custom error without [int, string] format
96+
// t.Run("RPCClientCallFloatArgsErrorCustom", func(t *testing.T) {
97+
// arr, err := in.DecodeSlice()
98+
// require.NoError(t, err)
99+
// require.Equal(t, []any{int8(0), int8(3), "mult", []any{2.0}}, arr)
100+
// err = out.Encode([]any{1, 3, "missing parameter", nil})
101+
// require.NoError(t, err)
102+
// expectDebug("mult(2.0)\r\n")
103+
// expectDebug("-> error\r\n")
104+
// })
105+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package testsuite
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/require"
8+
"github.com/vmihailenco/msgpack/v5"
9+
"go.bug.st/serial"
10+
)
11+
12+
func TestRPCServer(t *testing.T) {
13+
// Get the upload port to upload the sketch
14+
rpcPort, debugPort := UploadSketchAndGetRPCAndDebugPorts(t)
15+
16+
// Connect to the RPC serial port
17+
_rpcSer, err := serial.Open(rpcPort, &serial.Mode{BaudRate: 115200})
18+
rpcSer := &DebugStream{Upstream: _rpcSer, Portname: rpcPort}
19+
require.NoError(t, err)
20+
t.Cleanup(func() { rpcSer.Close() })
21+
in := msgpack.NewDecoder(rpcSer)
22+
out := msgpack.NewEncoder(rpcSer)
23+
out.UseCompactInts(true)
24+
25+
// Connect to the Debug serial port
26+
debugSer, err := serial.Open(debugPort, &serial.Mode{BaudRate: 115200})
27+
require.NoError(t, err)
28+
t.Cleanup(func() { debugSer.Close() })
29+
expectDebug := func(s string) { Expect(t, debugSer, s) }
30+
31+
// Timeout fallback: close the connection after 10 seconds, if the test do not go through
32+
go func() {
33+
time.Sleep(10 * time.Second)
34+
rpcSer.Close()
35+
debugSer.Close()
36+
}()
37+
38+
// 1: Send an RPC call to the "add" method with 2 arguments
39+
// and get back the result
40+
t.Run("RPCServerCallIntArgs", func(t *testing.T) {
41+
err = out.Encode([]any{0, 1, "add", []any{2, 3}})
42+
require.NoError(t, err)
43+
expectDebug("add(2, 3)\r\n")
44+
arr, err := in.DecodeSlice()
45+
require.NoError(t, err)
46+
require.Equal(t, []any{int8(1), int8(1), nil, int8(5)}, arr)
47+
})
48+
49+
// 2, 3: Send the same RPC call with 1 and 3 arguments, and get back the error
50+
t.Run("RPCServerCallWrongIntArgsCount", func(t *testing.T) {
51+
err = out.Encode([]any{0, 2, "add", []any{2}})
52+
require.NoError(t, err)
53+
arr, err := in.DecodeSlice()
54+
require.NoError(t, err)
55+
require.Equal(t, []any{
56+
int8(1),
57+
int8(2),
58+
[]any{uint8(253), "Missing call parameters (WARNING: Default param resolution is not implemented)"},
59+
nil,
60+
}, arr)
61+
62+
err = out.Encode([]any{0, 3, "add", []any{2, 3, 4}})
63+
require.NoError(t, err)
64+
arr, err = in.DecodeSlice()
65+
require.NoError(t, err)
66+
require.Equal(t, []any{
67+
int8(1),
68+
int8(3),
69+
[]any{uint8(253), "Too many parameters"},
70+
nil,
71+
}, arr)
72+
})
73+
74+
// 4: Send an RPC call to the "greet" method
75+
t.Run("RPCServerCallNoArgsReturnString", func(t *testing.T) {
76+
err = out.Encode([]any{0, 4, "greet", []any{}})
77+
require.NoError(t, err)
78+
expectDebug("greet()\r\n")
79+
arr, err := in.DecodeSlice()
80+
require.NoError(t, err)
81+
require.Equal(t, []any{int8(1), int8(4), nil, "Hello World!"}, arr)
82+
})
83+
84+
// 5: Send an RPC call to the "loopback" method with 1 string argument
85+
t.Run("RPCServerCallStringArgsReturnString", func(t *testing.T) {
86+
err = out.Encode([]any{0, 5, "loopback", []any{"Hello World!"}})
87+
require.NoError(t, err)
88+
expectDebug("loopback(\"Hello World!\")\r\n")
89+
arr, err := in.DecodeSlice()
90+
require.NoError(t, err)
91+
require.Equal(t, []any{int8(1), int8(5), nil, "Hello World!"}, arr)
92+
})
93+
}

0 commit comments

Comments
 (0)