github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/client/asserts_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 "errors" 24 "io/ioutil" 25 "net/http" 26 "net/url" 27 28 "golang.org/x/xerrors" 29 . "gopkg.in/check.v1" 30 31 "github.com/snapcore/snapd/asserts" 32 "github.com/snapcore/snapd/client" 33 "github.com/snapcore/snapd/snap" 34 ) 35 36 func (cs *clientSuite) TestClientAssert(c *C) { 37 cs.rsp = `{ 38 "type": "sync", 39 "result": {} 40 }` 41 a := []byte("Assertion.") 42 err := cs.cli.Ack(a) 43 c.Assert(err, IsNil) 44 body, err := ioutil.ReadAll(cs.req.Body) 45 c.Assert(err, IsNil) 46 c.Check(body, DeepEquals, a) 47 c.Check(cs.req.Method, Equals, "POST") 48 c.Check(cs.req.URL.Path, Equals, "/v2/assertions") 49 } 50 51 func (cs *clientSuite) TestClientAssertsTypes(c *C) { 52 cs.rsp = `{ 53 "result": { 54 "types": ["one", "two"] 55 }, 56 "status": "OK", 57 "status-code": 200, 58 "type": "sync" 59 }` 60 typs, err := cs.cli.AssertionTypes() 61 c.Assert(err, IsNil) 62 c.Check(typs, DeepEquals, []string{"one", "two"}) 63 } 64 65 func (cs *clientSuite) TestClientAssertsCallsEndpoint(c *C) { 66 _, _ = cs.cli.Known("snap-revision", nil, nil) 67 c.Check(cs.req.Method, Equals, "GET") 68 c.Check(cs.req.URL.Path, Equals, "/v2/assertions/snap-revision") 69 } 70 71 func (cs *clientSuite) TestClientAssertsOptsCallsEndpoint(c *C) { 72 _, _ = cs.cli.Known("snap-revision", nil, &client.KnownOptions{Remote: true}) 73 c.Check(cs.req.Method, Equals, "GET") 74 c.Check(cs.req.URL.Path, Equals, "/v2/assertions/snap-revision") 75 c.Check(cs.req.URL.Query()["remote"], DeepEquals, []string{"true"}) 76 } 77 78 func (cs *clientSuite) TestClientAssertsCallsEndpointWithFilter(c *C) { 79 _, _ = cs.cli.Known("snap-revision", map[string]string{ 80 "snap-id": "snap-id-1", 81 "snap-sha3-384": "sha3-384...", 82 }, nil) 83 u, err := url.ParseRequestURI(cs.req.URL.String()) 84 c.Assert(err, IsNil) 85 c.Check(u.Path, Equals, "/v2/assertions/snap-revision") 86 c.Check(u.Query(), DeepEquals, url.Values{ 87 "snap-sha3-384": []string{"sha3-384..."}, 88 "snap-id": []string{"snap-id-1"}, 89 }) 90 } 91 92 func (cs *clientSuite) TestClientAssertsHttpError(c *C) { 93 cs.err = errors.New("fail") 94 _, err := cs.cli.Known("snap-build", nil, nil) 95 c.Assert(err, ErrorMatches, "failed to query assertions: cannot communicate with server: fail") 96 } 97 98 func (cs *clientSuite) TestClientAssertsJSONError(c *C) { 99 cs.status = 400 100 cs.header = http.Header{} 101 cs.header.Add("Content-type", "application/json") 102 cs.rsp = `{ 103 "status-code": 400, 104 "type": "error", 105 "result": { 106 "message": "invalid" 107 } 108 }` 109 _, err := cs.cli.Known("snap-build", nil, nil) 110 c.Assert(err, ErrorMatches, "invalid") 111 } 112 113 func (cs *clientSuite) TestClientAsserts(c *C) { 114 cs.header = http.Header{} 115 cs.header.Add("X-Ubuntu-Assertions-Count", "2") 116 cs.rsp = `type: snap-revision 117 authority-id: store-id1 118 snap-sha3-384: P1wNUk5O_5tO5spqOLlqUuAk7gkNYezIMHp5N9hMUg1a6YEjNeaCc4T0BaYz7IWs 119 snap-id: snap-id-1 120 snap-size: 123 121 snap-revision: 1 122 developer-id: dev-id1 123 revision: 1 124 timestamp: 2015-11-25T20:00:00Z 125 body-length: 0 126 sign-key-sha3-384: Jv8_JiHiIzJVcO9M55pPdqSDWUvuhfDIBJUS-3VW7F_idjix7Ffn5qMxB21ZQuij 127 128 openpgp ... 129 130 type: snap-revision 131 authority-id: store-id1 132 snap-sha3-384: 0Yt6-GXQeTZWUAHo1IKDpS9kqO6zMaizY6vGEfGM-aSfpghPKir1Ic7teQ5Zadaj 133 snap-id: snap-id-2 134 snap-size: 456 135 snap-revision: 1 136 developer-id: dev-id1 137 revision: 1 138 timestamp: 2015-11-30T20:00:00Z 139 body-length: 0 140 sign-key-sha3-384: Jv8_JiHiIzJVcO9M55pPdqSDWUvuhfDIBJUS-3VW7F_idjix7Ffn5qMxB21ZQuij 141 142 openpgp ... 143 ` 144 145 a, err := cs.cli.Known("snap-revision", nil, nil) 146 c.Assert(err, IsNil) 147 c.Check(a, HasLen, 2) 148 149 c.Check(a[0].Type(), Equals, asserts.SnapRevisionType) 150 } 151 152 func (cs *clientSuite) TestClientAssertsNoAssertions(c *C) { 153 cs.header = http.Header{} 154 cs.header.Add("X-Ubuntu-Assertions-Count", "0") 155 cs.rsp = "" 156 cs.status = 200 157 a, err := cs.cli.Known("snap-revision", nil, nil) 158 c.Assert(err, IsNil) 159 c.Check(a, HasLen, 0) 160 } 161 162 func (cs *clientSuite) TestClientAssertsMissingAssertions(c *C) { 163 cs.header = http.Header{} 164 cs.header.Add("X-Ubuntu-Assertions-Count", "4") 165 cs.rsp = "" 166 cs.status = 200 167 _, err := cs.cli.Known("snap-build", nil, nil) 168 c.Assert(err, ErrorMatches, "response did not have the expected number of assertions") 169 } 170 171 func (cs *clientSuite) TestStoreAccount(c *C) { 172 cs.header = http.Header{} 173 cs.header.Add("X-Ubuntu-Assertions-Count", "1") 174 cs.rsp = `type: account 175 authority-id: canonical 176 account-id: canonicalID 177 display-name: canonicalDisplay 178 timestamp: 2016-04-01T00:00:00.0Z 179 username: canonicalUser 180 validation: certified 181 sign-key-sha3-384: -CvQKAwRQ5h3Ffn10FILJoEZUXOv6km9FwA80-Rcj-f-6jadQ89VRswHNiEB9Lxk 182 183 AcLDXAQAAQoABgUCV7UYzwAKCRDUpVvql9g3IK7uH/4udqNOurx5WYVknzXdwekp0ovHCQJ0iBPw 184 TSFxEVr9faZSzb7eqJ1WicHsShf97PYS3ClRYAiluFsjRA8Y03kkSVJHjC+sIwGFubsnkmgflt6D 185 WEmYIl0UBmeaEDS8uY4Xvp9NsLTzNEj2kvzy/52gKaTc1ZSl5RDL9ppMav+0V9iBYpiDPBWH2rJ+ 186 aDSD8Rkyygm0UscfAKyDKH4lrvZ0WkYyi1YVNPrjQ/AtBySh6Q4iJ3LifzKa9woIyAuJET/4/FPY 187 oirqHAfuvNod36yNQIyNqEc20AvTvZNH0PSsg4rq3DLjIPzv5KbJO9lhsasNJK1OdL6x8Yqrdsbk 188 ldZp4qkzfjV7VOMQKaadfcZPRaVVeJWOBnBiaukzkhoNlQi1sdCdkBB/AJHZF8QXw6c7vPDcfnCV 189 1lW7ddQ2p8IsJbT6LzpJu3GW/P4xhNgCjtCJ1AJm9a9RqLwQYgdLZwwDa9iCRtqTbRXBlfy3apps 190 1VjbQ3h5iCd0hNfwDBnGVm1rhLKHCD1DUdNE43oN2ZlE7XGyh0HFV6vKlpqoW3eoXCIxWu+HBY96 191 +LSl/jQgCkb0nxYyzEYK4Reb31D0mYw1Nji5W+MIF5E09+DYZoOT0UvR05YMwMEOeSdI/hLWg/5P 192 k+GDK+/KopMmpd4D1+jjtF7ZvqDpmAV98jJGB2F88RyVb4gcjmFFyTi4Kv6vzz/oLpbm0qrizC0W 193 HLGDN/ymGA5sHzEgEx7U540vz/q9VX60FKqL2YZr/DcyY9GKX5kCG4sNqIIHbcJneZ4frM99oVDu 194 7Jv+DIx/Di6D1ULXol2XjxbbJLKHFtHksR97ceaFvcZwTogC61IYUBJCvvMoqdXAWMhEXCr0QfQ5 195 Xbi31XW2d4/lF/zWlAkRnGTzufIXFni7+nEuOK0SQEzO3/WaRedK1SGOOtTDjB8/3OJeW96AUYK5 196 oTIynkYkEyHWMNCXALg+WQW6L4/YO7aUjZ97zOWIugd7Xy63aT3r/EHafqaY2nacOhLfkeKZ830b 197 o/ezjoZQAxbh6ce7JnXRgE9ELxjdAhBTpGjmmmN2sYrJ7zP9bOgly0BnEPXGSQfFA+NNNw1FADx1 198 MUY8q9DBjmVtgqY+1KGTV5X8KvQCBMODZIf/XJPHdCRAHxMd8COypcwgL2vDIIXpOFbi1J/B0GF+ 199 eklxk9wzBA8AecBMCwCzIRHDNpD1oa2we38bVFrOug6e/VId1k1jYFJjiLyLCDmV8IMYwEllHSXp 200 LQAdm3xZ7t4WnxYC8YSCk9mXf3CZg59SpmnV5Q5Z6A5Pl7Nc3sj7hcsMBZEsOMPzNC9dPsBnZvjs 201 WpPUffJzEdhHBFhvYMuD4Vqj6ejUv9l3oTrjQWVC 202 ` 203 204 account, err := cs.cli.StoreAccount("canonicalID") 205 c.Assert(err, IsNil) 206 c.Check(cs.req.Method, Equals, "GET") 207 c.Check(cs.req.URL.Query(), HasLen, 1) 208 c.Check(cs.req.URL.Query().Get("account-id"), Equals, "canonicalID") 209 c.Assert(account, DeepEquals, &snap.StoreAccount{ 210 ID: "canonicalID", 211 Username: "canonicalUser", 212 DisplayName: "canonicalDisplay", 213 Validation: "verified", 214 }) 215 } 216 217 func (cs *clientSuite) TestStoreAccountNoAssertionFound(c *C) { 218 cs.header = http.Header{} 219 cs.header.Add("X-Ubuntu-Assertions-Count", "0") 220 cs.rsp = "" 221 222 _, err := cs.cli.StoreAccount("canonicalID") 223 c.Assert(err, ErrorMatches, "no assertion found for account-id canonicalID") 224 } 225 226 func (cs *clientSuite) TestClientAssertTypesErrIsWrapped(c *C) { 227 cs.err = errors.New("boom") 228 _, err := cs.cli.AssertionTypes() 229 var e xerrors.Wrapper 230 c.Assert(err, Implements, &e) 231 } 232 233 func (cs *clientSuite) TestClientKnownErrIsWrapped(c *C) { 234 cs.err = errors.New("boom") 235 _, err := cs.cli.Known("foo", nil, nil) 236 var e xerrors.Wrapper 237 c.Assert(err, Implements, &e) 238 }