Implement test_suite.

test_suite supports all test rules with InstallInTestCases set. For these modules, all files insstalled in InstallFilesInfo.InstallFiles
are:
1. Symlinked under out/soong/packaging/<test_suite>
2. The relative path under out/soong/packaging/<test_suite> are added into manifest

Change-Id: I540a19b0a269618783a90d85975df7c110d8be9f
Bug: 372945132
diff --git a/tradefed_modules/test_suite_test.go b/tradefed_modules/test_suite_test.go
index 647ba4d..57e760e 100644
--- a/tradefed_modules/test_suite_test.go
+++ b/tradefed_modules/test_suite_test.go
@@ -16,12 +16,15 @@
 import (
 	"android/soong/android"
 	"android/soong/java"
+	"encoding/json"
+	"slices"
 	"testing"
 )
 
 func TestTestSuites(t *testing.T) {
 	t.Parallel()
 	ctx := android.GroupFixturePreparers(
+		android.PrepareForTestWithArchMutator,
 		java.PrepareForTestWithJavaDefaultModules,
 		android.FixtureRegisterWithContext(RegisterTestSuiteBuildComponents),
 	).RunTestWithBp(t, `
@@ -45,9 +48,44 @@
 		}
 	`)
 	manifestPath := ctx.ModuleForTests("my-suite", "").Output("out/soong/test_suites/my-suite/my-suite.json")
-	got := android.ContentFromFileRuleForTests(t, ctx.TestContext, manifestPath)
-	want := `{"name": "my-suite"}` + "\n"
-	if got != want {
-		t.Errorf("my-suite.json content was %q, want %q", got, want)
+	var actual testSuiteManifest
+	if err := json.Unmarshal([]byte(android.ContentFromFileRuleForTests(t, ctx.TestContext, manifestPath)), &actual); err != nil {
+		t.Errorf("failed to unmarshal manifest: %v", err)
 	}
+	slices.Sort(actual.Files)
+
+	expected := testSuiteManifest{
+		Name: "my-suite",
+		Files: []string{
+			"target/testcases/TestModule1/TestModule1.config",
+			"target/testcases/TestModule1/arm64/TestModule1.apk",
+			"target/testcases/TestModule2/TestModule2.config",
+			"target/testcases/TestModule2/arm64/TestModule2.apk",
+		},
+	}
+
+	android.AssertDeepEquals(t, "manifests differ", expected, actual)
+}
+
+func TestTestSuitesNotInstalledInTestcases(t *testing.T) {
+	t.Parallel()
+	android.GroupFixturePreparers(
+		android.PrepareForTestWithArchMutator,
+		java.PrepareForTestWithJavaDefaultModules,
+		android.FixtureRegisterWithContext(RegisterTestSuiteBuildComponents),
+	).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern([]string{
+		`"SomeHostTest" is not installed in testcases`,
+	})).RunTestWithBp(t, `
+			java_test_host {
+				name: "SomeHostTest",
+				srcs: ["a.java"],
+			}
+			test_suite {
+				name: "my-suite",
+				description: "a test suite",
+				tests: [
+					"SomeHostTest",
+				]
+			}
+	`)
 }