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  }