2021-04-08 15:47:28 +02:00
|
|
|
package android
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestRequestResultsAfterInvokeBazel(t *testing.T) {
|
|
|
|
label := "//foo:bar"
|
|
|
|
arch := Arm64
|
|
|
|
bazelContext, _ := testBazelContext(t, map[bazelCommand]string{
|
2021-05-11 16:54:29 +02:00
|
|
|
bazelCommand{command: "cquery", expression: "kind(rule, deps(@soong_injection//mixed_builds:buildroot))"}: `//foo:bar|arm64>>out/foo/bar.txt`,
|
2021-04-08 15:47:28 +02:00
|
|
|
})
|
|
|
|
g, ok := bazelContext.GetOutputFiles(label, arch)
|
|
|
|
if ok {
|
|
|
|
t.Errorf("Did not expect cquery results prior to running InvokeBazel(), but got %s", g)
|
|
|
|
}
|
|
|
|
err := bazelContext.InvokeBazel()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Did not expect error invoking Bazel, but got %s", err)
|
|
|
|
}
|
|
|
|
g, ok = bazelContext.GetOutputFiles(label, arch)
|
|
|
|
if !ok {
|
|
|
|
t.Errorf("Expected cquery results after running InvokeBazel(), but got none")
|
|
|
|
} else if w := []string{"out/foo/bar.txt"}; !reflect.DeepEqual(w, g) {
|
|
|
|
t.Errorf("Expected output %s, got %s", w, g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestInvokeBazelWritesBazelFiles(t *testing.T) {
|
|
|
|
bazelContext, baseDir := testBazelContext(t, map[bazelCommand]string{})
|
|
|
|
err := bazelContext.InvokeBazel()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Did not expect error invoking Bazel, but got %s", err)
|
|
|
|
}
|
2021-05-11 16:54:29 +02:00
|
|
|
if _, err := os.Stat(filepath.Join(baseDir, "soong_injection", "mixed_builds", "main.bzl")); os.IsNotExist(err) {
|
2021-04-08 15:47:28 +02:00
|
|
|
t.Errorf("Expected main.bzl to exist, but it does not")
|
|
|
|
} else if err != nil {
|
|
|
|
t.Errorf("Unexpected error stating main.bzl %s", err)
|
|
|
|
}
|
|
|
|
|
2021-05-11 16:54:29 +02:00
|
|
|
if _, err := os.Stat(filepath.Join(baseDir, "soong_injection", "mixed_builds", "BUILD.bazel")); os.IsNotExist(err) {
|
2021-04-08 15:47:28 +02:00
|
|
|
t.Errorf("Expected BUILD.bazel to exist, but it does not")
|
|
|
|
} else if err != nil {
|
|
|
|
t.Errorf("Unexpected error stating BUILD.bazel %s", err)
|
|
|
|
}
|
|
|
|
|
2021-04-21 14:46:34 +02:00
|
|
|
if _, err := os.Stat(filepath.Join(baseDir, "soong_injection", "WORKSPACE.bazel")); os.IsNotExist(err) {
|
2021-04-08 15:47:28 +02:00
|
|
|
t.Errorf("Expected WORKSPACE.bazel to exist, but it does not")
|
|
|
|
} else if err != nil {
|
|
|
|
t.Errorf("Unexpected error stating WORKSPACE.bazel %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestInvokeBazelPopulatesBuildStatements(t *testing.T) {
|
|
|
|
bazelContext, _ := testBazelContext(t, map[bazelCommand]string{
|
2021-05-11 16:54:29 +02:00
|
|
|
bazelCommand{command: "aquery", expression: "deps(@soong_injection//mixed_builds:buildroot)"}: `
|
2021-04-08 15:47:28 +02:00
|
|
|
{
|
|
|
|
"artifacts": [{
|
|
|
|
"id": 1,
|
|
|
|
"pathFragmentId": 1
|
|
|
|
}, {
|
|
|
|
"id": 2,
|
|
|
|
"pathFragmentId": 2
|
|
|
|
}],
|
|
|
|
"actions": [{
|
|
|
|
"targetId": 1,
|
|
|
|
"actionKey": "x",
|
|
|
|
"mnemonic": "x",
|
|
|
|
"arguments": ["touch", "foo"],
|
|
|
|
"inputDepSetIds": [1],
|
|
|
|
"outputIds": [1],
|
|
|
|
"primaryOutputId": 1
|
|
|
|
}],
|
|
|
|
"depSetOfFiles": [{
|
|
|
|
"id": 1,
|
|
|
|
"directArtifactIds": [1, 2]
|
|
|
|
}],
|
|
|
|
"pathFragments": [{
|
|
|
|
"id": 1,
|
|
|
|
"label": "one"
|
|
|
|
}, {
|
|
|
|
"id": 2,
|
|
|
|
"label": "two"
|
|
|
|
}]
|
|
|
|
}`,
|
|
|
|
})
|
|
|
|
err := bazelContext.InvokeBazel()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Did not expect error invoking Bazel, but got %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
got := bazelContext.BuildStatementsToRegister()
|
|
|
|
if want := 1; len(got) != want {
|
|
|
|
t.Errorf("Expected %d registered build statements, got %#v", want, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testBazelContext(t *testing.T, bazelCommandResults map[bazelCommand]string) (*bazelContext, string) {
|
|
|
|
t.Helper()
|
|
|
|
p := bazelPaths{
|
2021-08-26 15:07:24 +02:00
|
|
|
soongOutDir: t.TempDir(),
|
2021-04-08 15:47:28 +02:00
|
|
|
outputBase: "outputbase",
|
|
|
|
workspaceDir: "workspace_dir",
|
|
|
|
}
|
2021-05-11 16:54:29 +02:00
|
|
|
aqueryCommand := bazelCommand{command: "aquery", expression: "deps(@soong_injection//mixed_builds:buildroot)"}
|
2021-04-08 15:47:28 +02:00
|
|
|
if _, exists := bazelCommandResults[aqueryCommand]; !exists {
|
|
|
|
bazelCommandResults[aqueryCommand] = "{}\n"
|
|
|
|
}
|
|
|
|
runner := &mockBazelRunner{bazelCommandResults: bazelCommandResults}
|
|
|
|
return &bazelContext{
|
|
|
|
bazelRunner: runner,
|
|
|
|
paths: &p,
|
|
|
|
requests: map[cqueryKey]bool{},
|
2021-08-26 15:07:24 +02:00
|
|
|
}, p.soongOutDir
|
2021-04-08 15:47:28 +02:00
|
|
|
}
|