github.com/latiif/helm@v2.15.0+incompatible/cmd/helm/repo_add_test.go (about)

     1  /*
     2  Copyright The Helm 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"
    22  	"os"
    23  	"os/exec"
    24  	"strings"
    25  	"sync"
    26  	"testing"
    27  
    28  	"github.com/spf13/cobra"
    29  
    30  	"k8s.io/helm/pkg/helm"
    31  	"k8s.io/helm/pkg/helm/helmpath"
    32  	"k8s.io/helm/pkg/repo"
    33  	"k8s.io/helm/pkg/repo/repotest"
    34  )
    35  
    36  var testName = "test-name"
    37  
    38  func TestRepoAddCmd(t *testing.T) {
    39  	srv, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  
    44  	cleanup := resetEnv()
    45  	defer func() {
    46  		srv.Stop()
    47  		os.RemoveAll(thome.String())
    48  		cleanup()
    49  	}()
    50  	if err := ensureTestHome(thome, t); err != nil {
    51  		t.Fatal(err)
    52  	}
    53  
    54  	settings.Home = thome
    55  
    56  	tests := []releaseCase{
    57  		{
    58  			name:     "add a repository",
    59  			args:     []string{testName, srv.URL()},
    60  			expected: "\"" + testName + "\" has been added to your repositories",
    61  		},
    62  	}
    63  
    64  	runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command {
    65  		return newRepoAddCmd(out)
    66  	})
    67  }
    68  
    69  func TestRepoAdd(t *testing.T) {
    70  	ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
    71  	if err != nil {
    72  		t.Fatal(err)
    73  	}
    74  
    75  	cleanup := resetEnv()
    76  	hh := thome
    77  	defer func() {
    78  		ts.Stop()
    79  		os.RemoveAll(thome.String())
    80  		cleanup()
    81  	}()
    82  	if err := ensureTestHome(hh, t); err != nil {
    83  		t.Fatal(err)
    84  	}
    85  
    86  	settings.Home = thome
    87  
    88  	if err := addRepository(testName, ts.URL(), "", "", hh, "", "", "", true); err != nil {
    89  		t.Error(err)
    90  	}
    91  
    92  	f, err := repo.LoadRepositoriesFile(hh.RepositoryFile())
    93  	if err != nil {
    94  		t.Error(err)
    95  	}
    96  
    97  	if !f.Has(testName) {
    98  		t.Errorf("%s was not successfully inserted into %s", testName, hh.RepositoryFile())
    99  	}
   100  
   101  	if err := addRepository(testName, ts.URL(), "", "", hh, "", "", "", false); err != nil {
   102  		t.Errorf("Repository was not updated: %s", err)
   103  	}
   104  
   105  	if err := addRepository(testName, ts.URL(), "", "", hh, "", "", "", false); err != nil {
   106  		t.Errorf("Duplicate repository name was added")
   107  	}
   108  }
   109  func TestRepoAddConcurrentGoRoutines(t *testing.T) {
   110  	ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
   111  	if err != nil {
   112  		t.Fatal(err)
   113  	}
   114  
   115  	cleanup := resetEnv()
   116  	defer func() {
   117  		ts.Stop()
   118  		os.RemoveAll(thome.String())
   119  		cleanup()
   120  	}()
   121  
   122  	settings.Home = thome
   123  	if err := ensureTestHome(settings.Home, t); err != nil {
   124  		t.Fatal(err)
   125  	}
   126  
   127  	var wg sync.WaitGroup
   128  	wg.Add(3)
   129  	for i := 0; i < 3; i++ {
   130  		go func(name string) {
   131  			defer wg.Done()
   132  			if err := addRepository(name, ts.URL(), "", "", settings.Home, "", "", "", true); err != nil {
   133  				t.Error(err)
   134  			}
   135  		}(fmt.Sprintf("%s-%d", testName, i))
   136  	}
   137  	wg.Wait()
   138  
   139  	f, err := repo.LoadRepositoriesFile(settings.Home.RepositoryFile())
   140  	if err != nil {
   141  		t.Error(err)
   142  	}
   143  
   144  	var name string
   145  	for i := 0; i < 3; i++ {
   146  		name = fmt.Sprintf("%s-%d", testName, i)
   147  		if !f.Has(name) {
   148  			t.Errorf("%s was not successfully inserted into %s", name, settings.Home.RepositoryFile())
   149  		}
   150  	}
   151  }
   152  
   153  // Same as TestRepoAddConcurrentGoRoutines but with repository additions in sub-processes
   154  func TestRepoAddConcurrentSubProcesses(t *testing.T) {
   155  	goWantHelperProcess := os.Getenv("GO_WANT_HELPER_PROCESS")
   156  	if goWantHelperProcess == "" {
   157  		// parent
   158  
   159  		ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
   160  		if err != nil {
   161  			t.Fatal(err)
   162  		}
   163  
   164  		settings.Home = thome
   165  
   166  		cleanup := resetEnv()
   167  		defer func() {
   168  			ts.Stop()
   169  			os.RemoveAll(thome.String())
   170  			cleanup()
   171  		}()
   172  		if err := ensureTestHome(settings.Home, t); err != nil {
   173  			t.Fatal(err)
   174  		}
   175  
   176  		var wg sync.WaitGroup
   177  		wg.Add(2)
   178  		for i := 0; i < 2; i++ {
   179  			go func(name string) {
   180  				defer wg.Done()
   181  
   182  				cmd := exec.Command(os.Args[0], "-test.run=^TestRepoAddConcurrentSubProcesses$")
   183  				cmd.Env = append(os.Environ(), fmt.Sprintf("GO_WANT_HELPER_PROCESS=%s,%s", name, ts.URL()), fmt.Sprintf("HELM_HOME=%s", settings.Home))
   184  				out, err := cmd.CombinedOutput()
   185  				if len(out) > 0 || err != nil {
   186  					t.Fatalf("child process: %q, %v", out, err)
   187  				}
   188  			}(fmt.Sprintf("%s-%d", testName, i))
   189  		}
   190  		wg.Wait()
   191  
   192  		f, err := repo.LoadRepositoriesFile(settings.Home.RepositoryFile())
   193  		if err != nil {
   194  			t.Error(err)
   195  		}
   196  
   197  		var name string
   198  		for i := 0; i < 2; i++ {
   199  			name = fmt.Sprintf("%s-%d", testName, i)
   200  			if !f.Has(name) {
   201  				t.Errorf("%s was not successfully inserted into %s", name, settings.Home.RepositoryFile())
   202  			}
   203  		}
   204  	} else {
   205  		// child
   206  		s := strings.Split(goWantHelperProcess, ",")
   207  		settings.Home = helmpath.Home(os.Getenv("HELM_HOME"))
   208  		repoName := s[0]
   209  		tsURL := s[1]
   210  		if err := addRepository(repoName, tsURL, "", "", settings.Home, "", "", "", true); err != nil {
   211  			t.Fatal(err)
   212  		}
   213  
   214  		os.Exit(0)
   215  	}
   216  }