mirror of
https://github.com/minio/minio.git
synced 2025-01-14 00:05:02 -05:00
61175ef091
- over the course of a project history every maintainer needs to update its dependency packages, the problem essentially with godep is manipulating GOPATH - this manipulation leads to static objects created at different locations which end up conflicting with the overall functionality of golang. This also leads to broken builds. There is no easier way out of this other than asking developers to do 'godep restore' all the time. Which perhaps as a practice doesn't sound like a clean solution. On the other hand 'godep restore' has its own set of problems. - govendor is a right tool but a stop gap tool until we wait for golangs official 1.5 version which fixes this vendoring issue once and for all. - govendor provides consistency in terms of how import paths should be handled unlike manipulation GOPATH. This has advantages - no more compiled objects being referenced in GOPATH and build time GOPATH manging which leads to conflicts. - proper import paths referencing the exact package a project is dependent on. govendor is simple and provides the minimal necessary tooling to achieve this. For now this is the right solution.
176 lines
5.3 KiB
Go
176 lines
5.3 KiB
Go
package check
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Test suite registry.
|
|
|
|
var allSuites []interface{}
|
|
|
|
// Suite registers the given value as a test suite to be run. Any methods
|
|
// starting with the Test prefix in the given value will be considered as
|
|
// a test method.
|
|
func Suite(suite interface{}) interface{} {
|
|
allSuites = append(allSuites, suite)
|
|
return suite
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Public running interface.
|
|
|
|
var (
|
|
oldFilterFlag = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run")
|
|
oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode")
|
|
oldStreamFlag = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)")
|
|
oldBenchFlag = flag.Bool("gocheck.b", false, "Run benchmarks")
|
|
oldBenchTime = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark")
|
|
oldListFlag = flag.Bool("gocheck.list", false, "List the names of all tests that will be run")
|
|
oldWorkFlag = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory")
|
|
|
|
newFilterFlag = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run")
|
|
newVerboseFlag = flag.Bool("check.v", false, "Verbose mode")
|
|
newStreamFlag = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)")
|
|
newBenchFlag = flag.Bool("check.b", false, "Run benchmarks")
|
|
newBenchTime = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark")
|
|
newBenchMem = flag.Bool("check.bmem", false, "Report memory benchmarks")
|
|
newListFlag = flag.Bool("check.list", false, "List the names of all tests that will be run")
|
|
newWorkFlag = flag.Bool("check.work", false, "Display and do not remove the test working directory")
|
|
)
|
|
|
|
// TestingT runs all test suites registered with the Suite function,
|
|
// printing results to stdout, and reporting any failures back to
|
|
// the "testing" package.
|
|
func TestingT(testingT *testing.T) {
|
|
benchTime := *newBenchTime
|
|
if benchTime == 1*time.Second {
|
|
benchTime = *oldBenchTime
|
|
}
|
|
conf := &RunConf{
|
|
Filter: *oldFilterFlag + *newFilterFlag,
|
|
Verbose: *oldVerboseFlag || *newVerboseFlag,
|
|
Stream: *oldStreamFlag || *newStreamFlag,
|
|
Benchmark: *oldBenchFlag || *newBenchFlag,
|
|
BenchmarkTime: benchTime,
|
|
BenchmarkMem: *newBenchMem,
|
|
KeepWorkDir: *oldWorkFlag || *newWorkFlag,
|
|
}
|
|
if *oldListFlag || *newListFlag {
|
|
w := bufio.NewWriter(os.Stdout)
|
|
for _, name := range ListAll(conf) {
|
|
fmt.Fprintln(w, name)
|
|
}
|
|
w.Flush()
|
|
return
|
|
}
|
|
result := RunAll(conf)
|
|
println(result.String())
|
|
if !result.Passed() {
|
|
testingT.Fail()
|
|
}
|
|
}
|
|
|
|
// RunAll runs all test suites registered with the Suite function, using the
|
|
// provided run configuration.
|
|
func RunAll(runConf *RunConf) *Result {
|
|
result := Result{}
|
|
for _, suite := range allSuites {
|
|
result.Add(Run(suite, runConf))
|
|
}
|
|
return &result
|
|
}
|
|
|
|
// Run runs the provided test suite using the provided run configuration.
|
|
func Run(suite interface{}, runConf *RunConf) *Result {
|
|
runner := newSuiteRunner(suite, runConf)
|
|
return runner.run()
|
|
}
|
|
|
|
// ListAll returns the names of all the test functions registered with the
|
|
// Suite function that will be run with the provided run configuration.
|
|
func ListAll(runConf *RunConf) []string {
|
|
var names []string
|
|
for _, suite := range allSuites {
|
|
names = append(names, List(suite, runConf)...)
|
|
}
|
|
return names
|
|
}
|
|
|
|
// List returns the names of the test functions in the given
|
|
// suite that will be run with the provided run configuration.
|
|
func List(suite interface{}, runConf *RunConf) []string {
|
|
var names []string
|
|
runner := newSuiteRunner(suite, runConf)
|
|
for _, t := range runner.tests {
|
|
names = append(names, t.String())
|
|
}
|
|
return names
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Result methods.
|
|
|
|
func (r *Result) Add(other *Result) {
|
|
r.Succeeded += other.Succeeded
|
|
r.Skipped += other.Skipped
|
|
r.Failed += other.Failed
|
|
r.Panicked += other.Panicked
|
|
r.FixturePanicked += other.FixturePanicked
|
|
r.ExpectedFailures += other.ExpectedFailures
|
|
r.Missed += other.Missed
|
|
if r.WorkDir != "" && other.WorkDir != "" {
|
|
r.WorkDir += ":" + other.WorkDir
|
|
} else if other.WorkDir != "" {
|
|
r.WorkDir = other.WorkDir
|
|
}
|
|
}
|
|
|
|
func (r *Result) Passed() bool {
|
|
return (r.Failed == 0 && r.Panicked == 0 &&
|
|
r.FixturePanicked == 0 && r.Missed == 0 &&
|
|
r.RunError == nil)
|
|
}
|
|
|
|
func (r *Result) String() string {
|
|
if r.RunError != nil {
|
|
return "ERROR: " + r.RunError.Error()
|
|
}
|
|
|
|
var value string
|
|
if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 &&
|
|
r.Missed == 0 {
|
|
value = "OK: "
|
|
} else {
|
|
value = "OOPS: "
|
|
}
|
|
value += fmt.Sprintf("%d passed", r.Succeeded)
|
|
if r.Skipped != 0 {
|
|
value += fmt.Sprintf(", %d skipped", r.Skipped)
|
|
}
|
|
if r.ExpectedFailures != 0 {
|
|
value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures)
|
|
}
|
|
if r.Failed != 0 {
|
|
value += fmt.Sprintf(", %d FAILED", r.Failed)
|
|
}
|
|
if r.Panicked != 0 {
|
|
value += fmt.Sprintf(", %d PANICKED", r.Panicked)
|
|
}
|
|
if r.FixturePanicked != 0 {
|
|
value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked)
|
|
}
|
|
if r.Missed != 0 {
|
|
value += fmt.Sprintf(", %d MISSED", r.Missed)
|
|
}
|
|
if r.WorkDir != "" {
|
|
value += "\nWORK=" + r.WorkDir
|
|
}
|
|
return value
|
|
}
|