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