diff --git a/tools/aconfig/Android.bp b/tools/aconfig/Android.bp index 9617e0eb48..b8cce291df 100644 --- a/tools/aconfig/Android.bp +++ b/tools/aconfig/Android.bp @@ -35,4 +35,7 @@ rust_binary_host { rust_test_host { name: "aconfig.test", defaults: ["aconfig.defaults"], + rustlibs: [ + "libitertools", + ], } diff --git a/tools/aconfig/Cargo.toml b/tools/aconfig/Cargo.toml index 8517dd2443..b3c73b8284 100644 --- a/tools/aconfig/Cargo.toml +++ b/tools/aconfig/Cargo.toml @@ -18,3 +18,6 @@ tinytemplate = "1.2.1" [build-dependencies] protobuf-codegen = "3.2.0" + +[dev-dependencies] +itertools = "0.10.5" diff --git a/tools/aconfig/src/codegen_cpp.rs b/tools/aconfig/src/codegen_cpp.rs index 65f95de60f..2c32bb04c3 100644 --- a/tools/aconfig/src/codegen_cpp.rs +++ b/tools/aconfig/src/codegen_cpp.rs @@ -227,8 +227,11 @@ mod tests { let file = generate_cpp_code(&cache).unwrap(); assert_eq!("aconfig/com_example.h", file.path.to_str().unwrap()); assert_eq!( - expect_content.replace(' ', ""), - String::from_utf8(file.contents).unwrap().replace(' ', "") + None, + crate::test::first_significant_code_diff( + expect_content, + &String::from_utf8(file.contents).unwrap() + ) ); } } diff --git a/tools/aconfig/src/codegen_java.rs b/tools/aconfig/src/codegen_java.rs index 1c1cf77d72..dfd6766c96 100644 --- a/tools/aconfig/src/codegen_java.rs +++ b/tools/aconfig/src/codegen_java.rs @@ -135,8 +135,11 @@ mod tests { let file = generate_java_code(&cache).unwrap(); assert_eq!("com/example/Flags.java", file.path.to_str().unwrap()); assert_eq!( - expect_content.replace(' ', ""), - String::from_utf8(file.contents).unwrap().replace(' ', "") + None, + crate::test::first_significant_code_diff( + expect_content, + &String::from_utf8(file.contents).unwrap() + ) ); } } diff --git a/tools/aconfig/src/codegen_rust.rs b/tools/aconfig/src/codegen_rust.rs index cfe7316ff5..98caeae5cb 100644 --- a/tools/aconfig/src/codegen_rust.rs +++ b/tools/aconfig/src/codegen_rust.rs @@ -126,6 +126,12 @@ pub fn r#enabled_rw() -> bool { } } "#; - assert_eq!(expected.trim(), String::from_utf8(generated.contents).unwrap().trim()); + assert_eq!( + None, + crate::test::first_significant_code_diff( + expected, + &String::from_utf8(generated.contents).unwrap() + ) + ); } } diff --git a/tools/aconfig/src/test.rs b/tools/aconfig/src/test.rs index 21ef74d7dc..cc19c6a6d5 100644 --- a/tools/aconfig/src/test.rs +++ b/tools/aconfig/src/test.rs @@ -18,6 +18,7 @@ pub mod test_utils { use crate::cache::Cache; use crate::commands::{Input, Source}; + use itertools; pub fn create_cache() -> Cache { crate::commands::create_cache( @@ -39,6 +40,54 @@ pub mod test_utils { ) .unwrap() } + + pub fn first_significant_code_diff(a: &str, b: &str) -> Option { + let a = a.lines().map(|line| line.trim_start()).filter(|line| !line.is_empty()); + let b = b.lines().map(|line| line.trim_start()).filter(|line| !line.is_empty()); + match itertools::diff_with(a, b, |left, right| left == right) { + Some(itertools::Diff::FirstMismatch(_, mut left, mut right)) => { + Some(format!("'{}' vs '{}'", left.next().unwrap(), right.next().unwrap())) + } + Some(itertools::Diff::Shorter(_, mut left)) => { + Some(format!("LHS trailing data: '{}'", left.next().unwrap())) + } + Some(itertools::Diff::Longer(_, mut right)) => { + Some(format!("RHS trailing data: '{}'", right.next().unwrap())) + } + None => None, + } + } + + #[test] + fn test_first_significant_code_diff() { + assert!(first_significant_code_diff("", "").is_none()); + assert!(first_significant_code_diff(" a", "\n\na\n").is_none()); + let a = r#" + public class A { + private static final String FOO = "FOO"; + public static void main(String[] args) { + System.out.println("FOO=" + FOO); + } + } + "#; + let b = r#" + public class A { + private static final String FOO = "BAR"; + public static void main(String[] args) { + System.out.println("foo=" + FOO); + } + } + "#; + 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)); + assert_eq!( + Some("LHS trailing data: 'b'".to_string()), + first_significant_code_diff("a\nb", "a") + ); + assert_eq!( + Some("RHS trailing data: 'b'".to_string()), + first_significant_code_diff("a", "a\nb") + ); + } } #[cfg(test)]