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  }