Loading bazel/cquery/request_type.go +51 −16 Original line number Diff line number Diff line Loading @@ -158,28 +158,63 @@ else: # NOTE: It's OK if there's no ToC, as Soong just uses it for optimization pass return json_encode({ "OutputFiles": outputFiles, "CcObjectFiles": ccObjectFiles, "CcSharedLibraryFiles": sharedLibraries, "CcStaticLibraryFiles": staticLibraries, "Includes": includes, "SystemIncludes": system_includes, "Headers": headers, "RootStaticArchives": rootStaticArchives, "RootDynamicLibraries": rootSharedLibraries, "toc_file": toc_file })` returns = [ outputFiles, ccObjectFiles, sharedLibraries, staticLibraries, includes, system_includes, headers, rootStaticArchives, rootSharedLibraries, [toc_file] ] return "|".join([", ".join(r) for r in returns])` } // ParseResult returns a value obtained by parsing the result of the request's Starlark function. // The given rawString must correspond to the string output which was created by evaluating the // Starlark given in StarlarkFunctionBody. func (g getCcInfoType) ParseResult(rawString string) (CcInfo, error) { var ccInfo CcInfo decoder := json.NewDecoder(strings.NewReader(rawString)) err := decoder.Decode(&ccInfo) return ccInfo, err const expectedLen = 10 splitString := strings.Split(rawString, "|") if len(splitString) != expectedLen { return CcInfo{}, fmt.Errorf("expected %d items, got %q", expectedLen, splitString) } outputFilesString := splitString[0] ccObjectsString := splitString[1] ccSharedLibrariesString := splitString[2] ccStaticLibrariesString := splitString[3] includesString := splitString[4] systemIncludesString := splitString[5] headersString := splitString[6] rootStaticArchivesString := splitString[7] rootDynamicLibrariesString := splitString[8] tocFile := splitString[9] // NOTE: Will be the empty string if there wasn't outputFiles := splitOrEmpty(outputFilesString, ", ") ccObjects := splitOrEmpty(ccObjectsString, ", ") ccSharedLibraries := splitOrEmpty(ccSharedLibrariesString, ", ") ccStaticLibraries := splitOrEmpty(ccStaticLibrariesString, ", ") includes := splitOrEmpty(includesString, ", ") systemIncludes := splitOrEmpty(systemIncludesString, ", ") headers := splitOrEmpty(headersString, ", ") rootStaticArchives := splitOrEmpty(rootStaticArchivesString, ", ") rootDynamicLibraries := splitOrEmpty(rootDynamicLibrariesString, ", ") return CcInfo{ OutputFiles: outputFiles, CcObjectFiles: ccObjects, CcSharedLibraryFiles: ccSharedLibraries, CcStaticLibraryFiles: ccStaticLibraries, Includes: includes, SystemIncludes: systemIncludes, Headers: headers, RootStaticArchives: rootStaticArchives, RootDynamicLibraries: rootDynamicLibraries, TocFile: tocFile, }, nil } // Query Bazel for the artifacts generated by the apex modules. Loading bazel/cquery/request_type_test.go +64 −27 Original line number Diff line number Diff line package cquery import ( "encoding/json" "fmt" "reflect" "strings" "testing" ) Loading Loading @@ -62,49 +63,74 @@ func TestGetPythonBinaryParseResults(t *testing.T) { } func TestGetCcInfoParseResults(t *testing.T) { const expectedSplits = 10 noResult := strings.Repeat("|", expectedSplits-1) testCases := []struct { description string inputCcInfo CcInfo input string expectedOutput CcInfo expectedErrorMessage string }{ { description: "no result", inputCcInfo: CcInfo{}, expectedOutput: CcInfo{}, input: noResult, expectedOutput: CcInfo{ OutputFiles: []string{}, CcObjectFiles: []string{}, CcSharedLibraryFiles: []string{}, CcStaticLibraryFiles: []string{}, Includes: []string{}, SystemIncludes: []string{}, Headers: []string{}, RootStaticArchives: []string{}, RootDynamicLibraries: []string{}, TocFile: "", }, }, { description: "only output", inputCcInfo: CcInfo{ OutputFiles: []string{"test", "test3"}, }, input: "test" + noResult, expectedOutput: CcInfo{ OutputFiles: []string{"test", "test3"}, OutputFiles: []string{"test"}, CcObjectFiles: []string{}, CcSharedLibraryFiles: []string{}, CcStaticLibraryFiles: []string{}, Includes: []string{}, SystemIncludes: []string{}, Headers: []string{}, RootStaticArchives: []string{}, RootDynamicLibraries: []string{}, TocFile: "", }, }, { description: "only ToC", inputCcInfo: CcInfo{ TocFile: "test", }, input: noResult + "test", expectedOutput: CcInfo{ OutputFiles: []string{}, CcObjectFiles: []string{}, CcSharedLibraryFiles: []string{}, CcStaticLibraryFiles: []string{}, Includes: []string{}, SystemIncludes: []string{}, Headers: []string{}, RootStaticArchives: []string{}, RootDynamicLibraries: []string{}, TocFile: "test", }, }, { description: "all items set", inputCcInfo: CcInfo{ OutputFiles: []string{"out1", "out2"}, CcObjectFiles: []string{"object1", "object2"}, CcSharedLibraryFiles: []string{"shared_lib1", "shared_lib2"}, CcStaticLibraryFiles: []string{"static_lib1", "static_lib2"}, Includes: []string{".", "dir/subdir"}, SystemIncludes: []string{"system/dir", "system/other/dir"}, Headers: []string{"dir/subdir/hdr.h"}, RootStaticArchives: []string{"rootstaticarchive1"}, RootDynamicLibraries: []string{"rootdynamiclibrary1"}, TocFile: "lib.so.toc", }, input: "out1, out2" + "|object1, object2" + "|shared_lib1, shared_lib2" + "|static_lib1, static_lib2" + "|., dir/subdir" + "|system/dir, system/other/dir" + "|dir/subdir/hdr.h" + "|rootstaticarchive1" + "|rootdynamiclibrary1" + "|lib.so.toc", expectedOutput: CcInfo{ OutputFiles: []string{"out1", "out2"}, CcObjectFiles: []string{"object1", "object2"}, Loading @@ -118,10 +144,21 @@ func TestGetCcInfoParseResults(t *testing.T) { TocFile: "lib.so.toc", }, }, { description: "too few result splits", input: "|", expectedOutput: CcInfo{}, expectedErrorMessage: fmt.Sprintf("expected %d items, got %q", expectedSplits, []string{"", ""}), }, { description: "too many result splits", input: strings.Repeat("|", expectedSplits+1), // 2 too many expectedOutput: CcInfo{}, expectedErrorMessage: fmt.Sprintf("expected %d items, got %q", expectedSplits, make([]string, expectedSplits+2)), }, } for _, tc := range testCases { jsonInput, err := json.Marshal(tc.inputCcInfo) actualOutput, err := GetCcInfo.ParseResult(string(jsonInput)) actualOutput, err := GetCcInfo.ParseResult(tc.input) if (err == nil && tc.expectedErrorMessage != "") || (err != nil && err.Error() != tc.expectedErrorMessage) { t.Errorf("%q:\n%12s: %q\n%12s: %q", tc.description, "expect Error", tc.expectedErrorMessage, "but got", err) Loading Loading
bazel/cquery/request_type.go +51 −16 Original line number Diff line number Diff line Loading @@ -158,28 +158,63 @@ else: # NOTE: It's OK if there's no ToC, as Soong just uses it for optimization pass return json_encode({ "OutputFiles": outputFiles, "CcObjectFiles": ccObjectFiles, "CcSharedLibraryFiles": sharedLibraries, "CcStaticLibraryFiles": staticLibraries, "Includes": includes, "SystemIncludes": system_includes, "Headers": headers, "RootStaticArchives": rootStaticArchives, "RootDynamicLibraries": rootSharedLibraries, "toc_file": toc_file })` returns = [ outputFiles, ccObjectFiles, sharedLibraries, staticLibraries, includes, system_includes, headers, rootStaticArchives, rootSharedLibraries, [toc_file] ] return "|".join([", ".join(r) for r in returns])` } // ParseResult returns a value obtained by parsing the result of the request's Starlark function. // The given rawString must correspond to the string output which was created by evaluating the // Starlark given in StarlarkFunctionBody. func (g getCcInfoType) ParseResult(rawString string) (CcInfo, error) { var ccInfo CcInfo decoder := json.NewDecoder(strings.NewReader(rawString)) err := decoder.Decode(&ccInfo) return ccInfo, err const expectedLen = 10 splitString := strings.Split(rawString, "|") if len(splitString) != expectedLen { return CcInfo{}, fmt.Errorf("expected %d items, got %q", expectedLen, splitString) } outputFilesString := splitString[0] ccObjectsString := splitString[1] ccSharedLibrariesString := splitString[2] ccStaticLibrariesString := splitString[3] includesString := splitString[4] systemIncludesString := splitString[5] headersString := splitString[6] rootStaticArchivesString := splitString[7] rootDynamicLibrariesString := splitString[8] tocFile := splitString[9] // NOTE: Will be the empty string if there wasn't outputFiles := splitOrEmpty(outputFilesString, ", ") ccObjects := splitOrEmpty(ccObjectsString, ", ") ccSharedLibraries := splitOrEmpty(ccSharedLibrariesString, ", ") ccStaticLibraries := splitOrEmpty(ccStaticLibrariesString, ", ") includes := splitOrEmpty(includesString, ", ") systemIncludes := splitOrEmpty(systemIncludesString, ", ") headers := splitOrEmpty(headersString, ", ") rootStaticArchives := splitOrEmpty(rootStaticArchivesString, ", ") rootDynamicLibraries := splitOrEmpty(rootDynamicLibrariesString, ", ") return CcInfo{ OutputFiles: outputFiles, CcObjectFiles: ccObjects, CcSharedLibraryFiles: ccSharedLibraries, CcStaticLibraryFiles: ccStaticLibraries, Includes: includes, SystemIncludes: systemIncludes, Headers: headers, RootStaticArchives: rootStaticArchives, RootDynamicLibraries: rootDynamicLibraries, TocFile: tocFile, }, nil } // Query Bazel for the artifacts generated by the apex modules. Loading
bazel/cquery/request_type_test.go +64 −27 Original line number Diff line number Diff line package cquery import ( "encoding/json" "fmt" "reflect" "strings" "testing" ) Loading Loading @@ -62,49 +63,74 @@ func TestGetPythonBinaryParseResults(t *testing.T) { } func TestGetCcInfoParseResults(t *testing.T) { const expectedSplits = 10 noResult := strings.Repeat("|", expectedSplits-1) testCases := []struct { description string inputCcInfo CcInfo input string expectedOutput CcInfo expectedErrorMessage string }{ { description: "no result", inputCcInfo: CcInfo{}, expectedOutput: CcInfo{}, input: noResult, expectedOutput: CcInfo{ OutputFiles: []string{}, CcObjectFiles: []string{}, CcSharedLibraryFiles: []string{}, CcStaticLibraryFiles: []string{}, Includes: []string{}, SystemIncludes: []string{}, Headers: []string{}, RootStaticArchives: []string{}, RootDynamicLibraries: []string{}, TocFile: "", }, }, { description: "only output", inputCcInfo: CcInfo{ OutputFiles: []string{"test", "test3"}, }, input: "test" + noResult, expectedOutput: CcInfo{ OutputFiles: []string{"test", "test3"}, OutputFiles: []string{"test"}, CcObjectFiles: []string{}, CcSharedLibraryFiles: []string{}, CcStaticLibraryFiles: []string{}, Includes: []string{}, SystemIncludes: []string{}, Headers: []string{}, RootStaticArchives: []string{}, RootDynamicLibraries: []string{}, TocFile: "", }, }, { description: "only ToC", inputCcInfo: CcInfo{ TocFile: "test", }, input: noResult + "test", expectedOutput: CcInfo{ OutputFiles: []string{}, CcObjectFiles: []string{}, CcSharedLibraryFiles: []string{}, CcStaticLibraryFiles: []string{}, Includes: []string{}, SystemIncludes: []string{}, Headers: []string{}, RootStaticArchives: []string{}, RootDynamicLibraries: []string{}, TocFile: "test", }, }, { description: "all items set", inputCcInfo: CcInfo{ OutputFiles: []string{"out1", "out2"}, CcObjectFiles: []string{"object1", "object2"}, CcSharedLibraryFiles: []string{"shared_lib1", "shared_lib2"}, CcStaticLibraryFiles: []string{"static_lib1", "static_lib2"}, Includes: []string{".", "dir/subdir"}, SystemIncludes: []string{"system/dir", "system/other/dir"}, Headers: []string{"dir/subdir/hdr.h"}, RootStaticArchives: []string{"rootstaticarchive1"}, RootDynamicLibraries: []string{"rootdynamiclibrary1"}, TocFile: "lib.so.toc", }, input: "out1, out2" + "|object1, object2" + "|shared_lib1, shared_lib2" + "|static_lib1, static_lib2" + "|., dir/subdir" + "|system/dir, system/other/dir" + "|dir/subdir/hdr.h" + "|rootstaticarchive1" + "|rootdynamiclibrary1" + "|lib.so.toc", expectedOutput: CcInfo{ OutputFiles: []string{"out1", "out2"}, CcObjectFiles: []string{"object1", "object2"}, Loading @@ -118,10 +144,21 @@ func TestGetCcInfoParseResults(t *testing.T) { TocFile: "lib.so.toc", }, }, { description: "too few result splits", input: "|", expectedOutput: CcInfo{}, expectedErrorMessage: fmt.Sprintf("expected %d items, got %q", expectedSplits, []string{"", ""}), }, { description: "too many result splits", input: strings.Repeat("|", expectedSplits+1), // 2 too many expectedOutput: CcInfo{}, expectedErrorMessage: fmt.Sprintf("expected %d items, got %q", expectedSplits, make([]string, expectedSplits+2)), }, } for _, tc := range testCases { jsonInput, err := json.Marshal(tc.inputCcInfo) actualOutput, err := GetCcInfo.ParseResult(string(jsonInput)) actualOutput, err := GetCcInfo.ParseResult(tc.input) if (err == nil && tc.expectedErrorMessage != "") || (err != nil && err.Error() != tc.expectedErrorMessage) { t.Errorf("%q:\n%12s: %q\n%12s: %q", tc.description, "expect Error", tc.expectedErrorMessage, "but got", err) Loading