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