platform_build_soong/java/code_metadata_test.go
Colin Cross 31a674571e Write raw files to disk instead of the ninja file
Writing raw files as rules in the ninja file unnecessarily bloats
the ninja file.  Write files immediately to disk instead to files
based on the hash of the contents, and then emit ninja rules to
copy the files into place during the build.  Delete obsolete files
in a singleton at the end of analysis.

Bug: 306029038
Test: Run: m libc_musl_version.h
           touch build/soong/Android.bp
           m libc_musl_version.h
      libc_musl_version.h/genrule.sbox.textproto is not recopied.
Test: Run: lunch aosp_cf_x86_64_phone-userdebug
           m libc_musl_version.h
	   lunch aosp_x86_64-userdebug
	   m libc_musl_version.h
	   lunch aosp_cf_x86_64_phone-userdebug
	   m libc_musl_version.h
      libc_musl_version.h/genrule.sbox.textproto is recopied but restat prevents rerunning the genrule.
Test: Run: touch out/soong/raw-aosp_cf_x86_64_phone/00/foo
           touch build/soong/Android.bp
	   m nothing
      out/soong/raw-aosp_cf_x86_64_phone/00/foo is removed.
Change-Id: I172869c4d49565504794c051e2e8c1f7cf46486e
2023-12-19 16:33:46 -08:00

114 lines
3.3 KiB
Go

package java
import (
"strings"
"testing"
"android/soong/android"
soongTesting "android/soong/testing"
"android/soong/testing/code_metadata_internal_proto"
"google.golang.org/protobuf/proto"
)
func TestCodeMetadata(t *testing.T) {
bp := `code_metadata {
name: "module-name",
teamId: "12345",
code: [
"foo",
]
}
java_sdk_library {
name: "foo",
srcs: ["a.java"],
}`
result := runCodeMetadataTest(t, android.FixtureExpectsNoErrors, bp)
module := result.ModuleForTests("module-name", "")
// Check that the provider has the right contents
data, _ := android.SingletonModuleProvider(result, module.Module(), soongTesting.CodeMetadataProviderKey)
if !strings.HasSuffix(
data.IntermediatePath.String(), "/intermediateCodeMetadata.pb",
) {
t.Errorf(
"Missing intermediates path in provider: %s",
data.IntermediatePath.String(),
)
}
metadata := android.ContentFromFileRuleForTests(t, result.TestContext,
module.Output(data.IntermediatePath.String()))
metadataList := make([]*code_metadata_internal_proto.CodeMetadataInternal_TargetOwnership, 0, 2)
teamId := "12345"
bpFilePath := "Android.bp"
targetName := "foo"
srcFile := []string{"a.java"}
expectedMetadataProto := code_metadata_internal_proto.CodeMetadataInternal_TargetOwnership{
TrendyTeamId: &teamId,
TargetName: &targetName,
Path: &bpFilePath,
SourceFiles: srcFile,
}
metadataList = append(metadataList, &expectedMetadataProto)
CodeMetadataMetadata := code_metadata_internal_proto.CodeMetadataInternal{TargetOwnershipList: metadataList}
protoData, _ := proto.Marshal(&CodeMetadataMetadata)
expectedMetadata := string(protoData)
if metadata != expectedMetadata {
t.Errorf(
"Retrieved metadata: %s is not equal to expectedMetadata: %s", metadata,
expectedMetadata,
)
}
// Tests for all_test_spec singleton.
singleton := result.SingletonForTests("all_code_metadata")
rule := singleton.Rule("all_code_metadata_rule")
prebuiltOs := result.Config.PrebuiltOS()
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"
expectedOutputFile := "out/soong/ownership/all_code_metadata.pb"
expectedInputFile := "out/soong/.intermediates/module-name/intermediateCodeMetadata.pb"
if !strings.Contains(
strings.TrimSpace(rule.Output.String()),
expectedOutputFile,
) {
t.Errorf(
"Retrieved singletonOutputFile: %s is not equal to expectedSingletonOutputFile: %s",
rule.Output.String(), expectedOutputFile,
)
}
if !strings.Contains(
strings.TrimSpace(rule.Inputs[0].String()),
expectedInputFile,
) {
t.Errorf(
"Retrieved singletonInputFile: %s is not equal to expectedSingletonInputFile: %s",
rule.Inputs[0].String(), expectedInputFile,
)
}
if !strings.Contains(
strings.TrimSpace(rule.RuleParams.Command),
expectedCmd,
) {
t.Errorf(
"Retrieved cmd: %s doesn't contain expectedCmd: %s",
rule.RuleParams.Command, expectedCmd,
)
}
}
func runCodeMetadataTest(
t *testing.T, errorHandler android.FixtureErrorHandler, bp string,
) *android.TestResult {
return android.GroupFixturePreparers(
soongTesting.PrepareForTestWithTestingBuildComponents, prepareForJavaTest,
PrepareForTestWithJavaSdkLibraryFiles, FixtureWithLastReleaseApis("foo"),
).
ExtendWithErrorHandler(errorHandler).
RunTestWithBp(t, bp)
}