github.com/sdbaiguanghe/helm@v2.16.7+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 }