github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/utils/syslog/config_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package syslog_test 5 6 import ( 7 "io/ioutil" 8 "path/filepath" 9 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/agent" 15 "github.com/juju/juju/utils/syslog" 16 syslogtesting "github.com/juju/juju/utils/syslog/testing" 17 ) 18 19 type syslogConfigSuite struct { 20 testing.IsolationSuite 21 configDir string 22 } 23 24 var _ = gc.Suite(&syslogConfigSuite{}) 25 26 func (s *syslogConfigSuite) SetUpTest(c *gc.C) { 27 s.IsolationSuite.SetUpTest(c) 28 s.configDir = c.MkDir() 29 } 30 31 func (s *syslogConfigSuite) assertRsyslogConfigPath(c *gc.C, slConfig *syslog.SyslogConfig) { 32 slConfig.ConfigDir = s.configDir 33 slConfig.ConfigFileName = "rsyslog.conf" 34 c.Assert(slConfig.ConfigFilePath(), gc.Equals, filepath.Join(s.configDir, "rsyslog.conf")) 35 } 36 37 func (s *syslogConfigSuite) assertRsyslogConfigContents(c *gc.C, slConfig *syslog.SyslogConfig, expectedConf string) { 38 data, err := slConfig.Render() 39 c.Assert(err, jc.ErrorIsNil) 40 if len(data) == 0 { 41 c.Fatal("got empty data from render") 42 } 43 d := string(data) 44 if d != expectedConf { 45 diff(c, d, expectedConf) 46 c.Fail() 47 } 48 } 49 50 func args() syslogtesting.TemplateArgs { 51 return syslogtesting.TemplateArgs{ 52 MachineTag: "some-machine", 53 LogDir: agent.DefaultLogDir, 54 DataDir: agent.DefaultDataDir, 55 Port: 8888, 56 Server: "server", 57 } 58 } 59 60 func cfg() *syslog.SyslogConfig { 61 return &syslog.SyslogConfig{ 62 LogFileName: "some-machine", 63 LogDir: agent.DefaultLogDir, 64 JujuConfigDir: agent.DefaultDataDir, 65 Port: 8888, 66 StateServerAddresses: []string{"server"}, 67 } 68 } 69 70 func (s *syslogConfigSuite) TestAccumulateConfigRender(c *gc.C) { 71 cfg := cfg() 72 syslog.NewAccumulateConfig(cfg) 73 s.assertRsyslogConfigContents( 74 c, 75 cfg, 76 syslogtesting.ExpectedAccumulateSyslogConf(c, args()), 77 ) 78 } 79 80 func (s *syslogConfigSuite) TestAccumulateConfigWrite(c *gc.C) { 81 syslogConfigRenderer := cfg() 82 syslog.NewAccumulateConfig(syslogConfigRenderer) 83 syslogConfigRenderer.ConfigDir = s.configDir 84 syslogConfigRenderer.ConfigFileName = "rsyslog.conf" 85 s.assertRsyslogConfigPath(c, syslogConfigRenderer) 86 err := syslogConfigRenderer.Write() 87 c.Assert(err, jc.ErrorIsNil) 88 syslogConfData, err := ioutil.ReadFile(syslogConfigRenderer.ConfigFilePath()) 89 c.Assert(err, jc.ErrorIsNil) 90 c.Assert( 91 string(syslogConfData), 92 gc.Equals, 93 syslogtesting.ExpectedAccumulateSyslogConf(c, args()), 94 ) 95 } 96 97 func (s *syslogConfigSuite) TestAccumulateConfigRenderWithNamespace(c *gc.C) { 98 cfg := cfg() 99 cfg.Namespace = "namespace" 100 cfg.JujuConfigDir = cfg.JujuConfigDir + "-" + cfg.Namespace 101 cfg.LogDir = cfg.LogDir + "-" + cfg.Namespace 102 103 args := args() 104 args.Namespace = "namespace" 105 syslog.NewAccumulateConfig(cfg) 106 s.assertRsyslogConfigContents( 107 c, 108 cfg, 109 syslogtesting.ExpectedAccumulateSyslogConf(c, args), 110 ) 111 } 112 113 func (s *syslogConfigSuite) TestForwardConfigRender(c *gc.C) { 114 cfg := cfg() 115 syslog.NewForwardConfig(cfg) 116 s.assertRsyslogConfigContents( 117 c, 118 cfg, 119 syslogtesting.ExpectedForwardSyslogConf(c, args()), 120 ) 121 } 122 123 func (s *syslogConfigSuite) TestForwardConfigRenderWithNamespace(c *gc.C) { 124 cfg := cfg() 125 cfg.Namespace = "namespace" 126 args := args() 127 args.Namespace = "namespace" 128 syslog.NewForwardConfig(cfg) 129 s.assertRsyslogConfigContents( 130 c, 131 cfg, 132 syslogtesting.ExpectedForwardSyslogConf(c, args), 133 ) 134 } 135 136 func (s *syslogConfigSuite) TestForwardConfigWrite(c *gc.C) { 137 syslogConfigRenderer := cfg() 138 syslogConfigRenderer.ConfigDir = s.configDir 139 syslogConfigRenderer.ConfigFileName = "rsyslog.conf" 140 syslog.NewForwardConfig(syslogConfigRenderer) 141 s.assertRsyslogConfigPath(c, syslogConfigRenderer) 142 err := syslogConfigRenderer.Write() 143 c.Assert(err, jc.ErrorIsNil) 144 syslogConfData, err := ioutil.ReadFile(syslogConfigRenderer.ConfigFilePath()) 145 c.Assert(err, jc.ErrorIsNil) 146 c.Assert( 147 string(syslogConfData), 148 gc.Equals, 149 syslogtesting.ExpectedForwardSyslogConf(c, args()), 150 ) 151 } 152 153 func diff(c *gc.C, got, exp string) { 154 expR := []rune(exp) 155 gotR := []rune(got) 156 for x := 0; x < len(expR); x++ { 157 if x >= len(gotR) { 158 c.Log("String obtained is truncated version of expected.") 159 c.Errorf("Expected: %s, got: %s", exp, got) 160 return 161 } 162 if expR[x] != gotR[x] { 163 c.Logf("Diff at offset %d", x) 164 gotDiff := string(gotR[x:min(x+50, len(gotR)-x)]) 165 expDiff := string(expR[x:min(x+50, len(expR)-x)]) 166 c.Logf("Diff at offset - obtained: %#v\nexpected: %#v", gotDiff, expDiff) 167 c.Assert(got, gc.Equals, exp) 168 return 169 } 170 } 171 } 172 173 func min(x, y int) int { 174 if x < y { 175 return x 176 } 177 return y 178 }