func (s *snapExecSuite) TestSnapExecHookRealIntegration(c *C) { // we need a lot of mocks dirs.SetRootDir(c.MkDir()) oldOsArgs := os.Args defer func() { os.Args = oldOsArgs }() os.Setenv("SNAP_REVISION", "42") defer os.Unsetenv("SNAP_REVISION") canaryFile := filepath.Join(c.MkDir(), "canary.txt") testSnap := snaptest.MockSnap(c, string(mockHookYaml), &snap.SideInfo{ Revision: snap.R("42"), }) hookPath := filepath.Join("meta", "hooks", "configure") hookPathAndContents := []string{hookPath, fmt.Sprintf(binaryTemplate, canaryFile)} snaptest.PopulateDir(testSnap.MountDir(), [][]string{hookPathAndContents}) hookPath = filepath.Join(testSnap.MountDir(), hookPath) c.Assert(os.Chmod(hookPath, 0755), IsNil) // we can not use the real syscall.execv here because it would // replace the entire test :) syscallExec = actuallyExec // run it os.Args = []string{"snap-exec", "--hook=configure", "snapname"} err := run() c.Assert(err, IsNil) output, err := ioutil.ReadFile(canaryFile) c.Assert(err, IsNil) c.Assert(string(output), Equals, "configure\n\n") }
func (s *infoSuite) checkInstalledSnapAndSnapFile(c *C, yaml string, contents string, hooks []string, checker func(c *C, info *snap.Info)) { // First check installed snap sideInfo := &snap.SideInfo{Revision: snap.R(42)} info0 := snaptest.MockSnap(c, yaml, contents, sideInfo) snaptest.PopulateDir(info0.MountDir(), emptyHooks(hooks...)) info, err := snap.ReadInfo(info0.Name(), sideInfo) c.Check(err, IsNil) checker(c, info) // Now check snap file snapPath := snaptest.MakeTestSnapWithFiles(c, yaml, emptyHooks(hooks...)) snapf, err := snap.Open(snapPath) c.Assert(err, IsNil) info, err = snap.ReadInfoFromSnapFile(snapf, nil) c.Check(err, IsNil) checker(c, info) }