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)
}
