github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/restore_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_test 5 6 import ( 7 "sync" 8 "time" 9 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/state" 14 statetesting "github.com/juju/juju/state/testing" 15 coretesting "github.com/juju/juju/testing" 16 ) 17 18 // RestoreInfoSuite is *tremendously* incomplete: this test exists purely to 19 // verify that independent RestoreInfoSetters can be created concurrently. 20 // This says nothing about whether that's a good idea (it's *not*) but it's 21 // what we currently do and we need it to not just arbitrarily fail. 22 // 23 // TODO(fwereade): 2016-03-23 lp:1560920 24 // None of the other functionality is tested, and little of it is reliable or 25 // consistent with the other state code, but that's not for today. 26 type RestoreInfoSuite struct { 27 statetesting.StateSuite 28 } 29 30 var _ = gc.Suite(&RestoreInfoSuite{}) 31 32 func (s *RestoreInfoSuite) TestGetSetter(c *gc.C) { 33 setter, err := s.State.RestoreInfoSetter() 34 c.Assert(err, jc.ErrorIsNil) 35 checkStatus(c, setter, state.UnknownRestoreStatus) 36 } 37 38 func (s *RestoreInfoSuite) TestGetSetterRace(c *gc.C) { 39 trigger := make(chan struct{}) 40 test := func() { 41 select { 42 case <-trigger: 43 setter, err := s.State.RestoreInfoSetter() 44 if c.Check(err, jc.ErrorIsNil) { 45 checkStatus(c, setter, state.UnknownRestoreStatus) 46 } 47 case <-time.After(coretesting.LongWait): 48 c.Errorf("test invoked but not triggered") 49 } 50 } 51 52 const count = 100 53 wg := sync.WaitGroup{} 54 wg.Add(count) 55 for i := 0; i < count; i++ { 56 go func() { 57 defer wg.Done() 58 test() 59 }() 60 } 61 close(trigger) 62 wg.Wait() 63 } 64 65 func checkStatus(c *gc.C, setter *state.RestoreInfo, status state.RestoreStatus) { 66 if c.Check(setter, gc.NotNil) { 67 c.Check(setter.Status(), gc.Equals, status) 68 } 69 }