github.com/tompreston/snapd@v0.0.0-20210817193607-954edfcb9611/cmd/snap/cmd_keys_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 main_test 21 22 import ( 23 "encoding/json" 24 "fmt" 25 "io/ioutil" 26 "os" 27 "path/filepath" 28 "testing" 29 30 . "gopkg.in/check.v1" 31 32 snap "github.com/snapcore/snapd/cmd/snap" 33 ) 34 35 type SnapKeysSuite struct { 36 BaseSnapSuite 37 38 GnupgCmd string 39 tempdir string 40 } 41 42 // FIXME: Ideally we would just use gpg2 and remove the gnupg2_test.go file. 43 // However currently there is LP: #1621839 which prevents us from 44 // switching to gpg2 fully. Once this is resolved we should switch. 45 var _ = Suite(&SnapKeysSuite{GnupgCmd: "/usr/bin/gpg"}) 46 47 var fakePinentryData = []byte(`#!/bin/sh 48 set -e 49 echo "OK Pleased to meet you" 50 while true; do 51 read line 52 case $line in 53 BYE) 54 exit 0 55 ;; 56 *) 57 echo "OK I agree to everything" 58 ;; 59 esac 60 done 61 `) 62 63 func (s *SnapKeysSuite) SetUpTest(c *C) { 64 if testing.Short() && s.GnupgCmd == "/usr/bin/gpg2" { 65 c.Skip("gpg2 does not do short tests") 66 } 67 s.BaseSnapSuite.SetUpTest(c) 68 69 s.tempdir = c.MkDir() 70 for _, fileName := range []string{"pubring.gpg", "secring.gpg", "trustdb.gpg"} { 71 data, err := ioutil.ReadFile(filepath.Join("test-data", fileName)) 72 c.Assert(err, IsNil) 73 err = ioutil.WriteFile(filepath.Join(s.tempdir, fileName), data, 0644) 74 c.Assert(err, IsNil) 75 } 76 fakePinentryFn := filepath.Join(s.tempdir, "pinentry-fake") 77 err := ioutil.WriteFile(fakePinentryFn, fakePinentryData, 0755) 78 c.Assert(err, IsNil) 79 gpgAgentConfFn := filepath.Join(s.tempdir, "gpg-agent.conf") 80 err = ioutil.WriteFile(gpgAgentConfFn, []byte(fmt.Sprintf(`pinentry-program %s`, fakePinentryFn)), 0644) 81 c.Assert(err, IsNil) 82 83 os.Setenv("SNAP_GNUPG_HOME", s.tempdir) 84 os.Setenv("SNAP_GNUPG_CMD", s.GnupgCmd) 85 } 86 87 func (s *SnapKeysSuite) TearDownTest(c *C) { 88 os.Unsetenv("SNAP_GNUPG_HOME") 89 os.Unsetenv("SNAP_GNUPG_CMD") 90 s.BaseSnapSuite.TearDownTest(c) 91 } 92 93 func (s *SnapKeysSuite) TestKeys(c *C) { 94 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"keys"}) 95 c.Assert(err, IsNil) 96 c.Assert(rest, DeepEquals, []string{}) 97 c.Check(s.Stdout(), Matches, `Name +SHA3-384 98 default +g4Pks54W_US4pZuxhgG_RHNAf_UeZBBuZyGRLLmMj1Do3GkE_r_5A5BFjx24ZwVJ 99 another +DVQf1U4mIsuzlQqAebjjTPYtYJ-GEhJy0REuj3zvpQYTZ7EJj7adBxIXLJ7Vmk3L 100 `) 101 c.Check(s.Stderr(), Equals, "") 102 } 103 104 func (s *SnapKeysSuite) TestKeysEmptyNoHeader(c *C) { 105 // simulate empty keys 106 err := os.RemoveAll(s.tempdir) 107 c.Assert(err, IsNil) 108 109 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"keys"}) 110 c.Assert(err, IsNil) 111 c.Assert(rest, DeepEquals, []string{}) 112 c.Check(s.Stdout(), Equals, "") 113 c.Check(s.Stderr(), Equals, "No keys registered, see `snapcraft create-key`\n") 114 } 115 116 func (s *SnapKeysSuite) TestKeysJSON(c *C) { 117 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"keys", "--json"}) 118 c.Assert(err, IsNil) 119 c.Assert(rest, DeepEquals, []string{}) 120 expectedResponse := []snap.Key{ 121 { 122 Name: "default", 123 Sha3_384: "g4Pks54W_US4pZuxhgG_RHNAf_UeZBBuZyGRLLmMj1Do3GkE_r_5A5BFjx24ZwVJ", 124 }, 125 { 126 Name: "another", 127 Sha3_384: "DVQf1U4mIsuzlQqAebjjTPYtYJ-GEhJy0REuj3zvpQYTZ7EJj7adBxIXLJ7Vmk3L", 128 }, 129 } 130 var obtainedResponse []snap.Key 131 json.Unmarshal(s.stdout.Bytes(), &obtainedResponse) 132 c.Check(obtainedResponse, DeepEquals, expectedResponse) 133 c.Check(s.Stderr(), Equals, "") 134 } 135 136 func (s *SnapKeysSuite) TestKeysJSONEmpty(c *C) { 137 err := os.RemoveAll(os.Getenv("SNAP_GNUPG_HOME")) 138 c.Assert(err, IsNil) 139 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"keys", "--json"}) 140 c.Assert(err, IsNil) 141 c.Assert(rest, DeepEquals, []string{}) 142 c.Check(s.Stdout(), Equals, "[]\n") 143 c.Check(s.Stderr(), Equals, "") 144 }