github.com/danielqsj/helm@v2.0.0-alpha.4.0.20160908204436-976e0ba5199b+incompatible/pkg/storage/driver/cfgmaps_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 driver 18 19 import ( 20 "reflect" 21 "testing" 22 23 rspb "k8s.io/helm/pkg/proto/hapi/release" 24 25 "k8s.io/kubernetes/pkg/api" 26 kberrs "k8s.io/kubernetes/pkg/api/errors" 27 "k8s.io/kubernetes/pkg/client/unversioned" 28 ) 29 30 var _ Driver = &ConfigMaps{} 31 32 func TestConfigMapName(t *testing.T) { 33 c := newTestFixture(t) 34 if c.Name() != ConfigMapsDriverName { 35 t.Errorf("Expected name to be %q, got %q", ConfigMapsDriverName, c.Name()) 36 } 37 } 38 39 func TestConfigMapGet(t *testing.T) { 40 key := "key-1" 41 rel := newTestRelease(key, 1, rspb.Status_DEPLOYED) 42 43 cfgmaps := newTestFixture(t, []*rspb.Release{rel}...) 44 45 // get release with key 46 got, err := cfgmaps.Get(key) 47 if err != nil { 48 t.Fatalf("Failed to get release: %s", err) 49 } 50 // compare fetched release with original 51 if !reflect.DeepEqual(rel, got) { 52 t.Errorf("Expected {%q}, got {%q}", rel, got) 53 } 54 } 55 56 func TestConfigMapList(t *testing.T) { 57 cfgmaps := newTestFixture(t, []*rspb.Release{ 58 newTestRelease("key-1", 1, rspb.Status_DELETED), 59 newTestRelease("key-2", 1, rspb.Status_DELETED), 60 newTestRelease("key-3", 1, rspb.Status_DEPLOYED), 61 newTestRelease("key-4", 1, rspb.Status_DEPLOYED), 62 newTestRelease("key-5", 1, rspb.Status_SUPERSEDED), 63 newTestRelease("key-6", 1, rspb.Status_SUPERSEDED), 64 }...) 65 66 // list all deleted releases 67 del, err := cfgmaps.List(func(rel *rspb.Release) bool { 68 return rel.Info.Status.Code == rspb.Status_DELETED 69 }) 70 // check 71 if err != nil { 72 t.Errorf("Failed to list deleted: %s", err) 73 } 74 if len(del) != 2 { 75 t.Errorf("Expected 2 deleted, got %d:\n%v\n", len(del), del) 76 } 77 78 // list all deployed releases 79 dpl, err := cfgmaps.List(func(rel *rspb.Release) bool { 80 return rel.Info.Status.Code == rspb.Status_DEPLOYED 81 }) 82 // check 83 if err != nil { 84 t.Errorf("Failed to list deployed: %s", err) 85 } 86 if len(dpl) != 2 { 87 t.Errorf("Expected 2 deployed, got %d", len(dpl)) 88 } 89 90 // list all superseded releases 91 ssd, err := cfgmaps.List(func(rel *rspb.Release) bool { 92 return rel.Info.Status.Code == rspb.Status_SUPERSEDED 93 }) 94 // check 95 if err != nil { 96 t.Errorf("Failed to list superseded: %s", err) 97 } 98 if len(ssd) != 2 { 99 t.Errorf("Expected 2 superseded, got %d", len(ssd)) 100 } 101 } 102 103 func TestConfigMapCreate(t *testing.T) { 104 cfgmaps := newTestFixture(t) 105 106 key := "key-1" 107 rel := newTestRelease(key, 1, rspb.Status_DEPLOYED) 108 109 // store the release in a configmap 110 if err := cfgmaps.Create(rel); err != nil { 111 t.Fatalf("Failed to create release with key %q: %s", key, err) 112 } 113 114 // get the release back 115 got, err := cfgmaps.Get(key) 116 if err != nil { 117 t.Fatalf("Failed to get release with key %q: %s", key, err) 118 } 119 120 // compare created release with original 121 if !reflect.DeepEqual(rel, got) { 122 t.Errorf("Expected {%q}, got {%q}", rel, got) 123 } 124 } 125 126 func TestConfigMapUpdate(t *testing.T) { 127 key := "key-1" 128 rel := newTestRelease(key, 1, rspb.Status_DEPLOYED) 129 130 cfgmaps := newTestFixture(t, []*rspb.Release{rel}...) 131 132 // modify release status code & version 133 rel = newTestRelease(key, 2, rspb.Status_SUPERSEDED) 134 135 // perform the update 136 if err := cfgmaps.Update(rel); err != nil { 137 t.Fatalf("Failed to update release: %s", err) 138 } 139 140 // fetch the updated release 141 got, err := cfgmaps.Get(key) 142 if err != nil { 143 t.Fatalf("Failed to get release with key %q: %s", key, err) 144 } 145 146 // check release has actually been updated by comparing modified fields 147 switch { 148 case rel.Info.Status.Code != got.Info.Status.Code: 149 t.Errorf("Expected status %s, got status %s", rel.Info.Status.Code, got.Info.Status.Code) 150 case rel.Version != got.Version: 151 t.Errorf("Expected version %d, got version %d", rel.Version, got.Version) 152 } 153 } 154 155 // newTestFixture initializes a MockConfigMapsInterface. 156 // ConfigMaps are created for each release provided. 157 func newTestFixture(t *testing.T, releases ...*rspb.Release) *ConfigMaps { 158 var mock MockConfigMapsInterface 159 mock.Init(t, releases...) 160 161 return NewConfigMaps(&mock) 162 } 163 164 // newTestRelease creates a release object for testing. 165 func newTestRelease(key string, version int32, status rspb.Status_Code) *rspb.Release { 166 return &rspb.Release{Name: key, Info: &rspb.Info{Status: &rspb.Status{Code: status}}, Version: version} 167 } 168 169 // MockConfigMapsInterface mocks a kubernetes ConfigMapsInterface 170 type MockConfigMapsInterface struct { 171 unversioned.ConfigMapsInterface 172 173 objects map[string]*api.ConfigMap 174 } 175 176 func (mock *MockConfigMapsInterface) Init(t *testing.T, releases ...*rspb.Release) { 177 mock.objects = map[string]*api.ConfigMap{} 178 179 for _, rls := range releases { 180 cfgmap, err := newConfigMapsObject(rls, nil) 181 if err != nil { 182 t.Fatalf("Failed to create configmap: %s", err) 183 } 184 mock.objects[rls.Name] = cfgmap 185 } 186 } 187 188 func (mock *MockConfigMapsInterface) Get(name string) (*api.ConfigMap, error) { 189 object, ok := mock.objects[name] 190 if !ok { 191 return nil, kberrs.NewNotFound(api.Resource("tests"), name) 192 } 193 return object, nil 194 } 195 196 func (mock *MockConfigMapsInterface) List(opts api.ListOptions) (*api.ConfigMapList, error) { 197 var list api.ConfigMapList 198 for _, cfgmap := range mock.objects { 199 list.Items = append(list.Items, *cfgmap) 200 } 201 return &list, nil 202 } 203 204 func (mock *MockConfigMapsInterface) Create(cfgmap *api.ConfigMap) (*api.ConfigMap, error) { 205 name := cfgmap.ObjectMeta.Name 206 if object, ok := mock.objects[name]; ok { 207 return object, kberrs.NewAlreadyExists(api.Resource("tests"), name) 208 } 209 mock.objects[name] = cfgmap 210 return cfgmap, nil 211 } 212 213 func (mock *MockConfigMapsInterface) Update(cfgmap *api.ConfigMap) (*api.ConfigMap, error) { 214 name := cfgmap.ObjectMeta.Name 215 if _, ok := mock.objects[name]; !ok { 216 return nil, kberrs.NewNotFound(api.Resource("tests"), name) 217 } 218 mock.objects[name] = cfgmap 219 return cfgmap, nil 220 } 221 222 func (mock *MockConfigMapsInterface) Delete(name string) error { 223 if _, ok := mock.objects[name]; !ok { 224 return kberrs.NewNotFound(api.Resource("tests"), name) 225 } 226 delete(mock.objects, name) 227 return nil 228 }