6d96b548023533f7b9c9acf3d88e8260cabe9c19
[platform/upstream/connectedhomeip.git] / third_party / openthread / repo / tests / scripts / thread-cert / Cert_6_1_06_REEDAttachLinkQuality_ED.py
1 #!/usr/bin/env python3
2 #
3 #  Copyright (c) 2016, 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 mle
33 import thread_cert
34
35 LEADER = 1
36 REED = 2
37 ROUTER2 = 3
38 ED = 4
39
40
41 class Cert_6_1_6_REEDAttachLinkQuality_ED(thread_cert.TestCase):
42     TOPOLOGY = {
43         LEADER: {
44             'mode': 'rsdn',
45             'panid': 0xface,
46             'whitelist': [REED, ROUTER2]
47         },
48         REED: {
49             'mode': 'rsdn',
50             'panid': 0xface,
51             'router_upgrade_threshold': 0,
52             'whitelist': [LEADER, ED]
53         },
54         ROUTER2: {
55             'mode': 'rsdn',
56             'panid': 0xface,
57             'router_selection_jitter': 1,
58             'whitelist': [LEADER, (ED, -85)]
59         },
60         ED: {
61             'is_mtd': True,
62             'mode': 'rsn',
63             'panid': 0xface,
64             'whitelist': [REED, ROUTER2]
65         },
66     }
67
68     def test(self):
69         self.nodes[LEADER].start()
70         self.simulator.go(5)
71         self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
72
73         self.nodes[REED].start()
74         self.simulator.go(5)
75         self.assertEqual(self.nodes[REED].get_state(), 'child')
76
77         self.nodes[ROUTER2].start()
78         self.simulator.go(5)
79         self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
80
81         self.nodes[ED].start()
82         self.simulator.go(10)
83         self.assertEqual(self.nodes[ED].get_state(), 'child')
84         self.assertEqual(self.nodes[REED].get_state(), 'router')
85
86         leader_messages = self.simulator.get_messages_sent_by(LEADER)
87         reed_messages = self.simulator.get_messages_sent_by(REED)
88         ed_messages = self.simulator.get_messages_sent_by(ED)
89         router2_messages = self.simulator.get_messages_sent_by(ROUTER2)
90
91         # 1 - Leader. REED1, Router2
92         leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
93
94         reed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
95         leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
96
97         reed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
98         leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
99
100         router2_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
101         leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
102
103         router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
104         leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
105
106         msg = router2_messages.next_coap_message("0.02")
107         msg.assertCoapMessageRequestUriPath("/a/as")
108
109         msg = leader_messages.next_coap_message("2.04")
110
111         router2_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
112
113         # 3 - ED
114         msg = ed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
115         msg.assertSentWithHopLimit(255)
116         msg.assertSentToDestinationAddress("ff02::2")
117         msg.assertMleMessageContainsTlv(mle.Mode)
118         msg.assertMleMessageContainsTlv(mle.Challenge)
119         msg.assertMleMessageContainsTlv(mle.ScanMask)
120         msg.assertMleMessageContainsTlv(mle.Version)
121
122         scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask)
123         self.assertEqual(1, scan_mask_tlv.router)
124         self.assertEqual(0, scan_mask_tlv.end_device)
125
126         # 4 - Router2
127         msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
128         msg.assertSentToNode(self.nodes[ED])
129
130         # 5 - ED
131         msg = ed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
132         msg.assertSentWithHopLimit(255)
133         msg.assertSentToDestinationAddress("ff02::2")
134         msg.assertMleMessageContainsTlv(mle.Mode)
135         msg.assertMleMessageContainsTlv(mle.Challenge)
136         msg.assertMleMessageContainsTlv(mle.ScanMask)
137         msg.assertMleMessageContainsTlv(mle.Version)
138
139         scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask)
140         self.assertEqual(1, scan_mask_tlv.router)
141         self.assertEqual(1, scan_mask_tlv.end_device)
142
143         # 6 - REED
144         msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
145         msg.assertSentToNode(self.nodes[ED])
146
147         msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
148         msg.assertSentToNode(self.nodes[ED])
149
150         # 7 - ED
151         msg = ed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
152         msg.assertMleMessageContainsTlv(mle.AddressRegistration)
153         msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
154         msg.assertMleMessageContainsTlv(mle.Mode)
155         msg.assertMleMessageContainsTlv(mle.Response)
156         msg.assertMleMessageContainsTlv(mle.Timeout)
157         msg.assertMleMessageContainsTlv(mle.TlvRequest)
158         msg.assertMleMessageContainsTlv(mle.Version)
159         msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter)
160         msg.assertSentToNode(self.nodes[REED])
161
162         msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
163         msg.assertSentToNode(self.nodes[ED])
164
165
166 if __name__ == '__main__':
167     unittest.main()