1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
jc "github.com/juju/testing/checkers"
10
gc "gopkg.in/check.v1"
14
type StatusSerializationSuite struct {
16
statusFields map[string]interface{}
19
var _ = gc.Suite(&StatusSerializationSuite{})
21
func minimalStatus() *status {
22
return newStatus(minimalStatusArgs())
25
func minimalStatusMap() map[interface{}]interface{} {
26
return map[interface{}]interface{}{
28
"status": map[interface{}]interface{}{
30
"updated": "2016-01-28T11:50:00Z",
35
func minimalStatusArgs() StatusArgs {
38
Updated: time.Date(2016, 1, 28, 11, 50, 0, 0, time.UTC),
42
func (s *StatusSerializationSuite) SetUpTest(c *gc.C) {
43
s.SerializationSuite.SetUpTest(c)
44
s.importName = "status"
45
s.importFunc = func(m map[string]interface{}) (interface{}, error) {
46
return importStatus(m)
48
s.statusFields = map[string]interface{}{}
49
s.testFields = func(m map[string]interface{}) {
50
m["status"] = s.statusFields
54
func (s *StatusSerializationSuite) TestMinimalMatches(c *gc.C) {
55
bytes, err := yaml.Marshal(minimalStatus())
56
c.Assert(err, jc.ErrorIsNil)
58
var source map[interface{}]interface{}
59
err = yaml.Unmarshal(bytes, &source)
60
c.Assert(err, jc.ErrorIsNil)
61
c.Assert(source, jc.DeepEquals, minimalStatusMap())
64
func (s *StatusSerializationSuite) TestMissingValue(c *gc.C) {
65
testMap := s.makeMap(1)
66
s.statusFields["updated"] = "2016-01-28T11:50:00Z"
67
_, err := importStatus(testMap)
68
c.Check(err.Error(), gc.Equals, "status v1 schema check failed: value: expected string, got nothing")
71
func (s *StatusSerializationSuite) TestMissingUpdated(c *gc.C) {
72
testMap := s.makeMap(1)
73
s.statusFields["value"] = "running"
74
_, err := importStatus(testMap)
75
c.Check(err.Error(), gc.Equals, "status v1 schema check failed: updated: expected string or time.Time, got nothing")
78
func (s *StatusSerializationSuite) TestNewStatus(c *gc.C) {
82
Data: map[string]interface{}{
85
Updated: time.Date(2016, 1, 28, 11, 50, 0, 0, time.UTC),
87
status := newStatus(args)
88
c.Assert(status.Value(), gc.Equals, args.Value)
89
c.Assert(status.Message(), gc.Equals, args.Message)
90
c.Assert(status.Data(), jc.DeepEquals, args.Data)
91
c.Assert(status.Updated(), gc.Equals, args.Updated)
94
func (s *StatusSerializationSuite) exportImport(c *gc.C, status_ *status) *status {
95
bytes, err := yaml.Marshal(status_)
96
c.Assert(err, jc.ErrorIsNil)
98
var source map[string]interface{}
99
err = yaml.Unmarshal(bytes, &source)
100
c.Assert(err, jc.ErrorIsNil)
102
status, err := importStatus(source)
103
c.Assert(err, jc.ErrorIsNil)
107
func (s *StatusSerializationSuite) TestParsing(c *gc.C) {
108
initial := newStatus(StatusArgs{
110
Message: "a message",
111
Data: map[string]interface{}{
114
Updated: time.Date(2016, 1, 28, 11, 50, 0, 0, time.UTC),
116
status := s.exportImport(c, initial)
117
c.Assert(status, jc.DeepEquals, initial)
120
func (s *StatusSerializationSuite) TestOptionalValues(c *gc.C) {
121
initial := newStatus(StatusArgs{
123
Updated: time.Date(2016, 1, 28, 11, 50, 0, 0, time.UTC),
125
status := s.exportImport(c, initial)
126
c.Assert(status, jc.DeepEquals, initial)
129
type StatusHistorySerializationSuite struct {
133
var _ = gc.Suite(&StatusHistorySerializationSuite{})
135
func emptyStatusHistoryMap() map[interface{}]interface{} {
136
return map[interface{}]interface{}{
138
"history": []interface{}{},
142
func testStatusHistoryArgs() []StatusArgs {
143
return []StatusArgs{{
145
Updated: time.Date(2016, 1, 28, 11, 50, 0, 0, time.UTC),
148
Updated: time.Date(2016, 1, 28, 12, 50, 0, 0, time.UTC),
151
Updated: time.Date(2016, 1, 28, 13, 50, 0, 0, time.UTC),
155
func (s *StatusHistorySerializationSuite) SetUpTest(c *gc.C) {
156
s.SerializationSuite.SetUpTest(c)
157
s.importName = "status"
158
s.importFunc = func(m map[string]interface{}) (interface{}, error) {
159
history := newStatusHistory()
160
if err := importStatusHistory(&history, m); err != nil {
165
s.testFields = func(m map[string]interface{}) {
166
m["history"] = []interface{}{}
170
func (s *StatusHistorySerializationSuite) TestSetStatusHistory(c *gc.C) {
171
// Make sure all the arg values are set.
172
args := []StatusArgs{{
175
Data: map[string]interface{}{
178
Updated: time.Date(2016, 1, 28, 11, 50, 0, 0, time.UTC),
181
Updated: time.Date(2016, 1, 28, 12, 50, 0, 0, time.UTC),
183
history := newStatusHistory()
184
history.SetStatusHistory(args)
186
for i, point := range history.StatusHistory() {
187
c.Check(point.Value(), gc.Equals, args[i].Value)
188
c.Check(point.Message(), gc.Equals, args[i].Message)
189
c.Check(point.Data(), jc.DeepEquals, args[i].Data)
190
c.Check(point.Updated(), gc.Equals, args[i].Updated)
194
func (s *StatusHistorySerializationSuite) exportImport(c *gc.C, status_ StatusHistory_) StatusHistory_ {
195
bytes, err := yaml.Marshal(status_)
196
c.Assert(err, jc.ErrorIsNil)
198
var source map[string]interface{}
199
err = yaml.Unmarshal(bytes, &source)
200
c.Assert(err, jc.ErrorIsNil)
202
history := newStatusHistory()
203
err = importStatusHistory(&history, source)
204
c.Assert(err, jc.ErrorIsNil)
208
func (s *StatusHistorySerializationSuite) TestParsing(c *gc.C) {
209
initial := newStatusHistory()
210
initial.SetStatusHistory(testStatusHistoryArgs())
211
history := s.exportImport(c, initial)
212
c.Assert(history, jc.DeepEquals, initial)
215
type StatusHistoryMixinSuite struct {
216
creator func() HasStatusHistory
217
serializer func(*gc.C, interface{}) HasStatusHistory
220
func (s *StatusHistoryMixinSuite) TestStatusHistory(c *gc.C) {
221
initial := s.creator()
222
args := testStatusHistoryArgs()
223
initial.SetStatusHistory(args)
225
entity := s.serializer(c, initial)
226
for i, point := range entity.StatusHistory() {
227
c.Check(point.Value(), gc.Equals, args[i].Value)
228
c.Check(point.Message(), gc.Equals, args[i].Message)
229
c.Check(point.Data(), jc.DeepEquals, args[i].Data)
230
c.Check(point.Updated(), gc.Equals, args[i].Updated)