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 }