github.com/sgoings/helm@v2.0.0-alpha.2.0.20170406211108-734e92851ac3+incompatible/pkg/storage/storage_test.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors All rights reserved. 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 storage // import "k8s.io/helm/pkg/storage" 18 19 import ( 20 "fmt" 21 "reflect" 22 "testing" 23 24 rspb "k8s.io/helm/pkg/proto/hapi/release" 25 "k8s.io/helm/pkg/storage/driver" 26 ) 27 28 func TestStorageCreate(t *testing.T) { 29 // initialize storage 30 storage := Init(driver.NewMemory()) 31 32 // create fake release 33 rls := ReleaseTestData{ 34 Name: "angry-beaver", 35 Version: 1, 36 }.ToRelease() 37 38 assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease") 39 40 // fetch the release 41 res, err := storage.Get(rls.Name, rls.Version) 42 assertErrNil(t.Fatal, err, "QueryRelease") 43 44 // verify the fetched and created release are the same 45 if !reflect.DeepEqual(rls, res) { 46 t.Fatalf("Expected %q, got %q", rls, res) 47 } 48 } 49 50 func TestStorageUpdate(t *testing.T) { 51 // initialize storage 52 storage := Init(driver.NewMemory()) 53 54 // create fake release 55 rls := ReleaseTestData{ 56 Name: "angry-beaver", 57 Version: 1, 58 Status: rspb.Status_DEPLOYED, 59 }.ToRelease() 60 61 assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease") 62 63 // modify the release 64 rls.Info.Status.Code = rspb.Status_DELETED 65 assertErrNil(t.Fatal, storage.Update(rls), "UpdateRelease") 66 67 // retrieve the updated release 68 res, err := storage.Get(rls.Name, rls.Version) 69 assertErrNil(t.Fatal, err, "QueryRelease") 70 71 // verify updated and fetched releases are the same. 72 if !reflect.DeepEqual(rls, res) { 73 t.Fatalf("Expected %q, got %q", rls, res) 74 } 75 } 76 77 func TestStorageDelete(t *testing.T) { 78 // initialize storage 79 storage := Init(driver.NewMemory()) 80 81 // create fake release 82 rls := ReleaseTestData{ 83 Name: "angry-beaver", 84 Version: 1, 85 }.ToRelease() 86 87 assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease") 88 89 // delete the release 90 res, err := storage.Delete(rls.Name, rls.Version) 91 assertErrNil(t.Fatal, err, "DeleteRelease") 92 93 // verify updated and fetched releases are the same. 94 if !reflect.DeepEqual(rls, res) { 95 t.Fatalf("Expected %q, got %q", rls, res) 96 } 97 } 98 99 func TestStorageList(t *testing.T) { 100 // initialize storage 101 storage := Init(driver.NewMemory()) 102 103 // setup storage with test releases 104 setup := func() { 105 // release records 106 rls0 := ReleaseTestData{Name: "happy-catdog", Status: rspb.Status_SUPERSEDED}.ToRelease() 107 rls1 := ReleaseTestData{Name: "livid-human", Status: rspb.Status_SUPERSEDED}.ToRelease() 108 rls2 := ReleaseTestData{Name: "relaxed-cat", Status: rspb.Status_SUPERSEDED}.ToRelease() 109 rls3 := ReleaseTestData{Name: "hungry-hippo", Status: rspb.Status_DEPLOYED}.ToRelease() 110 rls4 := ReleaseTestData{Name: "angry-beaver", Status: rspb.Status_DEPLOYED}.ToRelease() 111 rls5 := ReleaseTestData{Name: "opulent-frog", Status: rspb.Status_DELETED}.ToRelease() 112 rls6 := ReleaseTestData{Name: "happy-liger", Status: rspb.Status_DELETED}.ToRelease() 113 114 // create the release records in the storage 115 assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'rls0'") 116 assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'rls1'") 117 assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'rls2'") 118 assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'rls3'") 119 assertErrNil(t.Fatal, storage.Create(rls4), "Storing release 'rls4'") 120 assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'rls5'") 121 assertErrNil(t.Fatal, storage.Create(rls6), "Storing release 'rls6'") 122 } 123 124 var listTests = []struct { 125 Description string 126 NumExpected int 127 ListFunc func() ([]*rspb.Release, error) 128 }{ 129 {"ListDeleted", 2, storage.ListDeleted}, 130 {"ListDeployed", 2, storage.ListDeployed}, 131 {"ListReleases", 7, storage.ListReleases}, 132 } 133 134 setup() 135 136 for _, tt := range listTests { 137 list, err := tt.ListFunc() 138 assertErrNil(t.Fatal, err, tt.Description) 139 // verify the count of releases returned 140 if len(list) != tt.NumExpected { 141 t.Errorf("ListReleases(%s): expected %d, actual %d", 142 tt.Description, 143 tt.NumExpected, 144 len(list)) 145 } 146 } 147 } 148 149 func TestStorageDeployed(t *testing.T) { 150 storage := Init(driver.NewMemory()) 151 152 const name = "angry-bird" 153 const vers = int32(4) 154 155 // setup storage with test releases 156 setup := func() { 157 // release records 158 rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease() 159 rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_SUPERSEDED}.ToRelease() 160 rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_SUPERSEDED}.ToRelease() 161 rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_DEPLOYED}.ToRelease() 162 163 // create the release records in the storage 164 assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") 165 assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") 166 assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") 167 assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") 168 } 169 170 setup() 171 172 rls, err := storage.Deployed(name) 173 if err != nil { 174 t.Fatalf("Failed to query for deployed release: %s\n", err) 175 } 176 177 switch { 178 case rls == nil: 179 t.Fatalf("Release is nil") 180 case rls.Name != name: 181 t.Fatalf("Expected release name %q, actual %q\n", name, rls.Name) 182 case rls.Version != vers: 183 t.Fatalf("Expected release version %d, actual %d\n", vers, rls.Version) 184 case rls.Info.Status.Code != rspb.Status_DEPLOYED: 185 t.Fatalf("Expected release status 'DEPLOYED', actual %s\n", rls.Info.Status.Code) 186 } 187 } 188 189 func TestStorageHistory(t *testing.T) { 190 storage := Init(driver.NewMemory()) 191 192 const name = "angry-bird" 193 194 // setup storage with test releases 195 setup := func() { 196 // release records 197 rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease() 198 rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_SUPERSEDED}.ToRelease() 199 rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_SUPERSEDED}.ToRelease() 200 rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_DEPLOYED}.ToRelease() 201 202 // create the release records in the storage 203 assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") 204 assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") 205 assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") 206 assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") 207 } 208 209 setup() 210 211 h, err := storage.History(name) 212 if err != nil { 213 t.Fatalf("Failed to query for release history (%q): %s\n", name, err) 214 } 215 if len(h) != 4 { 216 t.Fatalf("Release history (%q) is empty\n", name) 217 } 218 } 219 220 func TestStorageLast(t *testing.T) { 221 storage := Init(driver.NewMemory()) 222 223 const name = "angry-bird" 224 225 // setup storage with test releases 226 setup := func() { 227 // release records 228 rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease() 229 rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_SUPERSEDED}.ToRelease() 230 rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_SUPERSEDED}.ToRelease() 231 rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_FAILED}.ToRelease() 232 233 // create the release records in the storage 234 assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") 235 assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") 236 assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") 237 assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") 238 } 239 240 setup() 241 242 h, err := storage.Last(name) 243 if err != nil { 244 t.Fatalf("Failed to query for release history (%q): %s\n", name, err) 245 } 246 247 if h.Version != 4 { 248 t.Errorf("Expected revision 4, got %d", h.Version) 249 } 250 } 251 252 type ReleaseTestData struct { 253 Name string 254 Version int32 255 Manifest string 256 Namespace string 257 Status rspb.Status_Code 258 } 259 260 func (test ReleaseTestData) ToRelease() *rspb.Release { 261 return &rspb.Release{ 262 Name: test.Name, 263 Version: test.Version, 264 Manifest: test.Manifest, 265 Namespace: test.Namespace, 266 Info: &rspb.Info{Status: &rspb.Status{Code: test.Status}}, 267 } 268 } 269 270 func assertErrNil(eh func(args ...interface{}), err error, message string) { 271 if err != nil { 272 eh(fmt.Sprintf("%s: %q", message, err)) 273 } 274 }