blob: 9034704283c695d51fa7e9fee984bfe3495848ed [file] [log] [blame]
Mårten Kongstad83a87602023-06-02 11:20:15 +02001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#[cfg(test)]
18pub mod test_utils {
Mårten Kongstad403658f2023-06-14 09:51:56 +020019 use crate::commands::Input;
20 use crate::protos::ProtoParsedFlags;
Mårten Kongstadb0255072023-06-08 10:15:43 +020021 use itertools;
Mårten Kongstad83a87602023-06-02 11:20:15 +020022
Mårten Kongstad403658f2023-06-14 09:51:56 +020023 pub const TEST_PACKAGE: &str = "com.android.aconfig.test";
24
Mårten Kongstad3228b292023-06-26 10:17:42 +020025 pub const TEST_FLAGS_TEXTPROTO: &str = r#"
26parsed_flag {
27 package: "com.android.aconfig.test"
28 name: "disabled_ro"
29 namespace: "aconfig_test"
30 description: "This flag is DISABLED + READ_ONLY"
31 bug: "123"
32 state: DISABLED
33 permission: READ_ONLY
34 trace {
35 source: "tests/test.aconfig"
36 state: DISABLED
37 permission: READ_WRITE
38 }
39 trace {
40 source: "tests/first.values"
41 state: DISABLED
42 permission: READ_ONLY
43 }
Zhi Dou71f1b352023-08-21 22:49:46 +000044 is_fixed_read_only: false
Mårten Kongstad3228b292023-06-26 10:17:42 +020045}
46parsed_flag {
47 package: "com.android.aconfig.test"
48 name: "disabled_rw"
49 namespace: "aconfig_test"
50 description: "This flag is DISABLED + READ_WRITE"
51 bug: "456"
52 state: DISABLED
53 permission: READ_WRITE
54 trace {
55 source: "tests/test.aconfig"
56 state: DISABLED
57 permission: READ_WRITE
58 }
Zhi Dou71f1b352023-08-21 22:49:46 +000059 is_fixed_read_only: false
60}
61parsed_flag {
62 package: "com.android.aconfig.test"
63 name: "enabled_fixed_ro"
64 namespace: "aconfig_test"
65 description: "This flag is fixed READ_ONLY + ENABLED"
66 bug: ""
67 state: ENABLED
68 permission: READ_ONLY
69 trace {
70 source: "tests/test.aconfig"
71 state: DISABLED
72 permission: READ_ONLY
73 }
74 trace {
75 source: "tests/first.values"
76 state: ENABLED
77 permission: READ_ONLY
78 }
79 is_fixed_read_only: true
Mårten Kongstad3228b292023-06-26 10:17:42 +020080}
81parsed_flag {
82 package: "com.android.aconfig.test"
83 name: "enabled_ro"
84 namespace: "aconfig_test"
85 description: "This flag is ENABLED + READ_ONLY"
Mårten Kongstad3228b292023-06-26 10:17:42 +020086 bug: "abc"
87 state: ENABLED
88 permission: READ_ONLY
89 trace {
90 source: "tests/test.aconfig"
91 state: DISABLED
92 permission: READ_WRITE
93 }
94 trace {
95 source: "tests/first.values"
96 state: DISABLED
97 permission: READ_WRITE
98 }
99 trace {
100 source: "tests/second.values"
101 state: ENABLED
102 permission: READ_ONLY
103 }
Zhi Dou71f1b352023-08-21 22:49:46 +0000104 is_fixed_read_only: false
Mårten Kongstad3228b292023-06-26 10:17:42 +0200105}
106parsed_flag {
107 package: "com.android.aconfig.test"
108 name: "enabled_rw"
109 namespace: "aconfig_test"
110 description: "This flag is ENABLED + READ_WRITE"
Mårten Kongstad6353c6c2023-07-26 13:18:50 +0200111 bug: ""
Mårten Kongstad3228b292023-06-26 10:17:42 +0200112 state: ENABLED
113 permission: READ_WRITE
114 trace {
115 source: "tests/test.aconfig"
116 state: DISABLED
117 permission: READ_WRITE
118 }
119 trace {
120 source: "tests/first.values"
121 state: ENABLED
122 permission: READ_WRITE
123 }
Zhi Dou71f1b352023-08-21 22:49:46 +0000124 is_fixed_read_only: false
Mårten Kongstad3228b292023-06-26 10:17:42 +0200125}
126"#;
127
Mårten Kongstad403658f2023-06-14 09:51:56 +0200128 pub fn parse_test_flags() -> ProtoParsedFlags {
129 let bytes = crate::commands::parse_flags(
Mårten Kongstadfbd71e22023-05-31 13:29:35 +0200130 "com.android.aconfig.test",
Mårten Kongstad83a87602023-06-02 11:20:15 +0200131 vec![Input {
Mårten Kongstad403658f2023-06-14 09:51:56 +0200132 source: "tests/test.aconfig".to_string(),
Mårten Kongstad9c59c312023-05-30 11:15:02 +0200133 reader: Box::new(include_bytes!("../tests/test.aconfig").as_slice()),
Mårten Kongstad83a87602023-06-02 11:20:15 +0200134 }],
135 vec![
136 Input {
Mårten Kongstad403658f2023-06-14 09:51:56 +0200137 source: "tests/first.values".to_string(),
Mårten Kongstad9c59c312023-05-30 11:15:02 +0200138 reader: Box::new(include_bytes!("../tests/first.values").as_slice()),
Mårten Kongstad83a87602023-06-02 11:20:15 +0200139 },
140 Input {
Mårten Kongstad403658f2023-06-14 09:51:56 +0200141 source: "tests/second.values".to_string(),
Mårten Kongstad9c59c312023-05-30 11:15:02 +0200142 reader: Box::new(include_bytes!("../tests/second.values").as_slice()),
Mårten Kongstad83a87602023-06-02 11:20:15 +0200143 },
144 ],
Zhi Dou24a0b6a2023-08-10 21:39:59 +0000145 crate::commands::DEFAULT_FLAG_PERMISSION,
Mårten Kongstad83a87602023-06-02 11:20:15 +0200146 )
Mårten Kongstad403658f2023-06-14 09:51:56 +0200147 .unwrap();
148 crate::protos::parsed_flags::try_from_binary_proto(&bytes).unwrap()
Mårten Kongstad83a87602023-06-02 11:20:15 +0200149 }
Mårten Kongstadb0255072023-06-08 10:15:43 +0200150
151 pub fn first_significant_code_diff(a: &str, b: &str) -> Option<String> {
152 let a = a.lines().map(|line| line.trim_start()).filter(|line| !line.is_empty());
153 let b = b.lines().map(|line| line.trim_start()).filter(|line| !line.is_empty());
154 match itertools::diff_with(a, b, |left, right| left == right) {
155 Some(itertools::Diff::FirstMismatch(_, mut left, mut right)) => {
156 Some(format!("'{}' vs '{}'", left.next().unwrap(), right.next().unwrap()))
157 }
158 Some(itertools::Diff::Shorter(_, mut left)) => {
159 Some(format!("LHS trailing data: '{}'", left.next().unwrap()))
160 }
161 Some(itertools::Diff::Longer(_, mut right)) => {
162 Some(format!("RHS trailing data: '{}'", right.next().unwrap()))
163 }
164 None => None,
165 }
166 }
167
168 #[test]
169 fn test_first_significant_code_diff() {
170 assert!(first_significant_code_diff("", "").is_none());
171 assert!(first_significant_code_diff(" a", "\n\na\n").is_none());
172 let a = r#"
173 public class A {
174 private static final String FOO = "FOO";
175 public static void main(String[] args) {
176 System.out.println("FOO=" + FOO);
177 }
178 }
179 "#;
180 let b = r#"
181 public class A {
182 private static final String FOO = "BAR";
183 public static void main(String[] args) {
184 System.out.println("foo=" + FOO);
185 }
186 }
187 "#;
188 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));
189 assert_eq!(
190 Some("LHS trailing data: 'b'".to_string()),
191 first_significant_code_diff("a\nb", "a")
192 );
193 assert_eq!(
194 Some("RHS trailing data: 'b'".to_string()),
195 first_significant_code_diff("a", "a\nb")
196 );
197 }
Mårten Kongstad83a87602023-06-02 11:20:15 +0200198}
199
200#[cfg(test)]
201pub use test_utils::*;