github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasunitterminationworker/worker_test.go (about) 1 // Copyright 2021 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasunitterminationworker_test 5 6 import ( 7 "os" 8 "testing" 9 10 "github.com/juju/clock" 11 "github.com/juju/loggo" 12 "github.com/juju/names/v5" 13 jujutesting "github.com/juju/testing" 14 jc "github.com/juju/testing/checkers" 15 "github.com/juju/worker/v3" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/agent" 19 "github.com/juju/juju/api/agent/caasapplication" 20 "github.com/juju/juju/worker/caasunitterminationworker" 21 ) 22 23 func TestPackage(t *testing.T) { 24 gc.TestingT(t) 25 } 26 27 var _ = gc.Suite(&TerminationWorkerSuite{}) 28 29 type TerminationWorkerSuite struct { 30 state *mockState 31 terminator *mockTerminator 32 } 33 34 func (s *TerminationWorkerSuite) newWorker(c *gc.C, willRestart bool) worker.Worker { 35 s.state = &mockState{ 36 termination: caasapplication.UnitTermination{ 37 WillRestart: willRestart, 38 }, 39 } 40 s.terminator = &mockTerminator{} 41 config := caasunitterminationworker.Config{ 42 Agent: &mockAgent{}, 43 Logger: loggo.GetLogger("test"), 44 Clock: clock.WallClock, 45 State: s.state, 46 UnitTerminator: s.terminator, 47 } 48 return caasunitterminationworker.NewWorker(config) 49 } 50 51 func (s *TerminationWorkerSuite) TestStartStop(c *gc.C) { 52 w := s.newWorker(c, false) 53 w.Kill() 54 err := w.Wait() 55 c.Assert(err, jc.ErrorIsNil) 56 } 57 58 func (s *TerminationWorkerSuite) TestAgentWillRestart(c *gc.C) { 59 w := s.newWorker(c, true) 60 proc, err := os.FindProcess(os.Getpid()) 61 c.Assert(err, jc.ErrorIsNil) 62 defer proc.Release() 63 err = proc.Signal(caasunitterminationworker.TerminationSignal) 64 c.Assert(err, jc.ErrorIsNil) 65 err = w.Wait() 66 c.Assert(err, jc.ErrorIsNil) 67 s.state.CheckCallNames(c, "UnitTerminating") 68 c.Assert(s.state.Calls()[0].Args[0], gc.DeepEquals, names.NewUnitTag("gitlab/0")) 69 s.terminator.CheckCallNames(c, "Terminate") 70 } 71 72 func (s *TerminationWorkerSuite) TestAgentDying(c *gc.C) { 73 w := s.newWorker(c, false) 74 proc, err := os.FindProcess(os.Getpid()) 75 c.Assert(err, jc.ErrorIsNil) 76 defer proc.Release() 77 err = proc.Signal(caasunitterminationworker.TerminationSignal) 78 c.Assert(err, jc.ErrorIsNil) 79 err = w.Wait() 80 c.Assert(err, jc.ErrorIsNil) 81 s.state.CheckCallNames(c, "UnitTerminating") 82 c.Assert(s.state.Calls()[0].Args[0], gc.DeepEquals, names.NewUnitTag("gitlab/0")) 83 s.terminator.CheckCallNames(c) 84 } 85 86 type mockAgent struct { 87 agent.Agent 88 } 89 90 func (a *mockAgent) CurrentConfig() agent.Config { 91 return &mockAgentConfig{} 92 } 93 94 type mockAgentConfig struct { 95 agent.Config 96 } 97 98 func (c *mockAgentConfig) Tag() names.Tag { 99 return names.NewUnitTag("gitlab/0") 100 } 101 102 type mockState struct { 103 jujutesting.Stub 104 105 termination caasapplication.UnitTermination 106 } 107 108 func (s *mockState) UnitTerminating(tag names.UnitTag) (caasapplication.UnitTermination, error) { 109 s.MethodCall(s, "UnitTerminating", tag) 110 return s.termination, s.NextErr() 111 } 112 113 type mockTerminator struct { 114 jujutesting.Stub 115 } 116 117 func (t *mockTerminator) Terminate() error { 118 t.MethodCall(t, "Terminate") 119 return t.NextErr() 120 }