github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/cmd/juju/backups/package_test.go (about)

     1  // Copyright 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"
     9  	"io/ioutil"
    10  	"os"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/juju/cmd"
    15  	"github.com/juju/errors"
    16  	jc "github.com/juju/testing/checkers"
    17  	gc "gopkg.in/check.v1"
    18  
    19  	"github.com/juju/juju/apiserver/params"
    20  	"github.com/juju/juju/cmd/juju/backups"
    21  	jujutesting "github.com/juju/juju/testing"
    22  )
    23  
    24  // MetaResultString is the expected output of running dumpMetadata() on
    25  // s.metaresult.
    26  var MetaResultString = `
    27  backup ID:       "spam"
    28  checksum:        ""
    29  checksum format: ""
    30  size (B):        0
    31  stored:          0001-01-01 00:00:00 +0000 UTC
    32  started:         0001-01-01 00:00:00 +0000 UTC
    33  finished:        0001-01-01 00:00:00 +0000 UTC
    34  notes:           ""
    35  environment ID:  ""
    36  machine ID:      ""
    37  created on host: ""
    38  juju version:    0.0.0
    39  `[1:]
    40  
    41  func TestPackage(t *testing.T) {
    42  	gc.TestingT(t)
    43  }
    44  
    45  type BaseBackupsSuite struct {
    46  	jujutesting.FakeJujuHomeSuite
    47  
    48  	command    *backups.Command
    49  	metaresult *params.BackupsMetadataResult
    50  	data       string
    51  
    52  	filename string
    53  }
    54  
    55  func (s *BaseBackupsSuite) SetUpTest(c *gc.C) {
    56  	s.FakeJujuHomeSuite.SetUpTest(c)
    57  
    58  	s.command = backups.NewCommand().(*backups.Command)
    59  	s.metaresult = &params.BackupsMetadataResult{
    60  		ID: "spam",
    61  	}
    62  	s.data = "<compressed archive data>"
    63  }
    64  
    65  func (s *BaseBackupsSuite) TearDownTest(c *gc.C) {
    66  	if s.filename != "" {
    67  		err := os.Remove(s.filename)
    68  		if !os.IsNotExist(err) {
    69  			c.Check(err, jc.ErrorIsNil)
    70  		}
    71  	}
    72  
    73  	s.FakeJujuHomeSuite.TearDownTest(c)
    74  }
    75  
    76  func (s *BaseBackupsSuite) patchAPIClient(client backups.APIClient) {
    77  	s.PatchValue(backups.NewAPIClient,
    78  		func(c *backups.CommandBase) (backups.APIClient, error) {
    79  			return client, nil
    80  		},
    81  	)
    82  }
    83  
    84  func (s *BaseBackupsSuite) setSuccess() *fakeAPIClient {
    85  	client := &fakeAPIClient{metaresult: s.metaresult}
    86  	s.patchAPIClient(client)
    87  	return client
    88  }
    89  
    90  func (s *BaseBackupsSuite) setFailure(failure string) *fakeAPIClient {
    91  	client := &fakeAPIClient{err: errors.New(failure)}
    92  	s.patchAPIClient(client)
    93  	return client
    94  }
    95  
    96  func (s *BaseBackupsSuite) setDownload() *fakeAPIClient {
    97  	client := s.setSuccess()
    98  	client.archive = ioutil.NopCloser(bytes.NewBufferString(s.data))
    99  	return client
   100  }
   101  
   102  func (s *BaseBackupsSuite) checkArchive(c *gc.C) {
   103  	c.Assert(s.filename, gc.Not(gc.Equals), "")
   104  	archive, err := os.Open(s.filename)
   105  	c.Assert(err, jc.ErrorIsNil)
   106  	defer archive.Close()
   107  
   108  	data, err := ioutil.ReadAll(archive)
   109  	c.Check(string(data), gc.Equals, s.data)
   110  }
   111  
   112  func (s *BaseBackupsSuite) diffStrings(c *gc.C, value, expected string) {
   113  	// If only Go had a diff library.
   114  	vlines := strings.Split(value, "\n")
   115  	elines := strings.Split(expected, "\n")
   116  	vsize := len(vlines)
   117  	esize := len(elines)
   118  
   119  	if vsize < 2 || esize < 2 {
   120  		return
   121  	}
   122  
   123  	smaller := elines
   124  	if vsize < esize {
   125  		smaller = vlines
   126  	}
   127  
   128  	for i := range smaller {
   129  		vline := vlines[i]
   130  		eline := elines[i]
   131  		if vline != eline {
   132  			c.Log("first mismatched line:")
   133  			c.Log("expected: " + eline)
   134  			c.Log("got:      " + vline)
   135  			break
   136  		}
   137  	}
   138  
   139  }
   140  
   141  func (s *BaseBackupsSuite) checkString(c *gc.C, value, expected string) {
   142  	if !c.Check(value, gc.Equals, expected) {
   143  		s.diffStrings(c, value, expected)
   144  	}
   145  }
   146  
   147  func (s *BaseBackupsSuite) checkStd(c *gc.C, ctx *cmd.Context, out, err string) {
   148  	c.Check(ctx.Stdin.(*bytes.Buffer).String(), gc.Equals, "")
   149  	s.checkString(c, ctx.Stdout.(*bytes.Buffer).String(), out)
   150  	s.checkString(c, ctx.Stderr.(*bytes.Buffer).String(), err)
   151  }
   152  
   153  type fakeAPIClient struct {
   154  	metaresult *params.BackupsMetadataResult
   155  	archive    io.ReadCloser
   156  	err        error
   157  
   158  	calls []string
   159  	args  []string
   160  	idArg string
   161  	notes string
   162  }
   163  
   164  func (f *fakeAPIClient) Check(c *gc.C, id, notes string, calls ...string) {
   165  	c.Check(f.calls, jc.DeepEquals, calls)
   166  	c.Check(f.idArg, gc.Equals, id)
   167  	c.Check(f.notes, gc.Equals, notes)
   168  }
   169  
   170  func (c *fakeAPIClient) Create(notes string) (*params.BackupsMetadataResult, error) {
   171  	c.calls = append(c.calls, "Create")
   172  	c.args = append(c.args, "notes")
   173  	c.notes = notes
   174  	if c.err != nil {
   175  		return nil, c.err
   176  	}
   177  	return c.metaresult, nil
   178  }
   179  
   180  func (c *fakeAPIClient) Info(id string) (*params.BackupsMetadataResult, error) {
   181  	c.calls = append(c.calls, "Info")
   182  	c.args = append(c.args, "id")
   183  	c.idArg = id
   184  	if c.err != nil {
   185  		return nil, c.err
   186  	}
   187  	return c.metaresult, nil
   188  }
   189  
   190  func (c *fakeAPIClient) List() (*params.BackupsListResult, error) {
   191  	c.calls = append(c.calls, "List")
   192  	if c.err != nil {
   193  		return nil, c.err
   194  	}
   195  	var result params.BackupsListResult
   196  	result.List = []params.BackupsMetadataResult{*c.metaresult}
   197  	return &result, nil
   198  }
   199  
   200  func (c *fakeAPIClient) Download(id string) (io.ReadCloser, error) {
   201  	c.calls = append(c.calls, "Download")
   202  	c.args = append(c.args, "id")
   203  	c.idArg = id
   204  	if c.err != nil {
   205  		return nil, c.err
   206  	}
   207  	return c.archive, nil
   208  }
   209  
   210  func (c *fakeAPIClient) Upload(ar io.Reader, meta params.BackupsMetadataResult) (string, error) {
   211  	c.args = append(c.args, "ar", "meta")
   212  	if c.err != nil {
   213  		return "", c.err
   214  	}
   215  	return c.metaresult.ID, nil
   216  }
   217  
   218  func (c *fakeAPIClient) Remove(id string) error {
   219  	c.calls = append(c.calls, "Remove")
   220  	c.args = append(c.args, "id")
   221  	c.idArg = id
   222  	if c.err != nil {
   223  		return c.err
   224  	}
   225  	return nil
   226  }
   227  
   228  func (c *fakeAPIClient) Close() error {
   229  	return nil
   230  }