Improve aquery-related validation and error handling
Also introduce test suite for aquery handling
Test: m nothing
Test: lunch aosp_flame && USE_BAZEL_ANALYSIS=1 m libc
Change-Id: I2493d42782099ea0b575968fca38bce6f0d59015
diff --git a/bazel/aquery.go b/bazel/aquery.go
index 404be8c..a196e8b 100644
--- a/bazel/aquery.go
+++ b/bazel/aquery.go
@@ -83,11 +83,15 @@
// AqueryBuildStatements returns an array of BuildStatements which should be registered (and output
// to a ninja file) to correspond one-to-one with the given action graph json proto (from a bazel
// aquery invocation).
-func AqueryBuildStatements(aqueryJsonProto []byte) []BuildStatement {
+func AqueryBuildStatements(aqueryJsonProto []byte) ([]BuildStatement, error) {
buildStatements := []BuildStatement{}
var aqueryResult actionGraphContainer
- json.Unmarshal(aqueryJsonProto, &aqueryResult)
+ err := json.Unmarshal(aqueryJsonProto, &aqueryResult)
+
+ if err != nil {
+ return nil, err
+ }
pathFragments := map[int]pathFragment{}
for _, pathFragment := range aqueryResult.PathFragments {
@@ -97,8 +101,7 @@
for _, artifact := range aqueryResult.Artifacts {
artifactPath, err := expandPathFragment(artifact.PathFragmentId, pathFragments)
if err != nil {
- // TODO(cparsons): Better error handling.
- panic(err.Error())
+ return nil, err
}
artifactIdToPath[artifact.Id] = artifactPath
}
@@ -110,15 +113,24 @@
for _, actionEntry := range aqueryResult.Actions {
outputPaths := []string{}
for _, outputId := range actionEntry.OutputIds {
- // TODO(cparsons): Validate the id is present.
- outputPaths = append(outputPaths, artifactIdToPath[outputId])
+ outputPath, exists := artifactIdToPath[outputId]
+ if !exists {
+ return nil, fmt.Errorf("undefined outputId %d", outputId)
+ }
+ outputPaths = append(outputPaths, outputPath)
}
inputPaths := []string{}
for _, inputDepSetId := range actionEntry.InputDepSetIds {
- // TODO(cparsons): Validate the id is present.
- for _, inputId := range depsetIdToArtifactIds[inputDepSetId] {
- // TODO(cparsons): Validate the id is present.
- inputPaths = append(inputPaths, artifactIdToPath[inputId])
+ inputArtifacts, exists := depsetIdToArtifactIds[inputDepSetId]
+ if !exists {
+ return nil, fmt.Errorf("undefined input depsetId %d", inputDepSetId)
+ }
+ for _, inputId := range inputArtifacts {
+ inputPath, exists := artifactIdToPath[inputId]
+ if !exists {
+ return nil, fmt.Errorf("undefined input artifactId %d", inputId)
+ }
+ inputPaths = append(inputPaths, inputPath)
}
}
buildStatement := BuildStatement{
@@ -130,7 +142,7 @@
buildStatements = append(buildStatements, buildStatement)
}
- return buildStatements
+ return buildStatements, nil
}
func expandPathFragment(id int, pathFragmentsMap map[int]pathFragment) (string, error) {
@@ -140,7 +152,7 @@
for currId > 0 {
currFragment, ok := pathFragmentsMap[currId]
if !ok {
- return "", fmt.Errorf("undefined path fragment id '%s'", currId)
+ return "", fmt.Errorf("undefined path fragment id %d", currId)
}
labels = append([]string{currFragment.Label}, labels...)
currId = currFragment.ParentId