• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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