blob: 509e70112f129f12fe256f1610dfb65af0efcdf2 [file] [log] [blame]
Aditya Choudhary8094b6b2023-10-12 19:40:17 +00001package 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 "google.golang.org/protobuf/proto"
11)
12
13func TestCodeMetadata(t *testing.T) {
14 bp := `code_metadata {
15 name: "module-name",
16 teamId: "12345",
17 code: [
18 "foo",
19 ]
20 }
21
22 java_sdk_library {
23 name: "foo",
24 srcs: ["a.java"],
25 }`
26 result := runCodeMetadataTest(t, android.FixtureExpectsNoErrors, bp)
27
28 module := result.ModuleForTests(
29 "module-name", "",
30 ).Module().(*soongTesting.CodeMetadataModule)
31
32 // Check that the provider has the right contents
Colin Cross5a377182023-12-14 14:46:23 -080033 data, _ := android.SingletonModuleProvider(result, module, soongTesting.CodeMetadataProviderKey)
Aditya Choudhary8094b6b2023-10-12 19:40:17 +000034 if !strings.HasSuffix(
35 data.IntermediatePath.String(), "/intermediateCodeMetadata.pb",
36 ) {
37 t.Errorf(
38 "Missing intermediates path in provider: %s",
39 data.IntermediatePath.String(),
40 )
41 }
42
43 buildParamsSlice := module.BuildParamsForTests()
44 var metadata = ""
45 for _, params := range buildParamsSlice {
46 if params.Rule.String() == "android/soong/android.writeFile" {
47 metadata = params.Args["content"]
48 }
49 }
50
51 metadataList := make([]*code_metadata_internal_proto.CodeMetadataInternal_TargetOwnership, 0, 2)
52 teamId := "12345"
53 bpFilePath := "Android.bp"
54 targetName := "foo"
55 srcFile := []string{"a.java"}
56 expectedMetadataProto := code_metadata_internal_proto.CodeMetadataInternal_TargetOwnership{
57 TrendyTeamId: &teamId,
58 TargetName: &targetName,
59 Path: &bpFilePath,
60 SourceFiles: srcFile,
61 }
62 metadataList = append(metadataList, &expectedMetadataProto)
63
64 CodeMetadataMetadata := code_metadata_internal_proto.CodeMetadataInternal{TargetOwnershipList: metadataList}
65 protoData, _ := proto.Marshal(&CodeMetadataMetadata)
66 rawData := string(protoData)
67 formattedData := strings.ReplaceAll(rawData, "\n", "\\n")
68 expectedMetadata := "'" + formattedData + "\\n'"
69
70 if metadata != expectedMetadata {
71 t.Errorf(
72 "Retrieved metadata: %s is not equal to expectedMetadata: %s", metadata,
73 expectedMetadata,
74 )
75 }
76
77 // Tests for all_test_spec singleton.
78 singleton := result.SingletonForTests("all_code_metadata")
79 rule := singleton.Rule("all_code_metadata_rule")
80 prebuiltOs := result.Config.PrebuiltOS()
81 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"
82 expectedOutputFile := "out/soong/ownership/all_code_metadata.pb"
83 expectedInputFile := "out/soong/.intermediates/module-name/intermediateCodeMetadata.pb"
84 if !strings.Contains(
85 strings.TrimSpace(rule.Output.String()),
86 expectedOutputFile,
87 ) {
88 t.Errorf(
89 "Retrieved singletonOutputFile: %s is not equal to expectedSingletonOutputFile: %s",
90 rule.Output.String(), expectedOutputFile,
91 )
92 }
93
94 if !strings.Contains(
95 strings.TrimSpace(rule.Inputs[0].String()),
96 expectedInputFile,
97 ) {
98 t.Errorf(
99 "Retrieved singletonInputFile: %s is not equal to expectedSingletonInputFile: %s",
100 rule.Inputs[0].String(), expectedInputFile,
101 )
102 }
103
104 if !strings.Contains(
105 strings.TrimSpace(rule.RuleParams.Command),
106 expectedCmd,
107 ) {
108 t.Errorf(
109 "Retrieved cmd: %s doesn't contain expectedCmd: %s",
110 rule.RuleParams.Command, expectedCmd,
111 )
112 }
113}
114func runCodeMetadataTest(
Colin Crossbc7d76c2023-12-12 16:39:03 -0800115 t *testing.T, errorHandler android.FixtureErrorHandler, bp string,
Aditya Choudhary8094b6b2023-10-12 19:40:17 +0000116) *android.TestResult {
117 return android.GroupFixturePreparers(
118 soongTesting.PrepareForTestWithTestingBuildComponents, prepareForJavaTest,
119 PrepareForTestWithJavaSdkLibraryFiles, FixtureWithLastReleaseApis("foo"),
120 ).
121 ExtendWithErrorHandler(errorHandler).
122 RunTestWithBp(t, bp)
123}