3 # Copyright (c) 2019, The OpenThread Authors.
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.
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.
42 class Cert_6_1_6_REEDAttachLinkQuality_SED(thread_cert.TestCase):
47 'whitelist': [REED, ROUTER2]
52 'router_upgrade_threshold': 0,
53 'whitelist': [LEADER, SED]
58 'router_selection_jitter': 1,
59 'whitelist': [LEADER, (SED, -85)]
65 'timeout': config.DEFAULT_CHILD_TIMEOUT,
66 'whitelist': [REED, ROUTER2]
71 self.nodes[LEADER].start()
73 self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
75 self.nodes[REED].start()
77 self.assertEqual(self.nodes[REED].get_state(), 'child')
79 self.nodes[ROUTER2].start()
81 self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
83 self.nodes[SED].start()
85 self.assertEqual(self.nodes[SED].get_state(), 'child')
86 self.assertEqual(self.nodes[REED].get_state(), 'router')
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)
93 # 1 - Leader. REED1, Router2
94 leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
96 reed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
97 leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
99 reed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
100 leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
102 router2_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
103 leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
105 router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
106 leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
108 msg = router2_messages.next_coap_message("0.02")
109 msg.assertCoapMessageRequestUriPath("/a/as")
111 msg = leader_messages.next_coap_message("2.04")
113 router2_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
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)
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)
129 msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
130 msg.assertSentToNode(self.nodes[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)
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)
146 msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
147 msg.assertSentToNode(self.nodes[SED])
149 msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
150 msg.assertSentToNode(self.nodes[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])
164 msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
165 msg.assertSentToNode(self.nodes[SED])
168 if __name__ == '__main__':