launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cmd/juju/synctools_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	"errors"
     8  	"time"
     9  
    10  	gc "launchpad.net/gocheck"
    11  
    12  	"launchpad.net/juju-core/cmd"
    13  	"launchpad.net/juju-core/environs"
    14  	"launchpad.net/juju-core/environs/configstore"
    15  	"launchpad.net/juju-core/environs/sync"
    16  	"launchpad.net/juju-core/provider/dummy"
    17  	coretesting "launchpad.net/juju-core/testing"
    18  	jc "launchpad.net/juju-core/testing/checkers"
    19  	"launchpad.net/juju-core/testing/testbase"
    20  )
    21  
    22  type syncToolsSuite struct {
    23  	testbase.LoggingSuite
    24  	home         *coretesting.FakeHome
    25  	configStore  configstore.Storage
    26  	localStorage string
    27  
    28  	origSyncTools func(*sync.SyncContext) error
    29  }
    30  
    31  var _ = gc.Suite(&syncToolsSuite{})
    32  
    33  func (s *syncToolsSuite) SetUpTest(c *gc.C) {
    34  	s.LoggingSuite.SetUpTest(c)
    35  
    36  	// Create a target environments.yaml and make sure its environment is empty.
    37  	s.home = coretesting.MakeFakeHome(c, `
    38  environments:
    39      test-target:
    40          type: dummy
    41          state-server: false
    42          authorized-keys: "not-really-one"
    43  `)
    44  	var err error
    45  	s.configStore, err = configstore.Default()
    46  	c.Assert(err, gc.IsNil)
    47  	s.origSyncTools = syncTools
    48  }
    49  
    50  func (s *syncToolsSuite) TearDownTest(c *gc.C) {
    51  	syncTools = s.origSyncTools
    52  	dummy.Reset()
    53  	s.home.Restore()
    54  	s.LoggingSuite.TearDownTest(c)
    55  }
    56  
    57  func (s *syncToolsSuite) Reset(c *gc.C) {
    58  	s.TearDownTest(c)
    59  	s.SetUpTest(c)
    60  }
    61  
    62  func runSyncToolsCommand(c *gc.C, args ...string) (*cmd.Context, error) {
    63  	return coretesting.RunCommand(c, &SyncToolsCommand{}, args)
    64  }
    65  
    66  func wait(signal chan struct{}) error {
    67  	select {
    68  	case <-signal:
    69  		return nil
    70  	case <-time.After(25 * time.Millisecond):
    71  		return errors.New("timeout")
    72  	}
    73  }
    74  
    75  var syncToolsCommandTests = []struct {
    76  	description string
    77  	args        []string
    78  	sctx        *sync.SyncContext
    79  }{
    80  	{
    81  		description: "environment as only argument",
    82  		args:        []string{"-e", "test-target"},
    83  		sctx:        &sync.SyncContext{},
    84  	},
    85  	{
    86  		description: "specifying also the synchronization source",
    87  		args:        []string{"-e", "test-target", "--source", "/foo/bar"},
    88  		sctx: &sync.SyncContext{
    89  			Source: "/foo/bar",
    90  		},
    91  	},
    92  	{
    93  		description: "synchronize all version including development",
    94  		args:        []string{"-e", "test-target", "--all", "--dev"},
    95  		sctx: &sync.SyncContext{
    96  			AllVersions: true,
    97  			Dev:         true,
    98  		},
    99  	},
   100  	{
   101  		description: "just make a dry run",
   102  		args:        []string{"-e", "test-target", "--dry-run"},
   103  		sctx: &sync.SyncContext{
   104  			DryRun: true,
   105  		},
   106  	},
   107  	{
   108  		description: "specific public",
   109  		args:        []string{"-e", "test-target", "--public"},
   110  		sctx: &sync.SyncContext{
   111  			Public: true,
   112  		},
   113  	},
   114  	{
   115  		description: "specify version",
   116  		args:        []string{"-e", "test-target", "--version", "1.2"},
   117  		sctx: &sync.SyncContext{
   118  			MajorVersion: 1,
   119  			MinorVersion: 2,
   120  		},
   121  	},
   122  }
   123  
   124  func (s *syncToolsSuite) TestSyncToolsCommand(c *gc.C) {
   125  	for i, test := range syncToolsCommandTests {
   126  		c.Logf("test %d: %s", i, test.description)
   127  		targetEnv, err := environs.PrepareFromName("test-target", s.configStore)
   128  		c.Assert(err, gc.IsNil)
   129  		called := false
   130  		syncTools = func(sctx *sync.SyncContext) error {
   131  			c.Assert(sctx.AllVersions, gc.Equals, test.sctx.AllVersions)
   132  			c.Assert(sctx.MajorVersion, gc.Equals, test.sctx.MajorVersion)
   133  			c.Assert(sctx.MinorVersion, gc.Equals, test.sctx.MinorVersion)
   134  			c.Assert(sctx.DryRun, gc.Equals, test.sctx.DryRun)
   135  			c.Assert(sctx.Dev, gc.Equals, test.sctx.Dev)
   136  			c.Assert(sctx.Public, gc.Equals, test.sctx.Public)
   137  			c.Assert(sctx.Source, gc.Equals, test.sctx.Source)
   138  			c.Assert(dummy.IsSameStorage(sctx.Target, targetEnv.Storage()), jc.IsTrue)
   139  			called = true
   140  			return nil
   141  		}
   142  		ctx, err := runSyncToolsCommand(c, test.args...)
   143  		c.Assert(err, gc.IsNil)
   144  		c.Assert(ctx, gc.NotNil)
   145  		c.Assert(called, jc.IsTrue)
   146  		s.Reset(c)
   147  	}
   148  }
   149  
   150  func (s *syncToolsSuite) TestSyncToolsCommandTargetDirectory(c *gc.C) {
   151  	called := false
   152  	dir := c.MkDir()
   153  	syncTools = func(sctx *sync.SyncContext) error {
   154  		c.Assert(sctx.AllVersions, gc.Equals, false)
   155  		c.Assert(sctx.DryRun, gc.Equals, false)
   156  		c.Assert(sctx.Dev, gc.Equals, false)
   157  		c.Assert(sctx.Source, gc.Equals, "")
   158  		url, err := sctx.Target.URL("")
   159  		c.Assert(err, gc.IsNil)
   160  		c.Assert(url, gc.Equals, "file://"+dir)
   161  		called = true
   162  		return nil
   163  	}
   164  	ctx, err := runSyncToolsCommand(c, "-e", "test-target", "--local-dir", dir)
   165  	c.Assert(err, gc.IsNil)
   166  	c.Assert(ctx, gc.NotNil)
   167  	c.Assert(called, jc.IsTrue)
   168  	s.Reset(c)
   169  }