github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/binarystorage/layered_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package binarystorage_test
     5  
     6  import (
     7  	"io"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/state/binarystorage"
    15  	coretesting "github.com/juju/juju/testing"
    16  )
    17  
    18  type layeredStorageSuite struct {
    19  	coretesting.BaseSuite
    20  	stores []*mockStorage
    21  	store  binarystorage.Storage
    22  }
    23  
    24  var _ = gc.Suite(&layeredStorageSuite{})
    25  
    26  func (s *layeredStorageSuite) SetUpTest(c *gc.C) {
    27  	s.BaseSuite.SetUpTest(c)
    28  	s.stores = []*mockStorage{{
    29  		metadata: []binarystorage.Metadata{{
    30  			Version: "1.0", Size: 1, SHA256: "foo",
    31  		}, {
    32  			Version: "2.0", Size: 2, SHA256: "bar",
    33  		}},
    34  	}, {
    35  		metadata: []binarystorage.Metadata{{
    36  			Version: "3.0", Size: 3, SHA256: "baz",
    37  		}, {
    38  			Version: "1.0", Size: 3, SHA256: "meh",
    39  		}},
    40  	}}
    41  
    42  	stores := make([]binarystorage.Storage, len(s.stores))
    43  	for i, store := range s.stores {
    44  		stores[i] = store
    45  	}
    46  	var err error
    47  	s.store, err = binarystorage.NewLayeredStorage(stores...)
    48  	c.Assert(err, jc.ErrorIsNil)
    49  }
    50  
    51  func (s *layeredStorageSuite) TestNewLayeredStorageError(c *gc.C) {
    52  	_, err := binarystorage.NewLayeredStorage(s.stores[0])
    53  	c.Assert(err, gc.ErrorMatches, "expected multiple stores")
    54  }
    55  
    56  func (s *layeredStorageSuite) TestAdd(c *gc.C) {
    57  	r := new(readCloser)
    58  	m := binarystorage.Metadata{Version: "4.0", Size: 4, SHA256: "qux"}
    59  	expectedErr := errors.New("wut")
    60  	s.stores[0].SetErrors(expectedErr)
    61  	err := s.store.Add(r, m)
    62  	c.Assert(err, gc.Equals, expectedErr)
    63  	s.stores[0].CheckCalls(c, []testing.StubCall{{"Add", []interface{}{r, m}}})
    64  	s.stores[1].CheckNoCalls(c)
    65  }
    66  
    67  func (s *layeredStorageSuite) TestAllMetadata(c *gc.C) {
    68  	all, err := s.store.AllMetadata()
    69  	c.Assert(err, jc.ErrorIsNil)
    70  	c.Assert(all, jc.DeepEquals, []binarystorage.Metadata{
    71  		{Version: "1.0", Size: 1, SHA256: "foo"},
    72  		{Version: "2.0", Size: 2, SHA256: "bar"},
    73  		{Version: "3.0", Size: 3, SHA256: "baz"},
    74  	})
    75  	s.stores[0].CheckCallNames(c, "AllMetadata")
    76  	s.stores[1].CheckCallNames(c, "AllMetadata")
    77  }
    78  
    79  func (s *layeredStorageSuite) TestAllMetadataError(c *gc.C) {
    80  	expectedErr := errors.New("wut")
    81  	s.stores[0].SetErrors(expectedErr)
    82  	_, err := s.store.AllMetadata()
    83  	c.Assert(err, gc.Equals, expectedErr)
    84  	s.stores[0].CheckCallNames(c, "AllMetadata")
    85  	s.stores[1].CheckNoCalls(c)
    86  }
    87  
    88  func (s *layeredStorageSuite) TestMetadata(c *gc.C) {
    89  	s.stores[0].SetErrors(errors.NotFoundf("metadata"))
    90  	m, err := s.store.Metadata("3.0")
    91  	c.Assert(err, jc.ErrorIsNil)
    92  	c.Assert(m, jc.DeepEquals, s.stores[1].metadata[0])
    93  	s.stores[0].CheckCalls(c, []testing.StubCall{{
    94  		"Metadata", []interface{}{"3.0"},
    95  	}})
    96  	s.stores[1].CheckCalls(c, []testing.StubCall{{
    97  		"Metadata", []interface{}{"3.0"},
    98  	}})
    99  }
   100  
   101  func (s *layeredStorageSuite) TestMetadataEarlyExit(c *gc.C) {
   102  	m, err := s.store.Metadata("1.0")
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	s.stores[0].CheckCalls(c, []testing.StubCall{{
   105  		"Metadata", []interface{}{"1.0"},
   106  	}})
   107  	s.stores[1].CheckNoCalls(c)
   108  	c.Assert(m, jc.DeepEquals, s.stores[0].metadata[0])
   109  }
   110  
   111  func (s *layeredStorageSuite) TestMetadataFatalError(c *gc.C) {
   112  	expectedErr := errors.New("wut")
   113  	s.stores[0].SetErrors(expectedErr)
   114  	_, err := s.store.Metadata("1.0")
   115  	c.Assert(err, gc.Equals, expectedErr)
   116  	s.stores[0].CheckCalls(c, []testing.StubCall{{
   117  		"Metadata", []interface{}{"1.0"},
   118  	}})
   119  	s.stores[1].CheckNoCalls(c)
   120  }
   121  
   122  func (s *layeredStorageSuite) TestOpen(c *gc.C) {
   123  	s.stores[0].SetErrors(errors.NotFoundf("metadata"))
   124  	m, rc, err := s.store.Open("3.0")
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	c.Assert(m, jc.DeepEquals, s.stores[1].metadata[0])
   127  	c.Assert(rc, gc.Equals, &s.stores[1].rc)
   128  	s.stores[0].CheckCalls(c, []testing.StubCall{{
   129  		"Open", []interface{}{"3.0"},
   130  	}})
   131  	s.stores[1].CheckCalls(c, []testing.StubCall{{
   132  		"Open", []interface{}{"3.0"},
   133  	}})
   134  }
   135  
   136  func (s *layeredStorageSuite) TestOpenEarlyExit(c *gc.C) {
   137  	m, rc, err := s.store.Open("1.0")
   138  	c.Assert(err, jc.ErrorIsNil)
   139  	c.Assert(m, jc.DeepEquals, s.stores[0].metadata[0])
   140  	c.Assert(rc, gc.Equals, &s.stores[0].rc)
   141  	s.stores[0].CheckCalls(c, []testing.StubCall{{
   142  		"Open", []interface{}{"1.0"},
   143  	}})
   144  	s.stores[1].CheckNoCalls(c)
   145  }
   146  
   147  func (s *layeredStorageSuite) TestOpenFatalError(c *gc.C) {
   148  	expectedErr := errors.New("wut")
   149  	s.stores[0].SetErrors(expectedErr)
   150  	_, _, err := s.store.Open("1.0")
   151  	c.Assert(err, gc.Equals, expectedErr)
   152  	s.stores[0].CheckCalls(c, []testing.StubCall{{
   153  		"Open", []interface{}{"1.0"},
   154  	}})
   155  	s.stores[1].CheckNoCalls(c)
   156  }
   157  
   158  type mockStorage struct {
   159  	testing.Stub
   160  	rc       readCloser
   161  	metadata []binarystorage.Metadata
   162  }
   163  
   164  func (s *mockStorage) Add(r io.Reader, m binarystorage.Metadata) error {
   165  	s.MethodCall(s, "Add", r, m)
   166  	return s.NextErr()
   167  }
   168  
   169  func (s *mockStorage) AllMetadata() ([]binarystorage.Metadata, error) {
   170  	s.MethodCall(s, "AllMetadata")
   171  	return s.metadata, s.NextErr()
   172  }
   173  
   174  func (s *mockStorage) Metadata(version string) (binarystorage.Metadata, error) {
   175  	s.MethodCall(s, "Metadata", version)
   176  	return s.metadata[0], s.NextErr()
   177  }
   178  
   179  func (s *mockStorage) Open(version string) (binarystorage.Metadata, io.ReadCloser, error) {
   180  	s.MethodCall(s, "Open", version)
   181  	return s.metadata[0], &s.rc, s.NextErr()
   182  }
   183  
   184  type readCloser struct{ io.ReadCloser }