func (s *SnapTestSuite) TestAddPackageServicesStripsGlobalRootdir(c *C) { // ensure that even with a global rootdir the paths in the generated // .services file are setup correctly (i.e. that the global root // is stripped) c.Assert(dirs.GlobalRootDir, Not(Equals), "/") yamlFile, err := makeInstalledMockSnap("", 12) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) err = addPackageServices(snap.Info(), nil) c.Assert(err, IsNil) content, err := ioutil.ReadFile(filepath.Join(s.tempdir, "/etc/systemd/system/snap.hello-snap.svc1.service")) c.Assert(err, IsNil) baseDirWithoutRootPrefix := "/snap/" + helloSnapComposedName + "/12" verbs := []string{"Start", "Stop", "StopPost"} bins := []string{"hello", "goodbye", "missya"} for i := range verbs { expected := fmt.Sprintf("Exec%s=/usr/bin/ubuntu-core-launcher snap.hello-snap.svc1 snap.hello-snap.svc1 %s/bin/%s", verbs[i], baseDirWithoutRootPrefix, bins[i]) c.Check(string(content), Matches, "(?ms).*^"+regexp.QuoteMeta(expected)) // check.v1 adds ^ and $ around the regexp provided } }
func (s *SnapTestSuite) TestDesktopFileIsAddedAndRemoved(c *C) { yamlFile, err := makeInstalledMockSnap(string(desktopAppYaml), 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) // create a mock desktop file err = os.MkdirAll(filepath.Join(filepath.Dir(yamlFile), "gui"), 0755) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(filepath.Dir(yamlFile), "gui", "foobar.desktop"), []byte(mockDesktopFile), 0644) c.Assert(err, IsNil) // ensure that activate creates the desktop file err = ActivateSnap(snap, nil) c.Assert(err, IsNil) mockDesktopFilePath := filepath.Join(dirs.SnapDesktopFilesDir, "foo_foobar.desktop") content, err := ioutil.ReadFile(mockDesktopFilePath) c.Assert(err, IsNil) c.Assert(string(content), Equals, ` [Desktop Entry] Name=foo Icon=/snap/foo/11/foo.png`) // unlink (deactivate) removes it again err = UnlinkSnap(snap.Info(), nil) c.Assert(err, IsNil) c.Assert(osutil.FileExists(mockDesktopFilePath), Equals, false) }
func (s *SnapTestSuite) TestRemovePackageServiceKills(c *C) { c.Skip("needs porting to new squashfs based snap activation!") // make Stop not work var sysdLog [][]string systemd.SystemctlCmd = func(cmd ...string) ([]byte, error) { sysdLog = append(sysdLog, cmd) return []byte("ActiveState=active\n"), nil } yamlFile, err := makeInstalledMockSnap(`name: wat version: 42 apps: wat: command: wat stop-timeout: 25 daemon: forking `, 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) inter := &MockProgressMeter{} c.Check(removePackageServices(snap.Info(), inter), IsNil) c.Assert(len(inter.notified) > 0, Equals, true) c.Check(inter.notified[len(inter.notified)-1], Equals, "wat_wat_42.service refused to stop, killing.") c.Assert(len(sysdLog) >= 3, Equals, true) sd1 := sysdLog[len(sysdLog)-3] sd2 := sysdLog[len(sysdLog)-2] c.Check(sd1, DeepEquals, []string{"kill", "wat_wat_42.service", "-s", "TERM"}) c.Check(sd2, DeepEquals, []string{"kill", "wat_wat_42.service", "-s", "KILL"}) }
func activeSnapIterByTypeImpl(f func(*snap.Info) string, snapTs ...snap.Type) ([]string, error) { installed, err := ActiveSnapsByType(snapTs...) res := make([]string, len(installed)) for i, snap := range installed { res[i] = f(snap.Info()) } return res, err }
func (s *SnapTestSuite) TestLocalSnapSimple(c *C) { snapYaml, err := makeInstalledMockSnap("", 15) c.Assert(err, IsNil) snap, err := NewInstalledSnap(snapYaml) c.Assert(err, IsNil) c.Assert(snap, NotNil) c.Check(snap.Name(), Equals, "hello-snap") c.Check(snap.Version(), Equals, "1.10") c.Check(snap.IsActive(), Equals, false) c.Check(snap.Info().Summary(), Equals, "hello in summary") c.Check(snap.Info().Description(), Equals, "Hello...") c.Check(snap.Info().Revision, Equals, 15) mountDir := snap.Info().MountDir() _, err = os.Stat(mountDir) c.Assert(err, IsNil) c.Assert(mountDir, Equals, filepath.Join(dirs.SnapSnapsDir, helloSnapComposedName, "15")) }
func (s *SnapTestSuite) TestAddPackageDesktopFiles(c *C) { expectedDesktopFilePath := filepath.Join(dirs.SnapDesktopFilesDir, "foo_foobar.desktop") c.Assert(osutil.FileExists(expectedDesktopFilePath), Equals, false) yamlFile, err := makeInstalledMockSnap(desktopAppYaml, 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) // generate .desktop file in the package baseDir baseDir := snap.Info().MountDir() err = os.MkdirAll(filepath.Join(baseDir, "meta", "gui"), 0755) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(baseDir, "meta", "gui", "foobar.desktop"), mockDesktopFile, 0644) c.Assert(err, IsNil) err = addPackageDesktopFiles(snap.Info()) c.Assert(err, IsNil) c.Assert(osutil.FileExists(expectedDesktopFilePath), Equals, true) }
func (s *SnapTestSuite) TestServicesWithPorts(c *C) { const packageHello = `name: hello-snap version: 1.10 apps: hello: command: bin/hello svc1: command: svc1 type: forking description: "Service #1" ports: external: ui: port: 8080/tcp nothing: port: 8081/tcp negotiable: yes svc2: command: svc2 type: forking description: "Service #2" ` yamlFile, err := makeInstalledMockSnap(packageHello, 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) c.Assert(snap, NotNil) c.Assert(snap.Name(), Equals, "hello-snap") c.Assert(snap.Developer(), Equals, testDeveloper) c.Assert(snap.Version(), Equals, "1.10") c.Assert(snap.IsActive(), Equals, false) apps := snap.Info().Apps c.Assert(apps, HasLen, 3) c.Assert(apps["svc1"].Name, Equals, "svc1") c.Assert(apps["svc2"].Name, Equals, "svc2") }
func (s *SnapTestSuite) TestPackageNameInstalled(c *C) { c.Check(PackageNameActive("hello-snap"), Equals, false) yamlFile, err := makeInstalledMockSnap("", 11) c.Assert(err, IsNil) pkgdir := filepath.Dir(filepath.Dir(yamlFile)) c.Assert(os.MkdirAll(filepath.Join(pkgdir, ".click", "info"), 0755), IsNil) c.Assert(ioutil.WriteFile(filepath.Join(pkgdir, ".click", "info", "hello-snap.manifest"), []byte(`{"name": "hello-snap"}`), 0644), IsNil) ag := &progress.NullProgress{} snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) c.Assert(ActivateSnap(snap, ag), IsNil) c.Check(PackageNameActive("hello-snap"), Equals, true) c.Assert(UnlinkSnap(snap.Info(), ag), IsNil) c.Check(PackageNameActive("hello-snap"), Equals, false) }
func (s *SnapTestSuite) TestAddPackageBinariesStripsGlobalRootdir(c *C) { // ensure that even with a global rootdir the paths in the generated // .services file are setup correctly (i.e. that the global root // is stripped) c.Assert(dirs.GlobalRootDir, Not(Equals), "/") yamlFile, err := makeInstalledMockSnap("", 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) err = addPackageBinaries(snap.Info()) c.Assert(err, IsNil) content, err := ioutil.ReadFile(filepath.Join(s.tempdir, "/snap/bin/hello-snap.hello")) c.Assert(err, IsNil) needle := ` ubuntu-core-launcher snap.hello-snap.hello snap.hello-snap.hello /snap/hello-snap/11/bin/hello "$@" ` c.Assert(string(content), Matches, "(?ms).*"+regexp.QuoteMeta(needle)+".*") }