github.com/jenkins-x/test-infra@v0.0.7/kubetest/main_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 "encoding/json" 21 "fmt" 22 "io/ioutil" 23 "os" 24 "path/filepath" 25 "strconv" 26 "strings" 27 "testing" 28 29 "k8s.io/test-infra/kubetest/util" 30 ) 31 32 func TestWriteMetadata(t *testing.T) { 33 type mdata map[string]string 34 cases := []struct { 35 sources map[string]mdata 36 key string 37 version string 38 }{ 39 { 40 sources: nil, 41 key: "job-version", 42 version: "v1.8.0-alpha.2.251+ba2bdb1aead615", 43 }, 44 { 45 sources: nil, 46 key: "revision", 47 version: "v1.8.0-alpha.2.251+ba2bdb1aead615", 48 }, 49 { 50 sources: map[string]mdata{"images.json": {"imgkey": "imgval"}}, 51 key: "imgkey", 52 version: "v1.8.0-alpha.2.251+ba2bdb1aead615", 53 }, 54 { 55 sources: map[string]mdata{ 56 "images.json": {"imgkey": "imgval"}, 57 "foo.json": {"fookey": "fooval"}, 58 }, 59 key: "fookey", 60 version: "v1.8.0-alpha.2.251+ba2bdb1aead615", 61 }, 62 } 63 64 writeTmpMetadataSource := func(filePath string, md mdata) { 65 outputBytes, _ := json.MarshalIndent(md, "", " ") 66 if err := ioutil.WriteFile(filePath, outputBytes, 0644); err != nil { 67 t.Fatalf("write to %q: %v", filePath, err) 68 } 69 } 70 71 for _, tc := range cases { 72 topDir, err := ioutil.TempDir("", "TestWriteMetadata") 73 74 if err != nil { 75 t.Fatal(err) 76 } 77 78 defer os.RemoveAll(topDir) // Stack up all the cleanups 79 80 dumpDir := filepath.Join(topDir, "artifacts") 81 if err := os.Mkdir(dumpDir, 0755); err != nil { 82 t.Fatal(err) 83 } 84 85 if err := ioutil.WriteFile(filepath.Join(topDir, "version"), []byte(tc.version+"\n"), 0644); err != nil { 86 t.Fatalf("write %q/version: %v", topDir, err) 87 } 88 sourceNames := []string{} 89 for filename, metadata := range tc.sources { 90 sourceNames = append(sourceNames, filename) 91 writeTmpMetadataSource(filepath.Join(dumpDir, filename), metadata) 92 } 93 94 // Now we've set things up, call the function 95 // 96 os.Chdir(topDir) // version file is read from "." 97 writeMetadata(dumpDir, strings.Join(sourceNames, ",")) 98 99 // Load up the output 100 metadata := map[string]string{} 101 maybeMergeJSON(metadata, filepath.Join(dumpDir, "metadata.json")) 102 103 if _, exists := metadata[tc.key]; !exists { 104 t.Errorf("Expcected metadata key %q, but read in map %#v\n", tc.key, metadata) 105 } 106 } 107 } 108 109 func TestMigrateGcpEnvAndOptions(t *testing.T) { 110 proj := "fake-project" 111 zone := "fake-zone" 112 cases := []struct { 113 name string 114 provider string 115 expectedArg string 116 }{ 117 { 118 name: "gce sets KUBE_GCE_ZONE", 119 provider: "gce", 120 expectedArg: "KUBE_GCE_ZONE", 121 }, 122 { 123 name: "gke sets ZONE", 124 provider: "gke", 125 expectedArg: "ZONE", 126 }, 127 { 128 name: "random provider sets KUBE_GCE_ZONE", 129 provider: "random", 130 expectedArg: "KUBE_GCE_ZONE", 131 }, 132 } 133 134 // Preserve original ZONE, KUBE_GCE_ZONE state 135 if pz, err := util.PushEnv("ZONE", "unset"); err != nil { 136 t.Fatalf("Could not set ZONE: %v", err) 137 } else { 138 defer pz() 139 } 140 if pkgz, err := util.PushEnv("KUBE_GCE_ZONE", "unset"); err != nil { 141 t.Fatalf("Could not set KUBE_GCE_ZONE: %v", err) 142 } else { 143 defer pkgz() 144 } 145 146 for _, tc := range cases { 147 if err := os.Unsetenv("KUBE_GCE_ZONE"); err != nil { 148 t.Fatalf("%s: could not unset KUBE_GCE_ZONE", tc.name) 149 } 150 if err := os.Unsetenv("ZONE"); err != nil { 151 t.Fatalf("%s: could not unset ZONE", tc.name) 152 } 153 o := options{ 154 gcpProject: proj, 155 gcpZone: zone, 156 provider: tc.provider, 157 } 158 if err := migrateGcpEnvAndOptions(&o); err != nil { 159 t.Errorf("%s: failed to migrate: %v", tc.name, err) 160 } 161 162 z := os.Getenv(tc.expectedArg) 163 if z != zone { 164 t.Errorf("%s: %s is '%s' not expected '%s'", tc.name, tc.expectedArg, z, zone) 165 } 166 } 167 } 168 169 func TestPrepareParallelism(t *testing.T) { 170 cases := []struct { 171 initial []string 172 ginkgoParallel string 173 ginkgoParallelNodes string 174 wantParallel int 175 }{ 176 { 177 wantParallel: 1, 178 }, 179 { 180 initial: []string{"10"}, 181 wantParallel: 10, 182 }, 183 { 184 initial: []string{"true"}, 185 wantParallel: defaultGinkgoParallel, 186 }, 187 { 188 initial: []string{"true", "20"}, 189 wantParallel: 20, 190 }, 191 { 192 ginkgoParallel: "y", 193 wantParallel: defaultGinkgoParallel, 194 }, 195 { 196 ginkgoParallel: "y", 197 ginkgoParallelNodes: "50", 198 wantParallel: 50, 199 }, 200 { 201 ginkgoParallelNodes: "50", 202 wantParallel: 50, 203 }, 204 { 205 initial: []string{"20"}, 206 ginkgoParallelNodes: "50", 207 wantParallel: 50, 208 }, 209 } 210 211 // Preserve original GINKGO_PARALLEL and GINKGO_PARALLEL_NODES 212 if pre, err := util.PushEnv("GINKGO_PARALLEL", "unset"); err != nil { 213 t.Fatalf("Could not set GINKGO_PARALLEL: %v", err) 214 } else { 215 defer pre() 216 } 217 if pre, err := util.PushEnv("GINKGO_PARALLEL_NODES", "unset"); err != nil { 218 t.Fatalf("Could not set GINKGO_PARALLEL_NODES: %v", err) 219 } else { 220 defer pre() 221 } 222 223 for _, tc := range cases { 224 desc := fmt.Sprintf("(%v, %q, %q)", tc.initial, tc.ginkgoParallel, tc.ginkgoParallelNodes) 225 if err := os.Setenv("GINKGO_PARALLEL", tc.ginkgoParallel); err != nil { 226 t.Fatalf("%s => could not unset GINKGO_PARALLEL", desc) 227 } 228 if err := os.Setenv("GINKGO_PARALLEL_NODES", tc.ginkgoParallelNodes); err != nil { 229 t.Fatalf("%s => could not unset GINKGO_PARALLEL_NODES", desc) 230 } 231 v := ginkgoParallelValue{} 232 for _, i := range tc.initial { 233 if err := v.Set(i); err != nil { 234 t.Fatalf("%s => could not .Set(%q): %v", desc, i, err) 235 } 236 } 237 if err := prepareGinkgoParallel(&v); err != nil { 238 t.Errorf("%s => error %v, did not want", desc, err) 239 } 240 241 if i := v.Get(); i != tc.wantParallel { 242 t.Errorf("%s => parallel %d (got) != %d (want)", desc, i, tc.wantParallel) 243 } 244 if gp := os.Getenv("GINKGO_PARALLEL"); gp != "" { 245 t.Errorf("%s => GINKGO_PARALLEL is set to %q, did not want", desc, gp) 246 } 247 if gpn := os.Getenv("GINKGO_PARALLEL_NODES"); gpn != strconv.Itoa(v.Get()) { 248 t.Errorf("%s => GINKGO_PARALLEL_NODES=%s (got) != %s (want)", desc, gpn, v.String()) 249 } 250 } 251 }