diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-04 19:47:12 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-04 20:29:04 +0000 |
commit | b6b418e11d874753b4467310573eee93f232809a (patch) | |
tree | 1b31c1b42acacc516df1ebafad70ff4a27569920 | |
parent | 17fc721a8265623ab74bfa826bcfd01c5bda761c (diff) | |
parent | 0be2581e80073ff12fc3d1a056488563e6c10516 (diff) | |
download | build-aml_wif_341510000.tar.gz |
Make change and version bump to aml_wif_341510000 for mainline module file: Noneaml_wif_341510000
Snap for 11273583 from 0be2581e80073ff12fc3d1a056488563e6c10516 to mainline-wifi-release
Change-Id: I80fc03b52c572769b5e47e7a40c6556a40c5a08c
-rw-r--r-- | core/build_id.mk | 2 | ||||
-rw-r--r-- | core/version_defaults.mk | 2 | ||||
-rw-r--r-- | tools/metadata/Android.bp | 14 | ||||
-rw-r--r-- | tools/metadata/OWNERS | 4 | ||||
-rw-r--r-- | tools/metadata/generator.go | 195 | ||||
-rw-r--r-- | tools/metadata/go.mod | 7 | ||||
-rw-r--r-- | tools/metadata/go.work | 10 | ||||
-rw-r--r-- | tools/metadata/testdata/emptyInputFile.txt | 1 | ||||
-rw-r--r-- | tools/metadata/testdata/expectedOutputFile.txt | 22 | ||||
-rw-r--r-- | tools/metadata/testdata/file1.txt | 13 | ||||
-rw-r--r-- | tools/metadata/testdata/file2.txt | 25 | ||||
-rw-r--r-- | tools/metadata/testdata/file3.txt | 13 | ||||
-rw-r--r-- | tools/metadata/testdata/file4.txt | 25 | ||||
-rw-r--r-- | tools/metadata/testdata/generatedEmptyOutputFile.txt | 1 | ||||
-rw-r--r-- | tools/metadata/testdata/generatedOutputFile.txt | 22 | ||||
-rw-r--r-- | tools/metadata/testdata/inputFiles.txt | 1 | ||||
-rw-r--r-- | tools/metadata/testdata/inputFilesNegativeCase.txt | 1 | ||||
-rw-r--r-- | tools/metadata/testdata/metadata_test.go | 89 | ||||
-rw-r--r-- | tools/metadata/testdata/outputFile.txt | 22 |
19 files changed, 467 insertions, 2 deletions
diff --git a/core/build_id.mk b/core/build_id.mk index c93c3bbb16..8e362e4409 100644 --- a/core/build_id.mk +++ b/core/build_id.mk @@ -18,4 +18,4 @@ # (like "CRB01"). It must be a single word, and is # capitalized by convention. -BUILD_ID=341410000 +BUILD_ID=341510000 diff --git a/core/version_defaults.mk b/core/version_defaults.mk index 893303500e..160c6455ca 100644 --- a/core/version_defaults.mk +++ b/core/version_defaults.mk @@ -79,7 +79,7 @@ endif .KATI_READONLY := PLATFORM_SDK_VERSION # This is the sdk extension version of this tree. -PLATFORM_SDK_EXTENSION_VERSION := 10 +PLATFORM_SDK_EXTENSION_VERSION := 11 .KATI_READONLY := PLATFORM_SDK_EXTENSION_VERSION # This is the sdk extension version that PLATFORM_SDK_VERSION ships with. diff --git a/tools/metadata/Android.bp b/tools/metadata/Android.bp new file mode 100644 index 0000000000..b2fabecb96 --- /dev/null +++ b/tools/metadata/Android.bp @@ -0,0 +1,14 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +blueprint_go_binary { + name: "metadata", + deps: [ + "soong-testing-test_spec_proto", + "golang-protobuf-proto", + ], + srcs: [ + "generator.go", + ] +}
\ No newline at end of file diff --git a/tools/metadata/OWNERS b/tools/metadata/OWNERS new file mode 100644 index 0000000000..03bcdf1c40 --- /dev/null +++ b/tools/metadata/OWNERS @@ -0,0 +1,4 @@ +dariofreni@google.com +joeo@google.com +ronish@google.com +caditya@google.com diff --git a/tools/metadata/generator.go b/tools/metadata/generator.go new file mode 100644 index 0000000000..e970e1708f --- /dev/null +++ b/tools/metadata/generator.go @@ -0,0 +1,195 @@ +package main + +import ( + "flag" + "fmt" + "io" + "log" + "os" + "sort" + "strings" + "sync" + + "android/soong/testing/test_spec_proto" + "google.golang.org/protobuf/proto" +) + +type keyToLocksMap struct { + locks sync.Map +} + +func (kl *keyToLocksMap) GetLockForKey(key string) *sync.Mutex { + mutex, _ := kl.locks.LoadOrStore(key, &sync.Mutex{}) + return mutex.(*sync.Mutex) +} + +func getSortedKeys(syncMap *sync.Map) []string { + var allKeys []string + syncMap.Range( + func(key, _ interface{}) bool { + allKeys = append(allKeys, key.(string)) + return true + }, + ) + + sort.Strings(allKeys) + return allKeys +} + +func writeOutput( + outputFile string, + allMetadata []*test_spec_proto.TestSpec_OwnershipMetadata, +) { + testSpec := &test_spec_proto.TestSpec{ + OwnershipMetadataList: allMetadata, + } + data, err := proto.Marshal(testSpec) + if err != nil { + log.Fatal(err) + } + file, err := os.Create(outputFile) + if err != nil { + log.Fatal(err) + } + defer file.Close() + + _, err = file.Write(data) + if err != nil { + log.Fatal(err) + } +} + +func readFileToString(filePath string) string { + file, err := os.Open(filePath) + if err != nil { + log.Fatal(err) + } + defer file.Close() + + data, err := io.ReadAll(file) + if err != nil { + log.Fatal(err) + } + return string(data) +} + +func writeNewlineToOutputFile(outputFile string) { + file, err := os.Create(outputFile) + data := "\n" + if err != nil { + log.Fatal(err) + } + defer file.Close() + + _, err = file.Write([]byte(data)) + if err != nil { + log.Fatal(err) + } +} + +func processTestSpecProtobuf( + filePath string, ownershipMetadataMap *sync.Map, keyLocks *keyToLocksMap, + errCh chan error, wg *sync.WaitGroup, +) { + defer wg.Done() + + fileContent := strings.TrimRight(readFileToString(filePath), "\n") + testData := test_spec_proto.TestSpec{} + err := proto.Unmarshal([]byte(fileContent), &testData) + if err != nil { + errCh <- err + return + } + + ownershipMetadata := testData.GetOwnershipMetadataList() + for _, metadata := range ownershipMetadata { + key := metadata.GetTargetName() + lock := keyLocks.GetLockForKey(key) + lock.Lock() + + value, loaded := ownershipMetadataMap.LoadOrStore( + key, []*test_spec_proto.TestSpec_OwnershipMetadata{metadata}, + ) + if loaded { + existingMetadata := value.([]*test_spec_proto.TestSpec_OwnershipMetadata) + isDuplicate := false + for _, existing := range existingMetadata { + if metadata.GetTrendyTeamId() != existing.GetTrendyTeamId() { + errCh <- fmt.Errorf( + "Conflicting trendy team IDs found for %s at:\n%s with teamId"+ + ": %s,\n%s with teamId: %s", + key, + metadata.GetPath(), metadata.GetTrendyTeamId(), existing.GetPath(), + existing.GetTrendyTeamId(), + ) + + lock.Unlock() + return + } + if metadata.GetTrendyTeamId() == existing.GetTrendyTeamId() && metadata.GetPath() == existing.GetPath() { + isDuplicate = true + break + } + } + if !isDuplicate { + existingMetadata = append(existingMetadata, metadata) + ownershipMetadataMap.Store(key, existingMetadata) + } + } + + lock.Unlock() + } +} + +func main() { + inputFile := flag.String("inputFile", "", "Input file path") + outputFile := flag.String("outputFile", "", "Output file path") + rule := flag.String("rule", "", "Metadata rule (Hint: test_spec or code_metadata)") + flag.Parse() + + if *inputFile == "" || *outputFile == "" || *rule == "" { + fmt.Println("Usage: metadata -rule <rule> -inputFile <input file path> -outputFile <output file path>") + os.Exit(1) + } + + inputFileData := strings.TrimRight(readFileToString(*inputFile), "\n") + filePaths := strings.Split(inputFileData, " ") + if len(filePaths) == 1 && filePaths[0] == "" { + writeNewlineToOutputFile(*outputFile) + return + } + ownershipMetadataMap := &sync.Map{} + keyLocks := &keyToLocksMap{} + errCh := make(chan error, len(filePaths)) + var wg sync.WaitGroup + + switch *rule { + case "test_spec": + for _, filePath := range filePaths { + wg.Add(1) + go processTestSpecProtobuf(filePath, ownershipMetadataMap, keyLocks, errCh, &wg) + } + + wg.Wait() + close(errCh) + + for err := range errCh { + log.Fatal(err) + } + + allKeys := getSortedKeys(ownershipMetadataMap) + var allMetadata []*test_spec_proto.TestSpec_OwnershipMetadata + + for _, key := range allKeys { + value, _ := ownershipMetadataMap.Load(key) + metadataList := value.([]*test_spec_proto.TestSpec_OwnershipMetadata) + allMetadata = append(allMetadata, metadataList...) + } + + writeOutput(*outputFile, allMetadata) + break + case "code_metadata": + default: + log.Fatalf("No specific processing implemented for rule '%s'.\n", *rule) + } +} diff --git a/tools/metadata/go.mod b/tools/metadata/go.mod new file mode 100644 index 0000000000..e9d04b16f6 --- /dev/null +++ b/tools/metadata/go.mod @@ -0,0 +1,7 @@ +module android/soong/tools/metadata + +require google.golang.org/protobuf v0.0.0 + +replace google.golang.org/protobuf v0.0.0 => ../../../external/golang-protobuf + +go 1.18
\ No newline at end of file diff --git a/tools/metadata/go.work b/tools/metadata/go.work new file mode 100644 index 0000000000..23875daf3d --- /dev/null +++ b/tools/metadata/go.work @@ -0,0 +1,10 @@ +go 1.18 + +use ( + . + ../../../../external/golang-protobuf + ../../../soong/testing/test_spec_proto + +) + +replace google.golang.org/protobuf v0.0.0 => ../../../../external/golang-protobuf diff --git a/tools/metadata/testdata/emptyInputFile.txt b/tools/metadata/testdata/emptyInputFile.txt new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/tools/metadata/testdata/emptyInputFile.txt @@ -0,0 +1 @@ + diff --git a/tools/metadata/testdata/expectedOutputFile.txt b/tools/metadata/testdata/expectedOutputFile.txt new file mode 100644 index 0000000000..b0d382f279 --- /dev/null +++ b/tools/metadata/testdata/expectedOutputFile.txt @@ -0,0 +1,22 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-six +Android.bp12346 +. +java-test-module-name-six +Aqwerty.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-two +Android.bp12345 +. +java-test-module-name-two +Asdfghj.bp12345 +. +java-test-module-name-two +Azxcvbn.bp12345
\ No newline at end of file diff --git a/tools/metadata/testdata/file1.txt b/tools/metadata/testdata/file1.txt new file mode 100644 index 0000000000..81beed00ab --- /dev/null +++ b/tools/metadata/testdata/file1.txt @@ -0,0 +1,13 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-two +Android.bp12345 +. +java-test-module-name-two +Asdfghj.bp12345 +. +java-test-module-name-two +Azxcvbn.bp12345 diff --git a/tools/metadata/testdata/file2.txt b/tools/metadata/testdata/file2.txt new file mode 100644 index 0000000000..32a753fef5 --- /dev/null +++ b/tools/metadata/testdata/file2.txt @@ -0,0 +1,25 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-six +Android.bp12346 +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-six +Aqwerty.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 diff --git a/tools/metadata/testdata/file3.txt b/tools/metadata/testdata/file3.txt new file mode 100644 index 0000000000..81beed00ab --- /dev/null +++ b/tools/metadata/testdata/file3.txt @@ -0,0 +1,13 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-two +Android.bp12345 +. +java-test-module-name-two +Asdfghj.bp12345 +. +java-test-module-name-two +Azxcvbn.bp12345 diff --git a/tools/metadata/testdata/file4.txt b/tools/metadata/testdata/file4.txt new file mode 100644 index 0000000000..6a7590021d --- /dev/null +++ b/tools/metadata/testdata/file4.txt @@ -0,0 +1,25 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-six +Android.bp12346 +. +java-test-module-name-one +Android.bp12346 +. +java-test-module-name-six +Aqwerty.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 diff --git a/tools/metadata/testdata/generatedEmptyOutputFile.txt b/tools/metadata/testdata/generatedEmptyOutputFile.txt new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/tools/metadata/testdata/generatedEmptyOutputFile.txt @@ -0,0 +1 @@ + diff --git a/tools/metadata/testdata/generatedOutputFile.txt b/tools/metadata/testdata/generatedOutputFile.txt new file mode 100644 index 0000000000..b0d382f279 --- /dev/null +++ b/tools/metadata/testdata/generatedOutputFile.txt @@ -0,0 +1,22 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-six +Android.bp12346 +. +java-test-module-name-six +Aqwerty.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-two +Android.bp12345 +. +java-test-module-name-two +Asdfghj.bp12345 +. +java-test-module-name-two +Azxcvbn.bp12345
\ No newline at end of file diff --git a/tools/metadata/testdata/inputFiles.txt b/tools/metadata/testdata/inputFiles.txt new file mode 100644 index 0000000000..e44bc94d32 --- /dev/null +++ b/tools/metadata/testdata/inputFiles.txt @@ -0,0 +1 @@ +file1.txt file2.txt
\ No newline at end of file diff --git a/tools/metadata/testdata/inputFilesNegativeCase.txt b/tools/metadata/testdata/inputFilesNegativeCase.txt new file mode 100644 index 0000000000..a37aa3fd5d --- /dev/null +++ b/tools/metadata/testdata/inputFilesNegativeCase.txt @@ -0,0 +1 @@ +file3.txt file4.txt
\ No newline at end of file diff --git a/tools/metadata/testdata/metadata_test.go b/tools/metadata/testdata/metadata_test.go new file mode 100644 index 0000000000..71856fe606 --- /dev/null +++ b/tools/metadata/testdata/metadata_test.go @@ -0,0 +1,89 @@ +package main + +import ( + "fmt" + "io/ioutil" + "os/exec" + "strings" + "testing" +) + +func TestMetadata(t *testing.T) { + cmd := exec.Command( + "metadata", "-rule", "test_spec", "-inputFile", "./inputFiles.txt", "-outputFile", + "./generatedOutputFile.txt", + ) + stderr, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("Error running metadata command: %s. Error: %v", stderr, err) + } + + // Read the contents of the expected output file + expectedOutput, err := ioutil.ReadFile("./expectedOutputFile.txt") + if err != nil { + t.Fatalf("Error reading expected output file: %s", err) + } + + // Read the contents of the generated output file + generatedOutput, err := ioutil.ReadFile("./generatedOutputFile.txt") + if err != nil { + t.Fatalf("Error reading generated output file: %s", err) + } + + fmt.Println() + + // Compare the contents + if string(expectedOutput) != string(generatedOutput) { + t.Errorf("Generated file contents do not match the expected output") + } +} + +func TestMetadataNegativeCase(t *testing.T) { + cmd := exec.Command( + "metadata", "-rule", "test_spec", "-inputFile", "./inputFilesNegativeCase.txt", "-outputFile", + "./generatedOutputFileNegativeCase.txt", + ) + stderr, err := cmd.CombinedOutput() + if err == nil { + t.Fatalf( + "Expected an error, but the metadata command executed successfully. Output: %s", + stderr, + ) + } + + expectedError := "Conflicting trendy team IDs found for java-test-module" + + "-name-one at:\nAndroid.bp with teamId: 12346," + + "\nAndroid.bp with teamId: 12345" + if !strings.Contains( + strings.TrimSpace(string(stderr)), strings.TrimSpace(expectedError), + ) { + t.Errorf( + "Unexpected error message. Expected to contain: %s, Got: %s", + expectedError, stderr, + ) + } +} + +func TestEmptyInputFile(t *testing.T) { + cmd := exec.Command( + "metadata", "-rule", "test_spec", "-inputFile", "./emptyInputFile.txt", "-outputFile", + "./generatedEmptyOutputFile.txt", + ) + stderr, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("Error running metadata command: %s. Error: %v", stderr, err) + } + + // Read the contents of the generated output file + generatedOutput, err := ioutil.ReadFile("./generatedEmptyOutputFile.txt") + if err != nil { + t.Fatalf("Error reading generated output file: %s", err) + } + + fmt.Println() + + // Compare the contents + if string(generatedOutput) != "\n" { + t.Errorf("Generated file contents do not match the expected output") + } +} diff --git a/tools/metadata/testdata/outputFile.txt b/tools/metadata/testdata/outputFile.txt new file mode 100644 index 0000000000..b0d382f279 --- /dev/null +++ b/tools/metadata/testdata/outputFile.txt @@ -0,0 +1,22 @@ + +. +java-test-module-name-one +Android.bp12345 +. +java-test-module-name-six +Android.bp12346 +. +java-test-module-name-six +Aqwerty.bp12346 +. +java-test-module-name-six +Apoiuyt.bp12346 +. +java-test-module-name-two +Android.bp12345 +. +java-test-module-name-two +Asdfghj.bp12345 +. +java-test-module-name-two +Azxcvbn.bp12345
\ No newline at end of file |