launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/uniter/charm/git_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charm_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  
    12  	"launchpad.net/errgo/errors"
    13  	gc "launchpad.net/gocheck"
    14  
    15  	corecharm "launchpad.net/juju-core/charm"
    16  	"launchpad.net/juju-core/testing"
    17  	jc "launchpad.net/juju-core/testing/checkers"
    18  	"launchpad.net/juju-core/testing/testbase"
    19  	"launchpad.net/juju-core/worker/uniter/charm"
    20  )
    21  
    22  var curl = corecharm.MustParseURL("cs:series/blah-blah-123")
    23  
    24  type GitDirSuite struct {
    25  	testing.GitSuite
    26  	LoggingSuite testbase.LoggingSuite
    27  }
    28  
    29  var _ = gc.Suite(&GitDirSuite{})
    30  
    31  func (s *GitDirSuite) SetUpTest(c *gc.C) {
    32  	s.GitSuite.SetUpTest(c)
    33  	s.LoggingSuite.SetUpTest(c)
    34  	s.LoggingSuite.PatchEnvironment("LC_ALL", "en_US")
    35  }
    36  
    37  func (s *GitDirSuite) TearDownTest(c *gc.C) {
    38  	s.LoggingSuite.TearDownTest(c)
    39  	s.GitSuite.TearDownTest(c)
    40  }
    41  
    42  func (s *GitDirSuite) TestInitConfig(c *gc.C) {
    43  	base := c.MkDir()
    44  	repo := charm.NewGitDir(filepath.Join(base, "repo"))
    45  	err := repo.Init()
    46  	c.Assert(err, gc.IsNil)
    47  
    48  	cmd := exec.Command("git", "config", "--list", "--local")
    49  	cmd.Dir = repo.Path()
    50  	out, err := cmd.Output()
    51  	c.Assert(err, gc.IsNil)
    52  	outstr := string(out)
    53  	c.Assert(outstr, jc.Contains, "user.email=juju@localhost")
    54  	c.Assert(outstr, jc.Contains, "user.name=juju")
    55  }
    56  
    57  func (s *GitDirSuite) TestCreate(c *gc.C) {
    58  	base := c.MkDir()
    59  	repo := charm.NewGitDir(filepath.Join(base, "repo"))
    60  	exists, err := repo.Exists()
    61  	c.Assert(err, gc.IsNil)
    62  	c.Assert(exists, jc.IsFalse)
    63  
    64  	err = ioutil.WriteFile(repo.Path(), nil, 0644)
    65  	c.Assert(err, gc.IsNil)
    66  	_, err = repo.Exists()
    67  	c.Assert(err, gc.ErrorMatches, `".*/repo" is not a directory`)
    68  	err = os.Remove(repo.Path())
    69  	c.Assert(err, gc.IsNil)
    70  
    71  	err = os.Chmod(base, 0555)
    72  	c.Assert(err, gc.IsNil)
    73  	defer os.Chmod(base, 0755)
    74  	err = repo.Init()
    75  	c.Assert(err, gc.ErrorMatches, ".* permission denied")
    76  	exists, err = repo.Exists()
    77  	c.Assert(err, gc.IsNil)
    78  	c.Assert(exists, jc.IsFalse)
    79  
    80  	err = os.Chmod(base, 0755)
    81  	c.Assert(err, gc.IsNil)
    82  	err = repo.Init()
    83  	c.Assert(err, gc.IsNil)
    84  	exists, err = repo.Exists()
    85  	c.Assert(err, gc.IsNil)
    86  	c.Assert(exists, jc.IsTrue)
    87  
    88  	_, err = charm.ReadCharmURL(repo)
    89  	c.Assert(errors.Cause(err), jc.Satisfies, os.IsNotExist)
    90  
    91  	err = repo.Init()
    92  	c.Assert(err, gc.IsNil)
    93  }
    94  
    95  func (s *GitDirSuite) TestAddCommitPullRevert(c *gc.C) {
    96  	target := charm.NewGitDir(c.MkDir())
    97  	err := target.Init()
    98  	c.Assert(err, gc.IsNil)
    99  	err = ioutil.WriteFile(filepath.Join(target.Path(), "initial"), []byte("initial"), 0644)
   100  	c.Assert(err, gc.IsNil)
   101  	err = charm.WriteCharmURL(target, curl)
   102  	c.Assert(err, gc.IsNil)
   103  	err = target.AddAll()
   104  	c.Assert(err, gc.IsNil)
   105  	dirty, err := target.Dirty()
   106  	c.Assert(err, gc.IsNil)
   107  	c.Assert(dirty, jc.IsTrue)
   108  	err = target.Commitf("initial")
   109  	c.Assert(err, gc.IsNil)
   110  	dirty, err = target.Dirty()
   111  	c.Assert(err, gc.IsNil)
   112  	c.Assert(dirty, jc.IsFalse)
   113  
   114  	source := newRepo(c)
   115  	err = target.Pull(source)
   116  	c.Assert(err, gc.IsNil)
   117  	url, err := charm.ReadCharmURL(target)
   118  	c.Assert(err, gc.IsNil)
   119  	c.Assert(url, gc.DeepEquals, curl)
   120  	fi, err := os.Stat(filepath.Join(target.Path(), "some-dir"))
   121  	c.Assert(err, gc.IsNil)
   122  	c.Assert(fi, jc.Satisfies, os.FileInfo.IsDir)
   123  	data, err := ioutil.ReadFile(filepath.Join(target.Path(), "some-file"))
   124  	c.Assert(err, gc.IsNil)
   125  	c.Assert(string(data), gc.Equals, "hello")
   126  	dirty, err = target.Dirty()
   127  	c.Assert(err, gc.IsNil)
   128  	c.Assert(dirty, jc.IsFalse)
   129  
   130  	err = ioutil.WriteFile(filepath.Join(target.Path(), "another-file"), []byte("blah"), 0644)
   131  	c.Assert(err, gc.IsNil)
   132  	dirty, err = target.Dirty()
   133  	c.Assert(err, gc.IsNil)
   134  	c.Assert(dirty, jc.IsTrue)
   135  	err = source.AddAll()
   136  	c.Assert(err, gc.IsNil)
   137  	dirty, err = target.Dirty()
   138  	c.Assert(err, gc.IsNil)
   139  	c.Assert(dirty, jc.IsTrue)
   140  
   141  	err = target.Revert()
   142  	c.Assert(err, gc.IsNil)
   143  	_, err = os.Stat(filepath.Join(target.Path(), "some-file"))
   144  	c.Assert(err, jc.Satisfies, os.IsNotExist)
   145  	_, err = os.Stat(filepath.Join(target.Path(), "some-dir"))
   146  	c.Assert(err, jc.Satisfies, os.IsNotExist)
   147  	data, err = ioutil.ReadFile(filepath.Join(target.Path(), "initial"))
   148  	c.Assert(err, gc.IsNil)
   149  	c.Assert(string(data), gc.Equals, "initial")
   150  	dirty, err = target.Dirty()
   151  	c.Assert(err, gc.IsNil)
   152  	c.Assert(dirty, jc.IsFalse)
   153  }
   154  
   155  func (s *GitDirSuite) TestClone(c *gc.C) {
   156  	repo, err := newRepo(c).Clone(c.MkDir())
   157  	c.Assert(err, gc.IsNil)
   158  	_, err = os.Stat(filepath.Join(repo.Path(), "some-file"))
   159  	c.Assert(err, jc.Satisfies, os.IsNotExist)
   160  	_, err = os.Stat(filepath.Join(repo.Path(), "some-dir"))
   161  	c.Assert(err, jc.Satisfies, os.IsNotExist)
   162  	dirty, err := repo.Dirty()
   163  	c.Assert(err, gc.IsNil)
   164  	c.Assert(dirty, jc.IsTrue)
   165  
   166  	err = repo.AddAll()
   167  	c.Assert(err, gc.IsNil)
   168  	dirty, err = repo.Dirty()
   169  	c.Assert(err, gc.IsNil)
   170  	c.Assert(dirty, jc.IsTrue)
   171  	err = repo.Commitf("blank overwrite")
   172  	c.Assert(err, gc.IsNil)
   173  	dirty, err = repo.Dirty()
   174  	c.Assert(err, gc.IsNil)
   175  	c.Assert(dirty, jc.IsFalse)
   176  
   177  	lines, err := repo.Log()
   178  	c.Assert(err, gc.IsNil)
   179  	c.Assert(lines, gc.HasLen, 2)
   180  	c.Assert(lines[0], gc.Matches, "[a-f0-9]{7} blank overwrite")
   181  	c.Assert(lines[1], gc.Matches, "[a-f0-9]{7} im in ur repo committin ur files")
   182  }
   183  
   184  func (s *GitDirSuite) TestConflictRevert(c *gc.C) {
   185  	source := newRepo(c)
   186  	updated, err := source.Clone(c.MkDir())
   187  	c.Assert(err, gc.IsNil)
   188  	err = ioutil.WriteFile(filepath.Join(updated.Path(), "some-dir"), []byte("hello"), 0644)
   189  	c.Assert(err, gc.IsNil)
   190  	err = updated.Snapshotf("potential conflict src")
   191  	c.Assert(err, gc.IsNil)
   192  	conflicted, err := updated.Conflicted()
   193  	c.Assert(err, gc.IsNil)
   194  	c.Assert(conflicted, jc.IsFalse)
   195  
   196  	target := charm.NewGitDir(c.MkDir())
   197  	err = target.Init()
   198  	c.Assert(err, gc.IsNil)
   199  	err = target.Pull(source)
   200  	c.Assert(err, gc.IsNil)
   201  	err = ioutil.WriteFile(filepath.Join(target.Path(), "some-dir", "conflicting-file"), []byte("hello"), 0644)
   202  	c.Assert(err, gc.IsNil)
   203  	err = target.Snapshotf("potential conflict dst")
   204  	c.Assert(err, gc.IsNil)
   205  	conflicted, err = target.Conflicted()
   206  	c.Assert(err, gc.IsNil)
   207  	c.Assert(conflicted, jc.IsFalse)
   208  
   209  	err = target.Pull(updated)
   210  	c.Assert(errors.Cause(err), gc.Equals, charm.ErrConflict)
   211  	conflicted, err = target.Conflicted()
   212  	c.Assert(err, gc.IsNil)
   213  	c.Assert(conflicted, jc.IsTrue)
   214  	dirty, err := target.Dirty()
   215  	c.Assert(err, gc.IsNil)
   216  	c.Assert(dirty, jc.IsTrue)
   217  
   218  	err = target.Revert()
   219  	c.Assert(err, gc.IsNil)
   220  	conflicted, err = target.Conflicted()
   221  	c.Assert(err, gc.IsNil)
   222  	c.Assert(conflicted, jc.IsFalse)
   223  	dirty, err = target.Dirty()
   224  	c.Assert(err, gc.IsNil)
   225  	c.Assert(dirty, jc.IsFalse)
   226  }
   227  
   228  func newRepo(c *gc.C) *charm.GitDir {
   229  	repo := charm.NewGitDir(c.MkDir())
   230  	err := repo.Init()
   231  	c.Assert(err, gc.IsNil)
   232  	err = os.Mkdir(filepath.Join(repo.Path(), "some-dir"), 0755)
   233  	c.Assert(err, gc.IsNil)
   234  	err = ioutil.WriteFile(filepath.Join(repo.Path(), "some-file"), []byte("hello"), 0644)
   235  	c.Assert(err, gc.IsNil)
   236  	err = repo.AddAll()
   237  	c.Assert(err, gc.IsNil)
   238  	err = repo.Commitf("im in ur repo committin ur %s", "files")
   239  	c.Assert(err, gc.IsNil)
   240  	return repo
   241  }