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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package worker_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	coretesting "github.com/juju/juju/testing"
    15  	"github.com/juju/juju/worker"
    16  	"github.com/juju/juju/worker/workertest"
    17  )
    18  
    19  type WorkerSuite struct {
    20  	testing.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&WorkerSuite{})
    24  
    25  func (*WorkerSuite) TestStopReturnsNoError(c *gc.C) {
    26  	w := workertest.NewDeadWorker(nil)
    27  
    28  	err := worker.Stop(w)
    29  	c.Check(err, jc.ErrorIsNil)
    30  }
    31  
    32  func (*WorkerSuite) TestStopReturnsError(c *gc.C) {
    33  	w := workertest.NewDeadWorker(errors.New("pow"))
    34  
    35  	err := worker.Stop(w)
    36  	c.Check(err, gc.ErrorMatches, "pow")
    37  }
    38  
    39  func (*WorkerSuite) TestStopKills(c *gc.C) {
    40  	w := workertest.NewErrorWorker(nil)
    41  	defer workertest.CleanKill(c, w)
    42  
    43  	worker.Stop(w)
    44  	workertest.CheckKilled(c, w)
    45  }
    46  
    47  func (*WorkerSuite) TestStopWaits(c *gc.C) {
    48  	w := workertest.NewForeverWorker(nil)
    49  	defer workertest.CheckKilled(c, w)
    50  	defer w.ReallyKill()
    51  
    52  	done := make(chan struct{})
    53  	go func() {
    54  		defer close(done)
    55  		worker.Stop(w)
    56  	}()
    57  
    58  	select {
    59  	case <-time.After(coretesting.ShortWait):
    60  	case <-done:
    61  		c.Fatalf("Stop returned early")
    62  	}
    63  
    64  	w.ReallyKill()
    65  
    66  	select {
    67  	case <-done:
    68  	case <-time.After(coretesting.LongWait):
    69  		c.Fatalf("Stop never returned")
    70  	}
    71  }
    72  
    73  func (*WorkerSuite) TestDeadAlready(c *gc.C) {
    74  	w := workertest.NewDeadWorker(nil)
    75  
    76  	select {
    77  	case _, ok := <-worker.Dead(w):
    78  		c.Check(ok, jc.IsFalse)
    79  	case <-time.After(coretesting.LongWait):
    80  		c.Fatalf("Dead never sent")
    81  	}
    82  }
    83  
    84  func (*WorkerSuite) TestDeadWaits(c *gc.C) {
    85  	w := workertest.NewErrorWorker(nil)
    86  	defer workertest.CleanKill(c, w)
    87  
    88  	dead := worker.Dead(w)
    89  	select {
    90  	case <-time.After(coretesting.ShortWait):
    91  	case _, ok := <-dead:
    92  		if !ok {
    93  			c.Fatalf("Dead closed early")
    94  		} else {
    95  			c.Fatalf("Dead sent unexpectedly")
    96  		}
    97  	}
    98  
    99  	w.Kill()
   100  	select {
   101  	case _, ok := <-dead:
   102  		c.Check(ok, jc.IsFalse)
   103  	case <-time.After(coretesting.LongWait):
   104  		c.Fatalf("Dead never closed")
   105  	}
   106  }