github.com/bugraaydogar/snapd@v0.0.0-20210315170335-8c70bb858939/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 type: os 157 version: 0 158 slots: 159 old: 160 interface: interface 161 slot: 162 interface: interface 163 plugs: 164 plug: 165 interface: interface 166 apps: 167 app: 168 hooks: 169 configure: 170 `, nil) 171 172 // Rename "old" to "plug" 173 err := snaptest.RenameSlot(snapInfo, "old", "plug") 174 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "plug": existing plug with that name`) 175 176 // Rename "old" to "slot" 177 err = snaptest.RenameSlot(snapInfo, "old", "slot") 178 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "slot": existing slot with that name`) 179 180 // Rename "old" to "bad name" 181 err = snaptest.RenameSlot(snapInfo, "old", "bad name") 182 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "bad name": invalid slot name: "bad name"`) 183 184 // Rename "old" to "new" 185 err = snaptest.RenameSlot(snapInfo, "old", "new") 186 c.Assert(err, IsNil) 187 188 // Check that there's no trace of the old slot name. 189 c.Assert(snapInfo.Slots["old"], IsNil) 190 c.Assert(snapInfo.Slots["new"], NotNil) 191 c.Assert(snapInfo.Slots["new"].Name, Equals, "new") 192 c.Assert(snapInfo.Apps["app"].Slots["old"], IsNil) 193 c.Assert(snapInfo.Apps["app"].Slots["new"], DeepEquals, snapInfo.Slots["new"]) 194 c.Assert(snapInfo.Hooks["configure"].Slots["old"], IsNil) 195 c.Assert(snapInfo.Hooks["configure"].Slots["new"], DeepEquals, snapInfo.Slots["new"]) 196 197 // Rename "old" to "new" (again) 198 err = snaptest.RenameSlot(snapInfo, "old", "new") 199 c.Assert(err, ErrorMatches, `cannot rename slot "old" to "new": no such slot`) 200 201 } 202 203 func (s *snapTestSuite) TestMockSnapWithFiles(c *C) { 204 snapInfo := snaptest.MockSnapWithFiles(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}, [][]string{ 205 {"foo/bar", "bar"}, 206 {"bar", "not foo"}, 207 {"meta/gadget.yaml", "gadget yaml\nmulti line"}, 208 }) 209 // Data from YAML is used 210 c.Check(snapInfo.InstanceName(), Equals, "sample") 211 // Data from SideInfo is used 212 c.Check(snapInfo.Revision, Equals, snap.R(42)) 213 c.Check(filepath.Join(snapInfo.MountDir(), "bar"), testutil.FileEquals, "not foo") 214 c.Check(filepath.Join(snapInfo.MountDir(), "foo/bar"), testutil.FileEquals, "bar") 215 c.Check(filepath.Join(snapInfo.MountDir(), "meta/gadget.yaml"), testutil.FileEquals, "gadget yaml\nmulti line") 216 } 217 218 func (s *snapTestSuite) TestMockContainerMinimal(c *C) { 219 cont := snaptest.MockContainer(c, nil) 220 err := snap.ValidateContainer(cont, &snap.Info{}, nil) 221 c.Check(err, IsNil) 222 } 223 224 func (s *snapTestSuite) TestMockContainer(c *C) { 225 defer snap.MockSanitizePlugsSlots(func(snapInfo *snap.Info) {})() 226 227 const snapYaml = `name: gadget 228 type: gadget 229 version: 1.0` 230 const gadgetYaml = `defaults: 231 ` 232 cont := snaptest.MockContainer(c, [][]string{ 233 {"meta/snap.yaml", snapYaml}, 234 {"meta/gadget.yaml", gadgetYaml}, 235 }) 236 237 info, err := snap.ReadInfoFromSnapFile(cont, nil) 238 c.Assert(err, IsNil) 239 c.Check(info.SnapName(), Equals, "gadget") 240 err = snap.ValidateContainer(cont, info, nil) 241 c.Assert(err, IsNil) 242 readGadgetYaml, err := cont.ReadFile("meta/gadget.yaml") 243 c.Assert(err, IsNil) 244 c.Check(readGadgetYaml, DeepEquals, []byte(gadgetYaml)) 245 }