1package java
2
3import (
4	"strings"
5	"testing"
6
7	"android/soong/android"
8	soongTesting "android/soong/testing"
9	"android/soong/testing/test_spec_proto"
10	"google.golang.org/protobuf/proto"
11)
12
13func TestTestSpec(t *testing.T) {
14	bp := `test_spec {
15		name: "module-name",
16		teamId: "12345",
17		tests: [
18			"java-test-module-name-one",
19			"java-test-module-name-two"
20		]
21	}
22
23	java_test {
24		name: "java-test-module-name-one",
25	}
26
27	java_test {
28		name: "java-test-module-name-two",
29	}`
30	result := runTestSpecTest(t, android.FixtureExpectsNoErrors, bp)
31
32	module := result.ModuleForTests("module-name", "")
33
34	// Check that the provider has the right contents
35	data, _ := android.SingletonModuleProvider(result, module.Module(), soongTesting.TestSpecProviderKey)
36	if !strings.HasSuffix(
37		data.IntermediatePath.String(), "/intermediateTestSpecMetadata.pb",
38	) {
39		t.Errorf(
40			"Missing intermediates path in provider: %s",
41			data.IntermediatePath.String(),
42		)
43	}
44
45	metadata := android.ContentFromFileRuleForTests(t, result.TestContext,
46		module.Output(data.IntermediatePath.String()))
47
48	metadataList := make([]*test_spec_proto.TestSpec_OwnershipMetadata, 0, 2)
49	teamId := "12345"
50	bpFilePath := "Android.bp"
51	targetNames := []string{
52		"java-test-module-name-one", "java-test-module-name-two",
53	}
54
55	for _, test := range targetNames {
56		targetName := test
57		metadata := test_spec_proto.TestSpec_OwnershipMetadata{
58			TrendyTeamId: &teamId,
59			TargetName:   &targetName,
60			Path:         &bpFilePath,
61		}
62		metadataList = append(metadataList, &metadata)
63	}
64	testSpecMetadata := test_spec_proto.TestSpec{OwnershipMetadataList: metadataList}
65	protoData, _ := proto.Marshal(&testSpecMetadata)
66	expectedMetadata := string(protoData)
67
68	if metadata != expectedMetadata {
69		t.Errorf(
70			"Retrieved metadata: %s doesn't contain expectedMetadata: %s", metadata,
71			expectedMetadata,
72		)
73	}
74
75	// Tests for all_test_spec singleton.
76	singleton := result.SingletonForTests("all_test_specs")
77	rule := singleton.Rule("all_test_specs_rule")
78	prebuiltOs := result.Config.PrebuiltOS()
79	expectedCmd := "out/soong/host/" + prebuiltOs + "/bin/metadata -rule test_spec -inputFile out/soong/all_test_spec_paths.rsp -outputFile out/soong/ownership/all_test_specs.pb"
80	expectedOutputFile := "out/soong/ownership/all_test_specs.pb"
81	expectedInputFile := "out/soong/.intermediates/module-name/intermediateTestSpecMetadata.pb"
82	if !strings.Contains(
83		strings.TrimSpace(rule.Output.String()),
84		expectedOutputFile,
85	) {
86		t.Errorf(
87			"Retrieved singletonOutputFile: %s is not equal to expectedSingletonOutputFile: %s",
88			rule.Output.String(), expectedOutputFile,
89		)
90	}
91
92	if !strings.Contains(
93		strings.TrimSpace(rule.Inputs[0].String()),
94		expectedInputFile,
95	) {
96		t.Errorf(
97			"Retrieved singletonInputFile: %s is not equal to expectedSingletonInputFile: %s",
98			rule.Inputs[0].String(), expectedInputFile,
99		)
100	}
101
102	if !strings.Contains(
103		strings.TrimSpace(rule.RuleParams.Command),
104		expectedCmd,
105	) {
106		t.Errorf(
107			"Retrieved cmd: %s is not equal to expectedCmd: %s",
108			rule.RuleParams.Command, expectedCmd,
109		)
110	}
111}
112
113func runTestSpecTest(
114	t *testing.T, errorHandler android.FixtureErrorHandler, bp string,
115) *android.TestResult {
116	return android.GroupFixturePreparers(
117		soongTesting.PrepareForTestWithTestingBuildComponents,
118		PrepareForIntegrationTestWithJava,
119	).
120		ExtendWithErrorHandler(errorHandler).
121		RunTestWithBp(t, bp)
122}
123