~ubuntu-branches/ubuntu/vivid/juju-core/vivid-updates

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/cmd/juju/storage/add_test.go

  • Committer: Package Import Robot
  • Author(s): Curtis C. Hovey
  • Date: 2015-09-29 19:43:29 UTC
  • mfrom: (47.1.4 wily-proposed)
  • Revision ID: package-import@ubuntu.com-20150929194329-9y496tbic30hc7vp
Tags: 1.24.6-0ubuntu1~15.04.1
Backport of 1.24.6 from wily. (LP: #1500916, #1497087)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2015 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package storage_test
 
5
 
 
6
import (
 
7
        "fmt"
 
8
        "strings"
 
9
 
 
10
        "github.com/juju/cmd"
 
11
        "github.com/juju/errors"
 
12
        jc "github.com/juju/testing/checkers"
 
13
        gc "gopkg.in/check.v1"
 
14
 
 
15
        "github.com/juju/juju/apiserver/common"
 
16
        "github.com/juju/juju/apiserver/params"
 
17
        "github.com/juju/juju/cmd/envcmd"
 
18
        "github.com/juju/juju/cmd/juju/storage"
 
19
        _ "github.com/juju/juju/provider/dummy"
 
20
        "github.com/juju/juju/testing"
 
21
)
 
22
 
 
23
type addSuite struct {
 
24
        SubStorageSuite
 
25
        mockAPI *mockAddAPI
 
26
        args    []string
 
27
}
 
28
 
 
29
var _ = gc.Suite(&addSuite{})
 
30
 
 
31
func (s *addSuite) SetUpTest(c *gc.C) {
 
32
        s.SubStorageSuite.SetUpTest(c)
 
33
 
 
34
        s.mockAPI = &mockAddAPI{}
 
35
        s.PatchValue(storage.GetStorageAddAPI, func(c *storage.AddCommand) (storage.StorageAddAPI, error) {
 
36
                return s.mockAPI, nil
 
37
        })
 
38
        s.args = nil
 
39
}
 
40
 
 
41
type tstData struct {
 
42
        args        []string
 
43
        expectedErr string
 
44
}
 
45
 
 
46
var errorTsts = []tstData{
 
47
        {nil, ".*storage add requires a unit and a storage directive.*"},
 
48
        {[]string{"tst/123"}, ".*storage add requires a unit and a storage directive.*"},
 
49
        {[]string{"tst/123", "data="}, `.*storage constraints require at least one.*`},
 
50
        {[]string{"tst/123", "data=-676"}, `.*count must be greater than zero, got "-676".*`},
 
51
        {[]string{"tst/123", "data=676", "data=676"}, `.*storage "data" specified more than once.*`},
 
52
}
 
53
 
 
54
func (s *addSuite) TestAddArgs(c *gc.C) {
 
55
        for i, t := range errorTsts {
 
56
                c.Logf("test %d for %q", i, t.args)
 
57
                s.args = t.args
 
58
                s.assertAddErrorOutput(c, t.expectedErr)
 
59
        }
 
60
}
 
61
 
 
62
func (s *addSuite) assertAddErrorOutput(c *gc.C, expected string) {
 
63
        _, err := runAdd(c, s.args...)
 
64
        c.Assert(errors.Cause(err), gc.ErrorMatches, expected)
 
65
}
 
66
 
 
67
func runAdd(c *gc.C, args ...string) (*cmd.Context, error) {
 
68
        return testing.RunCommand(c, envcmd.Wrap(&storage.AddCommand{}), args...)
 
69
}
 
70
 
 
71
func (s *addSuite) TestAddInvalidUnit(c *gc.C) {
 
72
        s.args = []string{"tst-123", "data=676"}
 
73
        s.assertAddErrorOutput(c, `.*unit name "tst-123" not valid.*`)
 
74
}
 
75
 
 
76
var successTsts = []tstData{
 
77
        {[]string{"tst/123", "data=676"}, ""},
 
78
        {[]string{"tst/123", "data"}, ``},
 
79
}
 
80
 
 
81
func (s *addSuite) TestAddSuccess(c *gc.C) {
 
82
        for i, t := range successTsts {
 
83
                c.Logf("test %d for %q", i, t.args)
 
84
                s.args = t.args
 
85
                s.assertAddOutput(c, "", "")
 
86
        }
 
87
}
 
88
 
 
89
func (s *addSuite) TestAddOperationAborted(c *gc.C) {
 
90
        s.args = []string{"tst/123", "data=676"}
 
91
        s.mockAPI.abort = true
 
92
        s.assertAddErrorOutput(c, ".*aborted.*")
 
93
}
 
94
 
 
95
func (s *addSuite) TestAddFailure(c *gc.C) {
 
96
        s.args = []string{"tst/123", "err=676"}
 
97
        s.assertAddOutput(c, "", "fail: storage \"err\": test failure\n")
 
98
}
 
99
 
 
100
func (s *addSuite) TestAddMixOrderPreserved(c *gc.C) {
 
101
        expectedErr := `
 
102
fail: storage "err": test failure
 
103
success: storage "a"`[1:]
 
104
 
 
105
        s.args = []string{"tst/123", "a=676", "err=676"}
 
106
        s.assertAddOutput(c, "", expectedErr)
 
107
 
 
108
        s.args = []string{"tst/123", "err=676", "a=676"}
 
109
        s.assertAddOutput(c, "", expectedErr)
 
110
}
 
111
 
 
112
func (s *addSuite) assertAddOutput(c *gc.C, expectedValid, expectedErr string) {
 
113
        context, err := runAdd(c, s.args...)
 
114
        c.Assert(err, jc.ErrorIsNil)
 
115
 
 
116
        obtainedErr := testing.Stderr(context)
 
117
        c.Assert(obtainedErr, gc.Equals, expectedErr)
 
118
 
 
119
        obtainedValid := testing.Stdout(context)
 
120
        c.Assert(obtainedValid, gc.Equals, expectedValid)
 
121
}
 
122
 
 
123
type mockAddAPI struct {
 
124
        abort bool
 
125
}
 
126
 
 
127
func (s mockAddAPI) Close() error {
 
128
        return nil
 
129
}
 
130
 
 
131
func (s mockAddAPI) AddToUnit(storages []params.StorageAddParams) ([]params.ErrorResult, error) {
 
132
        if s.abort {
 
133
                return nil, errors.New("aborted")
 
134
        }
 
135
        result := make([]params.ErrorResult, len(storages))
 
136
        for i, one := range storages {
 
137
                if strings.HasPrefix(one.StorageName, "err") {
 
138
                        result[i].Error = common.ServerError(fmt.Errorf("test failure"))
 
139
                }
 
140
        }
 
141
        return result, nil
 
142
}