Coverage for test/d7a/d7anp/test_addressee.py: 98%

93 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2024-05-24 08:03 +0200

1# 

2# Copyright (c) 2015-2021 University of Antwerp, Aloxy NV. 

3# 

4# This file is part of pyd7a. 

5# See https://github.com/Sub-IoT/pyd7a for further info. 

6# 

7# Licensed under the Apache License, Version 2.0 (the "License"); 

8# you may not use this file except in compliance with the License. 

9# You may obtain a copy of the License at 

10# 

11# http://www.apache.org/licenses/LICENSE-2.0 

12# 

13# Unless required by applicable law or agreed to in writing, software 

14# distributed under the License is distributed on an "AS IS" BASIS, 

15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

16# See the License for the specific language governing permissions and 

17# limitations under the License. 

18# 

19 

20# author: Christophe VG <contact@christophe.vg> 

21# unit tests for the D7 ATP Addressee 

22 

23import unittest 

24 

25from d7a.d7anp.addressee import Addressee, IdType, NlsMethod 

26from d7a.types.ct import CT 

27 

28 

29class TestAddressee(unittest.TestCase): 

30 def test_default_constructor(self): 

31 Addressee() 

32 

33 def test_construction(self): 

34 Addressee(id_type=IdType.VID, id=0xFFFF) 

35 Addressee(id_type=IdType.UID, id=0xFFFFFFFFFFFFFF) 

36 

37 def test_id_length_of_nbid(self): 

38 addr = Addressee(id_type=IdType.NBID, id=CT(1)) 

39 self.assertEqual(addr.id_length, 1) 

40 

41 def test_id_length_of_noid(self): 

42 addr = Addressee(id_type=IdType.NOID, id=None) 

43 self.assertEqual(addr.id_length, 0) 

44 

45 def test_id_length_of_virtual_id(self): 

46 addr = Addressee(id_type=IdType.VID, id=0x0) 

47 self.assertEqual(addr.id_length, 2) 

48 

49 def test_id_length_of_universal_id(self): 

50 addr = Addressee(id_type=IdType.UID, id=0x0) 

51 self.assertEqual(addr.id_length, 8) 

52 

53 def test_id_type_property(self): 

54 addr = Addressee() 

55 self.assertEqual(addr.id_type, IdType.NOID) 

56 

57 def test_access_class_property(self): 

58 addr = Addressee(access_class=0xF) 

59 self.assertEqual(addr.access_class, 0xF) 

60 

61 def test_id_property(self): 

62 addr = Addressee(id_type=IdType.VID, id=0x1234) 

63 self.assertEqual(addr.id, 0x1234) 

64 

65 # negative tests 

66 

67 def test_addressee_id_is_positive_value(self): 

68 def bad(): addr = Addressee(id_type=IdType.UID, id=-1) 

69 self.assertRaises(ValueError, bad) 

70 def bad(): addr = Addressee(id_type=IdType.VID, id=-1) 

71 self.assertRaises(ValueError, bad) 

72 

73 def test_noid_id_consists_of_0_bytes(self): 

74 def bad(): addr = Addressee(id_type=IdType.NOID, id=0) 

75 self.assertRaises(ValueError, bad) 

76 

77 def test_nbid_id_should_be_ct(self): 

78 def bad(): addr = Addressee(id_type=IdType.NOID, id=0) 

79 self.assertRaises(ValueError, bad) 

80 

81 def bad(): addr = Addressee(id_type=IdType.NOID, id=CT(0)) 

82 self.assertRaises(ValueError, bad) 

83 

84 def test_nbid_id_consists_of_1_bytes(self): 

85 def bad(): addr = Addressee(id_type=IdType.NOID, id=0xFFFF) 

86 

87 self.assertRaises(ValueError, bad) 

88 

89 def test_virtual_addressee_id_consists_of_max_2_bytes(self): 

90 def bad(): addr = Addressee(id_type=IdType.VID,id=0x1FFFF) 

91 self.assertRaises(ValueError, bad) 

92 

93 def test_universal_addressee_id_consists_of_max_8_bytes(self): 

94 def bad(): addr = Addressee(id_type=IdType.UID, id=0x1FFFFFFFFFFFFFFFF) 

95 self.assertRaises(ValueError, bad) 

96 

97 def test_access_class_consists_of_max_8_bits(self): 

98 def bad(): addr = Addressee(access_class=0xFFFF) 

99 self.assertRaises(ValueError, bad) 

100 

101 def test_invalid_id_type(self): 

102 def bad(): addr = Addressee(id_type=0) 

103 self.assertRaises(ValueError, bad) 

104 

105 # byte generation 

106 

107 def test_byte_generation(self): 

108 tests = [ 

109 (Addressee(), '00010000'), # NOID 

110 (Addressee(id_type=IdType.NBID, id=CT(0)), '00000000'), 

111 (Addressee(id_type=IdType.VID, id=0), '00110000'), 

112 (Addressee(id_type=IdType.UID, id=0), '00100000'), 

113 (Addressee(id_type=IdType.NBID, id=CT(0), nls_method=NlsMethod.AES_CTR), '00000001') 

114 ] 

115 for test in tests: 

116 addressee_ctrl = bytearray(test[0])[0] 

117 self.assertEqual(addressee_ctrl, int(test[1], 2)) 

118 

119 bs = bytearray(Addressee(id_type=IdType.VID, id=0x1234, access_class=5)) 

120 self.assertEqual(len(bs), 4) 

121 self.assertEqual(bs[0], int('00110000', 2)) 

122 self.assertEqual(bs[1], 5) 

123 self.assertEqual(bs[2], int('00010010', 2)) 

124 self.assertEqual(bs[3], int('00110100', 2)) 

125 

126 bs = bytearray(Addressee(id_type=IdType.UID, id=0x1234567890123456, access_class=5)) 

127 self.assertEqual(len(bs), 10) 

128 self.assertEqual(bs[0], int('00100000', 2)) 

129 self.assertEqual(bs[1], 5) 

130 self.assertEqual(bs[2], int('00010010', 2)) 

131 self.assertEqual(bs[3], int('00110100', 2)) 

132 self.assertEqual(bs[4], int('01010110', 2)) 

133 self.assertEqual(bs[5], int('01111000', 2)) 

134 self.assertEqual(bs[6], int('10010000', 2)) 

135 self.assertEqual(bs[7], int('00010010', 2)) 

136 self.assertEqual(bs[8], int('00110100', 2)) 

137 self.assertEqual(bs[9], int('01010110', 2)) 

138 

139 bs = bytearray(Addressee(id_type=IdType.NOID, access_class=5, nls_method=NlsMethod.AES_CBC_MAC_128)) 

140 self.assertEqual(len(bs), 2) 

141 self.assertEqual(bs[0], int('00010010', 2)) 

142 self.assertEqual(bs[1], 5) 

143 

144 bs = bytearray(Addressee(id_type=IdType.NBID, id=CT.compress(100))) 

145 self.assertEqual(len(bs), 3) 

146 self.assertEqual(bs[0], int('00000000', 2)) 

147 self.assertEqual(bs[1], 0) 

148 self.assertEqual(bs[2], 0x39) 

149 

150if __name__ == '__main__': 

151 suite = unittest.TestLoader().loadTestsFromTestCase(TestAddressee) 

152 unittest.TextTestRunner(verbosity=2).run(suite)