github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/cmd/plugins/juju-metadata/toolsmetadata_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  	"bytes"
     8  	"fmt"
     9  	"path/filepath"
    10  	"regexp"
    11  	"strings"
    12  
    13  	"github.com/juju/loggo"
    14  	gc "launchpad.net/gocheck"
    15  
    16  	"github.com/juju/juju/cmd"
    17  	"github.com/juju/juju/cmd/envcmd"
    18  	"github.com/juju/juju/environs"
    19  	"github.com/juju/juju/environs/configstore"
    20  	envtesting "github.com/juju/juju/environs/testing"
    21  	"github.com/juju/juju/environs/tools"
    22  	toolstesting "github.com/juju/juju/environs/tools/testing"
    23  	"github.com/juju/juju/juju/osenv"
    24  	"github.com/juju/juju/provider/dummy"
    25  	coretesting "github.com/juju/juju/testing"
    26  	"github.com/juju/juju/version"
    27  )
    28  
    29  type ToolsMetadataSuite struct {
    30  	coretesting.FakeJujuHomeSuite
    31  	env              environs.Environ
    32  	publicStorageDir string
    33  }
    34  
    35  var _ = gc.Suite(&ToolsMetadataSuite{})
    36  
    37  func (s *ToolsMetadataSuite) SetUpTest(c *gc.C) {
    38  	s.FakeJujuHomeSuite.SetUpTest(c)
    39  	s.AddCleanup(func(*gc.C) {
    40  		dummy.Reset()
    41  		loggo.ResetLoggers()
    42  	})
    43  	env, err := environs.PrepareFromName("erewhemos", coretesting.Context(c), configstore.NewMem())
    44  	c.Assert(err, gc.IsNil)
    45  	s.env = env
    46  	envtesting.RemoveAllTools(c, s.env)
    47  	loggo.GetLogger("").SetLogLevel(loggo.INFO)
    48  
    49  	// Switch the default tools location.
    50  	s.publicStorageDir = c.MkDir()
    51  	s.PatchValue(&tools.DefaultBaseURL, s.publicStorageDir)
    52  }
    53  
    54  var currentVersionStrings = []string{
    55  	// only these ones will make it into the JSON files.
    56  	version.Current.Number.String() + "-quantal-amd64",
    57  	version.Current.Number.String() + "-quantal-armhf",
    58  	version.Current.Number.String() + "-quantal-i386",
    59  }
    60  
    61  var versionStrings = append([]string{
    62  	"1.12.0-precise-amd64",
    63  	"1.12.0-precise-i386",
    64  	"1.12.0-raring-amd64",
    65  	"1.12.0-raring-i386",
    66  	"1.13.0-precise-amd64",
    67  }, currentVersionStrings...)
    68  
    69  var expectedOutputCommon = makeExpectedOutputCommon()
    70  
    71  func makeExpectedOutputCommon() string {
    72  	expected := `Finding tools in .*
    73  .*Fetching tools to generate hash: 1\.12\.0-precise-amd64
    74  .*Fetching tools to generate hash: 1\.12\.0-precise-i386
    75  .*Fetching tools to generate hash: 1\.12\.0-raring-amd64
    76  .*Fetching tools to generate hash: 1\.12\.0-raring-i386
    77  .*Fetching tools to generate hash: 1\.13\.0-precise-amd64
    78  `
    79  	f := ".*Fetching tools to generate hash: %s\n"
    80  	for _, v := range currentVersionStrings {
    81  		expected += fmt.Sprintf(f, regexp.QuoteMeta(v))
    82  	}
    83  	return strings.TrimSpace(expected)
    84  }
    85  
    86  var expectedOutputDirectory = expectedOutputCommon + `
    87  .*Writing tools/streams/v1/index\.json
    88  .*Writing tools/streams/v1/com\.ubuntu\.juju:released:tools\.json
    89  `
    90  var expectedOutputMirrors = expectedOutputCommon + `
    91  .*Writing tools/streams/v1/index\.json
    92  .*Writing tools/streams/v1/com\.ubuntu\.juju:released:tools\.json
    93  .*Writing tools/streams/v1/mirrors\.json
    94  `
    95  
    96  func (s *ToolsMetadataSuite) TestGenerateDefaultDirectory(c *gc.C) {
    97  	metadataDir := osenv.JujuHome() // default metadata dir
    98  	toolstesting.MakeTools(c, metadataDir, "releases", versionStrings)
    99  	ctx := coretesting.Context(c)
   100  	code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, nil)
   101  	c.Assert(code, gc.Equals, 0)
   102  	output := ctx.Stdout.(*bytes.Buffer).String()
   103  	c.Assert(output, gc.Matches, expectedOutputDirectory)
   104  	metadata := toolstesting.ParseMetadataFromDir(c, metadataDir, false)
   105  	c.Assert(metadata, gc.HasLen, len(versionStrings))
   106  	obtainedVersionStrings := make([]string, len(versionStrings))
   107  	for i, metadata := range metadata {
   108  		s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch)
   109  		obtainedVersionStrings[i] = s
   110  	}
   111  	c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings)
   112  }
   113  
   114  func (s *ToolsMetadataSuite) TestGenerateDirectory(c *gc.C) {
   115  	metadataDir := c.MkDir()
   116  	toolstesting.MakeTools(c, metadataDir, "releases", versionStrings)
   117  	ctx := coretesting.Context(c)
   118  	code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, []string{"-d", metadataDir})
   119  	c.Assert(code, gc.Equals, 0)
   120  	output := ctx.Stdout.(*bytes.Buffer).String()
   121  	c.Assert(output, gc.Matches, expectedOutputDirectory)
   122  	metadata := toolstesting.ParseMetadataFromDir(c, metadataDir, false)
   123  	c.Assert(metadata, gc.HasLen, len(versionStrings))
   124  	obtainedVersionStrings := make([]string, len(versionStrings))
   125  	for i, metadata := range metadata {
   126  		s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch)
   127  		obtainedVersionStrings[i] = s
   128  	}
   129  	c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings)
   130  }
   131  
   132  func (s *ToolsMetadataSuite) TestGenerateWithPublicFallback(c *gc.C) {
   133  	// Write tools and metadata to the public tools location.
   134  	toolstesting.MakeToolsWithCheckSum(c, s.publicStorageDir, "releases", versionStrings)
   135  
   136  	// Run the command with no local metadata.
   137  	ctx := coretesting.Context(c)
   138  	metadataDir := c.MkDir()
   139  	code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, []string{"-d", metadataDir})
   140  	c.Assert(code, gc.Equals, 0)
   141  	metadata := toolstesting.ParseMetadataFromDir(c, metadataDir, false)
   142  	c.Assert(metadata, gc.HasLen, len(versionStrings))
   143  	obtainedVersionStrings := make([]string, len(versionStrings))
   144  	for i, metadata := range metadata {
   145  		s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch)
   146  		obtainedVersionStrings[i] = s
   147  	}
   148  	c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings)
   149  }
   150  
   151  func (s *ToolsMetadataSuite) TestGenerateWithMirrors(c *gc.C) {
   152  	metadataDir := c.MkDir()
   153  	toolstesting.MakeTools(c, metadataDir, "releases", versionStrings)
   154  	ctx := coretesting.Context(c)
   155  	code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, []string{"--public", "-d", metadataDir})
   156  	c.Assert(code, gc.Equals, 0)
   157  	output := ctx.Stdout.(*bytes.Buffer).String()
   158  	c.Assert(output, gc.Matches, expectedOutputMirrors)
   159  	metadata := toolstesting.ParseMetadataFromDir(c, metadataDir, true)
   160  	c.Assert(metadata, gc.HasLen, len(versionStrings))
   161  	obtainedVersionStrings := make([]string, len(versionStrings))
   162  	for i, metadata := range metadata {
   163  		s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch)
   164  		obtainedVersionStrings[i] = s
   165  	}
   166  	c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings)
   167  }
   168  
   169  func (s *ToolsMetadataSuite) TestNoTools(c *gc.C) {
   170  	ctx := coretesting.Context(c)
   171  	code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, nil)
   172  	c.Assert(code, gc.Equals, 1)
   173  	stdout := ctx.Stdout.(*bytes.Buffer).String()
   174  	c.Assert(stdout, gc.Matches, "Finding tools in .*\n")
   175  	stderr := ctx.Stderr.(*bytes.Buffer).String()
   176  	c.Assert(stderr, gc.Matches, "error: no tools available\n")
   177  }
   178  
   179  func (s *ToolsMetadataSuite) TestPatchLevels(c *gc.C) {
   180  	currentVersion := version.Current.Number
   181  	currentVersion.Build = 0
   182  	versionStrings := []string{
   183  		currentVersion.String() + "-precise-amd64",
   184  		currentVersion.String() + ".1-precise-amd64",
   185  	}
   186  	metadataDir := osenv.JujuHome() // default metadata dir
   187  	toolstesting.MakeTools(c, metadataDir, "releases", versionStrings)
   188  	ctx := coretesting.Context(c)
   189  	code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, nil)
   190  	c.Assert(code, gc.Equals, 0)
   191  	output := ctx.Stdout.(*bytes.Buffer).String()
   192  	expectedOutput := fmt.Sprintf(`
   193  Finding tools in .*
   194  .*Fetching tools to generate hash: %s
   195  .*Fetching tools to generate hash: %s
   196  .*Writing tools/streams/v1/index\.json
   197  .*Writing tools/streams/v1/com\.ubuntu\.juju:released:tools\.json
   198  `[1:], regexp.QuoteMeta(versionStrings[0]), regexp.QuoteMeta(versionStrings[1]))
   199  	c.Assert(output, gc.Matches, expectedOutput)
   200  	metadata := toolstesting.ParseMetadataFromDir(c, metadataDir, false)
   201  	c.Assert(metadata, gc.HasLen, 2)
   202  
   203  	filename := fmt.Sprintf("juju-%s-precise-amd64.tgz", currentVersion)
   204  	size, sha256 := toolstesting.SHA256sum(c, filepath.Join(metadataDir, "tools", "releases", filename))
   205  	c.Assert(metadata[0], gc.DeepEquals, &tools.ToolsMetadata{
   206  		Release:  "precise",
   207  		Version:  currentVersion.String(),
   208  		Arch:     "amd64",
   209  		Size:     size,
   210  		Path:     "releases/" + filename,
   211  		FileType: "tar.gz",
   212  		SHA256:   sha256,
   213  	})
   214  
   215  	filename = fmt.Sprintf("juju-%s.1-precise-amd64.tgz", currentVersion)
   216  	size, sha256 = toolstesting.SHA256sum(c, filepath.Join(metadataDir, "tools", "releases", filename))
   217  	c.Assert(metadata[1], gc.DeepEquals, &tools.ToolsMetadata{
   218  		Release:  "precise",
   219  		Version:  currentVersion.String() + ".1",
   220  		Arch:     "amd64",
   221  		Size:     size,
   222  		Path:     "releases/" + filename,
   223  		FileType: "tar.gz",
   224  		SHA256:   sha256,
   225  	})
   226  }