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  }