github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"github.com/juju/errors"
    15  	jc "github.com/juju/testing/checkers"
    16  	gc "gopkg.in/check.v1"
    17  )
    18  
    19  type metricFileSuite struct {
    20  	spoolDir string
    21  }
    22  
    23  var _ = gc.Suite(&metricFileSuite{})
    24  
    25  func (s *metricFileSuite) SetUpTest(c *gc.C) {
    26  	s.spoolDir = c.MkDir()
    27  }
    28  
    29  func (s *metricFileSuite) TestRenameOnClose(c *gc.C) {
    30  	fileName := filepath.Join(s.spoolDir, "foo")
    31  	mf, err := createMetricFile(fileName)
    32  	c.Assert(err, gc.IsNil)
    33  
    34  	_, err = io.CopyN(mf, rand.Reader, 78666)
    35  	c.Assert(err, gc.IsNil)
    36  
    37  	_, err = os.Stat(fileName)
    38  	c.Assert(os.IsNotExist(err), jc.IsTrue)
    39  
    40  	err = mf.Close()
    41  	c.Assert(err, gc.IsNil)
    42  
    43  	st, err := os.Stat(fileName)
    44  	c.Assert(err, gc.IsNil)
    45  	c.Assert(st.Size(), gc.Equals, int64(78666))
    46  }
    47  
    48  func (s *metricFileSuite) TestNoRenameOnError(c *gc.C) {
    49  	fileName := filepath.Join(s.spoolDir, "foo")
    50  	mf, err := createMetricFile(fileName)
    51  	c.Assert(err, gc.IsNil)
    52  
    53  	_, err = io.CopyN(mf, rand.Reader, 78666)
    54  	c.Assert(err, gc.IsNil)
    55  
    56  	_, err = os.Stat(fileName)
    57  	c.Assert(os.IsNotExist(err), jc.IsTrue)
    58  
    59  	mf.encodeErr = errors.New("error")
    60  	err = mf.Close()
    61  	c.Assert(err, gc.IsNil)
    62  
    63  	_, err = os.Stat(fileName)
    64  	c.Assert(os.IsNotExist(err), jc.IsTrue)
    65  }
    66  
    67  func (s *metricFileSuite) TestContention(c *gc.C) {
    68  	fileName := filepath.Join(s.spoolDir, "foo")
    69  	mf1, err := createMetricFile(fileName)
    70  	c.Assert(err, gc.IsNil)
    71  	mf2, err := createMetricFile(fileName)
    72  	c.Assert(err, gc.IsNil)
    73  
    74  	_, err = fmt.Fprint(mf1, "emacs")
    75  	c.Assert(err, gc.IsNil)
    76  	_, err = fmt.Fprint(mf2, "vi")
    77  	c.Assert(err, gc.IsNil)
    78  
    79  	_, err = os.Stat(fileName)
    80  	c.Assert(os.IsNotExist(err), jc.IsTrue)
    81  
    82  	err = mf2.Close()
    83  	c.Assert(err, gc.IsNil)
    84  	err = mf1.Close()
    85  	c.Assert(err, gc.NotNil)
    86  
    87  	st, err := os.Stat(fileName)
    88  	c.Assert(err, gc.IsNil)
    89  	c.Assert(st.Size(), gc.Equals, int64(2))
    90  	contents, err := ioutil.ReadFile(fileName)
    91  	c.Assert(err, gc.IsNil)
    92  	c.Assert(contents, gc.DeepEquals, []byte("vi"))
    93  }