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  }