github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/metrics/spool/metrics_file_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package spool
     5  
     6  import (
     7  	"crypto/rand"
     8  	"fmt"
     9  	"io"
    10  	"io/ioutil"
    11  	"os"
    12  	"path/filepath"
    13  
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  )
    17  
    18  type metricFileSuite struct {
    19  	spoolDir string
    20  }
    21  
    22  var _ = gc.Suite(&metricFileSuite{})
    23  
    24  func (s *metricFileSuite) SetUpTest(c *gc.C) {
    25  	s.spoolDir = c.MkDir()
    26  }
    27  
    28  func cleanupFile(f *metricFile) {
    29  	if f != nil {
    30  		f.File.Close()
    31  	}
    32  }
    33  
    34  func (s *metricFileSuite) TestRenameOnClose(c *gc.C) {
    35  	fileName := filepath.Join(s.spoolDir, "foo")
    36  	mf, err := createMetricFile(fileName)
    37  	c.Assert(err, gc.IsNil)
    38  
    39  	_, err = io.CopyN(mf, rand.Reader, 78666)
    40  	c.Assert(err, gc.IsNil)
    41  
    42  	_, err = os.Stat(fileName)
    43  	c.Assert(os.IsNotExist(err), jc.IsTrue)
    44  
    45  	err = mf.Close()
    46  	c.Assert(err, gc.IsNil)
    47  
    48  	st, err := os.Stat(fileName)
    49  	c.Assert(err, gc.IsNil)
    50  	c.Assert(st.Size(), gc.Equals, int64(78666))
    51  }
    52  
    53  func (s *metricFileSuite) TestContention(c *gc.C) {
    54  	fileName := filepath.Join(s.spoolDir, "foo")
    55  	mf1, err := createMetricFile(fileName)
    56  	c.Assert(err, gc.IsNil)
    57  	mf2, err := createMetricFile(fileName)
    58  	c.Assert(err, gc.IsNil)
    59  
    60  	_, err = fmt.Fprint(mf1, "emacs")
    61  	c.Assert(err, gc.IsNil)
    62  	_, err = fmt.Fprint(mf2, "vi")
    63  	c.Assert(err, gc.IsNil)
    64  
    65  	_, err = os.Stat(fileName)
    66  	c.Assert(os.IsNotExist(err), jc.IsTrue)
    67  
    68  	err = mf2.Close()
    69  	c.Assert(err, gc.IsNil)
    70  	err = mf1.Close()
    71  	c.Assert(err, gc.NotNil)
    72  
    73  	st, err := os.Stat(fileName)
    74  	c.Assert(err, gc.IsNil)
    75  	c.Assert(st.Size(), gc.Equals, int64(2))
    76  	contents, err := ioutil.ReadFile(fileName)
    77  	c.Assert(err, gc.IsNil)
    78  	c.Assert(contents, gc.DeepEquals, []byte("vi"))
    79  }