github.com/kubiko/snapd@v0.0.0-20201013125620-d4f3094d9ddf/client/change_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2016 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package client_test 21 22 import ( 23 "gopkg.in/check.v1" 24 25 "github.com/snapcore/snapd/client" 26 "io/ioutil" 27 "time" 28 ) 29 30 func (cs *clientSuite) TestClientChange(c *check.C) { 31 cs.rsp = `{"type": "sync", "result": { 32 "id": "uno", 33 "kind": "foo", 34 "summary": "...", 35 "status": "Do", 36 "ready": false, 37 "spawn-time": "2016-04-21T01:02:03Z", 38 "ready-time": "2016-04-21T01:02:04Z", 39 "tasks": [{"kind": "bar", "summary": "...", "status": "Do", "progress": {"done": 0, "total": 1}, "spawn-time": "2016-04-21T01:02:03Z", "ready-time": "2016-04-21T01:02:04Z"}] 40 }}` 41 42 chg, err := cs.cli.Change("uno") 43 c.Assert(err, check.IsNil) 44 c.Check(chg, check.DeepEquals, &client.Change{ 45 ID: "uno", 46 Kind: "foo", 47 Summary: "...", 48 Status: "Do", 49 Tasks: []*client.Task{{ 50 Kind: "bar", 51 Summary: "...", 52 Status: "Do", 53 Progress: client.TaskProgress{Done: 0, Total: 1}, 54 SpawnTime: time.Date(2016, 04, 21, 1, 2, 3, 0, time.UTC), 55 ReadyTime: time.Date(2016, 04, 21, 1, 2, 4, 0, time.UTC), 56 }}, 57 58 SpawnTime: time.Date(2016, 04, 21, 1, 2, 3, 0, time.UTC), 59 ReadyTime: time.Date(2016, 04, 21, 1, 2, 4, 0, time.UTC), 60 }) 61 } 62 63 func (cs *clientSuite) TestClientChangeData(c *check.C) { 64 cs.rsp = `{"type": "sync", "result": { 65 "id": "uno", 66 "kind": "foo", 67 "summary": "...", 68 "status": "Do", 69 "ready": false, 70 "data": {"n": 42} 71 }}` 72 73 chg, err := cs.cli.Change("uno") 74 c.Assert(err, check.IsNil) 75 var n int 76 err = chg.Get("n", &n) 77 c.Assert(err, check.IsNil) 78 c.Assert(n, check.Equals, 42) 79 80 err = chg.Get("missing", &n) 81 c.Assert(err, check.Equals, client.ErrNoData) 82 } 83 84 func (cs *clientSuite) TestClientChangeRestartingState(c *check.C) { 85 cs.rsp = `{"type": "sync", "result": { 86 "id": "uno", 87 "kind": "foo", 88 "summary": "...", 89 "status": "Do", 90 "ready": false 91 }, 92 "maintenance": {"kind": "system-restart", "message": "system is restarting"} 93 }` 94 95 chg, err := cs.cli.Change("uno") 96 c.Check(chg, check.NotNil) 97 c.Check(chg.ID, check.Equals, "uno") 98 c.Check(err, check.IsNil) 99 c.Check(cs.cli.Maintenance(), check.ErrorMatches, `system is restarting`) 100 } 101 102 func (cs *clientSuite) TestClientChangeError(c *check.C) { 103 cs.rsp = `{"type": "sync", "result": { 104 "id": "uno", 105 "kind": "foo", 106 "summary": "...", 107 "status": "Error", 108 "ready": true, 109 "tasks": [{"kind": "bar", "summary": "...", "status": "Error", "progress": {"done": 1, "total": 1}, "log": ["ERROR: something broke"]}], 110 "err": "error message" 111 }}` 112 113 chg, err := cs.cli.Change("uno") 114 c.Assert(err, check.IsNil) 115 c.Check(chg, check.DeepEquals, &client.Change{ 116 ID: "uno", 117 Kind: "foo", 118 Summary: "...", 119 Status: "Error", 120 Tasks: []*client.Task{{ 121 Kind: "bar", 122 Summary: "...", 123 Status: "Error", 124 Progress: client.TaskProgress{Done: 1, Total: 1}, 125 Log: []string{"ERROR: something broke"}, 126 }}, 127 Err: "error message", 128 Ready: true, 129 }) 130 } 131 132 func (cs *clientSuite) TestClientChangesString(c *check.C) { 133 for k, v := range map[client.ChangeSelector]string{ 134 client.ChangesAll: "all", 135 client.ChangesReady: "ready", 136 client.ChangesInProgress: "in-progress", 137 } { 138 c.Check(k.String(), check.Equals, v) 139 } 140 } 141 142 func (cs *clientSuite) TestClientChanges(c *check.C) { 143 cs.rsp = `{"type": "sync", "result": [{ 144 "id": "uno", 145 "kind": "foo", 146 "summary": "...", 147 "status": "Do", 148 "ready": false, 149 "tasks": [{"kind": "bar", "summary": "...", "status": "Do", "progress": {"done": 0, "total": 1}}] 150 }]}` 151 152 for _, i := range []*client.ChangesOptions{ 153 {Selector: client.ChangesAll}, 154 {Selector: client.ChangesReady}, 155 {Selector: client.ChangesInProgress}, 156 {SnapName: "foo"}, 157 nil, 158 } { 159 chg, err := cs.cli.Changes(i) 160 c.Assert(err, check.IsNil) 161 c.Check(chg, check.DeepEquals, []*client.Change{{ 162 ID: "uno", 163 Kind: "foo", 164 Summary: "...", 165 Status: "Do", 166 Tasks: []*client.Task{{Kind: "bar", Summary: "...", Status: "Do", Progress: client.TaskProgress{Done: 0, Total: 1}}}, 167 }}) 168 if i == nil { 169 c.Check(cs.req.URL.RawQuery, check.Equals, "") 170 } else { 171 if i.Selector != 0 { 172 c.Check(cs.req.URL.RawQuery, check.Equals, "select="+i.Selector.String()) 173 } else { 174 c.Check(cs.req.URL.RawQuery, check.Equals, "for="+i.SnapName) 175 } 176 } 177 } 178 179 } 180 181 func (cs *clientSuite) TestClientChangesData(c *check.C) { 182 cs.rsp = `{"type": "sync", "result": [{ 183 "id": "uno", 184 "kind": "foo", 185 "summary": "...", 186 "status": "Do", 187 "ready": false, 188 "data": {"n": 42} 189 }]}` 190 191 chgs, err := cs.cli.Changes(&client.ChangesOptions{Selector: client.ChangesAll}) 192 c.Assert(err, check.IsNil) 193 194 chg := chgs[0] 195 var n int 196 err = chg.Get("n", &n) 197 c.Assert(err, check.IsNil) 198 c.Assert(n, check.Equals, 42) 199 200 err = chg.Get("missing", &n) 201 c.Assert(err, check.Equals, client.ErrNoData) 202 } 203 204 func (cs *clientSuite) TestClientAbort(c *check.C) { 205 cs.rsp = `{"type": "sync", "result": { 206 "id": "uno", 207 "kind": "foo", 208 "summary": "...", 209 "status": "Hold", 210 "ready": true, 211 "spawn-time": "2016-04-21T01:02:03Z", 212 "ready-time": "2016-04-21T01:02:04Z" 213 }}` 214 215 chg, err := cs.cli.Abort("uno") 216 c.Assert(err, check.IsNil) 217 c.Check(cs.req.Method, check.Equals, "POST") 218 c.Check(chg, check.DeepEquals, &client.Change{ 219 ID: "uno", 220 Kind: "foo", 221 Summary: "...", 222 Status: "Hold", 223 Ready: true, 224 225 SpawnTime: time.Date(2016, 04, 21, 1, 2, 3, 0, time.UTC), 226 ReadyTime: time.Date(2016, 04, 21, 1, 2, 4, 0, time.UTC), 227 }) 228 229 body, err := ioutil.ReadAll(cs.req.Body) 230 c.Assert(err, check.IsNil) 231 232 c.Assert(string(body), check.Equals, "{\"action\":\"abort\"}\n") 233 }