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 }