279e266a6df22f3481b1a3a84fa47b776c057dd0
[platform/upstream/connectedhomeip.git] / third_party / openthread / repo / tests / scripts / thread-cert / Cert_6_1_06_REEDAttachLinkQuality_SED.py
1 #!/usr/bin/env python3
2 #
3 #  Copyright (c) 2019, The OpenThread Authors.
4 #  All rights reserved.
5 #
6 #  Redistribution and use in source and binary forms, with or without
7 #  modification, are permitted provided that the following conditions are met:
8 #  1. Redistributions of source code must retain the above copyright
9 #     notice, this list of conditions and the following disclaimer.
10 #  2. Redistributions in binary form must reproduce the above copyright
11 #     notice, this list of conditions and the following disclaimer in the
12 #     documentation and/or other materials provided with the distribution.
13 #  3. Neither the name of the copyright holder nor the
14 #     names of its contributors may be used to endorse or promote products
15 #     derived from this software without specific prior written permission.
16 #
17 #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 #  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 #  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 #  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 #  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 #  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 #  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 #  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 #  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 #  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 #  POSSIBILITY OF SUCH DAMAGE.
28 #
29
30 import unittest
31
32 import config
33 import mle
34 import thread_cert
35
36 LEADER = 1
37 REED = 2
38 ROUTER2 = 3
39 SED = 4
40
41
42 class Cert_6_1_6_REEDAttachLinkQuality_SED(thread_cert.TestCase):
43     TOPOLOGY = {
44         LEADER: {
45             'mode': 'rsdn',
46             'panid': 0xface,
47             'whitelist': [REED, ROUTER2]
48         },
49         REED: {
50             'mode': 'rsdn',
51             'panid': 0xface,
52             'router_upgrade_threshold': 0,
53             'whitelist': [LEADER, SED]
54         },
55         ROUTER2: {
56             'mode': 'rsdn',
57             'panid': 0xface,
58             'router_selection_jitter': 1,
59             'whitelist': [LEADER, (SED, -85)]
60         },
61         SED: {
62             'is_mtd': True,
63             'mode': 's',
64             'panid': 0xface,
65             'timeout': config.DEFAULT_CHILD_TIMEOUT,
66             'whitelist': [REED, ROUTER2]
67         },
68     }
69
70     def test(self):
71         self.nodes[LEADER].start()
72         self.simulator.go(5)
73         self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
74
75         self.nodes[REED].start()
76         self.simulator.go(5)
77         self.assertEqual(self.nodes[REED].get_state(), 'child')
78
79         self.nodes[ROUTER2].start()
80         self.simulator.go(5)
81         self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
82
83         self.nodes[SED].start()
84         self.simulator.go(10)
85         self.assertEqual(self.nodes[SED].get_state(), 'child')
86         self.assertEqual(self.nodes[REED].get_state(), 'router')
87
88         leader_messages = self.simulator.get_messages_sent_by(LEADER)
89         reed_messages = self.simulator.get_messages_sent_by(REED)
90         sed_messages = self.simulator.get_messages_sent_by(SED)
91         router2_messages = self.simulator.get_messages_sent_by(ROUTER2)
92
93         # 1 - Leader. REED1, Router2
94         leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
95
96         reed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
97         leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
98
99         reed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
100         leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
101
102         router2_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
103         leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
104
105         router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
106         leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
107
108         msg = router2_messages.next_coap_message("0.02")
109         msg.assertCoapMessageRequestUriPath("/a/as")
110
111         msg = leader_messages.next_coap_message("2.04")
112
113         router2_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
114
115         # 3 - SED
116         msg = sed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
117         msg.assertSentWithHopLimit(255)
118         msg.assertSentToDestinationAddress("ff02::2")
119         msg.assertMleMessageContainsTlv(mle.Mode)
120         msg.assertMleMessageContainsTlv(mle.Challenge)
121         msg.assertMleMessageContainsTlv(mle.ScanMask)
122         msg.assertMleMessageContainsTlv(mle.Version)
123
124         scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask)
125         self.assertEqual(1, scan_mask_tlv.router)
126         self.assertEqual(0, scan_mask_tlv.end_device)
127
128         # 4 - Router2
129         msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
130         msg.assertSentToNode(self.nodes[SED])
131
132         # 5 - SED
133         msg = sed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
134         msg.assertSentWithHopLimit(255)
135         msg.assertSentToDestinationAddress("ff02::2")
136         msg.assertMleMessageContainsTlv(mle.Mode)
137         msg.assertMleMessageContainsTlv(mle.Challenge)
138         msg.assertMleMessageContainsTlv(mle.ScanMask)
139         msg.assertMleMessageContainsTlv(mle.Version)
140
141         scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask)
142         self.assertEqual(1, scan_mask_tlv.router)
143         self.assertEqual(1, scan_mask_tlv.end_device)
144
145         # 6 - REED
146         msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
147         msg.assertSentToNode(self.nodes[SED])
148
149         msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
150         msg.assertSentToNode(self.nodes[SED])
151
152         # 7 - SED
153         msg = sed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
154         msg.assertMleMessageContainsTlv(mle.AddressRegistration)
155         msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
156         msg.assertMleMessageContainsTlv(mle.Mode)
157         msg.assertMleMessageContainsTlv(mle.Response)
158         msg.assertMleMessageContainsTlv(mle.Timeout)
159         msg.assertMleMessageContainsTlv(mle.TlvRequest)
160         msg.assertMleMessageContainsTlv(mle.Version)
161         msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter)
162         msg.assertSentToNode(self.nodes[REED])
163
164         msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
165         msg.assertSentToNode(self.nodes[SED])
166
167
168 if __name__ == '__main__':
169     unittest.main()