github.com/rigado/snapd@v2.42.5-go-mod+incompatible/overlord/snapstate/devicectx_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2018-2019 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 snapstate_test 21 22 import ( 23 . "gopkg.in/check.v1" 24 25 "github.com/snapcore/snapd/overlord/snapstate" 26 "github.com/snapcore/snapd/overlord/snapstate/snapstatetest" 27 "github.com/snapcore/snapd/overlord/state" 28 ) 29 30 type deviceCtxSuite struct { 31 st *state.State 32 } 33 34 var _ = Suite(&deviceCtxSuite{}) 35 36 func (s *deviceCtxSuite) SetUpTest(c *C) { 37 s.st = state.New(nil) 38 } 39 40 func (s *deviceCtxSuite) TestDevicePastSeedingTooEarly(c *C) { 41 s.st.Lock() 42 defer s.st.Unlock() 43 44 r := snapstatetest.MockDeviceModel(nil) 45 defer r() 46 47 expectedErr := &snapstate.ChangeConflictError{ 48 Message: "too early for operation, device not yet seeded or" + 49 " device model not acknowledged", 50 ChangeKind: "seed", 51 } 52 53 // not seeded, no model assertion 54 _, err := snapstate.DevicePastSeeding(s.st, nil) 55 c.Assert(err, DeepEquals, expectedErr) 56 57 // seeded, no model assertion 58 s.st.Set("seeded", true) 59 _, err = snapstate.DevicePastSeeding(s.st, nil) 60 c.Assert(err, DeepEquals, expectedErr) 61 } 62 63 func (s *deviceCtxSuite) TestDevicePastSeedingProvided(c *C) { 64 s.st.Lock() 65 defer s.st.Unlock() 66 67 r := snapstatetest.MockDeviceContext(nil) 68 defer r() 69 70 expectedErr := &snapstate.ChangeConflictError{ 71 Message: "too early for operation, device not yet seeded or" + 72 " device model not acknowledged", 73 ChangeKind: "seed", 74 } 75 76 deviceCtx1 := &snapstatetest.TrivialDeviceContext{DeviceModel: MakeModel(nil)} 77 78 // not seeded 79 _, err := snapstate.DevicePastSeeding(s.st, deviceCtx1) 80 c.Assert(err, DeepEquals, expectedErr) 81 82 // seeded 83 s.st.Set("seeded", true) 84 deviceCtx, err := snapstate.DevicePastSeeding(s.st, deviceCtx1) 85 c.Assert(err, IsNil) 86 c.Assert(deviceCtx, Equals, deviceCtx1) 87 88 // remodeling is also ok 89 deviceCtx2 := &snapstatetest.TrivialDeviceContext{DeviceModel: MakeModel(nil), Remodeling: true} 90 defer snapstatetest.ReplaceRemodelingHook(func(*state.State) bool { 91 return true 92 })() 93 deviceCtx, err = snapstate.DevicePastSeeding(s.st, deviceCtx2) 94 c.Assert(err, IsNil) 95 c.Assert(deviceCtx, Equals, deviceCtx2) 96 97 expectedErr = &snapstate.ChangeConflictError{ 98 Message: "remodeling in progress, no other " + 99 "changes allowed until this is done", 100 ChangeKind: "remodel", 101 } 102 103 // should not happen in practice but correct 104 deviceCtx, err = snapstate.DevicePastSeeding(s.st, deviceCtx1) 105 c.Assert(err, DeepEquals, expectedErr) 106 c.Check(deviceCtx, IsNil) 107 } 108 109 func (s *deviceCtxSuite) TestDevicePastSeedingReady(c *C) { 110 s.st.Lock() 111 defer s.st.Unlock() 112 113 // seeded and model assertion 114 s.st.Set("seeded", true) 115 116 r := snapstatetest.MockDeviceModel(DefaultModel()) 117 defer r() 118 119 deviceCtx, err := snapstate.DevicePastSeeding(s.st, nil) 120 c.Assert(err, IsNil) 121 c.Check(deviceCtx.Model().Model(), Equals, "baz-3000") 122 } 123 124 func (s *deviceCtxSuite) TestDevicePastSeedingButRemodeling(c *C) { 125 s.st.Lock() 126 defer s.st.Unlock() 127 128 // seeded and model assertion 129 s.st.Set("seeded", true) 130 131 r := snapstatetest.MockDeviceModel(DefaultModel()) 132 defer r() 133 defer snapstatetest.ReplaceRemodelingHook(func(*state.State) bool { 134 return true 135 })() 136 137 expectedErr := &snapstate.ChangeConflictError{ 138 Message: "remodeling in progress, no other " + 139 "changes allowed until this is done", 140 ChangeKind: "remodel", 141 } 142 143 _, err := snapstate.DevicePastSeeding(s.st, nil) 144 c.Assert(err, DeepEquals, expectedErr) 145 } 146 147 func (s *deviceCtxSuite) TestDeviceCtxFromStateReady(c *C) { 148 s.st.Lock() 149 defer s.st.Unlock() 150 151 // model assertion but not seeded yet 152 r := snapstatetest.MockDeviceModel(DefaultModel()) 153 defer r() 154 155 deviceCtx, err := snapstate.DeviceCtxFromState(s.st, nil) 156 c.Assert(err, IsNil) 157 c.Check(deviceCtx.Model().Model(), Equals, "baz-3000") 158 } 159 160 func (s *deviceCtxSuite) TestDeviceCtxFromStateProvided(c *C) { 161 s.st.Lock() 162 defer s.st.Unlock() 163 164 r := snapstatetest.MockDeviceContext(nil) 165 defer r() 166 167 deviceCtx1 := &snapstatetest.TrivialDeviceContext{DeviceModel: MakeModel(nil)} 168 169 // not seeded 170 deviceCtx, err := snapstate.DeviceCtxFromState(s.st, deviceCtx1) 171 c.Assert(err, IsNil) 172 c.Assert(deviceCtx, Equals, deviceCtx1) 173 174 // seeded 175 s.st.Set("seeded", true) 176 deviceCtx, err = snapstate.DeviceCtxFromState(s.st, deviceCtx1) 177 c.Assert(err, IsNil) 178 c.Assert(deviceCtx, Equals, deviceCtx1) 179 } 180 181 func (s *deviceCtxSuite) TestDeviceCtxFromStateTooEarly(c *C) { 182 s.st.Lock() 183 defer s.st.Unlock() 184 185 r := snapstatetest.MockDeviceModel(nil) 186 defer r() 187 188 expectedErr := &snapstate.ChangeConflictError{ 189 Message: "too early for operation, device model " + 190 "not yet acknowledged", 191 ChangeKind: "seed", 192 } 193 194 // not seeded, no model assertion 195 _, err := snapstate.DeviceCtxFromState(s.st, nil) 196 c.Assert(err, DeepEquals, expectedErr) 197 198 // seeded, no model assertion 199 s.st.Set("seeded", true) 200 _, err = snapstate.DeviceCtxFromState(s.st, nil) 201 c.Assert(err, DeepEquals, expectedErr) 202 }