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), +)  |