795c377e14
Calling android.NewContext() in tests results in a context that contains all the mutators, module types, and singletons, which causes unexpected interactions in unit tests. Create an empty context instead, and add in only the necessary mutators, module types, and singletons. Bug: 36366816 Test: soong tests Change-Id: Ic61262c37e3436b3ad4ccaca18b737021c304be6
208 lines
4 KiB
Go
208 lines
4 KiB
Go
// Copyright 2017 Google Inc. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package cc
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"android/soong/android"
|
|
"android/soong/genrule"
|
|
|
|
"github.com/google/blueprint"
|
|
)
|
|
|
|
type dataFile struct {
|
|
path string
|
|
file string
|
|
}
|
|
|
|
var testDataTests = []struct {
|
|
name string
|
|
modules string
|
|
data []dataFile
|
|
}{
|
|
{
|
|
name: "data files",
|
|
modules: `
|
|
test {
|
|
name: "foo",
|
|
data: [
|
|
"baz",
|
|
"bar/baz",
|
|
],
|
|
}`,
|
|
data: []dataFile{
|
|
{"dir", "baz"},
|
|
{"dir", "bar/baz"},
|
|
},
|
|
},
|
|
{
|
|
name: "filegroup",
|
|
modules: `
|
|
filegroup {
|
|
name: "fg",
|
|
srcs: [
|
|
"baz",
|
|
"bar/baz",
|
|
],
|
|
}
|
|
|
|
test {
|
|
name: "foo",
|
|
data: [":fg"],
|
|
}`,
|
|
data: []dataFile{
|
|
{"dir", "baz"},
|
|
{"dir", "bar/baz"},
|
|
},
|
|
},
|
|
{
|
|
name: "relative filegroup",
|
|
modules: `
|
|
filegroup {
|
|
name: "fg",
|
|
srcs: [
|
|
"bar/baz",
|
|
],
|
|
path: "bar",
|
|
}
|
|
|
|
test {
|
|
name: "foo",
|
|
data: [":fg"],
|
|
}`,
|
|
data: []dataFile{
|
|
{"dir/bar", "baz"},
|
|
},
|
|
},
|
|
{
|
|
name: "relative filegroup trailing slash",
|
|
modules: `
|
|
filegroup {
|
|
name: "fg",
|
|
srcs: [
|
|
"bar/baz",
|
|
],
|
|
path: "bar/",
|
|
}
|
|
|
|
test {
|
|
name: "foo",
|
|
data: [":fg"],
|
|
}`,
|
|
data: []dataFile{
|
|
{"dir/bar", "baz"},
|
|
},
|
|
},
|
|
}
|
|
|
|
func TestDataTests(t *testing.T) {
|
|
buildDir, err := ioutil.TempDir("", "soong_test_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(buildDir)
|
|
|
|
config := android.TestConfig(buildDir)
|
|
|
|
for _, test := range testDataTests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
ctx := blueprint.NewContext()
|
|
android.RegisterTestMutators(ctx)
|
|
ctx.MockFileSystem(map[string][]byte{
|
|
"Blueprints": []byte(`subdirs = ["dir"]`),
|
|
"dir/Blueprints": []byte(test.modules),
|
|
"dir/baz": nil,
|
|
"dir/bar/baz": nil,
|
|
})
|
|
ctx.RegisterModuleType("filegroup", genrule.FileGroupFactory)
|
|
ctx.RegisterModuleType("test", newTest)
|
|
|
|
_, errs := ctx.ParseBlueprintsFiles("Blueprints")
|
|
fail(t, errs)
|
|
_, errs = ctx.PrepareBuildActions(config)
|
|
fail(t, errs)
|
|
|
|
foo := findModule(ctx, "foo")
|
|
if foo == nil {
|
|
t.Fatalf("failed to find module foo")
|
|
}
|
|
|
|
got := foo.(*testDataTest).data
|
|
if len(got) != len(test.data) {
|
|
t.Errorf("expected %d data files, got %d",
|
|
len(test.data), len(got))
|
|
}
|
|
|
|
for i := range got {
|
|
if i >= len(test.data) {
|
|
break
|
|
}
|
|
|
|
path := filepath.Join(test.data[i].path, test.data[i].file)
|
|
if test.data[i].file != got[i].Rel() ||
|
|
path != got[i].String() {
|
|
fmt.Errorf("expected %s:%s got %s:%s",
|
|
path, test.data[i].file,
|
|
got[i].String(), got[i].Rel())
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
type testDataTest struct {
|
|
android.ModuleBase
|
|
data android.Paths
|
|
Properties struct {
|
|
Data []string
|
|
}
|
|
}
|
|
|
|
func newTest() (blueprint.Module, []interface{}) {
|
|
m := &testDataTest{}
|
|
return android.InitAndroidModule(m, &m.Properties)
|
|
}
|
|
|
|
func (test *testDataTest) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
android.ExtractSourcesDeps(ctx, test.Properties.Data)
|
|
}
|
|
|
|
func (test *testDataTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
test.data = ctx.ExpandSources(test.Properties.Data, nil)
|
|
}
|
|
|
|
func findModule(ctx *blueprint.Context, name string) blueprint.Module {
|
|
var ret blueprint.Module
|
|
ctx.VisitAllModules(func(m blueprint.Module) {
|
|
if ctx.ModuleName(m) == name {
|
|
ret = m
|
|
}
|
|
})
|
|
return ret
|
|
}
|
|
|
|
func fail(t *testing.T, errs []error) {
|
|
if len(errs) > 0 {
|
|
for _, err := range errs {
|
|
t.Error(err)
|
|
}
|
|
t.FailNow()
|
|
}
|
|
}
|