github.com/rigado/snapd@v2.42.5-go-mod+incompatible/snap/snaptest/snaptest_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 snaptest_test 21 22 import ( 23 "os" 24 "path/filepath" 25 "testing" 26 27 . "gopkg.in/check.v1" 28 29 "github.com/snapcore/snapd/dirs" 30 "github.com/snapcore/snapd/snap" 31 "github.com/snapcore/snapd/snap/snaptest" 32 "github.com/snapcore/snapd/testutil" 33 ) 34 35 func TestSnapTest(t *testing.T) { TestingT(t) } 36 37 const sampleYaml = ` 38 name: sample 39 version: 1 40 apps: 41 app: 42 command: foo 43 plugs: 44 network: 45 interface: network 46 ` 47 48 type snapTestSuite struct{} 49 50 var _ = Suite(&snapTestSuite{}) 51 52 func (s *snapTestSuite) SetUpTest(c *C) { 53 dirs.SetRootDir(c.MkDir()) 54 } 55 56 func (s *snapTestSuite) TearDownTest(c *C) { 57 dirs.SetRootDir("") 58 } 59 60 func (s *snapTestSuite) TestMockSnap(c *C) { 61 snapInfo := snaptest.MockSnap(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}) 62 // Data from YAML is used 63 c.Check(snapInfo.InstanceName(), Equals, "sample") 64 // Data from SideInfo is used 65 c.Check(snapInfo.Revision, Equals, snap.R(42)) 66 // The YAML is placed on disk 67 c.Check(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml"), 68 testutil.FileEquals, sampleYaml) 69 70 // More 71 c.Check(snapInfo.Apps["app"].Command, Equals, "foo") 72 c.Check(snapInfo.Plugs["network"].Interface, Equals, "network") 73 } 74 75 func (s *snapTestSuite) TestMockSnapInstance(c *C) { 76 snapInfo := snaptest.MockSnapInstance(c, "sample_instance", sampleYaml, &snap.SideInfo{Revision: snap.R(42)}) 77 // Data from YAML and parameters is used 78 c.Check(snapInfo.InstanceName(), Equals, "sample_instance") 79 c.Check(snapInfo.SnapName(), Equals, "sample") 80 c.Check(snapInfo.InstanceKey, Equals, "instance") 81 82 // Data from SideInfo is used 83 c.Check(snapInfo.Revision, Equals, snap.R(42)) 84 // The YAML is placed on disk 85 c.Check(filepath.Join(dirs.SnapMountDir, "sample_instance", "42", "meta", "snap.yaml"), 86 testutil.FileEquals, sampleYaml) 87 88 // More 89 c.Check(snapInfo.Apps["app"].Command, Equals, "foo") 90 c.Check(snapInfo.Plugs["network"].Interface, Equals, "network") 91 } 92 93 func (s *snapTestSuite) TestMockSnapCurrent(c *C) { 94 snapInfo := snaptest.MockSnapCurrent(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}) 95 // Data from YAML is used 96 c.Check(snapInfo.InstanceName(), Equals, "sample") 97 // Data from SideInfo is used 98 c.Check(snapInfo.Revision, Equals, snap.R(42)) 99 // The YAML is placed on disk 100 c.Check(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml"), 101 testutil.FileEquals, sampleYaml) 102 link, err := os.Readlink(filepath.Join(dirs.SnapMountDir, "sample", "current")) 103 c.Check(err, IsNil) 104 c.Check(link, Equals, "42") 105 } 106 107 func (s *snapTestSuite) TestMockSnapInstanceCurrent(c *C) { 108 snapInfo := snaptest.MockSnapInstanceCurrent(c, "sample_instance", sampleYaml, &snap.SideInfo{Revision: snap.R(42)}) 109 // Data from YAML and parameters is used 110 c.Check(snapInfo.InstanceName(), Equals, "sample_instance") 111 c.Check(snapInfo.SnapName(), Equals, "sample") 112 c.Check(snapInfo.InstanceKey, Equals, "instance") 113 // Data from SideInfo is used 114 c.Check(snapInfo.Revision, Equals, snap.R(42)) 115 // The YAML is placed on disk 116 c.Check(filepath.Join(dirs.SnapMountDir, "sample_instance", "42", "meta", "snap.yaml"), 117 testutil.FileEquals, sampleYaml) 118 link, err := os.Readlink(filepath.Join(dirs.SnapMountDir, "sample_instance", "current")) 119 c.Check(err, IsNil) 120 c.Check(link, Equals, filepath.Join(dirs.SnapMountDir, "sample_instance", "42")) 121 } 122 123 func (s *snapTestSuite) TestMockInfo(c *C) { 124 snapInfo := snaptest.MockInfo(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}) 125 // Data from YAML is used 126 c.Check(snapInfo.InstanceName(), Equals, "sample") 127 // Data from SideInfo is used 128 c.Check(snapInfo.Revision, Equals, snap.R(42)) 129 // The YAML is *not* placed on disk 130 _, err := os.Stat(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml")) 131 c.Assert(os.IsNotExist(err), Equals, true) 132 // More 133 c.Check(snapInfo.Apps["app"].Command, Equals, "foo") 134 c.Check(snapInfo.Plugs["network"].Interface, Equals, "network") 135 } 136 137 func (s *snapTestSuite) TestMockInvalidInfo(c *C) { 138 snapInfo := snaptest.MockInvalidInfo(c, sampleYaml+"\nslots:\n network:\n", &snap.SideInfo{Revision: snap.R(42)}) 139 // Data from YAML is used 140 c.Check(snapInfo.InstanceName(), Equals, "sample") 141 // Data from SideInfo is used 142 c.Check(snapInfo.Revision, Equals, snap.R(42)) 143 // The YAML is *not* placed on disk 144 _, err := os.Stat(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml")) 145 c.Assert(os.IsNotExist(err), Equals, true) 146 // More 147 c.Check(snapInfo.Apps["app"].Command, Equals, "foo") 148 c.Check(snapInfo.Plugs["network"].Interface, Equals, "network") 149 c.Check(snapInfo.Slots["network"].Interface, Equals, "network") 150 // They info object is not valid 151 c.Check(snap.Validate(snapInfo), ErrorMatches, `cannot have plug and slot with the same name: "network"`) 152 } 153 154 func (s *snapTestSuite) TestRenameSlot(c *C) { 155 snapInfo := snaptest.MockInfo(c, `name: core 156 version: 0 157 slots: 158 old: 159 interface: interface 160 slot: 161 interface: interface 162 plugs: 163 plug: 164 interface: interface 165 apps: 166 app: 167 hooks: 168 configure: 169 `, nil) 170 171 // Rename "old" to "plug" 172 err := snaptest.RenameSlot(snapInfo, "old", "plug") 173 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "plug": existing plug with that name`) 174 175 // Rename "old" to "slot" 176 err = snaptest.RenameSlot(snapInfo, "old", "slot") 177 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "slot": existing slot with that name`) 178 179 // Rename "old" to "bad name" 180 err = snaptest.RenameSlot(snapInfo, "old", "bad name") 181 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "bad name": invalid slot name: "bad name"`) 182 183 // Rename "old" to "new" 184 err = snaptest.RenameSlot(snapInfo, "old", "new") 185 c.Assert(err, IsNil) 186 187 // Check that there's no trace of the old slot name. 188 c.Assert(snapInfo.Slots["old"], IsNil) 189 c.Assert(snapInfo.Slots["new"], NotNil) 190 c.Assert(snapInfo.Slots["new"].Name, Equals, "new") 191 c.Assert(snapInfo.Apps["app"].Slots["old"], IsNil) 192 c.Assert(snapInfo.Apps["app"].Slots["new"], DeepEquals, snapInfo.Slots["new"]) 193 c.Assert(snapInfo.Hooks["configure"].Slots["old"], IsNil) 194 c.Assert(snapInfo.Hooks["configure"].Slots["new"], DeepEquals, snapInfo.Slots["new"]) 195 196 // Rename "old" to "new" (again) 197 err = snaptest.RenameSlot(snapInfo, "old", "new") 198 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "new": no such slot`) 199 200 } 201 202 func (s *snapTestSuite) TestMockSnapWithFiles(c *C) { 203 snapInfo := snaptest.MockSnapWithFiles(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}, [][]string{ 204 {"foo/bar", "bar"}, 205 {"bar", "not foo"}, 206 {"meta/gadget.yaml", "gadget yaml\nmulti line"}, 207 }) 208 // Data from YAML is used 209 c.Check(snapInfo.InstanceName(), Equals, "sample") 210 // Data from SideInfo is used 211 c.Check(snapInfo.Revision, Equals, snap.R(42)) 212 c.Check(filepath.Join(snapInfo.MountDir(), "bar"), testutil.FileEquals, "not foo") 213 c.Check(filepath.Join(snapInfo.MountDir(), "foo/bar"), testutil.FileEquals, "bar") 214 c.Check(filepath.Join(snapInfo.MountDir(), "meta/gadget.yaml"), testutil.FileEquals, "gadget yaml\nmulti line") 215 }