github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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  	"github.com/juju/loggo"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "launchpad.net/gocheck"
    13  
    14  	"github.com/juju/juju/cmd"
    15  	"github.com/juju/juju/cmd/envcmd"
    16  	"github.com/juju/juju/environs"
    17  	"github.com/juju/juju/environs/configstore"
    18  	"github.com/juju/juju/environs/sync"
    19  	"github.com/juju/juju/provider/dummy"
    20  	coretesting "github.com/juju/juju/testing"
    21  )
    22  
    23  type syncToolsSuite struct {
    24  	coretesting.FakeJujuHomeSuite
    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.FakeJujuHomeSuite.SetUpTest(c)
    35  
    36  	// Create a target environments.yaml and make sure its environment is empty.
    37  	coretesting.WriteEnvironments(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.FakeJujuHomeSuite.TearDownTest(c)
    54  }
    55  
    56  func (s *syncToolsSuite) Reset(c *gc.C) {
    57  	s.TearDownTest(c)
    58  	s.SetUpTest(c)
    59  }
    60  
    61  func runSyncToolsCommand(c *gc.C, args ...string) (*cmd.Context, error) {
    62  	return coretesting.RunCommand(c, envcmd.Wrap(&SyncToolsCommand{}), args...)
    63  }
    64  
    65  func wait(signal chan struct{}) error {
    66  	select {
    67  	case <-signal:
    68  		return nil
    69  	case <-time.After(25 * time.Millisecond):
    70  		return errors.New("timeout")
    71  	}
    72  }
    73  
    74  var syncToolsCommandTests = []struct {
    75  	description string
    76  	args        []string
    77  	sctx        *sync.SyncContext
    78  }{
    79  	{
    80  		description: "environment as only argument",
    81  		args:        []string{"-e", "test-target"},
    82  		sctx:        &sync.SyncContext{},
    83  	},
    84  	{
    85  		description: "specifying also the synchronization source",
    86  		args:        []string{"-e", "test-target", "--source", "/foo/bar"},
    87  		sctx: &sync.SyncContext{
    88  			Source: "/foo/bar",
    89  		},
    90  	},
    91  	{
    92  		description: "synchronize all version including development",
    93  		args:        []string{"-e", "test-target", "--all", "--dev"},
    94  		sctx: &sync.SyncContext{
    95  			AllVersions: true,
    96  			Dev:         true,
    97  		},
    98  	},
    99  	{
   100  		description: "just make a dry run",
   101  		args:        []string{"-e", "test-target", "--dry-run"},
   102  		sctx: &sync.SyncContext{
   103  			DryRun: true,
   104  		},
   105  	},
   106  	{
   107  		description: "specific public",
   108  		args:        []string{"-e", "test-target", "--public"},
   109  		sctx: &sync.SyncContext{
   110  			Public: true,
   111  		},
   112  	},
   113  	{
   114  		description: "specify version",
   115  		args:        []string{"-e", "test-target", "--version", "1.2"},
   116  		sctx: &sync.SyncContext{
   117  			MajorVersion: 1,
   118  			MinorVersion: 2,
   119  		},
   120  	},
   121  }
   122  
   123  func (s *syncToolsSuite) TestSyncToolsCommand(c *gc.C) {
   124  	for i, test := range syncToolsCommandTests {
   125  		c.Logf("test %d: %s", i, test.description)
   126  		targetEnv, err := environs.PrepareFromName("test-target", nullContext(c), s.configStore)
   127  		c.Assert(err, gc.IsNil)
   128  		called := false
   129  		syncTools = func(sctx *sync.SyncContext) error {
   130  			c.Assert(sctx.AllVersions, gc.Equals, test.sctx.AllVersions)
   131  			c.Assert(sctx.MajorVersion, gc.Equals, test.sctx.MajorVersion)
   132  			c.Assert(sctx.MinorVersion, gc.Equals, test.sctx.MinorVersion)
   133  			c.Assert(sctx.DryRun, gc.Equals, test.sctx.DryRun)
   134  			c.Assert(sctx.Dev, gc.Equals, test.sctx.Dev)
   135  			c.Assert(sctx.Public, gc.Equals, test.sctx.Public)
   136  			c.Assert(sctx.Source, gc.Equals, test.sctx.Source)
   137  			c.Assert(dummy.IsSameStorage(sctx.Target, targetEnv.Storage()), jc.IsTrue)
   138  			called = true
   139  			return nil
   140  		}
   141  		ctx, err := runSyncToolsCommand(c, test.args...)
   142  		c.Assert(err, gc.IsNil)
   143  		c.Assert(ctx, gc.NotNil)
   144  		c.Assert(called, jc.IsTrue)
   145  		s.Reset(c)
   146  	}
   147  }
   148  
   149  func (s *syncToolsSuite) TestSyncToolsCommandTargetDirectory(c *gc.C) {
   150  	called := false
   151  	dir := c.MkDir()
   152  	syncTools = func(sctx *sync.SyncContext) error {
   153  		c.Assert(sctx.AllVersions, gc.Equals, false)
   154  		c.Assert(sctx.DryRun, gc.Equals, false)
   155  		c.Assert(sctx.Dev, gc.Equals, false)
   156  		c.Assert(sctx.Source, gc.Equals, "")
   157  		url, err := sctx.Target.URL("")
   158  		c.Assert(err, gc.IsNil)
   159  		c.Assert(url, gc.Equals, "file://"+dir)
   160  		called = true
   161  		return nil
   162  	}
   163  	ctx, err := runSyncToolsCommand(c, "-e", "test-target", "--local-dir", dir)
   164  	c.Assert(err, gc.IsNil)
   165  	c.Assert(ctx, gc.NotNil)
   166  	c.Assert(called, jc.IsTrue)
   167  	s.Reset(c)
   168  }
   169  
   170  func (s *syncToolsSuite) TestSyncToolsCommandDeprecatedDestination(c *gc.C) {
   171  	called := false
   172  	dir := c.MkDir()
   173  	syncTools = func(sctx *sync.SyncContext) error {
   174  		c.Assert(sctx.AllVersions, gc.Equals, false)
   175  		c.Assert(sctx.DryRun, gc.Equals, false)
   176  		c.Assert(sctx.Dev, gc.Equals, false)
   177  		c.Assert(sctx.Source, gc.Equals, "")
   178  		url, err := sctx.Target.URL("")
   179  		c.Assert(err, gc.IsNil)
   180  		c.Assert(url, gc.Equals, "file://"+dir)
   181  		called = true
   182  		return nil
   183  	}
   184  	// Register writer.
   185  	tw := &loggo.TestWriter{}
   186  	c.Assert(loggo.RegisterWriter("deprecated-tester", tw, loggo.DEBUG), gc.IsNil)
   187  	defer loggo.RemoveWriter("deprecated-tester")
   188  	// Add deprecated message to be checked.
   189  	messages := []jc.SimpleMessage{
   190  		{loggo.WARNING, "Use of the --destination flag is deprecated in 1.18. Please use --local-dir instead."},
   191  	}
   192  	// Run sync-tools command with --destination flag.
   193  	ctx, err := runSyncToolsCommand(c, "-e", "test-target", "--destination", dir)
   194  	c.Assert(err, gc.IsNil)
   195  	c.Assert(ctx, gc.NotNil)
   196  	c.Assert(called, jc.IsTrue)
   197  	// Check deprecated message was logged.
   198  	c.Check(tw.Log, jc.LogMatches, messages)
   199  	s.Reset(c)
   200  }