1 // Copyright 2024, The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 //! Maintenance tests.
16 use super::*;
17 use der::ErrorKind;
18
19 #[test]
test_encode_module_info_empty()20 fn test_encode_module_info_empty() {
21 let expected = vec![0x31, 0x00];
22 assert_eq!(expected, Maintenance::encode_module_info(Vec::new()).unwrap());
23 }
24
25 #[test]
test_encode_module_info_same_name()26 fn test_encode_module_info_same_name() {
27 // Same versions
28 let module_info: Vec<ModuleInfo> = vec![
29 ModuleInfo {
30 name: OctetString::new("com.android.os.statsd".to_string()).unwrap(),
31 version: 25,
32 },
33 ModuleInfo {
34 name: OctetString::new("com.android.os.statsd".to_string()).unwrap(),
35 version: 25,
36 },
37 ];
38 let actual = Maintenance::encode_module_info(module_info);
39 assert!(actual.is_err());
40 assert_eq!(ErrorKind::SetDuplicate, actual.unwrap_err().kind());
41
42 // Different versions
43 let module_info: Vec<ModuleInfo> = vec![
44 ModuleInfo {
45 name: OctetString::new("com.android.os.statsd".to_string()).unwrap(),
46 version: 3,
47 },
48 ModuleInfo {
49 name: OctetString::new("com.android.os.statsd".to_string()).unwrap(),
50 version: 789,
51 },
52 ];
53 let actual = Maintenance::encode_module_info(module_info);
54 assert!(actual.is_err());
55 assert_eq!(ErrorKind::SetDuplicate, actual.unwrap_err().kind());
56 }
57
58 #[test]
test_encode_module_info_same_name_length()59 fn test_encode_module_info_same_name_length() {
60 let module_info: Vec<ModuleInfo> = vec![
61 ModuleInfo { name: OctetString::new("com.android.wifi".to_string()).unwrap(), version: 2 },
62 ModuleInfo { name: OctetString::new("com.android.virt".to_string()).unwrap(), version: 1 },
63 ];
64 let actual = Maintenance::encode_module_info(module_info).unwrap();
65 let expected = hex::decode(concat!(
66 "312e", // SET OF, len 46
67 "3015", // SEQUENCE, len 21
68 "0410", // OCTET STRING, len 16
69 "636f6d2e616e64726f69642e76697274", // "com.android.virt"
70 "020101", // INTEGER len 1 value 1
71 "3015", // SEQUENCE, len 21
72 "0410", // OCTET STRING, len 16
73 "636f6d2e616e64726f69642e77696669", // "com.android.wifi"
74 "020102", // INTEGER len 1 value 2
75 ))
76 .unwrap();
77 assert_eq!(expected, actual);
78 }
79
80 #[test]
test_encode_module_info_version_irrelevant()81 fn test_encode_module_info_version_irrelevant() {
82 // Versions of the modules are irrelevant for determining encoding order since differing names
83 // guarantee a unique ascending order. See Maintenance::ModuleInfo::der_cmp for more detail.
84 let module_info: Vec<ModuleInfo> = vec![
85 ModuleInfo {
86 name: OctetString::new("com.android.extservices".to_string()).unwrap(),
87 version: 1,
88 },
89 ModuleInfo { name: OctetString::new("com.android.adbd".to_string()).unwrap(), version: 14 },
90 ];
91 let actual = Maintenance::encode_module_info(module_info).unwrap();
92 let expected = hex::decode(concat!(
93 "3135", // SET OF, len 53
94 "3015", // SEQUENCE, len 21
95 "0410", // OCTET STRING, len 16
96 "636f6d2e616e64726f69642e61646264", // "com.android.abdb"
97 "02010e", // INTEGER len 2 value 14
98 "301c", // SEQUENCE, len 28
99 "0417", // OCTET STRING, len 23
100 "636f6d2e616e64726f69642e6578747365727669636573", // "com.android.extservices"
101 "020101", // INTEGER len 1 value 1
102 ))
103 .unwrap();
104 assert_eq!(expected, actual);
105 }
106
107 #[test]
test_encode_module_info_alphaordering_irrelevant()108 fn test_encode_module_info_alphaordering_irrelevant() {
109 // Character ordering of the names of modules is irrelevant for determining encoding order since
110 // differing name lengths guarantee a unique ascending order. See
111 // Maintenance::ModuleInfo::der_cmp for more detail.
112 let module_info: Vec<ModuleInfo> = vec![
113 ModuleInfo {
114 name: OctetString::new("com.android.crashrecovery".to_string()).unwrap(),
115 version: 3,
116 },
117 ModuleInfo { name: OctetString::new("com.android.rkpd".to_string()).unwrap(), version: 8 },
118 ];
119 let actual = Maintenance::encode_module_info(module_info).unwrap();
120 let expected = hex::decode(concat!(
121 "3137", // SET OF, len 55
122 "3015", // SEQUENCE, len 21
123 "0410", // OCTET STRING, len 16
124 "636f6d2e616e64726f69642e726b7064", // "com.android.rkpd"
125 "020108", // INTEGER len 1 value 8
126 "301e", // SEQUENCE, len 30
127 "0419", // OCTET STRING, len 25
128 "636f6d2e616e64726f69642e63726173687265636f76657279", // "com.android.crashrecovery"
129 "020103", // INTEGER len 1 value 3
130 ))
131 .unwrap();
132 assert_eq!(expected, actual);
133 }
134
135 #[test]
test_encode_module_info()136 fn test_encode_module_info() {
137 // Collection of `ModuleInfo`s from a few of the other test_encode_module_info_* tests
138 let module_info: Vec<ModuleInfo> = vec![
139 ModuleInfo { name: OctetString::new("com.android.rkpd".to_string()).unwrap(), version: 8 },
140 ModuleInfo {
141 name: OctetString::new("com.android.extservices".to_string()).unwrap(),
142 version: 1,
143 },
144 ModuleInfo {
145 name: OctetString::new("com.android.crashrecovery".to_string()).unwrap(),
146 version: 3,
147 },
148 ModuleInfo { name: OctetString::new("com.android.wifi".to_string()).unwrap(), version: 2 },
149 ModuleInfo { name: OctetString::new("com.android.virt".to_string()).unwrap(), version: 1 },
150 ModuleInfo { name: OctetString::new("com.android.adbd".to_string()).unwrap(), version: 14 },
151 ];
152 let actual = Maintenance::encode_module_info(module_info).unwrap();
153 let expected = hex::decode(concat!(
154 "31819a", // SET OF, len 154
155 "3015", // SEQUENCE, len 21
156 "0410", // OCTET STRING, len 16
157 "636f6d2e616e64726f69642e61646264", // "com.android.abdb"
158 "02010e", // INTEGER len 2 value 14
159 "3015", // SEQUENCE, len 21
160 "0410", // OCTET STRING, len 16
161 "636f6d2e616e64726f69642e726b7064", // "com.android.rkpd"
162 "020108", // INTEGER len 1 value 8
163 "3015", // SEQUENCE, len 21
164 "0410", // OCTET STRING, len 16
165 "636f6d2e616e64726f69642e76697274", // "com.android.virt"
166 "020101", // INTEGER len 1 value 1
167 "3015", // SEQUENCE, len 21
168 "0410", // OCTET STRING, len 16
169 "636f6d2e616e64726f69642e77696669", // "com.android.wifi"
170 "020102", // INTEGER len 1 value 2
171 "301c", // SEQUENCE, len 28
172 "0417", // OCTET STRING, len 23
173 "636f6d2e616e64726f69642e6578747365727669636573", // "com.android.extservices"
174 "020101", // INTEGER len 1 value 1
175 "301e", // SEQUENCE, len 30
176 "0419", // OCTET STRING, len 25
177 "636f6d2e616e64726f69642e63726173687265636f76657279", // "com.android.crashrecovery"
178 "020103", // INTEGER len 1 value 3
179 ))
180 .unwrap();
181 assert_eq!(expected, actual);
182 }
183