github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/client/login_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 "io/ioutil" 24 "os" 25 "path/filepath" 26 27 "gopkg.in/check.v1" 28 29 "github.com/snapcore/snapd/client" 30 "github.com/snapcore/snapd/osutil" 31 "github.com/snapcore/snapd/testutil" 32 ) 33 34 func (cs *clientSuite) TestClientLogin(c *check.C) { 35 cs.rsp = `{"type": "sync", "result": 36 {"username": "the-user-name", 37 "macaroon": "the-root-macaroon", 38 "discharges": ["discharge-macaroon"]}}` 39 40 outfile := filepath.Join(c.MkDir(), "json") 41 os.Setenv(client.TestAuthFileEnvKey, outfile) 42 defer os.Unsetenv(client.TestAuthFileEnvKey) 43 44 c.Assert(cs.cli.LoggedInUser(), check.IsNil) 45 46 user, err := cs.cli.Login("username", "pass", "") 47 c.Check(err, check.IsNil) 48 c.Check(user, check.DeepEquals, &client.User{ 49 Username: "the-user-name", 50 Macaroon: "the-root-macaroon", 51 Discharges: []string{"discharge-macaroon"}}) 52 53 c.Assert(cs.cli.LoggedInUser(), check.Not(check.IsNil)) 54 55 c.Check(osutil.FileExists(outfile), check.Equals, true) 56 c.Check(outfile, testutil.FileEquals, `{"username":"the-user-name","macaroon":"the-root-macaroon","discharges":["discharge-macaroon"]}`) 57 } 58 59 func (cs *clientSuite) TestClientLoginWhenLoggedIn(c *check.C) { 60 cs.rsp = `{"type": "sync", "result": 61 {"username": "the-user-name", 62 "email": "zed@bar.com", 63 "macaroon": "the-root-macaroon", 64 "discharges": ["discharge-macaroon"]}}` 65 66 outfile := filepath.Join(c.MkDir(), "json") 67 os.Setenv(client.TestAuthFileEnvKey, outfile) 68 defer os.Unsetenv(client.TestAuthFileEnvKey) 69 70 err := ioutil.WriteFile(outfile, []byte(`{"email":"foo@bar.com","macaroon":"macaroon"}`), 0600) 71 c.Assert(err, check.IsNil) 72 c.Assert(cs.cli.LoggedInUser(), check.DeepEquals, &client.User{ 73 Email: "foo@bar.com", 74 Macaroon: "macaroon", 75 }) 76 77 user, err := cs.cli.Login("username", "pass", "") 78 expected := &client.User{ 79 Email: "zed@bar.com", 80 Username: "the-user-name", 81 Macaroon: "the-root-macaroon", 82 Discharges: []string{"discharge-macaroon"}, 83 } 84 c.Check(err, check.IsNil) 85 c.Check(user, check.DeepEquals, expected) 86 c.Check(cs.req.Header.Get("Authorization"), check.Matches, `Macaroon root="macaroon"`) 87 88 c.Assert(cs.cli.LoggedInUser(), check.DeepEquals, expected) 89 90 c.Check(osutil.FileExists(outfile), check.Equals, true) 91 c.Check(outfile, testutil.FileEquals, `{"username":"the-user-name","email":"zed@bar.com","macaroon":"the-root-macaroon","discharges":["discharge-macaroon"]}`) 92 } 93 94 func (cs *clientSuite) TestClientLoginError(c *check.C) { 95 cs.rsp = `{ 96 "result": {}, 97 "status": "Bad Request", 98 "status-code": 400, 99 "type": "error" 100 }` 101 102 outfile := filepath.Join(c.MkDir(), "json") 103 os.Setenv(client.TestAuthFileEnvKey, outfile) 104 defer os.Unsetenv(client.TestAuthFileEnvKey) 105 106 user, err := cs.cli.Login("username", "pass", "") 107 108 c.Check(user, check.IsNil) 109 c.Check(err, check.NotNil) 110 111 c.Check(osutil.FileExists(outfile), check.Equals, false) 112 } 113 114 func (cs *clientSuite) TestClientLogout(c *check.C) { 115 cs.rsp = `{"type": "sync", "result": {}}` 116 117 outfile := filepath.Join(c.MkDir(), "json") 118 os.Setenv(client.TestAuthFileEnvKey, outfile) 119 defer os.Unsetenv(client.TestAuthFileEnvKey) 120 121 err := ioutil.WriteFile(outfile, []byte(`{"macaroon":"macaroon","discharges":["discharged"]}`), 0600) 122 c.Assert(err, check.IsNil) 123 124 err = cs.cli.Logout() 125 c.Assert(err, check.IsNil) 126 c.Check(cs.req.Method, check.Equals, "POST") 127 c.Check(cs.req.URL.Path, check.Equals, "/v2/logout") 128 129 c.Check(osutil.FileExists(outfile), check.Equals, false) 130 } 131 132 func (cs *clientSuite) TestWriteAuthData(c *check.C) { 133 outfile := filepath.Join(c.MkDir(), "json") 134 os.Setenv(client.TestAuthFileEnvKey, outfile) 135 defer os.Unsetenv(client.TestAuthFileEnvKey) 136 137 authData := client.User{ 138 Macaroon: "macaroon", 139 Discharges: []string{"discharge"}, 140 } 141 err := client.TestWriteAuth(authData) 142 c.Assert(err, check.IsNil) 143 144 c.Check(osutil.FileExists(outfile), check.Equals, true) 145 c.Check(outfile, testutil.FileEquals, `{"macaroon":"macaroon","discharges":["discharge"]}`) 146 } 147 148 func (cs *clientSuite) TestReadAuthData(c *check.C) { 149 outfile := filepath.Join(c.MkDir(), "json") 150 os.Setenv(client.TestAuthFileEnvKey, outfile) 151 defer os.Unsetenv(client.TestAuthFileEnvKey) 152 153 authData := client.User{ 154 Macaroon: "macaroon", 155 Discharges: []string{"discharge"}, 156 } 157 err := client.TestWriteAuth(authData) 158 c.Assert(err, check.IsNil) 159 160 readUser, err := client.TestReadAuth() 161 c.Assert(err, check.IsNil) 162 c.Check(readUser, check.DeepEquals, &authData) 163 }