summaryrefslogtreecommitdiff
diff options
authorPaweł Stołowski <stolowski@gmail.com>2020-10-20 11:11:07 +0200
committerPaweł Stołowski <stolowski@gmail.com>2020-10-20 11:11:07 +0200
commitd71c75089392a9421ae6a049891a0447c03910cd (patch)
tree07e6bf26fe7518cfe8d0c0c3fe374f65d1868c47
parent8dcb4bf7f7a851e26a2df9f3f07b748309612c0d (diff)
Tests for failing remove.undo-unlink-snap
-rw-r--r--overlord/snapstate/snapstate_remove_test.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/overlord/snapstate/snapstate_remove_test.go b/overlord/snapstate/snapstate_remove_test.go
index d823b086e9..c2010e648a 100644
--- a/overlord/snapstate/snapstate_remove_test.go
+++ b/overlord/snapstate/snapstate_remove_test.go
@@ -20,7 +20,9 @@
package snapstate_test
import (
+ "fmt"
"path/filepath"
+ "strings"
. "gopkg.in/check.v1"
@@ -30,6 +32,7 @@ import (
"github.com/snapcore/snapd/overlord/snapstate"
"github.com/snapcore/snapd/overlord/state"
"github.com/snapcore/snapd/snap"
+ "github.com/snapcore/snapd/snap/snaptest"
"github.com/snapcore/snapd/testutil"
)
@@ -1331,3 +1334,102 @@ func (s *snapmgrTestSuite) TestRemoveManyDiskSpaceCheckPasses(c *C) {
err := s.testRemoveManyDiskSpaceCheck(c, featureFlag, automaticSnapshot, freeSpaceCheckFail)
c.Check(err, IsNil)
}
+
+type failingBackend struct {
+ fakeSnappyBackend
+
+ removeSnapDataErr error
+ removeSnapCommonDataErr error
+ removeSnapDataDirErr error
+}
+
+func (f *failingBackend) RemoveSnapData(info *snap.Info) error {
+ return f.removeSnapDataErr
+}
+
+func (f *failingBackend) RemoveSnapCommonData(info *snap.Info) error {
+ return f.removeSnapCommonDataErr
+}
+
+func (f *failingBackend) RemoveSnapDataDir(info *snap.Info, otherInstances bool) error {
+ return f.removeSnapDataDirErr
+}
+
+func (s *snapmgrTestSuite) TestClearSnapDataIgnoresErrors(c *C) {
+ b := &failingBackend{}
+ snapstate.SetSnapManagerBackend(s.snapmgr, b)
+
+ snapsup := snapstate.SnapSetup{
+ SideInfo: &snap.SideInfo{
+ RealName: "some-snap",
+ Revision: snap.R(1),
+ },
+ }
+
+ st := s.state
+ st.Lock()
+ defer st.Unlock()
+
+ snapstate.Set(s.state, "some-snap", &snapstate.SnapState{
+ Active: true,
+ Sequence: []*snap.SideInfo{
+ {RealName: "some-snap", Revision: snap.R(1)},
+ },
+ Current: snap.R(1),
+ SnapType: "app",
+ })
+
+ snapYaml := `
+name: foo
+`
+ snaptest.MockSnap(c, snapYaml, &snap.SideInfo{
+ RealName: "some-snap",
+ Revision: snap.R(1),
+ })
+
+ for _, tc := range []struct {
+ removeSnapDataErr string
+ removeSnapCommonDataErr string
+ removeSnapDataDirErr string
+ expectedMessage string
+ }{
+ {
+ removeSnapDataErr: "boom1",
+ expectedMessage: "Cannot remove snap data: boom1",
+ },
+ {
+ removeSnapCommonDataErr: "boom2",
+ expectedMessage: "Cannot remove common snap data: boom2",
+ },
+ {
+ removeSnapDataDirErr: "boom3",
+ expectedMessage: "Cannot remove common snap data directory: boom3",
+ },
+ } {
+ chg := st.NewChange("remove", "remove a snap")
+ t := st.NewTask("clear-snap", "")
+ t.Set("snap-setup", snapsup)
+ chg.AddTask(t)
+
+ b.removeSnapDataErr = nil
+ b.removeSnapCommonDataErr = nil
+ b.removeSnapDataDirErr = nil
+
+ if tc.removeSnapDataErr != "" {
+ b.removeSnapDataErr = fmt.Errorf(tc.removeSnapDataErr)
+ }
+ if tc.removeSnapCommonDataErr != "" {
+ b.removeSnapCommonDataErr = fmt.Errorf(tc.removeSnapCommonDataErr)
+ }
+ if tc.removeSnapDataDirErr != "" {
+ b.removeSnapDataDirErr = fmt.Errorf(tc.removeSnapDataDirErr)
+ }
+
+ st.Unlock()
+ s.settle(c)
+ st.Lock()
+
+ c.Check(chg.Status(), Equals, state.DoneStatus)
+ c.Check(strings.Join(t.Log(), ""), testutil.Contains, tc.expectedMessage)
+ }
+}