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