github.com/sc0rp1us/gb@v0.4.1-0.20160319180011-4ba8cf1baa5a/test/test_test.go (about)

     1  package test
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"reflect"
     7  	"runtime"
     8  	"sort"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/constabulary/gb"
    14  )
    15  
    16  func TestTest(t *testing.T) {
    17  	tests := []struct {
    18  		pkg        string
    19  		testArgs   []string
    20  		ldflags    []string
    21  		err        error
    22  		minversion float64 // minimum go version that supports this feature
    23  		maxversion float64 // maximum go version that supports this feature
    24  	}{
    25  		{
    26  			pkg: "a",
    27  			err: nil,
    28  		}, {
    29  			pkg: "b",
    30  			err: nil,
    31  		}, {
    32  			pkg: "c",
    33  			err: nil,
    34  		}, {
    35  			pkg: "e",
    36  			err: nil,
    37  		}, {
    38  			pkg: "cmd/f",
    39  			err: nil,
    40  		}, {
    41  			pkg: "extest", // test external tests
    42  			err: nil,
    43  		}, {
    44  			pkg: "external_only_test", // issue 312
    45  			err: nil,
    46  		}, {
    47  			pkg: "notestfiles",
    48  			err: nil,
    49  		}, {
    50  			pkg: "cgoonlynotest",
    51  			err: nil,
    52  		}, {
    53  			pkg: "testonly",
    54  			err: nil,
    55  		}, {
    56  			pkg: "extestonly",
    57  			err: nil,
    58  		}, {
    59  			pkg: "g", // test that _test files can modify the internal package under test
    60  			err: nil,
    61  		}, {
    62  			pkg:        "ldflags",
    63  			ldflags:    []string{"-X", "ldflags.gitTagInfo=banana", "-X", "ldflags.gitRevision=f7926af2"},
    64  			minversion: 1.5,
    65  		}, {
    66  			pkg:        "ldflags",
    67  			ldflags:    []string{"-X", "ldflags.gitTagInfo", "banana", "-X", "ldflags.gitRevision", "f7926af2"},
    68  			maxversion: 1.5,
    69  		}, {
    70  			pkg: "cgotest",
    71  		}, {
    72  			pkg:      "testflags",
    73  			testArgs: []string{"-debug"},
    74  		}, {
    75  			pkg: "main", // issue 375, a package called main
    76  		}}
    77  
    78  	for _, tt := range tests {
    79  		if tt.minversion != 0 && goversion < tt.minversion {
    80  			t.Logf("skipping test, goversion %f is below mingoversion %f", goversion, tt.minversion)
    81  			continue
    82  		}
    83  		if tt.maxversion != 0 && goversion > tt.maxversion {
    84  			t.Logf("skipping test, goversion %f is above maxgoversion %f", goversion, tt.maxversion)
    85  			continue
    86  		}
    87  		ctx := testContext(t, gb.Ldflags(tt.ldflags...))
    88  		defer ctx.Destroy()
    89  		r := TestResolver(ctx)
    90  		pkg, err := r.ResolvePackage(tt.pkg)
    91  		if err != nil {
    92  			t.Errorf("ResolvePackage(%v): want %v, got %v", tt.pkg, tt.err, err)
    93  			continue
    94  		}
    95  		if err := Test(tt.testArgs, pkg); err != tt.err {
    96  			t.Errorf("Test(%v): want %v, got %v", tt.pkg, tt.err, err)
    97  			time.Sleep(500 * time.Millisecond)
    98  		}
    99  	}
   100  }
   101  
   102  func TestTestPackage(t *testing.T) {
   103  	tests := []struct {
   104  		pkg string
   105  		err error
   106  	}{{
   107  		pkg: "a",
   108  		err: nil,
   109  	}, {
   110  		pkg: "b", // actually command
   111  		err: nil,
   112  	}, {
   113  		pkg: "c",
   114  		err: nil,
   115  	}, {
   116  		pkg: "d.v1",
   117  		err: nil,
   118  	}, {
   119  		pkg: "cgomain",
   120  		err: nil,
   121  	}, {
   122  		pkg: "cgotest",
   123  		err: nil,
   124  	}, {
   125  		pkg: "notestfiles",
   126  		err: nil,
   127  	}, {
   128  		pkg: "cgoonlynotest",
   129  		err: nil,
   130  	}, {
   131  		pkg: "testonly",
   132  		err: nil,
   133  	}, {
   134  		pkg: "extestonly",
   135  		err: nil,
   136  	}}
   137  
   138  	for _, tt := range tests {
   139  		ctx := testContext(t)
   140  		defer ctx.Destroy()
   141  		r := TestResolver(ctx)
   142  		pkg, err := r.ResolvePackage(tt.pkg)
   143  		if err != nil {
   144  			t.Errorf("r.ResolvePackage(%v):  %v", tt.pkg, err)
   145  			continue
   146  		}
   147  		targets := make(map[string]*gb.Action)
   148  		if _, err := TestPackage(targets, pkg, nil); !reflect.DeepEqual(err, tt.err) {
   149  			t.Errorf("TestPackage(%v): want %v, got %v", tt.pkg, tt.err, err)
   150  		}
   151  	}
   152  }
   153  
   154  func TestTestPackages(t *testing.T) {
   155  	tests := []struct {
   156  		pkgs    []string
   157  		actions []string
   158  		err     error
   159  	}{{
   160  		pkgs: []string{"a", "b", "c"},
   161  		actions: []string{
   162  			"run: $WORKDIR/a/testmain/_test/a.test$EXE",
   163  			"run: $WORKDIR/b/testmain/_test/b.test$EXE",
   164  			"run: $WORKDIR/c/testmain/_test/c.test$EXE",
   165  		},
   166  	}, {
   167  		pkgs: []string{"cgotest", "cgomain", "notestfiles", "cgoonlynotest", "testonly", "extestonly"},
   168  		actions: []string{
   169  			"run: $WORKDIR/cgomain/testmain/_test/cgomain.test$EXE",
   170  			"run: $WORKDIR/cgoonlynotest/testmain/_test/cgoonly.test$EXE",
   171  			"run: $WORKDIR/cgotest/testmain/_test/cgotest.test$EXE",
   172  			"run: $WORKDIR/extestonly/testmain/_test/extestonly.test$EXE",
   173  			"run: $WORKDIR/notestfiles/testmain/_test/notest.test$EXE",
   174  			"run: $WORKDIR/testonly/testmain/_test/testonly.test$EXE",
   175  		},
   176  	}}
   177  
   178  	for i, tt := range tests {
   179  		ctx := testContext(t)
   180  		defer ctx.Destroy()
   181  		var pkgs []*gb.Package
   182  		t.Logf("testing: %v: pkgs: %v", i+1, tt.pkgs)
   183  		r := TestResolver(ctx)
   184  		for _, pkg := range tt.pkgs {
   185  			pkg, err := r.ResolvePackage(pkg)
   186  			if err != nil {
   187  				t.Errorf("r.ResolvePackage(%v):  %v", pkg, err)
   188  				continue
   189  			}
   190  			pkgs = append(pkgs, pkg)
   191  		}
   192  		a, err := TestPackages(nil, pkgs...)
   193  		if !reflect.DeepEqual(err, tt.err) {
   194  			t.Errorf("TestPackages(%v): want %v, got %v", pkgs, tt.err, err)
   195  		}
   196  		var actual []string
   197  		for _, a := range a.Deps {
   198  			actual = append(actual, a.Name)
   199  		}
   200  		sort.Strings(actual)
   201  		var expected []string
   202  		exe := ""
   203  		if runtime.GOOS == "windows" {
   204  			exe = ".exe"
   205  		}
   206  		for _, s := range tt.actions {
   207  			s = filepath.FromSlash(s)
   208  			s = strings.Replace(s, "$WORKDIR", ctx.Workdir(), -1)
   209  			s = strings.Replace(s, "$EXE", exe, -1)
   210  			expected = append(expected, s)
   211  		}
   212  		if !reflect.DeepEqual(expected, actual) {
   213  			t.Errorf("TestBuildPackages(%v): want %v, got %v", pkgs, expected, actual)
   214  		}
   215  	}
   216  }
   217  
   218  func getwd(t *testing.T) string {
   219  	cwd, err := os.Getwd()
   220  	if err != nil {
   221  		t.Fatal(err)
   222  	}
   223  	return cwd
   224  }
   225  
   226  func testProject(t *testing.T) *gb.Project {
   227  	cwd := getwd(t)
   228  	root := filepath.Join(cwd, "..", "testdata")
   229  	return gb.NewProject(root,
   230  		gb.SourceDir(filepath.Join(root, "src")),
   231  	)
   232  }
   233  
   234  func testContext(t *testing.T, opts ...func(*gb.Context) error) *gb.Context {
   235  	prj := testProject(t)
   236  	opts = append([]func(*gb.Context) error{gb.GcToolchain()}, opts...)
   237  	ctx, err := prj.NewContext(opts...)
   238  	if err != nil {
   239  		t.Fatal(err)
   240  	}
   241  	ctx.Force = true
   242  	return ctx
   243  }