blob: 5e630b51763a356a4534d915f166d763b0f33c2f [file] [log] [blame]
Vinh Tran457ddef2023-08-02 13:50:26 -04001package aconfig
2
3import (
Vinh Tran457ddef2023-08-02 13:50:26 -04004 "fmt"
5 "testing"
Zi Wang275f6542023-11-09 14:59:31 -08006
7 "android/soong/android"
8 "android/soong/rust"
Vinh Tran457ddef2023-08-02 13:50:26 -04009)
10
11func TestRustAconfigLibrary(t *testing.T) {
12 result := android.GroupFixturePreparers(
13 PrepareForTestWithAconfigBuildComponents,
14 rust.PrepareForTestWithRustIncludeVndk,
15 android.PrepareForTestWithArchMutator,
16 android.PrepareForTestWithDefaults,
17 android.PrepareForTestWithPrebuilts,
18 ).
19 ExtendWithErrorHandler(android.FixtureExpectsNoErrors).
20 RunTestWithBp(t, fmt.Sprintf(`
21 rust_library {
22 name: "libflags_rust", // test mock
23 crate_name: "flags_rust",
24 srcs: ["lib.rs"],
25 }
Dennis Shenba6ed2d2023-11-08 21:02:53 +000026 rust_library {
27 name: "liblazy_static", // test mock
28 crate_name: "lazy_static",
29 srcs: ["src/lib.rs"],
30 }
Vinh Tran457ddef2023-08-02 13:50:26 -040031 aconfig_declarations {
32 name: "my_aconfig_declarations",
33 package: "com.example.package",
34 srcs: ["foo.aconfig"],
35 }
36
37 rust_aconfig_library {
38 name: "libmy_rust_aconfig_library",
39 crate_name: "my_rust_aconfig_library",
40 aconfig_declarations: "my_aconfig_declarations",
41 }
42 `))
43
44 sourceVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_source")
45 rule := sourceVariant.Rule("rust_aconfig_library")
46 android.AssertStringEquals(t, "rule must contain production mode", rule.Args["mode"], "production")
47
48 dylibVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_dylib")
49 rlibRlibStdVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_rlib_rlib-std")
50 rlibDylibStdVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_rlib_dylib-std")
51
52 variants := []android.TestingModule{
53 dylibVariant,
54 rlibDylibStdVariant,
55 rlibRlibStdVariant,
56 }
57
58 for _, variant := range variants {
Colin Crossdf0ed702023-09-22 21:59:59 +000059 android.AssertStringEquals(
Vinh Tran457ddef2023-08-02 13:50:26 -040060 t,
61 "dylib variant builds from generated rust code",
62 "out/soong/.intermediates/libmy_rust_aconfig_library/android_arm64_armv8-a_source/gen/src/lib.rs",
Colin Crossdf0ed702023-09-22 21:59:59 +000063 variant.Rule("rustc").Inputs[0].RelativeToTop().String(),
Vinh Tran457ddef2023-08-02 13:50:26 -040064 )
65 }
66}
Zi Wang275f6542023-11-09 14:59:31 -080067
68var rustCodegenModeTestData = []struct {
69 setting, expected string
70}{
71 {"", "production"},
72 {"mode: `production`,", "production"},
73 {"mode: `test`,", "test"},
74 {"mode: `exported`,", "exported"},
75}
76
77func TestRustCodegenMode(t *testing.T) {
78 for _, testData := range rustCodegenModeTestData {
79 testRustCodegenModeHelper(t, testData.setting, testData.expected)
80 }
81}
82
83func testRustCodegenModeHelper(t *testing.T, bpMode string, ruleMode string) {
84 t.Helper()
85 result := android.GroupFixturePreparers(
86 PrepareForTestWithAconfigBuildComponents,
87 rust.PrepareForTestWithRustIncludeVndk).
88 ExtendWithErrorHandler(android.FixtureExpectsNoErrors).
89 RunTestWithBp(t, fmt.Sprintf(`
90 rust_library {
91 name: "libflags_rust", // test mock
92 crate_name: "flags_rust",
93 srcs: ["lib.rs"],
94 }
95 rust_library {
96 name: "liblazy_static", // test mock
97 crate_name: "lazy_static",
98 srcs: ["src/lib.rs"],
99 }
100 aconfig_declarations {
101 name: "my_aconfig_declarations",
102 package: "com.example.package",
103 srcs: ["foo.aconfig"],
104 }
105 rust_aconfig_library {
106 name: "libmy_rust_aconfig_library",
107 crate_name: "my_rust_aconfig_library",
108 aconfig_declarations: "my_aconfig_declarations",
109 %s
110 }
111 `, bpMode))
112
113 module := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_source")
114 rule := module.Rule("rust_aconfig_library")
115 android.AssertStringEquals(t, "rule must contain test mode", rule.Args["mode"], ruleMode)
116}
117
118var incorrectRustCodegenModeTestData = []struct {
119 setting, expectedErr string
120}{
121 {"mode: `unsupported`,", "mode: \"unsupported\" is not a supported mode"},
122 // TODO: remove this test case when test prop is removed
123 {"mode: `test`, test: true", "test prop should not be specified when mode prop is set"},
124}
125
126func TestIncorrectRustCodegenMode(t *testing.T) {
127 for _, testData := range incorrectRustCodegenModeTestData {
128 testIncorrectRustCodegenModeHelper(t, testData.setting, testData.expectedErr)
129 }
130}
131
132func testIncorrectRustCodegenModeHelper(t *testing.T, bpMode string, err string) {
133 t.Helper()
134 android.GroupFixturePreparers(
135 PrepareForTestWithAconfigBuildComponents,
136 rust.PrepareForTestWithRustIncludeVndk).
137 ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(err)).
138 RunTestWithBp(t, fmt.Sprintf(`
139 rust_library {
140 name: "libflags_rust", // test mock
141 crate_name: "flags_rust",
142 srcs: ["lib.rs"],
143 }
144 rust_library {
145 name: "liblazy_static", // test mock
146 crate_name: "lazy_static",
147 srcs: ["src/lib.rs"],
148 }
149 aconfig_declarations {
150 name: "my_aconfig_declarations",
151 package: "com.example.package",
152 srcs: ["foo.aconfig"],
153 }
154 rust_aconfig_library {
155 name: "libmy_rust_aconfig_library",
156 crate_name: "my_rust_aconfig_library",
157 aconfig_declarations: "my_aconfig_declarations",
158 %s
159 }
160 `, bpMode))
161}