github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/lifeflag/worker_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lifeflag_test
     5  
     6  import (
     7  	"errors"
     8  
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/names.v2"
    13  
    14  	apilifeflag "github.com/juju/juju/api/lifeflag"
    15  	"github.com/juju/juju/core/life"
    16  	"github.com/juju/juju/worker/lifeflag"
    17  	"github.com/juju/juju/worker/workertest"
    18  )
    19  
    20  type WorkerSuite struct {
    21  	testing.IsolationSuite
    22  }
    23  
    24  var _ = gc.Suite(&WorkerSuite{})
    25  
    26  func (*WorkerSuite) TestCreateNotFoundError(c *gc.C) {
    27  	stub := &testing.Stub{}
    28  	stub.SetErrors(apilifeflag.ErrNotFound)
    29  	config := lifeflag.Config{
    30  		Facade: newMockFacade(stub),
    31  		Entity: testEntity,
    32  		Result: explode,
    33  	}
    34  
    35  	worker, err := lifeflag.New(config)
    36  	c.Check(worker, gc.IsNil)
    37  	c.Check(err, gc.Equals, lifeflag.ErrNotFound)
    38  	checkCalls(c, stub, "Life")
    39  }
    40  
    41  func (*WorkerSuite) TestCreateRandomError(c *gc.C) {
    42  	stub := &testing.Stub{}
    43  	stub.SetErrors(errors.New("boom splat"))
    44  	config := lifeflag.Config{
    45  		Facade: newMockFacade(stub),
    46  		Entity: testEntity,
    47  		Result: explode,
    48  	}
    49  
    50  	worker, err := lifeflag.New(config)
    51  	c.Check(worker, gc.IsNil)
    52  	c.Check(err, gc.ErrorMatches, "boom splat")
    53  	checkCalls(c, stub, "Life")
    54  }
    55  
    56  func (*WorkerSuite) TestWatchNotFoundError(c *gc.C) {
    57  	stub := &testing.Stub{}
    58  	stub.SetErrors(nil, apilifeflag.ErrNotFound)
    59  	config := lifeflag.Config{
    60  		Facade: newMockFacade(stub, life.Alive),
    61  		Entity: testEntity,
    62  		Result: never,
    63  	}
    64  
    65  	worker, err := lifeflag.New(config)
    66  	c.Check(err, jc.ErrorIsNil)
    67  	c.Check(worker.Check(), jc.IsFalse)
    68  
    69  	err = workertest.CheckKilled(c, worker)
    70  	c.Check(err, gc.Equals, lifeflag.ErrNotFound)
    71  	checkCalls(c, stub, "Life", "Watch")
    72  }
    73  
    74  func (*WorkerSuite) TestWatchRandomError(c *gc.C) {
    75  	stub := &testing.Stub{}
    76  	stub.SetErrors(nil, errors.New("pew pew"))
    77  	config := lifeflag.Config{
    78  		Facade: newMockFacade(stub, life.Alive),
    79  		Entity: testEntity,
    80  		Result: never,
    81  	}
    82  
    83  	worker, err := lifeflag.New(config)
    84  	c.Check(err, jc.ErrorIsNil)
    85  	c.Check(worker.Check(), jc.IsFalse)
    86  
    87  	err = workertest.CheckKilled(c, worker)
    88  	c.Check(err, gc.ErrorMatches, "pew pew")
    89  	checkCalls(c, stub, "Life", "Watch")
    90  }
    91  
    92  func (*WorkerSuite) TestLifeNotFoundError(c *gc.C) {
    93  	stub := &testing.Stub{}
    94  	stub.SetErrors(nil, nil, apilifeflag.ErrNotFound)
    95  	config := lifeflag.Config{
    96  		Facade: newMockFacade(stub, life.Alive),
    97  		Entity: testEntity,
    98  		Result: never,
    99  	}
   100  
   101  	worker, err := lifeflag.New(config)
   102  	c.Check(err, jc.ErrorIsNil)
   103  	c.Check(worker.Check(), jc.IsFalse)
   104  
   105  	err = workertest.CheckKilled(c, worker)
   106  	c.Check(err, gc.Equals, lifeflag.ErrNotFound)
   107  	checkCalls(c, stub, "Life", "Watch", "Life")
   108  }
   109  
   110  func (*WorkerSuite) TestLifeRandomError(c *gc.C) {
   111  	stub := &testing.Stub{}
   112  	stub.SetErrors(nil, nil, errors.New("rawr"))
   113  	config := lifeflag.Config{
   114  		Facade: newMockFacade(stub, life.Alive),
   115  		Entity: testEntity,
   116  		Result: never,
   117  	}
   118  
   119  	worker, err := lifeflag.New(config)
   120  	c.Check(err, jc.ErrorIsNil)
   121  	c.Check(worker.Check(), jc.IsFalse)
   122  
   123  	err = workertest.CheckKilled(c, worker)
   124  	c.Check(err, gc.ErrorMatches, "rawr")
   125  	checkCalls(c, stub, "Life", "Watch", "Life")
   126  }
   127  
   128  func (*WorkerSuite) TestResultImmediateRealChange(c *gc.C) {
   129  	stub := &testing.Stub{}
   130  	config := lifeflag.Config{
   131  		Facade: newMockFacade(stub, life.Alive, life.Dead),
   132  		Entity: testEntity,
   133  		Result: life.IsNotAlive,
   134  	}
   135  
   136  	worker, err := lifeflag.New(config)
   137  	c.Check(err, jc.ErrorIsNil)
   138  	c.Check(worker.Check(), jc.IsFalse)
   139  
   140  	err = workertest.CheckKilled(c, worker)
   141  	c.Check(err, gc.Equals, lifeflag.ErrValueChanged)
   142  	checkCalls(c, stub, "Life", "Watch", "Life")
   143  }
   144  
   145  func (*WorkerSuite) TestResultSubsequentRealChange(c *gc.C) {
   146  	stub := &testing.Stub{}
   147  	config := lifeflag.Config{
   148  		Facade: newMockFacade(stub, life.Dying, life.Dying, life.Dead),
   149  		Entity: testEntity,
   150  		Result: life.IsNotDead,
   151  	}
   152  	worker, err := lifeflag.New(config)
   153  	c.Check(err, jc.ErrorIsNil)
   154  	c.Check(worker.Check(), jc.IsTrue)
   155  
   156  	err = workertest.CheckKilled(c, worker)
   157  	c.Check(err, gc.Equals, lifeflag.ErrValueChanged)
   158  	checkCalls(c, stub, "Life", "Watch", "Life", "Life")
   159  }
   160  
   161  func (*WorkerSuite) TestResultNoRealChange(c *gc.C) {
   162  	stub := &testing.Stub{}
   163  	config := lifeflag.Config{
   164  		Facade: newMockFacade(stub, life.Alive, life.Alive, life.Dying),
   165  		Entity: testEntity,
   166  		Result: life.IsNotDead,
   167  	}
   168  	worker, err := lifeflag.New(config)
   169  	c.Check(err, jc.ErrorIsNil)
   170  	c.Check(worker.Check(), jc.IsTrue)
   171  
   172  	workertest.CheckAlive(c, worker)
   173  	workertest.CleanKill(c, worker)
   174  	checkCalls(c, stub, "Life", "Watch", "Life", "Life")
   175  }
   176  
   177  var testEntity = names.NewUnitTag("blah/123")
   178  
   179  func checkCalls(c *gc.C, stub *testing.Stub, names ...string) {
   180  	stub.CheckCallNames(c, names...)
   181  	for _, call := range stub.Calls() {
   182  		c.Check(call.Args, gc.DeepEquals, []interface{}{testEntity})
   183  	}
   184  }
   185  
   186  func explode(life.Value) bool { panic("unexpected") }
   187  func never(life.Value) bool   { return false }