func (s *deviceMgrSuite) TestDoRequestSerialIdempotentAfterGotSerial(c *C) { privKey, _ := assertstest.GenerateKey(1024) mockServer := s.mockServer(c, "REQID-1") defer mockServer.Close() mockRequestIDURL := mockServer.URL + "/identity/api/v1/request-id" restore := devicestate.MockRequestIDURL(mockRequestIDURL) defer restore() mockSerialRequestURL := mockServer.URL + "/identity/api/v1/devices" restore = devicestate.MockSerialRequestURL(mockSerialRequestURL) defer restore() restore = devicestate.MockRepeatRequestSerial("after-got-serial") defer restore() s.state.Lock() defer s.state.Unlock() // setup state as done by first-boot/Ensure/doGenerateDeviceKey auth.SetDevice(s.state, &auth.DeviceState{ Brand: "canonical", Model: "pc", KeyID: privKey.PublicKey().ID(), }) s.mgr.KeypairManager().Put(privKey) t := s.state.NewTask("request-serial", "test") chg := s.state.NewChange("become-operational", "...") chg.AddTask(t) s.state.Unlock() s.mgr.Ensure() s.mgr.Wait() s.state.Lock() c.Check(chg.Status(), Equals, state.DoingStatus) device, err := auth.Device(s.state) c.Check(err, IsNil) _, err = s.db.Find(asserts.SerialType, map[string]string{ "brand-id": "canonical", "model": "pc", "serial": "9999", }) c.Assert(err, Equals, asserts.ErrNotFound) s.state.Unlock() s.mgr.Ensure() s.mgr.Wait() s.state.Lock() // Repeated handler run but set original serial. c.Check(chg.Status(), Equals, state.DoneStatus) device, err = auth.Device(s.state) c.Check(err, IsNil) c.Check(device.Serial, Equals, "9999") }
func (s *deviceMgrSuite) TestFullDeviceRegistrationPollHappy(c *C) { r1 := devicestate.MockKeyLength(752) defer r1() mockServer := s.mockServer(c, "REQID-POLL") defer mockServer.Close() mockRequestIDURL := mockServer.URL + "/identity/api/v1/request-id" r2 := devicestate.MockRequestIDURL(mockRequestIDURL) defer r2() mockSerialRequestURL := mockServer.URL + "/identity/api/v1/devices" r3 := devicestate.MockSerialRequestURL(mockSerialRequestURL) defer r3() // immediately r4 := devicestate.MockRetryInterval(0) defer r4() // setup state as will be done by first-boot s.state.Lock() defer s.state.Unlock() s.setupGadget(c, ` name: gadget type: gadget version: gadget `, "") auth.SetDevice(s.state, &auth.DeviceState{ Brand: "canonical", Model: "pc", }) // runs the whole device registration process with polling s.state.Unlock() s.settle() s.state.Lock() var becomeOperational *state.Change for _, chg := range s.state.Changes() { if chg.Kind() == "become-operational" { becomeOperational = chg break } } c.Assert(becomeOperational, NotNil) c.Check(becomeOperational.Status().Ready(), Equals, true) c.Check(becomeOperational.Err(), IsNil) device, err := auth.Device(s.state) c.Assert(err, IsNil) c.Check(device.Brand, Equals, "canonical") c.Check(device.Model, Equals, "pc") c.Check(device.Serial, Equals, "10002") a, err := s.db.Find(asserts.SerialType, map[string]string{ "brand-id": "canonical", "model": "pc", "serial": "10002", }) c.Assert(err, IsNil) serial := a.(*asserts.Serial) privKey, err := s.mgr.KeypairManager().Get(serial.DeviceKey().ID()) c.Assert(err, IsNil) c.Check(privKey, NotNil) c.Check(device.KeyID, Equals, privKey.PublicKey().ID()) }