github.com/koderover/helm@v2.17.0+incompatible/pkg/releasetesting/environment_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 releasetesting 18 19 import ( 20 "bytes" 21 "errors" 22 "io" 23 "io/ioutil" 24 "testing" 25 26 "k8s.io/helm/pkg/proto/hapi/release" 27 "k8s.io/helm/pkg/proto/hapi/services" 28 tillerEnv "k8s.io/helm/pkg/tiller/environment" 29 ) 30 31 func TestCreateTestPodSuccess(t *testing.T) { 32 env := testEnvFixture() 33 test := testFixture() 34 35 err := env.createTestPod(test) 36 if err != nil { 37 t.Errorf("Expected no error, got an error: %s", err) 38 } 39 } 40 41 func TestCreateTestPodFailure(t *testing.T) { 42 env := testEnvFixture() 43 env.KubeClient = newCreateFailingKubeClient() 44 test := testFixture() 45 46 err := env.createTestPod(test) 47 if err == nil { 48 t.Errorf("Expected error, got no error") 49 } 50 51 if test.result.Info == "" { 52 t.Errorf("Expected error to be saved in test result info but found empty string") 53 } 54 55 if test.result.Status != release.TestRun_FAILURE { 56 t.Errorf("Expected test result status to be failure but got: %v", test.result.Status) 57 } 58 } 59 60 func TestDeleteTestPods(t *testing.T) { 61 mockTestSuite := testSuiteFixture([]string{manifestWithTestSuccessHook}) 62 mockTestEnv := newMockTestingEnvironment() 63 mockTestEnv.KubeClient = newGetFailingKubeClient() 64 65 mockTestEnv.DeleteTestPods(mockTestSuite.TestManifests) 66 67 stream := mockTestEnv.Stream.(*mockStream) 68 if len(stream.messages) != 0 { 69 t.Errorf("Expected 0 errors, got at least one: %v", stream.messages) 70 } 71 72 for _, testManifest := range mockTestSuite.TestManifests { 73 if _, err := mockTestEnv.KubeClient.Get(mockTestEnv.Namespace, bytes.NewBufferString(testManifest)); err == nil { 74 t.Error("Expected error, got nil") 75 } 76 } 77 } 78 79 func TestDeleteTestPodsFailingDelete(t *testing.T) { 80 mockTestSuite := testSuiteFixture([]string{manifestWithTestSuccessHook}) 81 mockTestEnv := newMockTestingEnvironment() 82 mockTestEnv.KubeClient = newDeleteFailingKubeClient() 83 84 mockTestEnv.DeleteTestPods(mockTestSuite.TestManifests) 85 86 stream := mockTestEnv.Stream.(*mockStream) 87 if len(stream.messages) != 1 { 88 t.Errorf("Expected 1 error, got: %v", len(stream.messages)) 89 } 90 } 91 92 func TestGetTestPodLogs(t *testing.T) { 93 mockTestSuite := testSuiteFixture([]string{manifestWithTestSuccessHook}) 94 mockTestEnv := newMockTestingEnvironment() 95 mockTestEnv.KubeClient = newGetLogKubeClient() 96 97 mockTestEnv.GetLogs(mockTestSuite.TestManifests) 98 99 expectedMessage := "ERROR: Pod manifest is invalid. Unable to obtain the logs" 100 101 stream := mockTestEnv.Stream.(*mockStream) 102 if len(stream.messages) != 1 { 103 t.Errorf("Expected 1 message, got: %v", len(stream.messages)) 104 } 105 if stream.messages[0].Msg != expectedMessage { 106 t.Errorf("Expected message '%s', got: %v", expectedMessage, stream.messages[0].Msg) 107 } 108 } 109 110 func TestStreamMessage(t *testing.T) { 111 mockTestEnv := newMockTestingEnvironment() 112 113 expectedMessage := "testing streamMessage" 114 expectedStatus := release.TestRun_SUCCESS 115 err := mockTestEnv.streamMessage(expectedMessage, expectedStatus) 116 if err != nil { 117 t.Errorf("Expected no errors, got 1: %s", err) 118 } 119 120 stream := mockTestEnv.Stream.(*mockStream) 121 if len(stream.messages) != 1 { 122 t.Errorf("Expected 1 message, got: %v", len(stream.messages)) 123 } 124 125 if stream.messages[0].Msg != expectedMessage { 126 t.Errorf("Expected message: %s, got: %s", expectedMessage, stream.messages[0]) 127 } 128 if stream.messages[0].Status != expectedStatus { 129 t.Errorf("Expected status: %v, got: %v", expectedStatus, stream.messages[0].Status) 130 } 131 } 132 133 type MockTestingEnvironment struct { 134 *Environment 135 } 136 137 func newMockTestingEnvironment() *MockTestingEnvironment { 138 tEnv := mockTillerEnvironment() 139 140 return &MockTestingEnvironment{ 141 Environment: &Environment{ 142 Namespace: "default", 143 KubeClient: tEnv.KubeClient, 144 Timeout: 5, 145 Stream: &mockStream{}, 146 Parallelism: 20, 147 }, 148 } 149 } 150 151 func (mte MockTestingEnvironment) streamRunning(name string) error { return nil } 152 func (mte MockTestingEnvironment) streamError(info string) error { return nil } 153 func (mte MockTestingEnvironment) streamFailed(name string) error { return nil } 154 func (mte MockTestingEnvironment) streamSuccess(name string) error { return nil } 155 func (mte MockTestingEnvironment) streamUnknown(name, info string) error { return nil } 156 func (mte MockTestingEnvironment) streamMessage(msg string, status release.TestRun_Status) error { 157 mte.Stream.Send(&services.TestReleaseResponse{Msg: msg, Status: status}) 158 return nil 159 } 160 161 type getFailingKubeClient struct { 162 tillerEnv.PrintingKubeClient 163 } 164 165 func newGetFailingKubeClient() *getFailingKubeClient { 166 return &getFailingKubeClient{ 167 PrintingKubeClient: tillerEnv.PrintingKubeClient{Out: ioutil.Discard}, 168 } 169 } 170 171 func (p *getFailingKubeClient) Get(ns string, r io.Reader) (string, error) { 172 return "", errors.New("in the end, they did not find Nemo") 173 } 174 175 type deleteFailingKubeClient struct { 176 tillerEnv.PrintingKubeClient 177 } 178 179 func newDeleteFailingKubeClient() *deleteFailingKubeClient { 180 return &deleteFailingKubeClient{ 181 PrintingKubeClient: tillerEnv.PrintingKubeClient{Out: ioutil.Discard}, 182 } 183 } 184 185 func (p *deleteFailingKubeClient) Delete(ns string, r io.Reader) error { 186 return errors.New("delete failed") 187 } 188 189 type createFailingKubeClient struct { 190 tillerEnv.PrintingKubeClient 191 } 192 193 func newCreateFailingKubeClient() *createFailingKubeClient { 194 return &createFailingKubeClient{ 195 PrintingKubeClient: tillerEnv.PrintingKubeClient{Out: ioutil.Discard}, 196 } 197 } 198 199 func (p *createFailingKubeClient) Create(ns string, r io.Reader, t int64, shouldWait bool) error { 200 return errors.New("We ran out of budget and couldn't create finding-nemo") 201 } 202 203 type getLogKubeClient struct { 204 tillerEnv.PrintingKubeClient 205 } 206 207 func newGetLogKubeClient() *getLogKubeClient { 208 return &getLogKubeClient{ 209 PrintingKubeClient: tillerEnv.PrintingKubeClient{Out: ioutil.Discard}, 210 } 211 }