github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/workers/dumb_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package workers_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/loggo"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/state/workers"
    14  	"github.com/juju/juju/worker"
    15  	"github.com/juju/juju/worker/workertest"
    16  )
    17  
    18  type DumbWorkersSuite struct {
    19  	testing.IsolationSuite
    20  }
    21  
    22  var _ = gc.Suite(&DumbWorkersSuite{})
    23  
    24  func (*DumbWorkersSuite) TestValidateSuccess(c *gc.C) {
    25  	config := workers.DumbConfig{
    26  		Factory: struct{ workers.Factory }{},
    27  		Logger:  loggo.GetLogger("test"),
    28  	}
    29  	err := config.Validate()
    30  	c.Check(err, jc.ErrorIsNil)
    31  }
    32  
    33  func (*DumbWorkersSuite) TestValidateUninitializedLogger(c *gc.C) {
    34  	config := workers.DumbConfig{
    35  		Factory: struct{ workers.Factory }{},
    36  	}
    37  	check := func(err error) {
    38  		c.Check(err, gc.ErrorMatches, "uninitialized Logger not valid")
    39  		c.Check(err, jc.Satisfies, errors.IsNotValid)
    40  	}
    41  
    42  	check(config.Validate())
    43  	w, err := workers.NewDumbWorkers(config)
    44  	if !c.Check(w, gc.IsNil) {
    45  		workertest.CleanKill(c, w)
    46  	}
    47  	check(err)
    48  }
    49  
    50  func (*DumbWorkersSuite) TestValidateMissingFactory(c *gc.C) {
    51  	config := workers.DumbConfig{
    52  		Logger: loggo.GetLogger("test"),
    53  	}
    54  	check := func(err error) {
    55  		c.Check(err, gc.ErrorMatches, "nil Factory not valid")
    56  		c.Check(err, jc.Satisfies, errors.IsNotValid)
    57  	}
    58  
    59  	check(config.Validate())
    60  	w, err := workers.NewDumbWorkers(config)
    61  	if !c.Check(w, gc.IsNil) {
    62  		workertest.CleanKill(c, w)
    63  	}
    64  	check(err)
    65  }
    66  
    67  func (*DumbWorkersSuite) TestNewLeadershipManagerError(c *gc.C) {
    68  	fix := Fixture{
    69  		LW_errors: []error{ErrFailStart},
    70  	}
    71  	fix.FailDumb(c, "cannot create leadership lease manager: bad start")
    72  }
    73  
    74  func (*DumbWorkersSuite) TestNewSingularManagerError(c *gc.C) {
    75  	fix := Fixture{
    76  		LW_errors: []error{nil},
    77  		SW_errors: []error{ErrFailStart},
    78  	}
    79  	fix.FailDumb(c, "cannot create singular lease manager: bad start")
    80  }
    81  
    82  func (*DumbWorkersSuite) TestNewTxnLogWatcherError(c *gc.C) {
    83  	fix := Fixture{
    84  		LW_errors:  []error{nil},
    85  		SW_errors:  []error{nil},
    86  		TLW_errors: []error{ErrFailStart},
    87  	}
    88  	fix.FailDumb(c, "cannot create transaction log watcher: bad start")
    89  }
    90  
    91  func (*DumbWorkersSuite) TestNewPresenceWatcherError(c *gc.C) {
    92  	fix := BasicFixture()
    93  	fix.PW_errors = []error{ErrFailStart}
    94  	fix.FailDumb(c, "cannot create presence watcher: bad start")
    95  }
    96  
    97  func (*DumbWorkersSuite) TestLeadershipManagerFails(c *gc.C) {
    98  	fix := BasicFixture()
    99  	fix.LW_errors = []error{errors.New("zap")}
   100  	fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) {
   101  		w := NextWorker(c, ctx.LWs())
   102  		c.Assert(w, gc.NotNil)
   103  		AssertWorker(c, dw.LeadershipManager(), w)
   104  
   105  		w.Kill()
   106  		workertest.CheckAlive(c, dw)
   107  		AssertWorker(c, dw.LeadershipManager(), w)
   108  
   109  		err := workertest.CheckKill(c, dw)
   110  		c.Check(err, gc.ErrorMatches, "error stopping leadership lease manager: zap")
   111  	})
   112  }
   113  
   114  func (*DumbWorkersSuite) TestSingularManagerFails(c *gc.C) {
   115  	fix := BasicFixture()
   116  	fix.SW_errors = []error{errors.New("zap")}
   117  	fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) {
   118  		w := NextWorker(c, ctx.SWs())
   119  		c.Assert(w, gc.NotNil)
   120  		AssertWorker(c, dw.SingularManager(), w)
   121  
   122  		w.Kill()
   123  		workertest.CheckAlive(c, dw)
   124  		AssertWorker(c, dw.SingularManager(), w)
   125  
   126  		err := workertest.CheckKill(c, dw)
   127  		c.Check(err, gc.ErrorMatches, "error stopping singular lease manager: zap")
   128  	})
   129  }
   130  
   131  func (*DumbWorkersSuite) TestTxnLogWatcherFails(c *gc.C) {
   132  	fix := BasicFixture()
   133  	fix.TLW_errors = []error{errors.New("zap")}
   134  	fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) {
   135  		w := NextWorker(c, ctx.TLWs())
   136  		c.Assert(w, gc.NotNil)
   137  		AssertWorker(c, dw.TxnLogWatcher(), w)
   138  
   139  		w.Kill()
   140  		workertest.CheckAlive(c, dw)
   141  		AssertWorker(c, dw.TxnLogWatcher(), w)
   142  
   143  		err := workertest.CheckKill(c, dw)
   144  		c.Check(err, gc.ErrorMatches, "error stopping transaction log watcher: zap")
   145  	})
   146  }
   147  
   148  func (*DumbWorkersSuite) TestPresenceWatcherFails(c *gc.C) {
   149  	fix := BasicFixture()
   150  	fix.PW_errors = []error{errors.New("zap")}
   151  	fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) {
   152  		w := NextWorker(c, ctx.PWs())
   153  		c.Assert(w, gc.NotNil)
   154  		AssertWorker(c, dw.PresenceWatcher(), w)
   155  
   156  		w.Kill()
   157  		workertest.CheckAlive(c, dw)
   158  		AssertWorker(c, dw.PresenceWatcher(), w)
   159  
   160  		err := workertest.CheckKill(c, dw)
   161  		c.Check(err, gc.ErrorMatches, "error stopping presence watcher: zap")
   162  	})
   163  }
   164  
   165  func (*DumbWorkersSuite) TestEverythingFails(c *gc.C) {
   166  	fix := Fixture{
   167  		LW_errors:  []error{errors.New("zot")},
   168  		SW_errors:  []error{errors.New("bif")},
   169  		TLW_errors: []error{errors.New("pow")},
   170  		PW_errors:  []error{errors.New("arg")},
   171  	}
   172  	fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) {
   173  		for _, ch := range []<-chan worker.Worker{
   174  			ctx.LWs(), ctx.SWs(), ctx.TLWs(), ctx.PWs(),
   175  		} {
   176  			w := NextWorker(c, ch)
   177  			c.Assert(w, gc.NotNil)
   178  			w.Kill()
   179  		}
   180  
   181  		workertest.CheckAlive(c, dw)
   182  		err := workertest.CheckKill(c, dw)
   183  		c.Check(err, gc.ErrorMatches, "error stopping transaction log watcher: pow")
   184  	})
   185  }
   186  
   187  func (*DumbWorkersSuite) TestStopsAllWorkers(c *gc.C) {
   188  	fix := BasicFixture()
   189  	fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) {
   190  		workertest.CleanKill(c, dw)
   191  		for _, ch := range []<-chan worker.Worker{
   192  			ctx.LWs(), ctx.SWs(), ctx.TLWs(), ctx.PWs(),
   193  		} {
   194  			w := NextWorker(c, ch)
   195  			workertest.CheckKilled(c, w)
   196  		}
   197  	})
   198  }