github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"fmt"
     9  	"io"
    10  	"io/ioutil"
    11  	"os"
    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  	apibackups "github.com/juju/juju/api/backups"
    20  	"github.com/juju/juju/apiserver/params"
    21  	"github.com/juju/juju/cmd/juju/backups"
    22  	jujutesting "github.com/juju/juju/testing"
    23  )
    24  
    25  // MetaResultString is the expected output of running dumpMetadata() on
    26  // s.metaresult.
    27  var MetaResultString = `
    28  backup ID:       "spam"
    29  checksum:        ""
    30  checksum format: ""
    31  size (B):        0
    32  stored:          0001-01-01 00:00:00 +0000 UTC
    33  started:         0001-01-01 00:00:00 +0000 UTC
    34  finished:        0001-01-01 00:00:00 +0000 UTC
    35  notes:           ""
    36  model ID:        ""
    37  machine ID:      ""
    38  created on host: ""
    39  juju version:    0.0.0
    40  `[1:]
    41  
    42  func TestPackage(t *testing.T) {
    43  	gc.TestingT(t)
    44  }
    45  
    46  type BaseBackupsSuite struct {
    47  	jujutesting.FakeJujuXDGDataHomeSuite
    48  
    49  	command    cmd.Command
    50  	metaresult *params.BackupsMetadataResult
    51  	data       string
    52  	apiVersion int
    53  
    54  	filename string
    55  }
    56  
    57  func (s *BaseBackupsSuite) SetUpTest(c *gc.C) {
    58  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    59  
    60  	s.metaresult = &params.BackupsMetadataResult{
    61  		ID:       "spam",
    62  		Filename: "filename",
    63  	}
    64  	s.data = "<compressed archive data>"
    65  
    66  	s.apiVersion = 2
    67  }
    68  
    69  func (s *BaseBackupsSuite) TearDownTest(c *gc.C) {
    70  	if s.filename != "" {
    71  		err := os.Remove(s.filename)
    72  		if !os.IsNotExist(err) {
    73  			c.Check(err, jc.ErrorIsNil)
    74  		}
    75  	}
    76  
    77  	s.FakeJujuXDGDataHomeSuite.TearDownTest(c)
    78  }
    79  
    80  func (s *BaseBackupsSuite) patchAPIClient(client backups.APIClient) {
    81  	s.PatchValue(backups.NewAPIClient,
    82  		func(c *backups.CommandBase) (backups.APIClient, error) {
    83  			return client, nil
    84  		},
    85  	)
    86  }
    87  
    88  func (s *BaseBackupsSuite) patchGetAPI(client backups.APIClient) {
    89  	s.PatchValue(backups.NewGetAPI,
    90  		func(c *backups.CommandBase) (backups.APIClient, int, error) {
    91  			return client, s.apiVersion, nil
    92  		},
    93  	)
    94  }
    95  
    96  func (s *BaseBackupsSuite) setSuccess() *fakeAPIClient {
    97  	client := &fakeAPIClient{metaresult: s.metaresult}
    98  	s.patchAPIClient(client)
    99  	return client
   100  }
   101  
   102  func (s *BaseBackupsSuite) setFailure(failure string) *fakeAPIClient {
   103  	client := &fakeAPIClient{err: errors.New(failure)}
   104  	s.patchAPIClient(client)
   105  	return client
   106  }
   107  
   108  func (s *BaseBackupsSuite) setDownload() *fakeAPIClient {
   109  	client := s.setSuccess()
   110  	client.archive = ioutil.NopCloser(bytes.NewBufferString(s.data))
   111  	return client
   112  }
   113  
   114  func (s *BaseBackupsSuite) checkArchive(c *gc.C) {
   115  	c.Assert(s.filename, gc.Not(gc.Equals), "")
   116  	archive, err := os.Open(s.filename)
   117  	c.Assert(err, jc.ErrorIsNil)
   118  	defer archive.Close()
   119  
   120  	// Test file created successfully. Clean it up after the test is run.
   121  	s.AddCleanup(func(c *gc.C) {
   122  		err := os.Remove(s.filename)
   123  		if !os.IsNotExist(err) {
   124  			c.Fatalf("could not remove test file %v: %v", s.filename, err)
   125  		}
   126  	})
   127  
   128  	data, err := ioutil.ReadAll(archive)
   129  	c.Check(string(data), gc.Equals, s.data)
   130  }
   131  
   132  func (s *BaseBackupsSuite) checkStd(c *gc.C, ctx *cmd.Context, out, err string) {
   133  	c.Check(ctx.Stdin.(*bytes.Buffer).Len(), gc.Equals, 0)
   134  	jujutesting.CheckString(c, ctx.Stdout.(*bytes.Buffer).String(), out)
   135  	jujutesting.CheckString(c, ctx.Stderr.(*bytes.Buffer).String(), err)
   136  }
   137  
   138  // TODO (hml) 2018-05-01
   139  // Replace this fakeAPIClient with MockAPIClient for all tests.
   140  type fakeAPIClient struct {
   141  	metaresult *params.BackupsMetadataResult
   142  	archive    io.ReadCloser
   143  	err        error
   144  
   145  	calls []string
   146  	args  []string
   147  	idArg string
   148  	notes string
   149  }
   150  
   151  func (f *fakeAPIClient) Check(c *gc.C, id, notes string, calls ...string) {
   152  	c.Check(f.calls, jc.DeepEquals, calls)
   153  	c.Check(f.idArg, gc.Equals, id)
   154  	c.Check(f.notes, gc.Equals, notes)
   155  }
   156  
   157  func (f *fakeAPIClient) CheckCalls(c *gc.C, calls ...string) {
   158  	c.Check(f.calls, jc.DeepEquals, calls)
   159  }
   160  
   161  func (f *fakeAPIClient) CheckArgs(c *gc.C, args ...string) {
   162  	c.Check(f.args, jc.DeepEquals, args)
   163  }
   164  
   165  func (c *fakeAPIClient) Create(notes string, keepCopy, noDownload bool) (*params.BackupsMetadataResult, error) {
   166  	c.calls = append(c.calls, "Create")
   167  	c.args = append(c.args, notes, fmt.Sprintf("%t", keepCopy), fmt.Sprintf("%t", noDownload))
   168  	c.notes = notes
   169  	if c.err != nil {
   170  		return nil, c.err
   171  	}
   172  	createResult := c.metaresult
   173  
   174  	return createResult, nil
   175  }
   176  
   177  func (c *fakeAPIClient) Info(id string) (*params.BackupsMetadataResult, error) {
   178  	c.calls = append(c.calls, "Info")
   179  	c.args = append(c.args, id)
   180  	c.idArg = id
   181  	if c.err != nil {
   182  		return nil, c.err
   183  	}
   184  	return c.metaresult, nil
   185  }
   186  
   187  func (c *fakeAPIClient) List() (*params.BackupsListResult, error) {
   188  	c.calls = append(c.calls, "List")
   189  	if c.err != nil {
   190  		return nil, c.err
   191  	}
   192  	var result params.BackupsListResult
   193  	result.List = []params.BackupsMetadataResult{*c.metaresult}
   194  	return &result, nil
   195  }
   196  
   197  func (c *fakeAPIClient) Download(id string) (io.ReadCloser, error) {
   198  	c.calls = append(c.calls, "Download")
   199  	c.args = append(c.args, id)
   200  	if c.err != nil {
   201  		return nil, c.err
   202  	}
   203  	return c.archive, nil
   204  }
   205  
   206  func (c *fakeAPIClient) Upload(ar io.ReadSeeker, meta params.BackupsMetadataResult) (string, error) {
   207  	c.args = append(c.args, "ar", "meta")
   208  	if c.err != nil {
   209  		return "", c.err
   210  	}
   211  	return c.metaresult.ID, nil
   212  }
   213  
   214  func (c *fakeAPIClient) Remove(id ...string) ([]params.ErrorResult, error) {
   215  	c.calls = append(c.calls, "Remove")
   216  	c.args = append(c.args, "id")
   217  	c.idArg = id[0]
   218  	if c.err != nil {
   219  		return []params.ErrorResult{
   220  			{Error: &params.Error{Message: c.err.Error()}},
   221  		}, nil
   222  	}
   223  	return nil, nil
   224  }
   225  
   226  func (c *fakeAPIClient) Close() error {
   227  	return nil
   228  }
   229  
   230  func (c *fakeAPIClient) RestoreReader(io.ReadSeeker, *params.BackupsMetadataResult, apibackups.ClientConnection) error {
   231  	return nil
   232  }
   233  
   234  func (c *fakeAPIClient) Restore(string, apibackups.ClientConnection) error {
   235  	return nil
   236  }