xref: /aosp_15_r20/build/make/tools/aconfig/aconfig/src/test.rs (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker /*
2*9e94795aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*9e94795aSAndroid Build Coastguard Worker  *
4*9e94795aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*9e94795aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*9e94795aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*9e94795aSAndroid Build Coastguard Worker  *
8*9e94795aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*9e94795aSAndroid Build Coastguard Worker  *
10*9e94795aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*9e94795aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*9e94795aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9e94795aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*9e94795aSAndroid Build Coastguard Worker  * limitations under the License.
15*9e94795aSAndroid Build Coastguard Worker  */
16*9e94795aSAndroid Build Coastguard Worker 
17*9e94795aSAndroid Build Coastguard Worker #[cfg(test)]
18*9e94795aSAndroid Build Coastguard Worker pub use test_utils::*;
19*9e94795aSAndroid Build Coastguard Worker 
20*9e94795aSAndroid Build Coastguard Worker #[cfg(test)]
21*9e94795aSAndroid Build Coastguard Worker pub mod test_utils {
22*9e94795aSAndroid Build Coastguard Worker     use crate::commands::Input;
23*9e94795aSAndroid Build Coastguard Worker     use aconfig_protos::ProtoParsedFlags;
24*9e94795aSAndroid Build Coastguard Worker     use itertools;
25*9e94795aSAndroid Build Coastguard Worker 
26*9e94795aSAndroid Build Coastguard Worker     pub const TEST_PACKAGE: &str = "com.android.aconfig.test";
27*9e94795aSAndroid Build Coastguard Worker 
28*9e94795aSAndroid Build Coastguard Worker     pub const TEST_FLAGS_TEXTPROTO: &str = r#"
29*9e94795aSAndroid Build Coastguard Worker parsed_flag {
30*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
31*9e94795aSAndroid Build Coastguard Worker   name: "disabled_ro"
32*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
33*9e94795aSAndroid Build Coastguard Worker   description: "This flag is DISABLED + READ_ONLY"
34*9e94795aSAndroid Build Coastguard Worker   bug: "123"
35*9e94795aSAndroid Build Coastguard Worker   state: DISABLED
36*9e94795aSAndroid Build Coastguard Worker   permission: READ_ONLY
37*9e94795aSAndroid Build Coastguard Worker   trace {
38*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
39*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
40*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
41*9e94795aSAndroid Build Coastguard Worker   }
42*9e94795aSAndroid Build Coastguard Worker   trace {
43*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
44*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
45*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
46*9e94795aSAndroid Build Coastguard Worker   }
47*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
48*9e94795aSAndroid Build Coastguard Worker   is_exported: false
49*9e94795aSAndroid Build Coastguard Worker   container: "system"
50*9e94795aSAndroid Build Coastguard Worker   metadata {
51*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
52*9e94795aSAndroid Build Coastguard Worker   }
53*9e94795aSAndroid Build Coastguard Worker }
54*9e94795aSAndroid Build Coastguard Worker parsed_flag {
55*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
56*9e94795aSAndroid Build Coastguard Worker   name: "disabled_rw"
57*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
58*9e94795aSAndroid Build Coastguard Worker   description: "This flag is DISABLED + READ_WRITE"
59*9e94795aSAndroid Build Coastguard Worker   bug: "456"
60*9e94795aSAndroid Build Coastguard Worker   state: DISABLED
61*9e94795aSAndroid Build Coastguard Worker   permission: READ_WRITE
62*9e94795aSAndroid Build Coastguard Worker   trace {
63*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
64*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
65*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
66*9e94795aSAndroid Build Coastguard Worker   }
67*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
68*9e94795aSAndroid Build Coastguard Worker   is_exported: false
69*9e94795aSAndroid Build Coastguard Worker   container: "system"
70*9e94795aSAndroid Build Coastguard Worker   metadata {
71*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
72*9e94795aSAndroid Build Coastguard Worker   }
73*9e94795aSAndroid Build Coastguard Worker }
74*9e94795aSAndroid Build Coastguard Worker parsed_flag {
75*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
76*9e94795aSAndroid Build Coastguard Worker   name: "disabled_rw_exported"
77*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
78*9e94795aSAndroid Build Coastguard Worker   description: "This flag is DISABLED + READ_WRITE and exported"
79*9e94795aSAndroid Build Coastguard Worker   bug: "111"
80*9e94795aSAndroid Build Coastguard Worker   state: DISABLED
81*9e94795aSAndroid Build Coastguard Worker   permission: READ_WRITE
82*9e94795aSAndroid Build Coastguard Worker   trace {
83*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
84*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
85*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
86*9e94795aSAndroid Build Coastguard Worker   }
87*9e94795aSAndroid Build Coastguard Worker   trace {
88*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
89*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
90*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
91*9e94795aSAndroid Build Coastguard Worker   }
92*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
93*9e94795aSAndroid Build Coastguard Worker   is_exported: true
94*9e94795aSAndroid Build Coastguard Worker   container: "system"
95*9e94795aSAndroid Build Coastguard Worker   metadata {
96*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
97*9e94795aSAndroid Build Coastguard Worker   }
98*9e94795aSAndroid Build Coastguard Worker }
99*9e94795aSAndroid Build Coastguard Worker parsed_flag {
100*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
101*9e94795aSAndroid Build Coastguard Worker   name: "disabled_rw_in_other_namespace"
102*9e94795aSAndroid Build Coastguard Worker   namespace: "other_namespace"
103*9e94795aSAndroid Build Coastguard Worker   description: "This flag is DISABLED + READ_WRITE, and is defined in another namespace"
104*9e94795aSAndroid Build Coastguard Worker   bug: "999"
105*9e94795aSAndroid Build Coastguard Worker   state: DISABLED
106*9e94795aSAndroid Build Coastguard Worker   permission: READ_WRITE
107*9e94795aSAndroid Build Coastguard Worker   trace {
108*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
109*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
110*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
111*9e94795aSAndroid Build Coastguard Worker   }
112*9e94795aSAndroid Build Coastguard Worker   trace {
113*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
114*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
115*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
116*9e94795aSAndroid Build Coastguard Worker   }
117*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
118*9e94795aSAndroid Build Coastguard Worker   is_exported: false
119*9e94795aSAndroid Build Coastguard Worker   container: "system"
120*9e94795aSAndroid Build Coastguard Worker   metadata {
121*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
122*9e94795aSAndroid Build Coastguard Worker   }
123*9e94795aSAndroid Build Coastguard Worker }
124*9e94795aSAndroid Build Coastguard Worker parsed_flag {
125*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
126*9e94795aSAndroid Build Coastguard Worker   name: "enabled_fixed_ro"
127*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
128*9e94795aSAndroid Build Coastguard Worker   description: "This flag is fixed READ_ONLY + ENABLED"
129*9e94795aSAndroid Build Coastguard Worker   bug: ""
130*9e94795aSAndroid Build Coastguard Worker   state: ENABLED
131*9e94795aSAndroid Build Coastguard Worker   permission: READ_ONLY
132*9e94795aSAndroid Build Coastguard Worker   trace {
133*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
134*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
135*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
136*9e94795aSAndroid Build Coastguard Worker   }
137*9e94795aSAndroid Build Coastguard Worker   trace {
138*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
139*9e94795aSAndroid Build Coastguard Worker     state: ENABLED
140*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
141*9e94795aSAndroid Build Coastguard Worker   }
142*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: true
143*9e94795aSAndroid Build Coastguard Worker   is_exported: false
144*9e94795aSAndroid Build Coastguard Worker   container: "system"
145*9e94795aSAndroid Build Coastguard Worker   metadata {
146*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
147*9e94795aSAndroid Build Coastguard Worker   }
148*9e94795aSAndroid Build Coastguard Worker }
149*9e94795aSAndroid Build Coastguard Worker parsed_flag {
150*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
151*9e94795aSAndroid Build Coastguard Worker   name: "enabled_fixed_ro_exported"
152*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
153*9e94795aSAndroid Build Coastguard Worker   description: "This flag is fixed ENABLED + READ_ONLY and exported"
154*9e94795aSAndroid Build Coastguard Worker   bug: "111"
155*9e94795aSAndroid Build Coastguard Worker   state: ENABLED
156*9e94795aSAndroid Build Coastguard Worker   permission: READ_ONLY
157*9e94795aSAndroid Build Coastguard Worker   trace {
158*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
159*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
160*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
161*9e94795aSAndroid Build Coastguard Worker   }
162*9e94795aSAndroid Build Coastguard Worker   trace {
163*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
164*9e94795aSAndroid Build Coastguard Worker     state: ENABLED
165*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
166*9e94795aSAndroid Build Coastguard Worker   }
167*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: true
168*9e94795aSAndroid Build Coastguard Worker   is_exported: true
169*9e94795aSAndroid Build Coastguard Worker   container: "system"
170*9e94795aSAndroid Build Coastguard Worker   metadata {
171*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
172*9e94795aSAndroid Build Coastguard Worker   }
173*9e94795aSAndroid Build Coastguard Worker }
174*9e94795aSAndroid Build Coastguard Worker parsed_flag {
175*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
176*9e94795aSAndroid Build Coastguard Worker   name: "enabled_ro"
177*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
178*9e94795aSAndroid Build Coastguard Worker   description: "This flag is ENABLED + READ_ONLY"
179*9e94795aSAndroid Build Coastguard Worker   bug: "abc"
180*9e94795aSAndroid Build Coastguard Worker   state: ENABLED
181*9e94795aSAndroid Build Coastguard Worker   permission: READ_ONLY
182*9e94795aSAndroid Build Coastguard Worker   trace {
183*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
184*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
185*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
186*9e94795aSAndroid Build Coastguard Worker   }
187*9e94795aSAndroid Build Coastguard Worker   trace {
188*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
189*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
190*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
191*9e94795aSAndroid Build Coastguard Worker   }
192*9e94795aSAndroid Build Coastguard Worker   trace {
193*9e94795aSAndroid Build Coastguard Worker     source: "tests/second.values"
194*9e94795aSAndroid Build Coastguard Worker     state: ENABLED
195*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
196*9e94795aSAndroid Build Coastguard Worker   }
197*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
198*9e94795aSAndroid Build Coastguard Worker   is_exported: false
199*9e94795aSAndroid Build Coastguard Worker   container: "system"
200*9e94795aSAndroid Build Coastguard Worker   metadata {
201*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_BUGFIX
202*9e94795aSAndroid Build Coastguard Worker   }
203*9e94795aSAndroid Build Coastguard Worker }
204*9e94795aSAndroid Build Coastguard Worker parsed_flag {
205*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
206*9e94795aSAndroid Build Coastguard Worker   name: "enabled_ro_exported"
207*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
208*9e94795aSAndroid Build Coastguard Worker   description: "This flag is ENABLED + READ_ONLY and exported"
209*9e94795aSAndroid Build Coastguard Worker   bug: "111"
210*9e94795aSAndroid Build Coastguard Worker   state: ENABLED
211*9e94795aSAndroid Build Coastguard Worker   permission: READ_ONLY
212*9e94795aSAndroid Build Coastguard Worker   trace {
213*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
214*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
215*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
216*9e94795aSAndroid Build Coastguard Worker   }
217*9e94795aSAndroid Build Coastguard Worker   trace {
218*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
219*9e94795aSAndroid Build Coastguard Worker     state: ENABLED
220*9e94795aSAndroid Build Coastguard Worker     permission: READ_ONLY
221*9e94795aSAndroid Build Coastguard Worker   }
222*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
223*9e94795aSAndroid Build Coastguard Worker   is_exported: true
224*9e94795aSAndroid Build Coastguard Worker   container: "system"
225*9e94795aSAndroid Build Coastguard Worker   metadata {
226*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
227*9e94795aSAndroid Build Coastguard Worker   }
228*9e94795aSAndroid Build Coastguard Worker }
229*9e94795aSAndroid Build Coastguard Worker parsed_flag {
230*9e94795aSAndroid Build Coastguard Worker   package: "com.android.aconfig.test"
231*9e94795aSAndroid Build Coastguard Worker   name: "enabled_rw"
232*9e94795aSAndroid Build Coastguard Worker   namespace: "aconfig_test"
233*9e94795aSAndroid Build Coastguard Worker   description: "This flag is ENABLED + READ_WRITE"
234*9e94795aSAndroid Build Coastguard Worker   bug: ""
235*9e94795aSAndroid Build Coastguard Worker   state: ENABLED
236*9e94795aSAndroid Build Coastguard Worker   permission: READ_WRITE
237*9e94795aSAndroid Build Coastguard Worker   trace {
238*9e94795aSAndroid Build Coastguard Worker     source: "tests/test.aconfig"
239*9e94795aSAndroid Build Coastguard Worker     state: DISABLED
240*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
241*9e94795aSAndroid Build Coastguard Worker   }
242*9e94795aSAndroid Build Coastguard Worker   trace {
243*9e94795aSAndroid Build Coastguard Worker     source: "tests/first.values"
244*9e94795aSAndroid Build Coastguard Worker     state: ENABLED
245*9e94795aSAndroid Build Coastguard Worker     permission: READ_WRITE
246*9e94795aSAndroid Build Coastguard Worker   }
247*9e94795aSAndroid Build Coastguard Worker   is_fixed_read_only: false
248*9e94795aSAndroid Build Coastguard Worker   is_exported: false
249*9e94795aSAndroid Build Coastguard Worker   container: "system"
250*9e94795aSAndroid Build Coastguard Worker   metadata {
251*9e94795aSAndroid Build Coastguard Worker     purpose: PURPOSE_UNSPECIFIED
252*9e94795aSAndroid Build Coastguard Worker   }
253*9e94795aSAndroid Build Coastguard Worker }
254*9e94795aSAndroid Build Coastguard Worker "#;
255*9e94795aSAndroid Build Coastguard Worker 
parse_read_only_test_flags() -> ProtoParsedFlags256*9e94795aSAndroid Build Coastguard Worker     pub fn parse_read_only_test_flags() -> ProtoParsedFlags {
257*9e94795aSAndroid Build Coastguard Worker         let bytes = crate::commands::parse_flags(
258*9e94795aSAndroid Build Coastguard Worker             "com.android.aconfig.test",
259*9e94795aSAndroid Build Coastguard Worker             Some("system"),
260*9e94795aSAndroid Build Coastguard Worker             vec![Input {
261*9e94795aSAndroid Build Coastguard Worker                 source: "tests/read_only_test.aconfig".to_string(),
262*9e94795aSAndroid Build Coastguard Worker                 reader: Box::new(include_bytes!("../tests/read_only_test.aconfig").as_slice()),
263*9e94795aSAndroid Build Coastguard Worker             }],
264*9e94795aSAndroid Build Coastguard Worker             vec![Input {
265*9e94795aSAndroid Build Coastguard Worker                 source: "tests/read_only_test.values".to_string(),
266*9e94795aSAndroid Build Coastguard Worker                 reader: Box::new(include_bytes!("../tests/read_only_test.values").as_slice()),
267*9e94795aSAndroid Build Coastguard Worker             }],
268*9e94795aSAndroid Build Coastguard Worker             crate::commands::DEFAULT_FLAG_PERMISSION,
269*9e94795aSAndroid Build Coastguard Worker             true,
270*9e94795aSAndroid Build Coastguard Worker         )
271*9e94795aSAndroid Build Coastguard Worker         .unwrap();
272*9e94795aSAndroid Build Coastguard Worker         aconfig_protos::parsed_flags::try_from_binary_proto(&bytes).unwrap()
273*9e94795aSAndroid Build Coastguard Worker     }
274*9e94795aSAndroid Build Coastguard Worker 
parse_test_flags() -> ProtoParsedFlags275*9e94795aSAndroid Build Coastguard Worker     pub fn parse_test_flags() -> ProtoParsedFlags {
276*9e94795aSAndroid Build Coastguard Worker         let bytes = crate::commands::parse_flags(
277*9e94795aSAndroid Build Coastguard Worker             "com.android.aconfig.test",
278*9e94795aSAndroid Build Coastguard Worker             Some("system"),
279*9e94795aSAndroid Build Coastguard Worker             vec![Input {
280*9e94795aSAndroid Build Coastguard Worker                 source: "tests/test.aconfig".to_string(),
281*9e94795aSAndroid Build Coastguard Worker                 reader: Box::new(include_bytes!("../tests/test.aconfig").as_slice()),
282*9e94795aSAndroid Build Coastguard Worker             }],
283*9e94795aSAndroid Build Coastguard Worker             vec![
284*9e94795aSAndroid Build Coastguard Worker                 Input {
285*9e94795aSAndroid Build Coastguard Worker                     source: "tests/first.values".to_string(),
286*9e94795aSAndroid Build Coastguard Worker                     reader: Box::new(include_bytes!("../tests/first.values").as_slice()),
287*9e94795aSAndroid Build Coastguard Worker                 },
288*9e94795aSAndroid Build Coastguard Worker                 Input {
289*9e94795aSAndroid Build Coastguard Worker                     source: "tests/second.values".to_string(),
290*9e94795aSAndroid Build Coastguard Worker                     reader: Box::new(include_bytes!("../tests/second.values").as_slice()),
291*9e94795aSAndroid Build Coastguard Worker                 },
292*9e94795aSAndroid Build Coastguard Worker             ],
293*9e94795aSAndroid Build Coastguard Worker             crate::commands::DEFAULT_FLAG_PERMISSION,
294*9e94795aSAndroid Build Coastguard Worker             true,
295*9e94795aSAndroid Build Coastguard Worker         )
296*9e94795aSAndroid Build Coastguard Worker         .unwrap();
297*9e94795aSAndroid Build Coastguard Worker         aconfig_protos::parsed_flags::try_from_binary_proto(&bytes).unwrap()
298*9e94795aSAndroid Build Coastguard Worker     }
299*9e94795aSAndroid Build Coastguard Worker 
parse_second_package_flags() -> ProtoParsedFlags300*9e94795aSAndroid Build Coastguard Worker     pub fn parse_second_package_flags() -> ProtoParsedFlags {
301*9e94795aSAndroid Build Coastguard Worker         let bytes = crate::commands::parse_flags(
302*9e94795aSAndroid Build Coastguard Worker             "com.android.aconfig.second_test",
303*9e94795aSAndroid Build Coastguard Worker             Some("system"),
304*9e94795aSAndroid Build Coastguard Worker             vec![Input {
305*9e94795aSAndroid Build Coastguard Worker                 source: "tests/test_second_package.aconfig".to_string(),
306*9e94795aSAndroid Build Coastguard Worker                 reader: Box::new(include_bytes!("../tests/test_second_package.aconfig").as_slice()),
307*9e94795aSAndroid Build Coastguard Worker             }],
308*9e94795aSAndroid Build Coastguard Worker             vec![Input {
309*9e94795aSAndroid Build Coastguard Worker                 source: "tests/third.values".to_string(),
310*9e94795aSAndroid Build Coastguard Worker                 reader: Box::new(include_bytes!("../tests/third.values").as_slice()),
311*9e94795aSAndroid Build Coastguard Worker             }],
312*9e94795aSAndroid Build Coastguard Worker             crate::commands::DEFAULT_FLAG_PERMISSION,
313*9e94795aSAndroid Build Coastguard Worker             true,
314*9e94795aSAndroid Build Coastguard Worker         )
315*9e94795aSAndroid Build Coastguard Worker         .unwrap();
316*9e94795aSAndroid Build Coastguard Worker         aconfig_protos::parsed_flags::try_from_binary_proto(&bytes).unwrap()
317*9e94795aSAndroid Build Coastguard Worker     }
318*9e94795aSAndroid Build Coastguard Worker 
first_significant_code_diff(a: &str, b: &str) -> Option<String>319*9e94795aSAndroid Build Coastguard Worker     pub fn first_significant_code_diff(a: &str, b: &str) -> Option<String> {
320*9e94795aSAndroid Build Coastguard Worker         let a = a.lines().map(|line| line.trim_start()).filter(|line| !line.is_empty());
321*9e94795aSAndroid Build Coastguard Worker         let b = b.lines().map(|line| line.trim_start()).filter(|line| !line.is_empty());
322*9e94795aSAndroid Build Coastguard Worker         match itertools::diff_with(a, b, |left, right| left == right) {
323*9e94795aSAndroid Build Coastguard Worker             Some(itertools::Diff::FirstMismatch(_, mut left, mut right)) => {
324*9e94795aSAndroid Build Coastguard Worker                 Some(format!("'{}' vs '{}'", left.next().unwrap(), right.next().unwrap()))
325*9e94795aSAndroid Build Coastguard Worker             }
326*9e94795aSAndroid Build Coastguard Worker             Some(itertools::Diff::Shorter(_, mut left)) => {
327*9e94795aSAndroid Build Coastguard Worker                 Some(format!("LHS trailing data: '{}'", left.next().unwrap()))
328*9e94795aSAndroid Build Coastguard Worker             }
329*9e94795aSAndroid Build Coastguard Worker             Some(itertools::Diff::Longer(_, mut right)) => {
330*9e94795aSAndroid Build Coastguard Worker                 Some(format!("RHS trailing data: '{}'", right.next().unwrap()))
331*9e94795aSAndroid Build Coastguard Worker             }
332*9e94795aSAndroid Build Coastguard Worker             None => None,
333*9e94795aSAndroid Build Coastguard Worker         }
334*9e94795aSAndroid Build Coastguard Worker     }
335*9e94795aSAndroid Build Coastguard Worker 
336*9e94795aSAndroid Build Coastguard Worker     #[test]
test_first_significant_code_diff()337*9e94795aSAndroid Build Coastguard Worker     fn test_first_significant_code_diff() {
338*9e94795aSAndroid Build Coastguard Worker         assert!(first_significant_code_diff("", "").is_none());
339*9e94795aSAndroid Build Coastguard Worker         assert!(first_significant_code_diff("   a", "\n\na\n").is_none());
340*9e94795aSAndroid Build Coastguard Worker         let a = r#"
341*9e94795aSAndroid Build Coastguard Worker         public class A {
342*9e94795aSAndroid Build Coastguard Worker             private static final String FOO = "FOO";
343*9e94795aSAndroid Build Coastguard Worker             public static void main(String[] args) {
344*9e94795aSAndroid Build Coastguard Worker                 System.out.println("FOO=" + FOO);
345*9e94795aSAndroid Build Coastguard Worker             }
346*9e94795aSAndroid Build Coastguard Worker         }
347*9e94795aSAndroid Build Coastguard Worker         "#;
348*9e94795aSAndroid Build Coastguard Worker         let b = r#"
349*9e94795aSAndroid Build Coastguard Worker         public class A {
350*9e94795aSAndroid Build Coastguard Worker             private static final String FOO = "BAR";
351*9e94795aSAndroid Build Coastguard Worker             public static void main(String[] args) {
352*9e94795aSAndroid Build Coastguard Worker                 System.out.println("foo=" + FOO);
353*9e94795aSAndroid Build Coastguard Worker             }
354*9e94795aSAndroid Build Coastguard Worker         }
355*9e94795aSAndroid Build Coastguard Worker         "#;
356*9e94795aSAndroid Build Coastguard Worker         assert_eq!(Some(r#"'private static final String FOO = "FOO";' vs 'private static final String FOO = "BAR";'"#.to_string()), first_significant_code_diff(a, b));
357*9e94795aSAndroid Build Coastguard Worker         assert_eq!(
358*9e94795aSAndroid Build Coastguard Worker             Some("LHS trailing data: 'b'".to_string()),
359*9e94795aSAndroid Build Coastguard Worker             first_significant_code_diff("a\nb", "a")
360*9e94795aSAndroid Build Coastguard Worker         );
361*9e94795aSAndroid Build Coastguard Worker         assert_eq!(
362*9e94795aSAndroid Build Coastguard Worker             Some("RHS trailing data: 'b'".to_string()),
363*9e94795aSAndroid Build Coastguard Worker             first_significant_code_diff("a", "a\nb")
364*9e94795aSAndroid Build Coastguard Worker         );
365*9e94795aSAndroid Build Coastguard Worker     }
366*9e94795aSAndroid Build Coastguard Worker }
367