~themue/pyjuju/go-state-add-relation

« back to all changes in this revision

Viewing changes to environs/tools_test.go

  • Committer: Roger Peppe
  • Date: 2012-05-01 07:22:35 UTC
  • mfrom: (130.3.13 go-dummy-upload)
  • Revision ID: roger.peppe@canonical.com-20120501072235-whz9cxgoq1jrahab
juju: add code for building and uploading juju client

R=fwereade, niemeyer
CC=
https://codereview.appspot.com/6128046

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package environs_test
 
2
 
 
3
import (
 
4
        "fmt"
 
5
        "io"
 
6
        "io/ioutil"
 
7
        . "launchpad.net/gocheck"
 
8
        "launchpad.net/juju/go/environs"
 
9
        _ "launchpad.net/juju/go/environs/dummy"
 
10
        "launchpad.net/juju/go/version"
 
11
        "os"
 
12
        "os/exec"
 
13
        "path/filepath"
 
14
        "runtime"
 
15
)
 
16
 
 
17
type ToolsSuite struct{}
 
18
 
 
19
var envs *environs.Environs
 
20
 
 
21
const toolsConf = `
 
22
environments:
 
23
    foo:
 
24
        type: dummy
 
25
        zookeeper: false
 
26
`
 
27
 
 
28
func init() {
 
29
        var err error
 
30
        envs, err = environs.ReadEnvironsBytes([]byte(toolsConf))
 
31
        if err != nil {
 
32
                panic(err)
 
33
        }
 
34
}
 
35
 
 
36
var _ = Suite(&ToolsSuite{})
 
37
 
 
38
func (ToolsSuite) TestUploadTools(c *C) {
 
39
        env, err := envs.Open("")
 
40
        c.Assert(err, IsNil)
 
41
 
 
42
        err = environs.UploadTools(env)
 
43
        c.Assert(err, IsNil)
 
44
 
 
45
        name := fmt.Sprintf("tools/juju-%v-%s-%s.tgz", version.Current, runtime.GOOS, runtime.GOARCH)
 
46
        r, err := env.GetFile(name)
 
47
        c.Assert(err, IsNil)
 
48
 
 
49
        // Unarchive the tool executables into a temp directory.
 
50
        dir := c.MkDir()
 
51
        unarchive(c, dir, r)
 
52
 
 
53
        // Verify that each tool executes and produces some
 
54
        // characteristic output.
 
55
        for _, tool := range []string{"juju", "jujud"} {
 
56
                out, err := exec.Command(filepath.Join(dir, tool), "arble").CombinedOutput()
 
57
                if err != nil {
 
58
                        c.Assert(err, FitsTypeOf, (*exec.ExitError)(nil))
 
59
                }
 
60
                c.Check(string(out), Matches, fmt.Sprintf(`usage: %s (.|\n)*`, tool))
 
61
        }
 
62
}
 
63
 
 
64
// Test that the upload procedure fails correctly
 
65
// when the build process fails (because of a bad Go source
 
66
// file in this case).
 
67
func (ToolsSuite) TestUploadBadBuild(c *C) {
 
68
        gopath := c.MkDir()
 
69
        pkgdir := filepath.Join(gopath, "src", "launchpad.net", "juju", "go", "cmd", "broken")
 
70
        err := os.MkdirAll(pkgdir, 0777)
 
71
        c.Assert(err, IsNil)
 
72
 
 
73
        err = ioutil.WriteFile(filepath.Join(pkgdir, "broken.go"), []byte("nope"), 0666)
 
74
        c.Assert(err, IsNil)
 
75
 
 
76
        defer os.Setenv("GOPATH", os.Getenv("GOPATH"))
 
77
        os.Setenv("GOPATH", gopath)
 
78
 
 
79
        env, err := envs.Open("")
 
80
        c.Assert(err, IsNil)
 
81
 
 
82
        err = environs.UploadTools(env)
 
83
        c.Assert(err, ErrorMatches, `build failed: exit status 1; can't load package:(.|\n)*`)
 
84
}
 
85
 
 
86
func unarchive(c *C, dir string, r io.ReadCloser) {
 
87
        defer r.Close()
 
88
 
 
89
        // unarchive using actual tar command so we're
 
90
        // not just verifying the Go tar package against itself.
 
91
        cmd := exec.Command("tar", "xz")
 
92
        cmd.Dir = dir
 
93
        cmd.Stdin = r
 
94
        out, err := cmd.CombinedOutput()
 
95
        if err != nil {
 
96
                c.Logf("%s", out)
 
97
                c.Fatalf("tar xz failed: %v", err)
 
98
        }
 
99
}