123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- /*
- Copyright 2017 The Kubernetes Authors.
- 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.
- */
- // Unit tests for hack/e2e.go shim
- package main
- import (
- "errors"
- "flag"
- "fmt"
- "os"
- "path/filepath"
- "reflect"
- "testing"
- "time"
- )
- type FileInfo struct {
- when time.Time
- }
- func (f FileInfo) Name() string {
- return "fake-file"
- }
- func (f FileInfo) Size() int64 {
- return 0
- }
- func (f FileInfo) Mode() os.FileMode {
- return 0
- }
- func (f FileInfo) ModTime() time.Time {
- return f.when
- }
- func (f FileInfo) IsDir() bool {
- return false
- }
- func (f FileInfo) Sys() interface{} {
- return f
- }
- func TestParse(t *testing.T) {
- cases := []struct {
- args []string
- expected flags
- err error
- }{
- {
- []string{"foo", "-v=false"},
- flags{getDefault, oldDefault, []string{"--verbose-commands=false"}},
- nil,
- },
- {
- []string{"foo", "-v"},
- flags{getDefault, oldDefault, []string{"--verbose-commands=true"}},
- nil,
- },
- {
- []string{"hello", "world"},
- flags{getDefault, oldDefault, []string{"--verbose-commands=true", "world"}},
- nil,
- },
- {
- []string{"hello", "--", "--venus", "--karaoke"},
- flags{getDefault, oldDefault, []string{"--verbose-commands=true", "--venus", "--karaoke"}},
- nil,
- },
- {
- []string{"hello", "--alpha", "--beta"},
- flags{getDefault, oldDefault, []string{"--alpha", "--beta"}},
- nil,
- },
- {
- []string{"so", "--get", "--boo"},
- flags{true, oldDefault, []string{"--boo"}},
- nil,
- },
- {
- []string{"omg", "--get=false", "--", "ugh"},
- flags{false, oldDefault, []string{"--verbose-commands=true", "ugh"}},
- nil,
- },
- {
- []string{"wee", "--old=5m", "--get"},
- flags{true, 5 * time.Minute, []string{"--verbose-commands=true"}},
- nil,
- },
- {
- []string{"fun", "--times", "--old=666s"},
- flags{getDefault, oldDefault, []string{"--times", "--old=666s"}},
- nil,
- },
- {
- []string{"wut", "-h"},
- flags{},
- flag.ErrHelp,
- },
- {
- []string{"wut", "--", "-h"},
- flags{getDefault, oldDefault, []string{"--verbose-commands=true", "-h"}},
- nil,
- },
- }
- for i, c := range cases {
- a, err := parse(c.args)
- if err != c.err {
- t.Errorf("%d: a=%v != e%v", i, err, c.err)
- }
- e := c.expected
- if a.get != e.get {
- t.Errorf("%d: a=%v != e=%v", i, a.get, e.get)
- }
- if a.old != e.old {
- t.Errorf("%d: a=%v != e=%v", i, a.old, e.old)
- }
- if !reflect.DeepEqual(a.args, e.args) {
- t.Errorf("%d: a=%v != e=%v", i, a.args, e.args)
- }
- }
- }
- func TestLook(t *testing.T) {
- lpf := errors.New("LookPath failed")
- sf := errors.New("Stat failed")
- lpnc := errors.New("LookPath should not be called")
- snc := errors.New("Stat should not be called")
- cases := []struct {
- stat error
- lookPath error
- goPath string
- expected error
- }{
- { // GOPATH set, stat succeeds returns gopath
- stat: nil,
- lookPath: lpnc,
- goPath: "fake-gopath/",
- expected: nil,
- },
- { // GOPATH set, stat fails, terms on lookpath
- stat: sf,
- lookPath: lpf,
- goPath: "fake-gopath/",
- expected: lpf,
- },
- { // GOPATH unset, stat not called, terms on lookpath
- stat: snc,
- lookPath: lpf,
- goPath: "",
- expected: lpf,
- },
- { // GOPATH unset, stat not called, lookpath matches
- stat: snc,
- lookPath: nil,
- goPath: "",
- expected: nil,
- },
- }
- for _, c := range cases {
- l := tester{
- func(string) (os.FileInfo, error) {
- return FileInfo{}, c.stat
- },
- func(string) (string, error) {
- if c.lookPath != nil {
- return "FAILED", c.lookPath
- }
- return "$PATH-FOUND", nil
- },
- c.goPath,
- nil, // wait
- }
- if _, err := l.lookKubetest(); err != c.expected {
- t.Errorf("err: %s != %s", err, c.expected)
- }
- }
- }
- func TestGetKubetest(t *testing.T) {
- gp := "fake-gopath"
- gpk := filepath.Join(gp, "bin", "kubetest")
- p := "PATH"
- pk := filepath.Join(p, "kubetest")
- eu := errors.New("upgrade failed")
- euVerbose := fmt.Errorf("go get -u k8s.io/test-infra/kubetest: %v", eu)
- et := errors.New("touch failed")
- cases := []struct {
- name string
- get bool
- old time.Duration
- stat string // stat succeeds on this file
- path bool // file exists on path
- age time.Duration // age of mod time on file
- upgraded bool // go get -u succeeds
- touched bool // touch succeeds
- goPath string // GOPATH var
- returnPath string
- returnError error
- }{
- {name: "0: Pass when on GOPATH/bin",
- get: false,
- old: 0,
- stat: gpk,
- path: false,
- age: 100,
- upgraded: false,
- touched: false,
- goPath: gp,
- returnPath: gpk,
- returnError: nil,
- },
- {name: "1: Pass when on PATH",
- get: false,
- old: 0,
- stat: pk,
- path: true,
- age: 100,
- upgraded: false,
- touched: false,
- goPath: gp,
- returnPath: pk,
- returnError: nil,
- },
- {name: "2: Don't upgrade if on PATH and GOPATH is ''",
- get: true,
- old: 0,
- stat: pk,
- path: true,
- age: 100,
- upgraded: false,
- touched: false,
- goPath: "",
- returnPath: pk,
- returnError: nil,
- },
- {name: "3: Don't upgrade on PATH when young.",
- get: true,
- old: time.Hour,
- stat: pk,
- path: true,
- age: time.Second,
- upgraded: false,
- touched: false,
- goPath: gp,
- returnPath: pk,
- returnError: nil,
- },
- {name: "4: Upgrade if old but GOPATH is set.",
- get: true,
- old: 0,
- stat: pk,
- path: true,
- age: time.Second,
- upgraded: true,
- touched: true,
- goPath: gp,
- returnPath: pk,
- returnError: nil,
- },
- {name: "5: Fail if upgrade fails",
- get: true,
- old: 0,
- stat: pk,
- path: true,
- age: time.Second,
- upgraded: false,
- touched: false,
- goPath: gpk,
- returnPath: "",
- returnError: euVerbose,
- },
- {name: "6: Fail if touch fails",
- get: true,
- old: 0,
- stat: pk,
- path: true,
- age: time.Second,
- upgraded: true,
- touched: false,
- goPath: gpk,
- returnPath: "",
- returnError: et,
- },
- }
- for i, c := range cases {
- didUp := false
- didTouch := false
- l := tester{
- stat: func(p string) (os.FileInfo, error) {
- // stat
- if p != c.stat {
- return nil, fmt.Errorf("Failed to find %s", p)
- }
- return FileInfo{time.Now().Add(c.age * -1)}, nil
- },
- lookPath: func(name string) (string, error) {
- if c.path {
- return filepath.Join(p, name), nil
- }
- return "", fmt.Errorf("Not on path: %s", name)
- },
- goPath: c.goPath,
- wait: func(cmd string, args ...string) error {
- if cmd == "go" {
- if c.upgraded {
- didUp = true
- return nil
- }
- return eu
- }
- if c.touched {
- didTouch = true
- return nil
- }
- return et
- },
- }
- p, e := l.getKubetest(c.get, c.old)
- if p != c.returnPath {
- t.Errorf("%d: test=%q returnPath %q != %q", i, c.name, p, c.returnPath)
- }
- if e == nil || c.returnError == nil {
- if e != c.returnError {
- t.Errorf("%d: test=%q returnError %q != %q", i, c.name, e, c.returnError)
- }
- } else {
- if e.Error() != c.returnError.Error() {
- t.Errorf("%d: test=%q returnError %q != %q", i, c.name, e, c.returnError)
- }
- }
- if didUp != c.upgraded {
- t.Errorf("%d: test=%q bad upgrade state of %v", i, c.name, didUp)
- }
- if didTouch != c.touched {
- t.Errorf("%d: test=%q bad touch state of %v", i, c.name, didTouch)
- }
- }
- }
|