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 }