diff options
Diffstat (limited to 'python')
-rw-r--r-- | python/Android.bp | 1 | ||||
-rw-r--r-- | python/binary.go | 6 | ||||
-rw-r--r-- | python/library.go | 8 | ||||
-rw-r--r-- | python/python.go | 6 | ||||
-rw-r--r-- | python/python_test.go | 161 | ||||
-rw-r--r-- | python/test.go | 8 | ||||
-rw-r--r-- | python/testing.go | 24 |
7 files changed, 95 insertions, 119 deletions
diff --git a/python/Android.bp b/python/Android.bp index b633f1e3f..e49fa6a3c 100644 --- a/python/Android.bp +++ b/python/Android.bp @@ -20,6 +20,7 @@ bootstrap_go_package { "proto.go", "python.go", "test.go", + "testing.go", ], testSrcs: [ "python_test.go", diff --git a/python/binary.go b/python/binary.go index 372b8a8c1..6061ad4f7 100644 --- a/python/binary.go +++ b/python/binary.go @@ -26,10 +26,14 @@ import ( ) func init() { - android.RegisterModuleType("python_binary_host", PythonBinaryHostFactory) + registerPythonBinaryComponents(android.InitRegistrationContext) android.RegisterBp2BuildMutator("python_binary_host", PythonBinaryBp2Build) } +func registerPythonBinaryComponents(ctx android.RegistrationContext) { + ctx.RegisterModuleType("python_binary_host", PythonBinaryHostFactory) +} + type bazelPythonBinaryAttributes struct { Main string Srcs bazel.LabelList diff --git a/python/library.go b/python/library.go index b724d2b9f..9663b3c75 100644 --- a/python/library.go +++ b/python/library.go @@ -21,8 +21,12 @@ import ( ) func init() { - android.RegisterModuleType("python_library_host", PythonLibraryHostFactory) - android.RegisterModuleType("python_library", PythonLibraryFactory) + registerPythonLibraryComponents(android.InitRegistrationContext) +} + +func registerPythonLibraryComponents(ctx android.RegistrationContext) { + ctx.RegisterModuleType("python_library_host", PythonLibraryHostFactory) + ctx.RegisterModuleType("python_library", PythonLibraryFactory) } func PythonLibraryHostFactory() android.Module { diff --git a/python/python.go b/python/python.go index a078c0b58..4444a70e6 100644 --- a/python/python.go +++ b/python/python.go @@ -29,7 +29,11 @@ import ( ) func init() { - android.PreDepsMutators(RegisterPythonPreDepsMutators) + registerPythonMutators(android.InitRegistrationContext) +} + +func registerPythonMutators(ctx android.RegistrationContext) { + ctx.PreDepsMutators(RegisterPythonPreDepsMutators) } // Exported to support other packages using Python modules in tests. diff --git a/python/python_test.go b/python/python_test.go index 5c4efa763..6263c8a25 100644 --- a/python/python_test.go +++ b/python/python_test.go @@ -15,21 +15,15 @@ package python import ( - "errors" "fmt" - "io/ioutil" "os" "path/filepath" - "reflect" - "sort" - "strings" + "regexp" "testing" "android/soong/android" ) -var buildDir string - type pyModule struct { name string actualVersion string @@ -56,7 +50,7 @@ var ( data = []struct { desc string - mockFiles map[string][]byte + mockFiles android.MockFS errors []string expectedBinaries []pyModule @@ -64,7 +58,6 @@ var ( { desc: "module without any src files", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_library_host { name: "lib1", @@ -79,7 +72,6 @@ var ( { desc: "module with bad src file ext", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_library_host { name: "lib1", @@ -98,7 +90,6 @@ var ( { desc: "module with bad data file ext", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_library_host { name: "lib1", @@ -121,7 +112,6 @@ var ( { desc: "module with bad pkg_path format", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_library_host { name: "lib1", @@ -159,7 +149,6 @@ var ( { desc: "module with bad runfile src path format", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_library_host { name: "lib1", @@ -187,7 +176,6 @@ var ( { desc: "module with duplicate runfile path", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_library_host { name: "lib1", @@ -207,21 +195,32 @@ var ( "lib1", ], } + + python_binary_host { + name: "bin", + pkg_path: "e/", + srcs: [ + "bin.py", + ], + libs: [ + "lib2", + ], + } `, ), "dir/c/file1.py": nil, "dir/file1.py": nil, + "dir/bin.py": nil, }, errors: []string{ - fmt.Sprintf(dupRunfileErrTemplate, "dir/Android.bp:9:6", - "lib2", "PY3", "a/b/c/file1.py", "lib2", "dir/file1.py", + fmt.Sprintf(dupRunfileErrTemplate, "dir/Android.bp:20:6", + "bin", "PY3", "a/b/c/file1.py", "bin", "dir/file1.py", "lib1", "dir/c/file1.py"), }, }, { desc: "module for testing dependencies", mockFiles: map[string][]byte{ - bpFile: []byte(`subdirs = ["dir"]`), filepath.Join("dir", bpFile): []byte( `python_defaults { name: "default_lib", @@ -314,10 +313,10 @@ var ( "e/default_py3.py", "e/file4.py", }, - srcsZip: "@prefix@/.intermediates/dir/bin/PY3/bin.py.srcszip", + srcsZip: "out/soong/.intermediates/dir/bin/PY3/bin.py.srcszip", depsSrcsZips: []string{ - "@prefix@/.intermediates/dir/lib5/PY3/lib5.py.srcszip", - "@prefix@/.intermediates/dir/lib6/PY3/lib6.py.srcszip", + "out/soong/.intermediates/dir/lib5/PY3/lib5.py.srcszip", + "out/soong/.intermediates/dir/lib6/PY3/lib6.py.srcszip", }, }, }, @@ -327,60 +326,37 @@ var ( func TestPythonModule(t *testing.T) { for _, d := range data { + if d.desc != "module with duplicate runfile path" { + continue + } + errorPatterns := make([]string, len(d.errors)) + for i, s := range d.errors { + errorPatterns[i] = regexp.QuoteMeta(s) + } + t.Run(d.desc, func(t *testing.T) { - config := android.TestConfig(buildDir, nil, "", d.mockFiles) - ctx := android.NewTestContext(config) - ctx.PreDepsMutators(RegisterPythonPreDepsMutators) - ctx.RegisterModuleType("python_library_host", PythonLibraryHostFactory) - ctx.RegisterModuleType("python_binary_host", PythonBinaryHostFactory) - ctx.RegisterModuleType("python_defaults", defaultsFactory) - ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) - ctx.Register() - _, testErrs := ctx.ParseBlueprintsFiles(bpFile) - android.FailIfErrored(t, testErrs) - _, actErrs := ctx.PrepareBuildActions(config) - if len(actErrs) > 0 { - testErrs = append(testErrs, expectErrors(t, actErrs, d.errors)...) - } else { - for _, e := range d.expectedBinaries { - testErrs = append(testErrs, - expectModule(t, ctx, buildDir, e.name, - e.actualVersion, - e.srcsZip, - e.pyRunfiles, - e.depsSrcsZips)...) - } + result := emptyFixtureFactory. + ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(errorPatterns)). + RunTest(t, + android.PrepareForTestWithDefaults, + PrepareForTestWithPythonBuildComponents, + d.mockFiles.AddToFixture(), + ) + + if len(result.Errs) > 0 { + return } - android.FailIfErrored(t, testErrs) - }) - } -} -func expectErrors(t *testing.T, actErrs []error, expErrs []string) (testErrs []error) { - actErrStrs := []string{} - for _, v := range actErrs { - actErrStrs = append(actErrStrs, v.Error()) - } - sort.Strings(actErrStrs) - if len(actErrStrs) != len(expErrs) { - t.Errorf("got (%d) errors, expected (%d) errors!", len(actErrStrs), len(expErrs)) - for _, v := range actErrStrs { - testErrs = append(testErrs, errors.New(v)) - } - } else { - sort.Strings(expErrs) - for i, v := range actErrStrs { - if !strings.Contains(v, expErrs[i]) { - testErrs = append(testErrs, errors.New(v)) + for _, e := range d.expectedBinaries { + t.Run(e.name, func(t *testing.T) { + expectModule(t, result.TestContext, e.name, e.actualVersion, e.srcsZip, e.pyRunfiles, e.depsSrcsZips) + }) } - } + }) } - - return } -func expectModule(t *testing.T, ctx *android.TestContext, buildDir, name, variant, expectedSrcsZip string, - expectedPyRunfiles, expectedDepsSrcsZips []string) (testErrs []error) { +func expectModule(t *testing.T, ctx *android.TestContext, name, variant, expectedSrcsZip string, expectedPyRunfiles, expectedDepsSrcsZips []string) { module := ctx.ModuleForTests(name, variant) base, baseOk := module.Module().(*Module) @@ -393,56 +369,15 @@ func expectModule(t *testing.T, ctx *android.TestContext, buildDir, name, varian actualPyRunfiles = append(actualPyRunfiles, path.dest) } - if !reflect.DeepEqual(actualPyRunfiles, expectedPyRunfiles) { - testErrs = append(testErrs, errors.New(fmt.Sprintf( - `binary "%s" variant "%s" has unexpected pyRunfiles: %q! (expected: %q)`, - base.Name(), - base.properties.Actual_version, - actualPyRunfiles, - expectedPyRunfiles))) - } + android.AssertDeepEquals(t, "pyRunfiles", expectedPyRunfiles, actualPyRunfiles) - if base.srcsZip.String() != strings.Replace(expectedSrcsZip, "@prefix@", buildDir, 1) { - testErrs = append(testErrs, errors.New(fmt.Sprintf( - `binary "%s" variant "%s" has unexpected srcsZip: %q!`, - base.Name(), - base.properties.Actual_version, - base.srcsZip))) - } + android.AssertPathRelativeToTopEquals(t, "srcsZip", expectedSrcsZip, base.srcsZip) - for i, _ := range expectedDepsSrcsZips { - expectedDepsSrcsZips[i] = strings.Replace(expectedDepsSrcsZips[i], "@prefix@", buildDir, 1) - } - if !reflect.DeepEqual(base.depsSrcsZips.Strings(), expectedDepsSrcsZips) { - testErrs = append(testErrs, errors.New(fmt.Sprintf( - `binary "%s" variant "%s" has unexpected depsSrcsZips: %q!`, - base.Name(), - base.properties.Actual_version, - base.depsSrcsZips))) - } - - return -} - -func setUp() { - var err error - buildDir, err = ioutil.TempDir("", "soong_python_test") - if err != nil { - panic(err) - } + android.AssertPathsRelativeToTopEquals(t, "depsSrcsZips", expectedDepsSrcsZips, base.depsSrcsZips) } -func tearDown() { - os.RemoveAll(buildDir) -} +var emptyFixtureFactory = android.NewFixtureFactory(nil) func TestMain(m *testing.M) { - run := func() int { - setUp() - defer tearDown() - - return m.Run() - } - - os.Exit(run()) + os.Exit(m.Run()) } diff --git a/python/test.go b/python/test.go index b7cd4756a..6713189fd 100644 --- a/python/test.go +++ b/python/test.go @@ -22,8 +22,12 @@ import ( // This file contains the module types for building Python test. func init() { - android.RegisterModuleType("python_test_host", PythonTestHostFactory) - android.RegisterModuleType("python_test", PythonTestFactory) + registerPythonTestComponents(android.InitRegistrationContext) +} + +func registerPythonTestComponents(ctx android.RegistrationContext) { + ctx.RegisterModuleType("python_test_host", PythonTestHostFactory) + ctx.RegisterModuleType("python_test", PythonTestFactory) } // Test option struct. diff --git a/python/testing.go b/python/testing.go new file mode 100644 index 000000000..ce1a5ab27 --- /dev/null +++ b/python/testing.go @@ -0,0 +1,24 @@ +// Copyright 2021 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 python + +import "android/soong/android" + +var PrepareForTestWithPythonBuildComponents = android.GroupFixturePreparers( + android.FixtureRegisterWithContext(registerPythonBinaryComponents), + android.FixtureRegisterWithContext(registerPythonLibraryComponents), + android.FixtureRegisterWithContext(registerPythonTestComponents), + android.FixtureRegisterWithContext(registerPythonMutators), +) |