github.com/munnerz/test-infra@v0.0.0-20190108210205-ce3d181dc989/kubetest/extract_test.go (about) 1 /* 2 Copyright 2017 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 import ( 20 "fmt" 21 "io/ioutil" 22 "os" 23 "path" 24 "strings" 25 "testing" 26 "time" 27 ) 28 29 func TestGetKube(t *testing.T) { 30 cases := []struct { 31 name string 32 script string 33 success bool 34 }{ 35 { 36 name: "can succeed", 37 script: "true", 38 success: true, 39 }, 40 { 41 name: "can fail", 42 script: "exit 1", 43 success: false, 44 }, 45 { 46 name: "can successfully retry", 47 script: "([[ -e ran ]] && true) || (touch ran && exit 1)", 48 success: true, 49 }, 50 } 51 52 if !terminate.Stop() { 53 <-terminate.C 54 } 55 if !interrupt.Stop() { 56 <-interrupt.C 57 } 58 59 oldSleep := sleep 60 defer func() { sleep = oldSleep }() 61 sleep = func(d time.Duration) {} 62 63 if o, err := os.Getwd(); err != nil { 64 t.Fatal(err) 65 } else { 66 defer os.Chdir(o) 67 } 68 if d, err := ioutil.TempDir("", "extract"); err != nil { 69 t.Fatal(err) 70 } else if err := os.Chdir(d); err != nil { 71 t.Fatal(err) 72 } 73 74 for _, tc := range cases { 75 bytes := []byte(fmt.Sprintf("#!/bin/bash\necho hello\n%s\nmkdir -p ./kubernetes/cluster && touch ./kubernetes/cluster/get-kube-binaries.sh", tc.script)) 76 if err := ioutil.WriteFile("./get-kube.sh", bytes, 0700); err != nil { 77 t.Fatal(err) 78 } 79 err := getKube("url", "version", false) 80 if tc.success && err != nil { 81 t.Errorf("%s did not succeed: %s", tc.name, err) 82 } 83 if !tc.success && err == nil { 84 t.Errorf("%s unexpectedly succeeded", tc.name) 85 } 86 } 87 } 88 89 func TestExtractStrategies(t *testing.T) { 90 cases := []struct { 91 option string 92 expectURL string 93 expectVersion string 94 }{ 95 { 96 "bazel/v1.8.0-alpha.2.899+2c624e590f5670", 97 "", 98 "bazel/v1.8.0-alpha.2.899+2c624e590f5670", 99 }, 100 { 101 "bazel/49747/master:b341939d6d3666b119028400a4311cc66da9a542,49747:c4656c3d029e47d03b3d7d9915d79cab72a80852", 102 "", 103 "bazel/49747/master:b341939d6d3666b119028400a4311cc66da9a542,49747:c4656c3d029e47d03b3d7d9915d79cab72a80852", 104 }, 105 { 106 "gs://kubernetes-release-dev/bazel/v1.8.0-alpha.3.389+eab2f8f6c19fcb", 107 "https://storage.googleapis.com/kubernetes-release-dev/bazel", 108 "v1.8.0-alpha.3.389+eab2f8f6c19fcb", 109 }, 110 { 111 "v1.8.0-alpha.1", 112 "https://storage.googleapis.com/kubernetes-release/release", 113 "v1.8.0-alpha.1", 114 }, 115 { 116 "v1.8.0-alpha.2.899+2c624e590f5670", 117 "https://storage.googleapis.com/kubernetes-release-dev/ci", 118 "v1.8.0-alpha.2.899+2c624e590f5670", 119 }, 120 { 121 "v1.8.0-gke.0", 122 "https://storage.googleapis.com/kubernetes-release-gke/release", 123 "v1.8.0-gke.0", 124 }, 125 { 126 "ci/latest", 127 "https://storage.googleapis.com/kubernetes-release-dev/ci", 128 "v1.2.3+abcde", 129 }, 130 { 131 "ci/gke-staging-latest", 132 "https://storage.googleapis.com/kubernetes-release-gke/release", 133 "v1.2.3+abcde", 134 }, 135 { 136 "gs://whatever-bucket/ci/latest.txt", 137 "https://storage.googleapis.com/whatever-bucket/ci", 138 "v1.2.3+abcde", 139 }, 140 } 141 142 var gotURL string 143 var gotVersion string 144 145 // getKube is tested independently, so mock it out here so we can test 146 // that different extraction strategies call getKube with the correct 147 // arguments. 148 oldGetKube := getKube 149 defer func() { getKube = oldGetKube }() 150 getKube = func(url, version string, _ bool) error { 151 gotURL = url 152 gotVersion = version 153 // This is needed or else Extract() will think that getKube failed. 154 os.Mkdir("kubernetes", 0775) 155 return nil 156 } 157 158 oldCat := gsutilCat 159 defer func() { gsutilCat = oldCat }() 160 gsutilCat = func(url string) ([]byte, error) { 161 if path.Ext(url) != ".txt" { 162 return []byte{}, fmt.Errorf("url %s must end with .txt", url) 163 } 164 if !strings.HasPrefix(path.Dir(url), "gs:/") { 165 return []byte{}, fmt.Errorf("url %s must starts with gs:/", path.Dir(url)) 166 } 167 return []byte("v1.2.3+abcde"), nil 168 } 169 170 for _, tc := range cases { 171 if d, err := ioutil.TempDir("", "extract"); err != nil { 172 t.Fatal(err) 173 } else if err := os.Chdir(d); err != nil { 174 t.Fatal(err) 175 } 176 177 var es extractStrategies 178 if err := es.Set(tc.option); err != nil { 179 t.Errorf("extractStrategy.Set(%q) returned err: %q", tc.option, err) 180 } 181 if err := es.Extract("", "", "", false); err != nil { 182 t.Errorf("extractStrategy(%q).Extract() returned err: %q", tc.option, err) 183 } 184 185 if gotURL != tc.expectURL || gotVersion != tc.expectVersion { 186 t.Errorf("extractStrategy(%q).Extract() wanted getKube(%q, %q), got getKube(%q, %q)", tc.option, tc.expectURL, tc.expectVersion, gotURL, gotVersion) 187 } 188 } 189 }