github.com/abayer/test-infra@v0.0.5/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  }