github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/agenttools/agenttools_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package agenttools
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/version"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/environs/config"
    14  	"github.com/juju/juju/state"
    15  	coretesting "github.com/juju/juju/testing"
    16  	coretools "github.com/juju/juju/tools"
    17  )
    18  
    19  var _ = gc.Suite(&AgentToolsSuite{})
    20  
    21  type AgentToolsSuite struct {
    22  	coretesting.BaseSuite
    23  }
    24  
    25  type dummyEnviron struct {
    26  	environs.Environ
    27  }
    28  
    29  func (s *AgentToolsSuite) TestCheckTools(c *gc.C) {
    30  	sConfig := coretesting.FakeConfig()
    31  	sConfig = sConfig.Merge(coretesting.Attrs{
    32  		"agent-version": "2.5.0",
    33  	})
    34  	cfg, err := config.New(config.NoDefaults, sConfig)
    35  	c.Assert(err, jc.ErrorIsNil)
    36  	fakeNewEnvirons := func(*config.Config) (environs.Environ, error) {
    37  		return dummyEnviron{}, nil
    38  	}
    39  	s.PatchValue(&newEnvirons, fakeNewEnvirons)
    40  	var (
    41  		calledWithMajor, calledWithMinor int
    42  	)
    43  	fakeToolFinder := func(e environs.Environ, maj int, min int, stream string, filter coretools.Filter) (coretools.List, error) {
    44  		calledWithMajor = maj
    45  		calledWithMinor = min
    46  		ver := version.Binary{Number: version.Number{Major: maj, Minor: min}}
    47  		t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1}
    48  		c.Assert(calledWithMajor, gc.Equals, 2)
    49  		c.Assert(calledWithMinor, gc.Equals, 5)
    50  		c.Assert(stream, gc.Equals, "released")
    51  		return coretools.List{&t}, nil
    52  	}
    53  
    54  	ver, err := checkToolsAvailability(cfg, fakeToolFinder)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	c.Assert(ver, gc.Not(gc.Equals), version.Zero)
    57  	c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 0})
    58  }
    59  
    60  func (s *AgentToolsSuite) TestCheckToolsNonReleasedStream(c *gc.C) {
    61  	sConfig := coretesting.FakeConfig()
    62  	sConfig = sConfig.Merge(coretesting.Attrs{
    63  		"agent-version": "2.5-alpha1",
    64  		"agent-stream":  "proposed",
    65  	})
    66  	cfg, err := config.New(config.NoDefaults, sConfig)
    67  	c.Assert(err, jc.ErrorIsNil)
    68  	fakeNewEnvirons := func(*config.Config) (environs.Environ, error) {
    69  		return dummyEnviron{}, nil
    70  	}
    71  	s.PatchValue(&newEnvirons, fakeNewEnvirons)
    72  	var (
    73  		calledWithMajor, calledWithMinor int
    74  		calledWithStreams                []string
    75  	)
    76  	fakeToolFinder := func(e environs.Environ, maj int, min int, stream string, filter coretools.Filter) (coretools.List, error) {
    77  		calledWithMajor = maj
    78  		calledWithMinor = min
    79  		calledWithStreams = append(calledWithStreams, stream)
    80  		if stream == "released" {
    81  			return nil, coretools.ErrNoMatches
    82  		}
    83  		ver := version.Binary{Number: version.Number{Major: maj, Minor: min}}
    84  		t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1}
    85  		c.Assert(calledWithMajor, gc.Equals, 2)
    86  		c.Assert(calledWithMinor, gc.Equals, 5)
    87  		return coretools.List{&t}, nil
    88  	}
    89  	ver, err := checkToolsAvailability(cfg, fakeToolFinder)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(calledWithStreams, gc.DeepEquals, []string{"released", "proposed"})
    92  	c.Assert(ver, gc.Not(gc.Equals), version.Zero)
    93  	c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 0})
    94  }
    95  
    96  type modelGetter struct {
    97  }
    98  
    99  func (e *modelGetter) Model() (*state.Model, error) {
   100  	return &state.Model{}, nil
   101  }
   102  
   103  func (s *AgentToolsSuite) TestUpdateToolsAvailability(c *gc.C) {
   104  	fakeNewEnvirons := func(*config.Config) (environs.Environ, error) {
   105  		return dummyEnviron{}, nil
   106  	}
   107  	s.PatchValue(&newEnvirons, fakeNewEnvirons)
   108  
   109  	fakeEnvConfig := func(_ *state.Model) (*config.Config, error) {
   110  		sConfig := coretesting.FakeConfig()
   111  		sConfig = sConfig.Merge(coretesting.Attrs{
   112  			"agent-version": "2.5.0",
   113  		})
   114  		return config.New(config.NoDefaults, sConfig)
   115  	}
   116  	s.PatchValue(&envConfig, fakeEnvConfig)
   117  
   118  	fakeToolFinder := func(_ environs.Environ, _ int, _ int, _ string, _ coretools.Filter) (coretools.List, error) {
   119  		ver := version.Binary{Number: version.Number{Major: 2, Minor: 5, Patch: 2}}
   120  		olderVer := version.Binary{Number: version.Number{Major: 2, Minor: 5, Patch: 1}}
   121  		t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1}
   122  		tOld := coretools.Tools{Version: olderVer, URL: "http://example.com", Size: 1}
   123  		return coretools.List{&t, &tOld}, nil
   124  	}
   125  
   126  	var ver version.Number
   127  	fakeUpdate := func(_ *state.Model, v version.Number) error {
   128  		ver = v
   129  		return nil
   130  	}
   131  
   132  	err := updateToolsAvailability(&modelGetter{}, fakeToolFinder, fakeUpdate)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  
   135  	c.Assert(ver, gc.Not(gc.Equals), version.Zero)
   136  	c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 2})
   137  }
   138  
   139  func (s *AgentToolsSuite) TestUpdateToolsAvailabilityNoMatches(c *gc.C) {
   140  	fakeNewEnvirons := func(*config.Config) (environs.Environ, error) {
   141  		return dummyEnviron{}, nil
   142  	}
   143  	s.PatchValue(&newEnvirons, fakeNewEnvirons)
   144  
   145  	fakeEnvConfig := func(_ *state.Model) (*config.Config, error) {
   146  		sConfig := coretesting.FakeConfig()
   147  		sConfig = sConfig.Merge(coretesting.Attrs{
   148  			"agent-version": "2.5.0",
   149  		})
   150  		return config.New(config.NoDefaults, sConfig)
   151  	}
   152  	s.PatchValue(&envConfig, fakeEnvConfig)
   153  
   154  	// No new tools available.
   155  	fakeToolFinder := func(_ environs.Environ, _ int, _ int, _ string, _ coretools.Filter) (coretools.List, error) {
   156  		return nil, errors.NotFoundf("tools")
   157  	}
   158  
   159  	// Update should never be called.
   160  	fakeUpdate := func(_ *state.Model, v version.Number) error {
   161  		c.Fail()
   162  		return nil
   163  	}
   164  
   165  	err := updateToolsAvailability(&modelGetter{}, fakeToolFinder, fakeUpdate)
   166  	c.Assert(err, jc.ErrorIsNil)
   167  }