родитель
							
								
									18242bc26a
								
							
						
					
					
						коммит
						a536ddcda8
					
				
					 3 изменённых файлов: 52 добавлений и 10 удалений
				
			
		
							
								
								
									
										16
									
								
								main.go
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								main.go
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -177,7 +177,7 @@ func Build(pkgName, outpath string, options *compileopts.Options) error {
 | 
			
		|||
 | 
			
		||||
// Test runs the tests in the given package. Returns whether the test passed and
 | 
			
		||||
// possibly an error if the test failed to run.
 | 
			
		||||
func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVerbose, testShort bool, outpath string) (bool, error) {
 | 
			
		||||
func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVerbose, testShort bool, testRunRegexp string, outpath string) (bool, error) {
 | 
			
		||||
	options.TestConfig.CompileTestBinary = true
 | 
			
		||||
	config, err := builder.NewConfig(options)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -203,7 +203,7 @@ func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVer
 | 
			
		|||
		// Run the test.
 | 
			
		||||
		start := time.Now()
 | 
			
		||||
		var err error
 | 
			
		||||
		passed, err = runPackageTest(config, result, testVerbose, testShort)
 | 
			
		||||
		passed, err = runPackageTest(config, result, testVerbose, testShort, testRunRegexp)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -229,7 +229,7 @@ func Test(pkgName string, options *compileopts.Options, testCompileOnly, testVer
 | 
			
		|||
// runPackageTest runs a test binary that was previously built. The return
 | 
			
		||||
// values are whether the test passed and any errors encountered while trying to
 | 
			
		||||
// run the binary.
 | 
			
		||||
func runPackageTest(config *compileopts.Config, result builder.BuildResult, testVerbose, testShort bool) (bool, error) {
 | 
			
		||||
func runPackageTest(config *compileopts.Config, result builder.BuildResult, testVerbose, testShort bool, testRunRegexp string) (bool, error) {
 | 
			
		||||
	var cmd *exec.Cmd
 | 
			
		||||
	if len(config.Target.Emulator) == 0 {
 | 
			
		||||
		// Run directly.
 | 
			
		||||
| 
						 | 
				
			
			@ -240,6 +240,9 @@ func runPackageTest(config *compileopts.Config, result builder.BuildResult, test
 | 
			
		|||
		if testShort {
 | 
			
		||||
			flags = append(flags, "-test.short")
 | 
			
		||||
		}
 | 
			
		||||
		if testRunRegexp != "" {
 | 
			
		||||
			flags = append(flags, "-test.run="+testRunRegexp)
 | 
			
		||||
		}
 | 
			
		||||
		cmd = executeCommand(config.Options, result.Binary, flags...)
 | 
			
		||||
		cmd.Dir = result.MainDir
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -255,6 +258,9 @@ func runPackageTest(config *compileopts.Config, result builder.BuildResult, test
 | 
			
		|||
			if testShort {
 | 
			
		||||
				args = append(args, "-test.short")
 | 
			
		||||
			}
 | 
			
		||||
			if testRunRegexp != "" {
 | 
			
		||||
				args = append(args, "-test.run="+testRunRegexp)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		cmd = executeCommand(config.Options, config.Target.Emulator[0], args...)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1150,10 +1156,12 @@ func main() {
 | 
			
		|||
		flag.StringVar(&outpath, "o", "", "output filename")
 | 
			
		||||
	}
 | 
			
		||||
	var testCompileOnlyFlag, testVerboseFlag, testShortFlag *bool
 | 
			
		||||
	var testRunRegexp *string
 | 
			
		||||
	if command == "help" || command == "test" {
 | 
			
		||||
		testCompileOnlyFlag = flag.Bool("c", false, "compile the test binary but do not run it")
 | 
			
		||||
		testVerboseFlag = flag.Bool("v", false, "verbose: print additional output")
 | 
			
		||||
		testShortFlag = flag.Bool("short", false, "short: run smaller test suite to save time")
 | 
			
		||||
		testRunRegexp = flag.String("run", "", "run: regexp of tests to run")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Early command processing, before commands are interpreted by the Go flag
 | 
			
		||||
| 
						 | 
				
			
			@ -1336,7 +1344,7 @@ func main() {
 | 
			
		|||
		allTestsPassed := true
 | 
			
		||||
		for _, pkgName := range pkgNames {
 | 
			
		||||
			// TODO: parallelize building the test binaries
 | 
			
		||||
			passed, err := Test(pkgName, options, *testCompileOnlyFlag, *testVerboseFlag, *testShortFlag, outpath)
 | 
			
		||||
			passed, err := Test(pkgName, options, *testCompileOnlyFlag, *testVerboseFlag, *testShortFlag, *testRunRegexp, outpath)
 | 
			
		||||
			handleCompilerError(err)
 | 
			
		||||
			if !passed {
 | 
			
		||||
				allTestsPassed = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,8 +18,9 @@ import (
 | 
			
		|||
 | 
			
		||||
// Testing flags.
 | 
			
		||||
var (
 | 
			
		||||
	flagVerbose bool
 | 
			
		||||
	flagShort   bool
 | 
			
		||||
	flagVerbose   bool
 | 
			
		||||
	flagShort     bool
 | 
			
		||||
	flagRunRegexp string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var initRan bool
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +34,7 @@ func Init() {
 | 
			
		|||
 | 
			
		||||
	flag.BoolVar(&flagVerbose, "test.v", false, "verbose: print additional output")
 | 
			
		||||
	flag.BoolVar(&flagShort, "test.short", false, "short: run smaller test suite to save time")
 | 
			
		||||
	flag.StringVar(&flagRunRegexp, "test.run", "", "run: regexp of tests to run")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// common holds the elements common between T and B and
 | 
			
		||||
| 
						 | 
				
			
			@ -242,19 +244,42 @@ type InternalTest struct {
 | 
			
		|||
type M struct {
 | 
			
		||||
	// tests is a list of the test names to execute
 | 
			
		||||
	Tests []InternalTest
 | 
			
		||||
 | 
			
		||||
	deps testDeps
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Run the test suite.
 | 
			
		||||
func (m *M) Run() int {
 | 
			
		||||
	if len(m.Tests) == 0 {
 | 
			
		||||
		fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !flag.Parsed() {
 | 
			
		||||
		flag.Parse()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	failures := 0
 | 
			
		||||
	if flagRunRegexp != "" {
 | 
			
		||||
		var filtered []InternalTest
 | 
			
		||||
 | 
			
		||||
		// pre-test the regexp; we don't want to bother logging one failure for every test name if the regexp is broken
 | 
			
		||||
		if _, err := m.deps.MatchString(flagRunRegexp, "some-test-name"); err != nil {
 | 
			
		||||
			fmt.Println("testing: invalid regexp for -test.run:", err.Error())
 | 
			
		||||
			failures++
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// filter the list of tests before we try to run them
 | 
			
		||||
		for _, test := range m.Tests {
 | 
			
		||||
			// ignore the error; we already tested that the regexp compiles fine above
 | 
			
		||||
			if match, _ := m.deps.MatchString(flagRunRegexp, test.Name); match {
 | 
			
		||||
				filtered = append(filtered, test)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m.Tests = filtered
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(m.Tests) == 0 {
 | 
			
		||||
		fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range m.Tests {
 | 
			
		||||
		t := &T{
 | 
			
		||||
			common: common{
 | 
			
		||||
| 
						 | 
				
			
			@ -326,10 +351,15 @@ func TestMain(m *M) {
 | 
			
		|||
	os.Exit(m.Run())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type testDeps interface {
 | 
			
		||||
	MatchString(pat, s string) (bool, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func MainStart(deps interface{}, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
 | 
			
		||||
	Init()
 | 
			
		||||
	return &M{
 | 
			
		||||
		Tests: tests,
 | 
			
		||||
		deps:  deps.(testDeps),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								testdata/testing.go
									
										
									
									
										предоставленный
									
									
								
							
							
						
						
									
										6
									
								
								testdata/testing.go
									
										
									
									
										предоставленный
									
									
								
							| 
						 | 
				
			
			@ -34,9 +34,13 @@ var benchmarks = []testing.InternalBenchmark{}
 | 
			
		|||
var examples = []testing.InternalExample{}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	m := testing.MainStart(nil, tests, benchmarks, examples)
 | 
			
		||||
	m := testing.MainStart(testdeps{}, tests, benchmarks, examples)
 | 
			
		||||
	exitcode := m.Run()
 | 
			
		||||
	if exitcode != 0 {
 | 
			
		||||
		println("exitcode:", exitcode)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type testdeps struct{}
 | 
			
		||||
 | 
			
		||||
func (testdeps) MatchString(pat, str string) (bool, error) { return true, nil }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче