github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/state/backups/backups_test.go (about)

     1  // Copyright 2013,2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package backups_test
     5  
     6  import (
     7  	"bytes"
     8  	"io/ioutil"
     9  	"time" // Only used for time types.
    10  
    11  	"github.com/juju/errors"
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/juju/utils/set"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/mongo"
    17  	"github.com/juju/juju/state/backups"
    18  	backupstesting "github.com/juju/juju/state/backups/testing"
    19  	"github.com/juju/juju/testing"
    20  )
    21  
    22  type backupsSuite struct {
    23  	backupstesting.BaseSuite
    24  
    25  	api backups.Backups
    26  }
    27  
    28  var _ = gc.Suite(&backupsSuite{}) // Register the suite.
    29  
    30  func (s *backupsSuite) SetUpTest(c *gc.C) {
    31  	s.BaseSuite.SetUpTest(c)
    32  
    33  	s.api = backups.NewBackups(s.Storage)
    34  }
    35  
    36  func (s *backupsSuite) setStored(id string) *time.Time {
    37  	s.Storage.ID = id
    38  	s.Storage.Meta = backupstesting.NewMetadataStarted()
    39  	s.Storage.Meta.SetID(id)
    40  	stored := testing.NonZeroTime().UTC()
    41  	s.Storage.Meta.SetStored(&stored)
    42  	return &stored
    43  }
    44  
    45  type fakeDumper struct{}
    46  
    47  func (*fakeDumper) Dump(dumpDir string) error {
    48  	return nil
    49  }
    50  
    51  func (s *backupsSuite) checkFailure(c *gc.C, expected string) {
    52  	s.PatchValue(backups.GetDBDumper, func(*backups.DBInfo) (backups.DBDumper, error) {
    53  		return &fakeDumper{}, nil
    54  	})
    55  
    56  	paths := backups.Paths{DataDir: "/var/lib/juju"}
    57  	targets := set.NewStrings("juju", "admin")
    58  	dbInfo := backups.DBInfo{"a", "b", "c", targets, mongo.Mongo32wt}
    59  	meta := backupstesting.NewMetadataStarted()
    60  	meta.Notes = "some notes"
    61  	err := s.api.Create(meta, &paths, &dbInfo)
    62  
    63  	c.Check(err, gc.ErrorMatches, expected)
    64  }
    65  
    66  func (s *backupsSuite) TestNewBackups(c *gc.C) {
    67  	api := backups.NewBackups(s.Storage)
    68  
    69  	c.Check(api, gc.NotNil)
    70  }
    71  
    72  func (s *backupsSuite) TestCreateOkay(c *gc.C) {
    73  
    74  	// Patch the internals.
    75  	archiveFile := ioutil.NopCloser(bytes.NewBufferString("<compressed tarball>"))
    76  	result := backups.NewTestCreateResult(archiveFile, 10, "<checksum>")
    77  	received, testCreate := backups.NewTestCreate(result)
    78  	s.PatchValue(backups.RunCreate, testCreate)
    79  
    80  	rootDir := "<was never set>"
    81  	s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) {
    82  		rootDir = root
    83  		return []string{"<some file>"}, nil
    84  	})
    85  
    86  	var receivedDBInfo *backups.DBInfo
    87  	s.PatchValue(backups.GetDBDumper, func(info *backups.DBInfo) (backups.DBDumper, error) {
    88  		receivedDBInfo = info
    89  		return nil, nil
    90  	})
    91  
    92  	stored := s.setStored("spam")
    93  
    94  	// Run the backup.
    95  	paths := backups.Paths{DataDir: "/var/lib/juju"}
    96  	targets := set.NewStrings("juju", "admin")
    97  	dbInfo := backups.DBInfo{"a", "b", "c", targets, mongo.Mongo32wt}
    98  	meta := backupstesting.NewMetadataStarted()
    99  	backupstesting.SetOrigin(meta, "<model ID>", "<machine ID>", "<hostname>")
   100  	meta.Notes = "some notes"
   101  	err := s.api.Create(meta, &paths, &dbInfo)
   102  
   103  	// Test the call values.
   104  	s.Storage.CheckCalled(c, "spam", meta, archiveFile, "Add", "Metadata")
   105  	filesToBackUp, _ := backups.ExposeCreateArgs(received)
   106  	c.Check(filesToBackUp, jc.SameContents, []string{"<some file>"})
   107  
   108  	c.Check(receivedDBInfo.Address, gc.Equals, "a")
   109  	c.Check(receivedDBInfo.Username, gc.Equals, "b")
   110  	c.Check(receivedDBInfo.Password, gc.Equals, "c")
   111  	c.Check(receivedDBInfo.Targets, gc.DeepEquals, targets)
   112  
   113  	c.Check(rootDir, gc.Equals, "")
   114  
   115  	// Check the resulting metadata.
   116  	c.Check(meta, gc.Equals, s.Storage.MetaArg)
   117  	c.Check(meta.ID(), gc.Equals, "spam")
   118  	c.Check(meta.Size(), gc.Equals, int64(10))
   119  	c.Check(meta.Checksum(), gc.Equals, "<checksum>")
   120  	c.Check(meta.Stored().Unix(), gc.Equals, stored.Unix())
   121  	c.Check(meta.Origin.Model, gc.Equals, "<model ID>")
   122  	c.Check(meta.Origin.Machine, gc.Equals, "<machine ID>")
   123  	c.Check(meta.Origin.Hostname, gc.Equals, "<hostname>")
   124  	c.Check(meta.Notes, gc.Equals, "some notes")
   125  
   126  	// Check the file storage.
   127  	s.Storage.Meta = meta
   128  	s.Storage.File = archiveFile
   129  	storedMeta, storedFile, err := s.Storage.Get(meta.ID())
   130  	c.Check(err, jc.ErrorIsNil)
   131  	c.Check(storedMeta, gc.DeepEquals, meta)
   132  	data, err := ioutil.ReadAll(storedFile)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	c.Check(string(data), gc.Equals, "<compressed tarball>")
   135  }
   136  
   137  func (s *backupsSuite) TestCreateFailToListFiles(c *gc.C) {
   138  	s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) {
   139  		return nil, errors.New("failed!")
   140  	})
   141  
   142  	s.checkFailure(c, "while listing files to back up: failed!")
   143  }
   144  
   145  func (s *backupsSuite) TestCreateFailToCreate(c *gc.C) {
   146  	s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) {
   147  		return []string{}, nil
   148  	})
   149  	s.PatchValue(backups.RunCreate, backups.NewTestCreateFailure("failed!"))
   150  
   151  	s.checkFailure(c, "while creating backup archive: failed!")
   152  }
   153  
   154  func (s *backupsSuite) TestCreateFailToFinishMeta(c *gc.C) {
   155  	s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) {
   156  		return []string{}, nil
   157  	})
   158  	_, testCreate := backups.NewTestCreate(nil)
   159  	s.PatchValue(backups.RunCreate, testCreate)
   160  	s.PatchValue(backups.FinishMeta, backups.NewTestMetaFinisher("failed!"))
   161  
   162  	s.checkFailure(c, "while updating metadata: failed!")
   163  }
   164  
   165  func (s *backupsSuite) TestCreateFailToStoreArchive(c *gc.C) {
   166  	s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) {
   167  		return []string{}, nil
   168  	})
   169  	_, testCreate := backups.NewTestCreate(nil)
   170  	s.PatchValue(backups.RunCreate, testCreate)
   171  	s.PatchValue(backups.FinishMeta, backups.NewTestMetaFinisher(""))
   172  	s.PatchValue(backups.StoreArchiveRef, backups.NewTestArchiveStorer("failed!"))
   173  
   174  	s.checkFailure(c, "while storing backup archive: failed!")
   175  }
   176  
   177  func (s *backupsSuite) TestStoreArchive(c *gc.C) {
   178  	stored := s.setStored("spam")
   179  
   180  	meta := backupstesting.NewMetadataStarted()
   181  	c.Assert(meta.ID(), gc.Equals, "")
   182  	c.Assert(meta.Stored(), gc.IsNil)
   183  	archive := &bytes.Buffer{}
   184  	err := backups.StoreArchive(s.Storage, meta, archive)
   185  	c.Assert(err, jc.ErrorIsNil)
   186  
   187  	s.Storage.CheckCalled(c, "spam", meta, archive, "Add", "Metadata")
   188  	c.Assert(meta.ID(), gc.Equals, "spam")
   189  	c.Assert(meta.Stored(), jc.DeepEquals, stored)
   190  }