github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/cmd/jujud/agent/deploy_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package agent
     5  
     6  import (
     7  	"reflect"
     8  	"sort"
     9  	"sync"
    10  	"time"
    11  
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/juju/utils/set"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/agent"
    17  	"github.com/juju/juju/state"
    18  	"github.com/juju/juju/testing"
    19  )
    20  
    21  // fakeManager allows us to test deployments without actually deploying units
    22  // to the local system. It's slightly uncomfortably complex because it needs
    23  // to use the *state.State opened within the agent's runOnce -- not the one
    24  // created in the test -- to StartSync and cause the task to actually start
    25  // a sync and observe changes to the set of desired units (and thereby run
    26  // deployment tests in a reasonable amount of time).
    27  type fakeContext struct {
    28  	mu          sync.Mutex
    29  	deployed    set.Strings
    30  	st          *state.State
    31  	agentConfig agent.Config
    32  	inited      *signal
    33  }
    34  
    35  func (ctx *fakeContext) DeployUnit(unitName, _ string) error {
    36  	ctx.mu.Lock()
    37  	ctx.deployed.Add(unitName)
    38  	ctx.mu.Unlock()
    39  	return nil
    40  }
    41  
    42  func (ctx *fakeContext) RecallUnit(unitName string) error {
    43  	ctx.mu.Lock()
    44  	ctx.deployed.Remove(unitName)
    45  	ctx.mu.Unlock()
    46  	return nil
    47  }
    48  
    49  func (ctx *fakeContext) DeployedUnits() ([]string, error) {
    50  	ctx.mu.Lock()
    51  	defer ctx.mu.Unlock()
    52  	if ctx.deployed.IsEmpty() {
    53  		return nil, nil
    54  	}
    55  	return ctx.deployed.SortedValues(), nil
    56  }
    57  
    58  func (ctx *fakeContext) waitDeployed(c *gc.C, want ...string) {
    59  	sort.Strings(want)
    60  	select {
    61  	case <-time.After(testing.LongWait):
    62  		c.Fatalf("manager never initialized")
    63  	case <-ctx.inited.triggered():
    64  		timeout := time.After(testing.LongWait)
    65  		for {
    66  			ctx.st.StartSync()
    67  			select {
    68  			case <-timeout:
    69  				got, err := ctx.DeployedUnits()
    70  				c.Assert(err, jc.ErrorIsNil)
    71  				c.Fatalf("unexpected units: %#v", got)
    72  			case <-time.After(testing.ShortWait):
    73  				got, err := ctx.DeployedUnits()
    74  				c.Assert(err, jc.ErrorIsNil)
    75  				if reflect.DeepEqual(got, want) {
    76  					return
    77  				}
    78  			}
    79  		}
    80  	}
    81  }
    82  
    83  func (ctx *fakeContext) AgentConfig() agent.Config {
    84  	return ctx.agentConfig
    85  }