github.com/danielqsj/helm@v2.0.0-alpha.4.0.20160908204436-976e0ba5199b+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{Name: "angry-beaver"}.ToRelease()
    34  	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease")
    35  
    36  	// fetch the release
    37  	res, err := storage.Get(rls.Name)
    38  	assertErrNil(t.Fatal, err, "QueryRelease")
    39  
    40  	// verify the fetched and created release are the same
    41  	if !reflect.DeepEqual(rls, res) {
    42  		t.Fatalf("Expected %q, got %q", rls, res)
    43  	}
    44  }
    45  
    46  func TestStorageUpdate(t *testing.T) {
    47  	// initialize storage
    48  	storage := Init(driver.NewMemory())
    49  
    50  	// create fake release
    51  	rls := ReleaseTestData{Name: "angry-beaver"}.ToRelease()
    52  	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease")
    53  
    54  	// modify the release
    55  	rls.Version = 2
    56  	rls.Manifest = "new-manifest"
    57  	assertErrNil(t.Fatal, storage.Update(rls), "UpdateRelease")
    58  
    59  	// retrieve the updated release
    60  	res, err := storage.Get(rls.Name)
    61  	assertErrNil(t.Fatal, err, "QueryRelease")
    62  
    63  	// verify updated and fetched releases are the same.
    64  	if !reflect.DeepEqual(rls, res) {
    65  		t.Fatalf("Expected %q, got %q", rls, res)
    66  	}
    67  }
    68  
    69  func TestStorageDelete(t *testing.T) {
    70  	// initialize storage
    71  	storage := Init(driver.NewMemory())
    72  
    73  	// create fake release
    74  	rls := ReleaseTestData{Name: "angry-beaver"}.ToRelease()
    75  	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease")
    76  
    77  	// delete the release
    78  	res, err := storage.Delete(rls.Name)
    79  	assertErrNil(t.Fatal, err, "DeleteRelease")
    80  
    81  	// verify updated and fetched releases are the same.
    82  	if !reflect.DeepEqual(rls, res) {
    83  		t.Fatalf("Expected %q, got %q", rls, res)
    84  	}
    85  }
    86  
    87  func TestStorageList(t *testing.T) {
    88  	// initialize storage
    89  	storage := Init(driver.NewMemory())
    90  
    91  	// setup storage with test releases
    92  	setup := func() {
    93  		// release records
    94  		rls0 := ReleaseTestData{Name: "happy-catdog", Status: rspb.Status_SUPERSEDED}.ToRelease()
    95  		rls1 := ReleaseTestData{Name: "livid-human", Status: rspb.Status_SUPERSEDED}.ToRelease()
    96  		rls2 := ReleaseTestData{Name: "relaxed-cat", Status: rspb.Status_SUPERSEDED}.ToRelease()
    97  		rls3 := ReleaseTestData{Name: "hungry-hippo", Status: rspb.Status_DEPLOYED}.ToRelease()
    98  		rls4 := ReleaseTestData{Name: "angry-beaver", Status: rspb.Status_DEPLOYED}.ToRelease()
    99  		rls5 := ReleaseTestData{Name: "opulent-frog", Status: rspb.Status_DELETED}.ToRelease()
   100  		rls6 := ReleaseTestData{Name: "happy-liger", Status: rspb.Status_DELETED}.ToRelease()
   101  
   102  		// create the release records in the storage
   103  		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'rls0'")
   104  		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'rls1'")
   105  		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'rls2'")
   106  		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'rls3'")
   107  		assertErrNil(t.Fatal, storage.Create(rls4), "Storing release 'rls4'")
   108  		assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'rls5'")
   109  		assertErrNil(t.Fatal, storage.Create(rls6), "Storing release 'rls6'")
   110  	}
   111  
   112  	var listTests = []struct {
   113  		Description string
   114  		NumExpected int
   115  		ListFunc    func() ([]*rspb.Release, error)
   116  	}{
   117  		{"ListDeleted", 2, storage.ListDeleted},
   118  		{"ListDeployed", 2, storage.ListDeployed},
   119  		{"ListReleases", 7, storage.ListReleases},
   120  	}
   121  
   122  	setup()
   123  
   124  	for _, tt := range listTests {
   125  		list, err := tt.ListFunc()
   126  		assertErrNil(t.Fatal, err, tt.Description)
   127  		// verify the count of releases returned
   128  		if len(list) != tt.NumExpected {
   129  			t.Errorf("ListReleases(%s): expected %d, actual %d",
   130  				tt.Description,
   131  				tt.NumExpected,
   132  				len(list))
   133  		}
   134  	}
   135  }
   136  
   137  type ReleaseTestData struct {
   138  	Name      string
   139  	Version   int32
   140  	Manifest  string
   141  	Namespace string
   142  	Status    rspb.Status_Code
   143  }
   144  
   145  func (test ReleaseTestData) ToRelease() *rspb.Release {
   146  	return &rspb.Release{
   147  		Name:      test.Name,
   148  		Version:   test.Version,
   149  		Manifest:  test.Manifest,
   150  		Namespace: test.Namespace,
   151  		Info:      &rspb.Info{Status: &rspb.Status{Code: test.Status}},
   152  	}
   153  }
   154  
   155  func assertErrNil(eh func(args ...interface{}), err error, message string) {
   156  	if err != nil {
   157  		eh(fmt.Sprintf("%s: %q", message, err))
   158  	}
   159  }