Support multiple se_flags modules
Instead of centralized one se_flags module under system/sepolicy,
additional se_flags modules can be defined anywhere to support defining
downstream branches' own flagging.
Bug: 321875465
Test: TH
Test: soong test
Change-Id: I6e45c859b7f09e27ba1d60033b0db1424472cb63
diff --git a/build/soong/selinux_test.go b/build/soong/selinux_test.go
new file mode 100644
index 0000000..dd980a5
--- /dev/null
+++ b/build/soong/selinux_test.go
@@ -0,0 +1,96 @@
+// Copyright 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package selinux
+
+import (
+ "os"
+ "reflect"
+ "testing"
+
+ "android/soong/android"
+)
+
+func TestMain(m *testing.M) {
+ os.Exit(m.Run())
+}
+
+var prepareForTest = android.GroupFixturePreparers(
+ android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
+ buildFlags := make(map[string]string)
+ buildFlags["RELEASE_FLAGS_BAR"] = "true"
+ buildFlags["RELEASE_FLAGS_FOO1"] = "false"
+ // "RELEASE_FLAGS_FOO2" is missing
+ buildFlags["RELEASE_AVF_ENABLE_DEVICE_ASSIGNMENT"] = "true"
+ variables.BuildFlags = buildFlags
+ }),
+ android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("se_flags", flagsFactory)
+ ctx.RegisterModuleType("se_flags_collector", flagsCollectorFactory)
+ }),
+)
+
+func TestFlagCollector(t *testing.T) {
+ t.Parallel()
+
+ ctx := android.GroupFixturePreparers(
+ prepareForTest,
+ android.FixtureAddTextFile("package_bar/Android.bp", `
+ se_flags {
+ name: "se_flags_bar",
+ flags: ["RELEASE_FLAGS_BAR"],
+ export_to: ["se_flags_collector"],
+ }
+ `),
+ android.FixtureAddTextFile("package_foo/Android.bp", `
+ se_flags {
+ name: "se_flags_foo",
+ flags: ["RELEASE_FLAGS_FOO1", "RELEASE_FLAGS_FOO2"],
+ export_to: ["se_flags_collector"],
+ }
+ `),
+ android.FixtureAddTextFile("system/sepolicy/Android.bp", `
+ se_flags {
+ name: "se_flags",
+ flags: ["RELEASE_AVF_ENABLE_DEVICE_ASSIGNMENT"],
+ export_to: ["se_flags_collector"],
+ }
+ se_flags_collector {
+ name: "se_flags_collector",
+ }
+ `),
+ ).RunTest(t).TestContext
+
+ collectorModule := ctx.ModuleForTests("se_flags_collector", "").Module()
+ collectorData, ok := android.OtherModuleProvider(ctx.OtherModuleProviderAdaptor(), collectorModule, buildFlagsProviderKey)
+ if !ok {
+ t.Errorf("se_flags_collector must provide buildFlags")
+ return
+ }
+
+ actual := flagsToM4Macros(collectorData.BuildFlags)
+ expected := []string{
+ "-D target_flag_RELEASE_AVF_ENABLE_DEVICE_ASSIGNMENT=true",
+ "-D target_flag_RELEASE_FLAGS_BAR=true",
+ "-D target_flag_RELEASE_FLAGS_FOO1=false",
+ }
+ if !reflect.DeepEqual(actual, expected) {
+ t.Errorf("M4 macros were not exported correctly"+
+ "\nactual: %v"+
+ "\nexpected: %v",
+ actual,
+ expected,
+ )
+ }
+}