github.com/rigado/snapd@v2.42.5-go-mod+incompatible/wrappers/core18_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2018 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 wrappers_test 21 22 import ( 23 "fmt" 24 "io/ioutil" 25 "os" 26 "path/filepath" 27 28 . "gopkg.in/check.v1" 29 30 "github.com/snapcore/snapd/dirs" 31 "github.com/snapcore/snapd/osutil" 32 "github.com/snapcore/snapd/release" 33 "github.com/snapcore/snapd/snap" 34 "github.com/snapcore/snapd/snap/snaptest" 35 "github.com/snapcore/snapd/systemd" 36 "github.com/snapcore/snapd/wrappers" 37 ) 38 39 func makeMockSnapdSnap(c *C) *snap.Info { 40 err := os.MkdirAll(dirs.SnapServicesDir, 0755) 41 c.Assert(err, IsNil) 42 err = os.MkdirAll(dirs.SnapUserServicesDir, 0755) 43 c.Assert(err, IsNil) 44 45 info := snaptest.MockSnap(c, snapdYaml, &snap.SideInfo{Revision: snap.R(1)}) 46 snapdDir := filepath.Join(info.MountDir(), "lib", "systemd", "system") 47 err = os.MkdirAll(snapdDir, 0755) 48 c.Assert(err, IsNil) 49 snapdSrv := filepath.Join(snapdDir, "snapd.service") 50 err = ioutil.WriteFile(snapdSrv, []byte("[Unit]\nExecStart=/usr/lib/snapd/snapd\n# X-Snapd-Snap: do-not-start"), 0644) 51 c.Assert(err, IsNil) 52 snapdShutdown := filepath.Join(snapdDir, "snapd.system-shutdown.service") 53 err = ioutil.WriteFile(snapdShutdown, []byte("[Unit]\nExecStart=/bin/umount --everything\n# X-Snapd-Snap: do-not-start"), 0644) 54 c.Assert(err, IsNil) 55 snapdAutoimport := filepath.Join(snapdDir, "snapd.autoimport.service") 56 err = ioutil.WriteFile(snapdAutoimport, []byte("[Unit]\nExecStart=/usr/bin/snap auto-import"), 0644) 57 c.Assert(err, IsNil) 58 59 userUnitDir := filepath.Join(info.MountDir(), "usr", "lib", "systemd", "user") 60 err = os.MkdirAll(userUnitDir, 0755) 61 c.Assert(err, IsNil) 62 agentSrv := filepath.Join(userUnitDir, "snapd.session-agent.service") 63 err = ioutil.WriteFile(agentSrv, []byte("[Unit]\nExecStart=/usr/bin/snap session-agent"), 0644) 64 c.Assert(err, IsNil) 65 agentSock := filepath.Join(userUnitDir, "snapd.session-agent.socket") 66 err = ioutil.WriteFile(agentSock, []byte("[Unit]\n[Socket]\nListenStream=%t/snap-session.socket"), 0644) 67 c.Assert(err, IsNil) 68 69 return info 70 } 71 72 func (s *servicesTestSuite) TestAddSnapServicesForSnapdOnCore(c *C) { 73 restore := release.MockOnClassic(false) 74 defer restore() 75 76 restore = release.MockReleaseInfo(&release.OS{ID: "ubuntu"}) 77 defer restore() 78 79 // reset root dir 80 dirs.SetRootDir(s.tempdir) 81 82 systemctlRestorer := systemd.MockSystemctl(func(cmd ...string) ([]byte, error) { 83 s.sysdLog = append(s.sysdLog, cmd) 84 if cmd[0] == "show" && cmd[1] == "--property=Id,ActiveState,UnitFileState,Type" { 85 s := fmt.Sprintf("Type=oneshot\nId=%s\nActiveState=inactive\nUnitFileState=enabled\n", cmd[2]) 86 return []byte(s), nil 87 } 88 return []byte("ActiveState=inactive\n"), nil 89 }) 90 defer systemctlRestorer() 91 92 info := makeMockSnapdSnap(c) 93 // add the snapd service 94 err := wrappers.AddSnapServices(info, nil) 95 c.Assert(err, IsNil) 96 97 // check that snapd.service is created 98 content, err := ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "snapd.service")) 99 c.Assert(err, IsNil) 100 // and paths get re-written 101 c.Check(string(content), Equals, fmt.Sprintf("[Unit]\nExecStart=%s/snapd/1/usr/lib/snapd/snapd\n# X-Snapd-Snap: do-not-start", dirs.SnapMountDir)) 102 103 // check that snapd.autoimport.service is created 104 content, err = ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "snapd.autoimport.service")) 105 c.Assert(err, IsNil) 106 // and paths get re-written 107 c.Check(string(content), Equals, fmt.Sprintf("[Unit]\nExecStart=%s/snapd/1/usr/bin/snap auto-import", dirs.SnapMountDir)) 108 109 // check that snapd.system-shutdown.service is created 110 content, err = ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "snapd.system-shutdown.service")) 111 c.Assert(err, IsNil) 112 // and paths *do not* get re-written 113 c.Check(string(content), Equals, "[Unit]\nExecStart=/bin/umount --everything\n# X-Snapd-Snap: do-not-start") 114 115 // check that usr-lib-snapd.mount is created 116 content, err = ioutil.ReadFile(filepath.Join(dirs.SnapServicesDir, "usr-lib-snapd.mount")) 117 c.Assert(err, IsNil) 118 c.Check(string(content), Equals, fmt.Sprintf(`[Unit] 119 Description=Make the snapd snap tooling available for the system 120 Before=snapd.service 121 122 [Mount] 123 What=%s/snap/snapd/1/usr/lib/snapd 124 Where=/usr/lib/snapd 125 Type=none 126 Options=bind 127 128 [Install] 129 WantedBy=snapd.service 130 `, dirs.GlobalRootDir)) 131 132 // check that snapd.session-agent.service is created 133 content, err = ioutil.ReadFile(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.service")) 134 c.Assert(err, IsNil) 135 // and paths get re-written 136 c.Check(string(content), Equals, fmt.Sprintf("[Unit]\nExecStart=%s/snapd/1/usr/bin/snap session-agent", dirs.SnapMountDir)) 137 138 // check that snapd.session-agent.socket is created 139 content, err = ioutil.ReadFile(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.socket")) 140 c.Assert(err, IsNil) 141 // and paths get re-written 142 c.Check(string(content), Equals, "[Unit]\n[Socket]\nListenStream=%t/snap-session.socket") 143 144 // check the systemctl calls 145 c.Check(s.sysdLog, DeepEquals, [][]string{ 146 {"daemon-reload"}, 147 {"--root", dirs.GlobalRootDir, "enable", "usr-lib-snapd.mount"}, 148 {"stop", "usr-lib-snapd.mount"}, 149 {"show", "--property=ActiveState", "usr-lib-snapd.mount"}, 150 {"start", "usr-lib-snapd.mount"}, 151 {"daemon-reload"}, 152 {"--root", dirs.GlobalRootDir, "enable", "snapd.autoimport.service"}, 153 {"--root", dirs.GlobalRootDir, "enable", "snapd.service"}, 154 {"--root", dirs.GlobalRootDir, "enable", "snapd.system-shutdown.service"}, 155 {"--root", dirs.GlobalRootDir, "is-active", "snapd.autoimport.service"}, 156 {"stop", "snapd.autoimport.service"}, 157 {"show", "--property=ActiveState", "snapd.autoimport.service"}, 158 {"start", "snapd.autoimport.service"}, 159 {"start", "snapd.service"}, 160 {"start", "--no-block", "snapd.seeded.service"}, 161 {"start", "--no-block", "snapd.autoimport.service"}, 162 {"--user", "--global", "--root", dirs.GlobalRootDir, "enable", "snapd.session-agent.service"}, 163 {"--user", "--global", "--root", dirs.GlobalRootDir, "enable", "snapd.session-agent.socket"}, 164 }) 165 } 166 167 func (s *servicesTestSuite) TestAddSnapServicesForSnapdOnClassic(c *C) { 168 restore := release.MockOnClassic(true) 169 defer restore() 170 171 info := makeMockSnapdSnap(c) 172 // add the snapd service 173 err := wrappers.AddSnapServices(info, nil) 174 c.Assert(err, IsNil) 175 176 // check that snapd services were *not* created 177 c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "snapd.service")), Equals, false) 178 c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "snapd.autoimport.service")), Equals, false) 179 c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "snapd.system-shutdown.service")), Equals, false) 180 c.Check(osutil.FileExists(filepath.Join(dirs.SnapServicesDir, "usr-lib-snapd.mount")), Equals, false) 181 c.Check(osutil.FileExists(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.service")), Equals, false) 182 c.Check(osutil.FileExists(filepath.Join(dirs.SnapUserServicesDir, "snapd.session-agent.socket")), Equals, false) 183 184 // check that no systemctl calls happened 185 c.Check(s.sysdLog, IsNil) 186 }