github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/provider/joyent/storage_test.go (about)

     1  // Copyright 2013 Joyent Inc.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package joyent_test
     5  
     6  import (
     7  	"fmt"
     8  	"io/ioutil"
     9  	"math/rand"
    10  	"net/http"
    11  	"net/url"
    12  	"strings"
    13  
    14  	"github.com/joyent/gocommon/errors"
    15  	jujuerrors "github.com/juju/errors"
    16  	jc "github.com/juju/testing/checkers"
    17  	gc "launchpad.net/gocheck"
    18  
    19  	"github.com/juju/juju/provider/joyent"
    20  	jp "github.com/juju/juju/provider/joyent"
    21  )
    22  
    23  type storageSuite struct {
    24  	providerSuite
    25  	localMantaServer
    26  }
    27  
    28  const (
    29  	storageName     = "testStorage"
    30  	fileName        = "testFile"
    31  	fileBlobContent = "Juju Joyent Provider Storage - Test"
    32  )
    33  
    34  var _ = gc.Suite(&storageSuite{})
    35  
    36  func (s *storageSuite) SetUpSuite(c *gc.C) {
    37  	s.providerSuite.SetUpSuite(c)
    38  	s.localMantaServer.setupServer(c)
    39  }
    40  
    41  func (s *storageSuite) TearDownSuite(c *gc.C) {
    42  	s.localMantaServer.destroyServer()
    43  	s.providerSuite.TearDownSuite(c)
    44  }
    45  
    46  // makeStorage creates a Manta storage object for the running test.
    47  func (s *storageSuite) makeStorage(name string, c *gc.C) *jp.JoyentStorage {
    48  	stor := joyent.MakeStorage(c, GetFakeConfig("localhost", s.localMantaServer.Server.URL))
    49  	return stor.(*jp.JoyentStorage)
    50  }
    51  
    52  func (s *storageSuite) assertContainer(storage *jp.JoyentStorage, c *gc.C) {
    53  	err := jp.CreateContainer(storage)
    54  	c.Assert(err, gc.IsNil)
    55  }
    56  
    57  func (s *storageSuite) assertFile(storage *jp.JoyentStorage, c *gc.C) {
    58  	err := storage.Put(fileName, strings.NewReader(fileBlobContent), int64(len(fileBlobContent)))
    59  	c.Assert(err, gc.IsNil)
    60  }
    61  
    62  // makeRandomBytes returns an array of arbitrary byte values.
    63  func makeRandomBytes(length int) []byte {
    64  	data := make([]byte, length)
    65  	for index := range data {
    66  		data[index] = byte(rand.Intn(256))
    67  	}
    68  	return data
    69  }
    70  
    71  func makeResponse(content string, status int) *http.Response {
    72  	return &http.Response{
    73  		Status:     fmt.Sprintf("%d", status),
    74  		StatusCode: status,
    75  		Body:       ioutil.NopCloser(strings.NewReader(content)),
    76  	}
    77  }
    78  
    79  func (s *storageSuite) TestList(c *gc.C) {
    80  	mantaStorage := s.makeStorage(storageName, c)
    81  	s.assertContainer(mantaStorage, c)
    82  	s.assertFile(mantaStorage, c)
    83  
    84  	names, err := mantaStorage.List("")
    85  	c.Assert(err, gc.IsNil)
    86  	c.Check(names, gc.DeepEquals, []string{fileName})
    87  }
    88  
    89  func (s *storageSuite) TestListWithPrefix(c *gc.C) {
    90  	mantaStorage := s.makeStorage(storageName, c)
    91  	s.assertContainer(mantaStorage, c)
    92  	s.assertFile(mantaStorage, c)
    93  	err := mantaStorage.Put("pr/fileName", strings.NewReader(fileBlobContent), int64(len(fileBlobContent)))
    94  	c.Assert(err, gc.IsNil)
    95  
    96  	names, err := mantaStorage.List("p")
    97  	c.Assert(err, gc.IsNil)
    98  	c.Check(names, gc.DeepEquals, []string{"pr/fileName"})
    99  }
   100  
   101  func (s *storageSuite) TestGet(c *gc.C) {
   102  	mantaStorage := s.makeStorage(storageName, c)
   103  	s.assertFile(mantaStorage, c)
   104  
   105  	reader, err := mantaStorage.Get(fileName)
   106  	c.Assert(err, gc.IsNil)
   107  	c.Assert(reader, gc.NotNil)
   108  	defer reader.Close()
   109  
   110  	data, err := ioutil.ReadAll(reader)
   111  	c.Assert(err, gc.IsNil)
   112  	c.Check(string(data), gc.Equals, fileBlobContent)
   113  }
   114  
   115  func (s *storageSuite) TestGetFileNotExists(c *gc.C) {
   116  	mantaStorage := s.makeStorage(storageName, c)
   117  
   118  	_, err := mantaStorage.Get("noFile")
   119  	c.Assert(err, gc.NotNil)
   120  	c.Assert(err, jc.Satisfies, jujuerrors.IsNotFound)
   121  }
   122  
   123  func (s *storageSuite) TestPut(c *gc.C) {
   124  	mantaStorage := s.makeStorage(storageName, c)
   125  
   126  	s.assertFile(mantaStorage, c)
   127  }
   128  
   129  func (s *storageSuite) TestRemove(c *gc.C) {
   130  	mantaStorage := s.makeStorage(storageName, c)
   131  	s.assertFile(mantaStorage, c)
   132  
   133  	err := mantaStorage.Remove(fileName)
   134  	c.Assert(err, gc.IsNil)
   135  }
   136  
   137  func (s *storageSuite) TestRemoveFileNotExists(c *gc.C) {
   138  	mantaStorage := s.makeStorage(storageName, c)
   139  
   140  	err := mantaStorage.Remove("nofile")
   141  	c.Assert(err, gc.IsNil)
   142  }
   143  
   144  func (s *storageSuite) TestRemoveAll(c *gc.C) {
   145  	mantaStorage := s.makeStorage(storageName, c)
   146  
   147  	err := mantaStorage.RemoveAll()
   148  	c.Assert(err, gc.IsNil)
   149  }
   150  
   151  func (s *storageSuite) TestURL(c *gc.C) {
   152  	mantaStorage := s.makeStorage(storageName, c)
   153  
   154  	URL, err := mantaStorage.URL(fileName)
   155  	c.Assert(err, gc.IsNil)
   156  	parsedURL, err := url.Parse(URL)
   157  	c.Assert(err, gc.IsNil)
   158  	c.Check(parsedURL.Host, gc.Matches, mantaStorage.GetMantaUrl()[strings.LastIndex(mantaStorage.GetMantaUrl(), "/")+1:])
   159  	c.Check(parsedURL.Path, gc.Matches, fmt.Sprintf("/%s/stor/%s/%s", mantaStorage.GetMantaUser(), mantaStorage.GetContainerName(), fileName))
   160  }
   161  
   162  func (s *storageSuite) TestCreateContainer(c *gc.C) {
   163  	mantaStorage := s.makeStorage(storageName, c)
   164  
   165  	s.assertContainer(mantaStorage, c)
   166  }
   167  
   168  func (s *storageSuite) TestCreateContainerAlreadyExists(c *gc.C) {
   169  	mantaStorage := s.makeStorage(storageName, c)
   170  
   171  	s.assertContainer(mantaStorage, c)
   172  	s.assertContainer(mantaStorage, c)
   173  }
   174  
   175  func (s *storageSuite) TestDeleteContainer(c *gc.C) {
   176  	mantaStorage := s.makeStorage(storageName, c)
   177  	s.assertContainer(mantaStorage, c)
   178  
   179  	err := mantaStorage.DeleteContainer(mantaStorage.GetContainerName())
   180  	c.Assert(err, gc.IsNil)
   181  }
   182  
   183  func (s *storageSuite) TestDeleteContainerNotEmpty(c *gc.C) {
   184  	mantaStorage := s.makeStorage(storageName, c)
   185  	s.assertContainer(mantaStorage, c)
   186  	s.assertFile(mantaStorage, c)
   187  
   188  	err := mantaStorage.DeleteContainer(mantaStorage.GetContainerName())
   189  	c.Assert(err, gc.NotNil)
   190  	c.Assert(err, jc.Satisfies, errors.IsBadRequest)
   191  }
   192  
   193  func (s *storageSuite) TestDeleteContainerNotExists(c *gc.C) {
   194  	mantaStorage := s.makeStorage(storageName, c)
   195  
   196  	err := mantaStorage.DeleteContainer("noContainer")
   197  	c.Assert(err, gc.NotNil)
   198  	c.Assert(err, jc.Satisfies, jujuerrors.IsNotFound)
   199  }