github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/worker/dependency/reporter_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package dependency_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	coretesting "github.com/juju/juju/testing"
    14  	"github.com/juju/juju/worker/dependency"
    15  	"github.com/juju/juju/worker/workertest"
    16  )
    17  
    18  type ReportSuite struct {
    19  	testing.IsolationSuite
    20  	fix *engineFixture
    21  }
    22  
    23  var _ = gc.Suite(&ReportSuite{})
    24  
    25  func (s *ReportSuite) SetUpTest(c *gc.C) {
    26  	s.IsolationSuite.SetUpTest(c)
    27  	s.fix = &engineFixture{}
    28  }
    29  
    30  func (s *ReportSuite) TestReportStarted(c *gc.C) {
    31  	s.fix.run(c, func(engine *dependency.Engine) {
    32  		report := engine.Report()
    33  		c.Check(report, jc.DeepEquals, map[string]interface{}{
    34  			"state":     "started",
    35  			"error":     nil,
    36  			"manifolds": map[string]interface{}{},
    37  		})
    38  	})
    39  }
    40  
    41  func (s *ReportSuite) TestReportStopped(c *gc.C) {
    42  	s.fix.run(c, func(engine *dependency.Engine) {
    43  		workertest.CleanKill(c, engine)
    44  		report := engine.Report()
    45  		c.Check(report, jc.DeepEquals, map[string]interface{}{
    46  			"state":     "stopped",
    47  			"error":     nil,
    48  			"manifolds": map[string]interface{}{},
    49  		})
    50  	})
    51  }
    52  
    53  func (s *ReportSuite) TestReportStopping(c *gc.C) {
    54  	s.fix.run(c, func(engine *dependency.Engine) {
    55  		mh1 := newErrorIgnoringManifoldHarness()
    56  		err := engine.Install("task", mh1.Manifold())
    57  		c.Assert(err, jc.ErrorIsNil)
    58  		defer func() {
    59  			engine.Kill()
    60  			// we *must* inject this between Kill and Wait
    61  			mh1.InjectError(c, nil)
    62  			err := engine.Wait()
    63  			c.Check(err, jc.ErrorIsNil)
    64  		}()
    65  		mh1.AssertOneStart(c)
    66  
    67  		// It may take a short time for the main loop to notice
    68  		// the change and stop the "task" worker.
    69  		engine.Kill()
    70  		isTaskStopping := func(report map[string]interface{}) bool {
    71  			manifolds := report["manifolds"].(map[string]interface{})
    72  			task := manifolds["task"].(map[string]interface{})
    73  			switch taskState := task["state"]; taskState {
    74  			case "started":
    75  				return false
    76  			case "stopping":
    77  				return true
    78  			default:
    79  				c.Fatalf("unexpected task state: %v", taskState)
    80  			}
    81  			panic("unreachable")
    82  		}
    83  
    84  		var report map[string]interface{}
    85  		for i := 0; i < 3; i++ {
    86  			report = engine.Report()
    87  			if isTaskStopping(report) {
    88  				break
    89  			}
    90  			time.Sleep(coretesting.ShortWait)
    91  		}
    92  		c.Check(report, jc.DeepEquals, map[string]interface{}{
    93  			"state": "stopping",
    94  			"error": nil,
    95  			"manifolds": map[string]interface{}{
    96  				"task": map[string]interface{}{
    97  					"state":        "stopping",
    98  					"error":        nil,
    99  					"inputs":       ([]string)(nil),
   100  					"resource-log": []map[string]interface{}{},
   101  					"report": map[string]interface{}{
   102  						"key1": "hello there",
   103  					},
   104  				},
   105  			},
   106  		})
   107  	})
   108  }
   109  
   110  func (s *ReportSuite) TestReportInputs(c *gc.C) {
   111  	s.fix.run(c, func(engine *dependency.Engine) {
   112  		mh1 := newManifoldHarness()
   113  		err := engine.Install("task", mh1.Manifold())
   114  		c.Assert(err, jc.ErrorIsNil)
   115  		mh1.AssertOneStart(c)
   116  
   117  		mh2 := newManifoldHarness("task")
   118  		err = engine.Install("another task", mh2.Manifold())
   119  		c.Assert(err, jc.ErrorIsNil)
   120  		mh2.AssertOneStart(c)
   121  
   122  		report := engine.Report()
   123  		c.Check(report, jc.DeepEquals, map[string]interface{}{
   124  			"state": "started",
   125  			"error": nil,
   126  			"manifolds": map[string]interface{}{
   127  				"task": map[string]interface{}{
   128  					"state":        "started",
   129  					"error":        nil,
   130  					"inputs":       ([]string)(nil),
   131  					"resource-log": []map[string]interface{}{},
   132  					"report": map[string]interface{}{
   133  						"key1": "hello there",
   134  					},
   135  				},
   136  				"another task": map[string]interface{}{
   137  					"state":  "started",
   138  					"error":  nil,
   139  					"inputs": []string{"task"},
   140  					"resource-log": []map[string]interface{}{{
   141  						"name":  "task",
   142  						"type":  "<nil>",
   143  						"error": nil,
   144  					}},
   145  					"report": map[string]interface{}{
   146  						"key1": "hello there",
   147  					},
   148  				},
   149  			},
   150  		})
   151  	})
   152  }
   153  
   154  func (s *ReportSuite) TestReportError(c *gc.C) {
   155  	s.fix.run(c, func(engine *dependency.Engine) {
   156  		mh1 := newManifoldHarness("missing")
   157  		manifold := mh1.Manifold()
   158  		err := engine.Install("task", manifold)
   159  		c.Assert(err, jc.ErrorIsNil)
   160  		mh1.AssertNoStart(c)
   161  
   162  		workertest.CleanKill(c, engine)
   163  		report := engine.Report()
   164  		c.Check(report, jc.DeepEquals, map[string]interface{}{
   165  			"state": "stopped",
   166  			"error": nil,
   167  			"manifolds": map[string]interface{}{
   168  				"task": map[string]interface{}{
   169  					"state":  "stopped",
   170  					"error":  dependency.ErrMissing,
   171  					"inputs": []string{"missing"},
   172  					"resource-log": []map[string]interface{}{{
   173  						"name":  "missing",
   174  						"type":  "<nil>",
   175  						"error": dependency.ErrMissing,
   176  					}},
   177  					"report": (map[string]interface{})(nil),
   178  				},
   179  			},
   180  		})
   181  	})
   182  }