mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #8342 from JuhPuur/icetea_missing_test_doc
Icetea missing test docpull/8837/head
commit
30520c9513
|
|
@ -10,5 +10,6 @@ Testcases
|
||||||
|
|
||||||
Current testcases:
|
Current testcases:
|
||||||
|
|
||||||
- [netsocket](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/testcases/netsocket)
|
- [`netsocket`](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/testcases/netsocket)
|
||||||
- [example](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/testcases/example)
|
- [`example`](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/testcases/example)
|
||||||
|
- [`nanostack_mac_tester`](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/testcases/nanostack_mac_tester)
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,16 @@
|
||||||
Example tests
|
##Example tests
|
||||||
=============
|
|
||||||
|
|
||||||
This folder contains example tests for Icetea
|
This folder contains example tests for Icetea
|
||||||
The test located under this folder is dependent of the application [exampleapp](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/device/exampleapp)
|
The test located under this folder is dependent of the application [`exampleapp`](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/device/exampleapp)
|
||||||
The exampleapp is disabled by default, to be able to run the test_cmdline with the exampleapp, either remove the preprocessor macro from exampleapp.cpp or add `-DICETEA_EXAMPLE_ENABLED` to the mbed test command
|
The exampleapp is disabled by default, to be able to run the test_cmdline with the exampleapp, either remove the preprocessor macro from exampleapp.cpp or add `-DICETEA_EXAMPLE_ENABLED` to the mbed test command
|
||||||
|
|
||||||
Testcases
|
## Test cases
|
||||||
---------
|
|
||||||
|
|
||||||
### test_cmdline
|
### `test_cmdline`
|
||||||
|
|
||||||
**Description:**
|
**Description:**
|
||||||
Send command line commands to target over serial interface.
|
Send command line commands to target over serial interface.
|
||||||
This test introduces the Icetea testcase structure to the user.
|
This test introduces the Icetea test case structure to the user.
|
||||||
|
|
||||||
**Test steps:**
|
**Test steps:**
|
||||||
Send "echo hello world" to the target.
|
Send "echo hello world" to the target.
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,9 @@ class Testcase(Bench):
|
||||||
self.lock_th = threading.Lock()
|
self.lock_th = threading.Lock()
|
||||||
self.payload = "01234567890123456789012345678901234567890123456789"
|
self.payload = "01234567890123456789012345678901234567890123456789"
|
||||||
|
|
||||||
|
# Start PAN coordinator
|
||||||
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
||||||
|
# Start PAN beacon
|
||||||
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
self.command("Third", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Third", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
|
|
||||||
|
|
@ -90,12 +92,17 @@ class Testcase(Bench):
|
||||||
channels = range(11,27)
|
channels = range(11,27)
|
||||||
for i in range(0, 3):
|
for i in range(0, 3):
|
||||||
self.lock_th.acquire()
|
self.lock_th.acquire()
|
||||||
|
# Reset MAC settings
|
||||||
self.command("First", "mlme-reset")
|
self.command("First", "mlme-reset")
|
||||||
|
# Start PAN coordinator
|
||||||
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
||||||
self.command("Third", "mlme-reset")
|
self.command("Third", "mlme-reset")
|
||||||
|
# Start PAN beacon
|
||||||
self.command("Third", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Third", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
self.lock_th.release()
|
self.lock_th.release()
|
||||||
|
# Scan all channels
|
||||||
self.command("Second", "scan --scan_type 0 --scan_duration 7 --channel_mask {}".format(self.mask_from_channel_list(channels)))
|
self.command("Second", "scan --scan_type 0 --scan_duration 7 --channel_mask {}".format(self.mask_from_channel_list(channels)))
|
||||||
|
# Energy detection analysis
|
||||||
self.command("Second", "analyze-ed --channel {} --above 100".format(self.channel))
|
self.command("Second", "analyze-ed --channel {} --above 100".format(self.channel))
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,298 @@
|
||||||
|
## Nanostack MAC RF tests
|
||||||
|
|
||||||
|
This folder contains nanostack MAC RF tests for Icetea.
|
||||||
|
The test located under this folder is dependent of the application [`nanostack_mac_tester`](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/device/nanostack_mac_tester).
|
||||||
|
The nanostack MAC tester is disabled by default. To run the test cases with the application, either remove the preprocessor macro from main.cpp or add `-DICETEA_MAC_TESTER_ENABLED` to the `mbed test` command.
|
||||||
|
|
||||||
|
Icetea test cases are processed by passing commands through the `mbed-client-cli` command line. It is possible to manually replicate most test cases by following the instructions below.
|
||||||
|
|
||||||
|
In test cases with more than one device under test (DUT) the target device is given in the instructions as DUT1, DUT2 or DUT3.
|
||||||
|
|
||||||
|
## Test cases
|
||||||
|
|
||||||
|
### `address_read_and_write`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Write addresses to MAC interface, verify successful write.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. Set 64-bit MAC address to 01:02:03:00:00:00:00:01:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:01`
|
||||||
|
2. Set 16-bit MAC address to 0xABCD:
|
||||||
|
`addr --16-bit 0xABCD`
|
||||||
|
3. Set MAC PAN ID to 0xCDCD:
|
||||||
|
`mlme-set --attr 0x50 --value_bytes CD:CD --value_size 2`
|
||||||
|
4. Read and verify 64-bit address:
|
||||||
|
`addr`
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
The address that was read is the same as the one that was written.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `create_and_join_PAN`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Create two Personal Area Networks (PAN) and verify beacon transmission.
|
||||||
|
|
||||||
|
Requires 3 devices.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. All devices have 802.15.4 tranceivers and are in sufficient proximity.
|
||||||
|
2. RF channel and adjacent channel are sufficiently clear.
|
||||||
|
The RF channel is set in the test case method setUp(). The adjacent
|
||||||
|
channel is automatically the next higher one, except for channel 26,
|
||||||
|
where the adjacent channel becomes the next lower one. This is because
|
||||||
|
26 is the highest available of the 16 channels in the 2.4-GHz band.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. DUT1: Set MAC beacon payload to "mac-tester":
|
||||||
|
`mlme-set --attr 0x45 --value_ascii mac-tester --value_size 10`
|
||||||
|
2. DUT1: Set payload length:
|
||||||
|
`mlme-set --attr 0x46 --value_uint8 10 --value_size 1`
|
||||||
|
3. DUT2: Set MAC beacon payload to "second-mac-tester":
|
||||||
|
`mlme-set --attr 0x45 --value_ascii second-mac-tester --value_size 17`
|
||||||
|
4. DUT2: Set payload length:
|
||||||
|
`mlme-set --attr 0x46 --value_uint8 17 --value_size 1`
|
||||||
|
5. DUT1: Start PAN coordinator in chosen channel:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel 1>`
|
||||||
|
6. DUT2: Start PAN coordinator in adjacent channel:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel 2>`
|
||||||
|
7. DUT3: Scan with channel mask:
|
||||||
|
`scan --channel_mask <hex channel mask>`
|
||||||
|
Channel mask is given as a left bitshifted channel number in hexadecimal format.
|
||||||
|
For channels 11 and 12, the channel mask becomes 0x1800.
|
||||||
|
8. DUT3: Search beacon data for DUT1's beacon:
|
||||||
|
`find-beacon --data mac-tester`
|
||||||
|
9. DUT3: Search beacon data for DUT2's beacon:
|
||||||
|
`find-beacon --data second-mac-tester`
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
DUT1 and DUT2 start beacon transmissions on respective channels.
|
||||||
|
|
||||||
|
DUT3 receives and parses beacon transmissions.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `ED_scan`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Perform Energy Detection (ED) scan to find Personal Area Networks (PAN).
|
||||||
|
|
||||||
|
The test case requires that a lot of data is sent on the RF channel. In the test case
|
||||||
|
this is done automatically at a rate that is hard to perform manually, which makes
|
||||||
|
it difficult to run the test case manually.
|
||||||
|
|
||||||
|
Requires 3 devices.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. All devices have 802.15.4 tranceivers and are in sufficient proximity.
|
||||||
|
2. RF channel is sufficiently clear.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. Set addresses for devices:
|
||||||
|
DUT1: `addr --64-bit 01:02:03:00:00:00:00:01`
|
||||||
|
DUT2: `addr --64-bit 01:02:03:00:00:00:00:02`
|
||||||
|
DUT3: `addr --64-bit 01:02:03:00:00:00:00:03`
|
||||||
|
2. DUT1: Start PAN coordinator:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel>`
|
||||||
|
3. DUT2,DUT3: Start PAN beacon:
|
||||||
|
`start --pan_coordinator false --logical_channel <channel>`
|
||||||
|
4. (optional) Silence beacon traces:
|
||||||
|
`silent-mode on`
|
||||||
|
5. Start repeatedly sending data between DUT1 and DUT3:
|
||||||
|
DUT1: `data --dst_addr 01:02:03:00:00:00:00:03 --msdu <payload> --msdu_length <payload_length> --wait_for_confirm false`
|
||||||
|
DUT3: `data --dst_addr 01:02:03:00:00:00:00:01 --msdu <payload> --msdu_length <payload_length> --wait_for_confirm false`
|
||||||
|
In the test case this repeats every 100ms.
|
||||||
|
6. DUT1,DUT3: Reset MAC settings:
|
||||||
|
`mlme-reset`
|
||||||
|
7. DUT1: Start PAN coordinator:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel>`
|
||||||
|
8. DUT3: Start PAN beacon:
|
||||||
|
`start --pan_coordinator false --logical_channel <channel>`
|
||||||
|
9. DUT2: Scan channels 11-26:
|
||||||
|
`scan --scan_type 0 --scan_duration 7 --channel_mask 0x7fff800`
|
||||||
|
Channel mask is given as a left bitshifted channel numbers in hexadecimal format.
|
||||||
|
10. DUT2: Do Energy Detection analysis on data:
|
||||||
|
`analyze-ed --channel <channel> --above 100`
|
||||||
|
|
||||||
|
Test case repeats steps 5 to 10 three times.
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
Devices start beacon transmissions and send data on channel.
|
||||||
|
|
||||||
|
DUT2 scans channels for activity, and verifies that ED value for test channel is above 100.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `send_data`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Send data between two devices over single RF hop.
|
||||||
|
|
||||||
|
Requires 2 devices.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. All devices have 802.15.4 tranceivers and are in sufficient proximity.
|
||||||
|
2. RF channel is sufficiently clear.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. DUT1: Set 64-bit MAC address to 01:02:03:00:00:00:00:01:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:01`
|
||||||
|
2. DUT2: Set 64-bit MAC address to 01:02:03:00:00:00:00:02:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:02`
|
||||||
|
3. DUT1: Start PAN coordinator:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel>`
|
||||||
|
4. DUT2: Start PAN beacon:
|
||||||
|
`start --pan_coordinator false --logical_channel <channel>`
|
||||||
|
5. DUT1: Send data to DUT2:
|
||||||
|
`data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length 5 --msdu abcde`
|
||||||
|
6. DUT1: Send data to DUT2:
|
||||||
|
`data --dst_addr 01:02:03:00:00:00:00:01 --msdu_length 5 --msdu 12345`
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
Data send commands succeeds.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `send_data_indirect`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Send data between two devices over two RF hops with one relay.
|
||||||
|
|
||||||
|
Requires 3 devices.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. All devices have 802.15.4 tranceivers and are in sufficient proximity.
|
||||||
|
2. RF channel is sufficiently clear.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. DUT1: Set 64-bit MAC address to 01:02:03:00:00:00:00:01:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:01`
|
||||||
|
2. DUT2: Set 64-bit MAC address to 01:02:03:00:00:00:00:02:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:02`
|
||||||
|
3. DUT3: Set 64-bit MAC address to 01:02:03:00:00:00:00:03:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:03`
|
||||||
|
4. DUT1: Start PAN coordinator:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel>`
|
||||||
|
5. DUT2: Start PAN beacon:
|
||||||
|
`start --pan_coordinator false --logical_channel <channel>`
|
||||||
|
6. DUT3: Start PAN beacon:
|
||||||
|
`start --pan_coordinator false --logical_channel <channel>`
|
||||||
|
7. DUT2,DUT3: Set MAC RX on-while-idle off:
|
||||||
|
`mlme-set --attr 0x52 --value_uint8 0 --value_size 1`
|
||||||
|
8. DUT1: Add DUT2 and DUT3 as neighbours:
|
||||||
|
`add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:02 --pan_id 0x1234 --index 0`
|
||||||
|
`add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:03 --pan_id 0x1234 --index 1`
|
||||||
|
9. DUT2,DUT3: Add DUT1 as neighbour:
|
||||||
|
`add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:01 --pan_id 0x1234 --index 0`
|
||||||
|
10. DUT2: Configure indirect data:
|
||||||
|
`config-status --data_ind abcde`
|
||||||
|
10. DUT3: Configure indirect data:
|
||||||
|
`config-status --data_ind 12345`
|
||||||
|
11. DUT1,DUT2,DUT3: Mute traces (can cause timing issues):
|
||||||
|
`silent-mode on`
|
||||||
|
12. DUT1: Send data indirectly to DUT2:
|
||||||
|
`data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length 5 --msdu abcde --indirect_tx true --wait_for_confirm false`
|
||||||
|
13. DUT2: Poll DUT1 (coordinator) for data:
|
||||||
|
`poll --coord_address 01:02:03:00:00:00:00:01`
|
||||||
|
14. DUT1: Resend data twice:
|
||||||
|
`data`
|
||||||
|
`data`
|
||||||
|
15. DUT2: Poll data twice:
|
||||||
|
`poll`
|
||||||
|
`poll`
|
||||||
|
16. DUT2: Set expected poll return status to 0xEB (No data after poll):
|
||||||
|
`config-status --poll 235")`
|
||||||
|
17. DUT2: Expected fail for poll command:
|
||||||
|
`poll`
|
||||||
|
16. DUT2: Set expected poll return status to 0xEB (No data after poll):
|
||||||
|
`config-status --poll 235")`
|
||||||
|
17. DUT1: Send data indirectly to DUT3 (other values set before are preserved):
|
||||||
|
`data --dst_addr 01:02:03:00:00:00:00:03 --msdu 12345`
|
||||||
|
19. DUT2: Expected fail for poll command:
|
||||||
|
`poll`
|
||||||
|
20. DUT3: Poll DUT1 (coordinator) for data:
|
||||||
|
`poll --coord_address 01:02:03:00:00:00:00:01`
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
DUT2 receives data from DUT1 when polling after send.
|
||||||
|
|
||||||
|
DUT2 does not receive data from DUT1 when no data available.
|
||||||
|
|
||||||
|
DUT2 does not receive data from DUT1 when data available for DUT3.
|
||||||
|
|
||||||
|
DUT3 receives data from DUT1 when polling after send.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `send_large_payloads`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Send large payloads between two devices.
|
||||||
|
|
||||||
|
Requires 2 devices.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. All devices have 802.15.4 tranceivers and are in sufficient proximity.
|
||||||
|
2. RF channel is sufficiently clear.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. DUT1: Set 64-bit MAC address to 01:02:03:00:00:00:00:01:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:01`
|
||||||
|
2. DUT2: Set 64-bit MAC address to 01:02:03:00:00:00:00:02:
|
||||||
|
`addr --64-bit 01:02:03:00:00:00:00:02`
|
||||||
|
3. DUT1: Start PAN coordinator:
|
||||||
|
`start --pan_coordinator true --logical_channel <channel>`
|
||||||
|
4. DUT2: Start PAN beacon:
|
||||||
|
`start --pan_coordinator false --logical_channel <channel>`
|
||||||
|
5. Create large payload:
|
||||||
|
104 characters, headers are 2+1+2+8+8+2=23 bytes, resulting in a packet size of 127 (max):
|
||||||
|
`large_payload = "0123456789abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZZZZZZZZZ0123456789012345678901234567891234"`
|
||||||
|
6. DUT1,DUT2: Set indirect data:
|
||||||
|
`config-status --data_ind <large_payload>`
|
||||||
|
7. DUT1: Send payload:
|
||||||
|
`data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length <large_payload length> --msdu <large_payload>`
|
||||||
|
8. DUT2: wait for transmission to finish:
|
||||||
|
`wait --timeout 500`
|
||||||
|
9. DUT2: send data :
|
||||||
|
`data --dst_addr 01:02:03:00:00:00:00:01 --msdu_length <large_payload length> --msdu <large_payload>`
|
||||||
|
10. DUT1: wait for transmission to finish:
|
||||||
|
`wait --timeout 500`
|
||||||
|
11. DUT1,DUT2: Take turns waiting and transmitting:
|
||||||
|
`data`
|
||||||
|
`wait`
|
||||||
|
|
||||||
|
Test case repeats step 11 25 times for both devices.
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
Data send commands succeed.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
@ -56,7 +56,7 @@ class Testcase(Bench):
|
||||||
self.command("First", "addr")
|
self.command("First", "addr")
|
||||||
self.command("First", "addr --64-bit 01:02:03:00:00:00:00:01")
|
self.command("First", "addr --64-bit 01:02:03:00:00:00:00:01")
|
||||||
self.command("First", "addr --16-bit 0xABCD")
|
self.command("First", "addr --16-bit 0xABCD")
|
||||||
#macPANId
|
# Set MAC PAN ID
|
||||||
self.command("First", "mlme-set --attr 0x50 --value_bytes CD:CD --value_size 2")
|
self.command("First", "mlme-set --attr 0x50 --value_bytes CD:CD --value_size 2")
|
||||||
self.command("First", "addr")
|
self.command("First", "addr")
|
||||||
self.verify_trace(1, "MAC64: 01:02:03:00:00:00:00:01")
|
self.verify_trace(1, "MAC64: 01:02:03:00:00:00:00:01")
|
||||||
|
|
|
||||||
|
|
@ -61,13 +61,15 @@ class Testcase(Bench):
|
||||||
self.channel = 11
|
self.channel = 11
|
||||||
|
|
||||||
def case(self):
|
def case(self):
|
||||||
#Beacon payload & length
|
# Beacon payload
|
||||||
self.command("First", "mlme-set --attr 0x45 --value_ascii mac-tester --value_size 10")
|
self.command("First", "mlme-set --attr 0x45 --value_ascii mac-tester --value_size 10")
|
||||||
|
# Beacon payload length
|
||||||
self.command("First", "mlme-set --attr 0x46 --value_uint8 10 --value_size 1")
|
self.command("First", "mlme-set --attr 0x46 --value_uint8 10 --value_size 1")
|
||||||
|
|
||||||
self.command("Second", "mlme-set --attr 0x45 --value_ascii second-mac-tester --value_size 17")
|
self.command("Second", "mlme-set --attr 0x45 --value_ascii second-mac-tester --value_size 17")
|
||||||
self.command("Second", "mlme-set --attr 0x46 --value_uint8 17 --value_size 1")
|
self.command("Second", "mlme-set --attr 0x46 --value_uint8 17 --value_size 1")
|
||||||
|
|
||||||
|
# Start PAN coordinator
|
||||||
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
||||||
self.command("Second", "start --pan_coordinator true --logical_channel {}".format(int(self.channel)+1))
|
self.command("Second", "start --pan_coordinator true --logical_channel {}".format(int(self.channel)+1))
|
||||||
self.delay(3)
|
self.delay(3)
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,12 @@ class Testcase(Bench):
|
||||||
self.command("Second", "addr --64-bit 01:02:03:00:00:00:00:02")
|
self.command("Second", "addr --64-bit 01:02:03:00:00:00:00:02")
|
||||||
|
|
||||||
def case(self):
|
def case(self):
|
||||||
|
# Start PAN coordinator
|
||||||
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
||||||
|
# Start PAN beacon
|
||||||
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
|
|
||||||
|
# Send data
|
||||||
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length 5 --msdu abcde")
|
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length 5 --msdu abcde")
|
||||||
self.command("Second", "data --dst_addr 01:02:03:00:00:00:00:01 --msdu_length 5 --msdu 12345")
|
self.command("Second", "data --dst_addr 01:02:03:00:00:00:00:01 --msdu_length 5 --msdu 12345")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,37 +58,52 @@ class Testcase(Bench):
|
||||||
self.command("Third", "addr --64-bit 01:02:03:00:00:00:00:03")
|
self.command("Third", "addr --64-bit 01:02:03:00:00:00:00:03")
|
||||||
|
|
||||||
def case(self):
|
def case(self):
|
||||||
|
# Start PAN coordinator
|
||||||
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
||||||
|
# Start PAN beacon
|
||||||
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
self.command("Third", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Third", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
|
|
||||||
#macRxOnWhenIdle
|
# Set MAC RX on-while-idle off
|
||||||
self.command("Second", "mlme-set --attr 0x52 --value_uint8 0 --value_size 1")
|
self.command("Second", "mlme-set --attr 0x52 --value_uint8 0 --value_size 1")
|
||||||
self.command("Third", "mlme-set --attr 0x52 --value_uint8 0 --value_size 1")
|
self.command("Third", "mlme-set --attr 0x52 --value_uint8 0 --value_size 1")
|
||||||
|
|
||||||
|
# Add neighbours
|
||||||
self.command("First", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:02 --pan_id 0x1234 --index 0")
|
self.command("First", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:02 --pan_id 0x1234 --index 0")
|
||||||
self.command("First", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:03 --pan_id 0x1234 --index 1")
|
self.command("First", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:03 --pan_id 0x1234 --index 1")
|
||||||
self.command("Second", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:01 --pan_id 0x1234 --index 0")
|
self.command("Second", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:01 --pan_id 0x1234 --index 0")
|
||||||
self.command("Third", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:01 --pan_id 0x1234 --index 0")
|
self.command("Third", "add-neigh --frame_ctr 0 --mac16 0xFFFF --mac64 01:02:03:00:00:00:00:01 --pan_id 0x1234 --index 0")
|
||||||
|
|
||||||
|
# Configure indirect data
|
||||||
self.command("Second", "config-status --data_ind abcde")
|
self.command("Second", "config-status --data_ind abcde")
|
||||||
self.command("Third", "config-status --data_ind 12345")
|
self.command("Third", "config-status --data_ind 12345")
|
||||||
|
|
||||||
#Runs into timing issues if extensive printing is enabled
|
# Runs into timing issues if extensive printing is enabled
|
||||||
self.command("*", "silent-mode on")
|
self.command("*", "silent-mode on")
|
||||||
|
|
||||||
|
# Send data indirectly to DUT2
|
||||||
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length 5 --msdu abcde --indirect_tx true --wait_for_confirm false")
|
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length 5 --msdu abcde --indirect_tx true --wait_for_confirm false")
|
||||||
|
# Poll DUT1 for data
|
||||||
self.command("Second", "poll --coord_address 01:02:03:00:00:00:00:01")
|
self.command("Second", "poll --coord_address 01:02:03:00:00:00:00:01")
|
||||||
|
|
||||||
|
# Send more data
|
||||||
self.command("First", "data")
|
self.command("First", "data")
|
||||||
self.command("First", "data")
|
self.command("First", "data")
|
||||||
|
# Poll more data
|
||||||
self.command("Second", "poll")
|
self.command("Second", "poll")
|
||||||
self.command("Second", "poll")
|
self.command("Second", "poll")
|
||||||
|
# Set expected poll return status to 0xEB(no data after poll)
|
||||||
self.command("Second", "config-status --poll 235")
|
self.command("Second", "config-status --poll 235")
|
||||||
|
# No data should remain to be polled for
|
||||||
self.command("Second", "poll")
|
self.command("Second", "poll")
|
||||||
|
|
||||||
|
# Set expected poll return status to 0xEB(no data after poll)
|
||||||
self.command("Second", "config-status --poll 235")
|
self.command("Second", "config-status --poll 235")
|
||||||
|
# Send data to DUT3
|
||||||
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:03 --msdu 12345")
|
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:03 --msdu 12345")
|
||||||
|
# Poll(expected failure)
|
||||||
self.command("Second", "poll")
|
self.command("Second", "poll")
|
||||||
|
# Poll DUT1 for data(expected success)
|
||||||
self.command("Third", "poll --coord_address 01:02:03:00:00:00:00:01")
|
self.command("Third", "poll --coord_address 01:02:03:00:00:00:00:01")
|
||||||
self.command("*", "silent-mode off")
|
self.command("*", "silent-mode off")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,17 +58,25 @@ class Testcase(Bench):
|
||||||
def case(self):
|
def case(self):
|
||||||
#104 characters, headers are 2+1+2+8+8+2=23 bytes, resulting in a packet size of 127 (max)
|
#104 characters, headers are 2+1+2+8+8+2=23 bytes, resulting in a packet size of 127 (max)
|
||||||
large_payload = "0123456789abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZZZZZZZZZ0123456789012345678901234567891234"
|
large_payload = "0123456789abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZZZZZZZZZ0123456789012345678901234567891234"
|
||||||
|
# Start PAN coordinator
|
||||||
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
self.command("First", "start --pan_coordinator true --logical_channel {}".format(self.channel))
|
||||||
|
# Start PAN beacon
|
||||||
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
self.command("Second", "start --pan_coordinator false --logical_channel {}".format(self.channel))
|
||||||
|
|
||||||
|
# Set indirect data
|
||||||
self.command("First", "config-status --data_ind {}".format(large_payload))
|
self.command("First", "config-status --data_ind {}".format(large_payload))
|
||||||
self.command("Second", "config-status --data_ind {}".format(large_payload))
|
self.command("Second", "config-status --data_ind {}".format(large_payload))
|
||||||
|
|
||||||
|
# Send data to DUT2
|
||||||
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length {} --msdu {}".format(len(large_payload), large_payload))
|
self.command("First", "data --dst_addr 01:02:03:00:00:00:00:02 --msdu_length {} --msdu {}".format(len(large_payload), large_payload))
|
||||||
|
# Wait for transmission to finish
|
||||||
self.command("Second", "wait --timeout 500")
|
self.command("Second", "wait --timeout 500")
|
||||||
|
|
||||||
|
# Send data to DUT1
|
||||||
self.command("Second", "data --dst_addr 01:02:03:00:00:00:00:01 --msdu_length {} --msdu {}".format(len(large_payload), large_payload))
|
self.command("Second", "data --dst_addr 01:02:03:00:00:00:00:01 --msdu_length {} --msdu {}".format(len(large_payload), large_payload))
|
||||||
|
# Wait for transmission to finish
|
||||||
self.command("First", "wait --timeout 500")
|
self.command("First", "wait --timeout 500")
|
||||||
|
# Loop with previous settings
|
||||||
for i in range(0, 25):
|
for i in range(0, 25):
|
||||||
self.command("First", "data")
|
self.command("First", "data")
|
||||||
self.command("Second", "wait")
|
self.command("Second", "wait")
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,113 @@
|
||||||
Netsocket tests
|
##Netsocket tests
|
||||||
===============
|
|
||||||
|
|
||||||
This folder contains netsocket tests for Icetea
|
This folder contains netsocket tests for Icetea
|
||||||
The tests located under this folder are dependent of the application [socket_app](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/device/socket_app)
|
The tests located in this folder are dependent of the application [`socket_app`](https://github.com/ARMmbed/mbed-os/blob/master/TEST_APPS/device/socket_app)
|
||||||
|
|
||||||
The test cases under this folder are defined in [Network Socket test plan](https://github.com/ARMmbed/mbed-os/blob/master/TESTS/netsocket/README.md)
|
The test cases in this folder are similar to [Network Socket test plan](https://github.com/ARMmbed/mbed-os/blob/master/TESTS/netsocket/README.md).
|
||||||
|
|
||||||
|
Icetea test cases are processed by passing commands through the `mbed-client-cli` command line. It is possible to manually replicate most test cases by following the instructions below.
|
||||||
|
|
||||||
|
In test cases with more than one device under test (DUT) the target device is given in the instructions as DUT1, DUT2 or DUT3.
|
||||||
|
|
||||||
|
## Test cases
|
||||||
|
|
||||||
|
### `SOCKET_BIND_PORT`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Open and bind port.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. Network interface and stack are initialized.
|
||||||
|
2. Network connection is up.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. Create a object by calling `socket new TCPSocket` on device
|
||||||
|
2. Call `socket TCPSocket open`
|
||||||
|
3. Call `socket TCPSocket bind port <any non-used port number>`
|
||||||
|
4. Destroy socket `socket TCPSocket delete`
|
||||||
|
5. Create a object by calling `socket new UDPSocket` on device
|
||||||
|
6. Call `socket UDPSocket open`
|
||||||
|
7. Call `socket UDPSocket bind port <any non-used port number>`
|
||||||
|
8. Destroy socket `socket UDPSocket delete`
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `TCPSERVER_ACCEPT`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Test that `TCPServer::bind()`, `TCPServer::listen()`
|
||||||
|
and `TCPServer::accept()` works.
|
||||||
|
|
||||||
|
Requires 2 devices.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. Network interface and stack are initialized.
|
||||||
|
2. Network connection is up.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. DUT1: `socket new TCPServer`
|
||||||
|
Command returns server base socket ID
|
||||||
|
2. DUT1: `socket <base socket ID> open)`
|
||||||
|
3. DUT1: `socket <base socket ID> bind port <port>)`
|
||||||
|
4. DUT1: `socket <base socket ID> listen)`
|
||||||
|
5. DUT1: Create a new TCPSocket `socket new TCPSocket`
|
||||||
|
Command returns server socket ID
|
||||||
|
6. DUT1: `socket <server socket ID> open`
|
||||||
|
7. DUT2: Create a new TCPSocket `socket new TCPSocket`
|
||||||
|
Command returns client socket ID
|
||||||
|
8. DUT2: `socket <client socket ID> open`
|
||||||
|
9. DUT2: `socket <client socket ID> connect <dut1 IP> <port>`
|
||||||
|
10. DUT1: `socket <base socket id> accept <server socket id>`
|
||||||
|
Command should return new socket ID
|
||||||
|
11. DUT1: `socket <new socket ID> send hello`
|
||||||
|
12. DUT2: `socket <client socket ID> recv 5`
|
||||||
|
13. DUT2: Verify that it received "hello"
|
||||||
|
14. Destroy all sockets.
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
On DUT1 accept() call blocks until connection is received. Duration
|
||||||
|
of call verified to be within threshold.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
||||||
|
### `TCPSOCKET_ECHOTEST_BURST_SHORT`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
|
||||||
|
Send burst of packets to echo server and read incoming packets back.
|
||||||
|
|
||||||
|
**Preconditions:**
|
||||||
|
|
||||||
|
1. Network interface and stack are initialized.
|
||||||
|
2. Network connection is up.
|
||||||
|
3. TCPSocket is open.
|
||||||
|
|
||||||
|
**Test steps:**
|
||||||
|
|
||||||
|
1. Call `socket <socket ID> open`
|
||||||
|
2. Call `socket <socket ID> connect echo.mbedcloudtesting.com 7`
|
||||||
|
1. Create 5 randomized strings
|
||||||
|
(100, 200, 300, 120 and 500 characters)
|
||||||
|
2. Send each string `socket <socket ID> send <string>`
|
||||||
|
3. Receive total size of sent data
|
||||||
|
`socket <socket ID> recv <total size>`
|
||||||
|
4. Verify that received data is identical to sent data
|
||||||
|
3. Repeat 2 times
|
||||||
|
4. Destroy the socket
|
||||||
|
|
||||||
|
**Expected result:**
|
||||||
|
|
||||||
|
All send() calls should return the packet size.
|
||||||
|
|
||||||
|
The received data matches the sent data.
|
||||||
|
|
||||||
|
The test exits with status `PASS` without timeouts.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue