github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/servant/config/config_test.go (about) 1 package config 2 3 import ( 4 "strings" 5 "testing" 6 ) 7 8 func generateTestConfig() *ServantConfig { 9 c := new(ServantConfig) 10 c.Sys.BindAddress = `0.0.0.0` 11 c.Sys.BindPort = 0 12 c.Job.HeartbeatSpanSec = 1 13 c.Job.MultiProc = 1 14 c.Job.DockerCommandPath = `/usr/bin/docker` 15 c.Job.DisuseJoblog = 1 16 c.Dir.JobDir = `.\jobscript` 17 c.Dir.JoblogDir = `.\joblog` 18 c.Dir.LogDir = `.\log` 19 c.Log.OutputLevel = `info` 20 c.Log.MaxSizeKB = 1 21 c.Log.MaxGeneration = 1 22 return c 23 } 24 25 func TestReadConfig_設定ファイルが開けない場合はデフォルト値をセットする(t *testing.T) { 26 RootPath = `C:\cuto` 27 FilePath = `noexistsfilepath` 28 ReadConfig("") 29 30 if Servant.Sys.BindAddress != defaultBindAddress { 31 t.Errorf("bind_addressの設定値[%s]が想定と違っている。", Servant.Sys.BindAddress) 32 } 33 if Servant.Sys.BindPort != defaultBindPort { 34 t.Errorf("bind_portの設定値[%d]が想定と違っている。", Servant.Sys.BindPort) 35 } 36 if Servant.Job.HeartbeatSpanSec != defaultHeartbeatSpanSec { 37 t.Errorf("heartbeat_span_secの設定値[%d]が想定と違っている。", Servant.Job.HeartbeatSpanSec) 38 } 39 if Servant.Job.MultiProc != defaultMultiProc { 40 t.Errorf("multi_procの設定値[%d]が想定と違っている。", Servant.Job.MultiProc) 41 } 42 if Servant.Job.DockerCommandPath != defaultDockerCommandPath { 43 t.Errorf("docker_command_pathの設定値[%s]が想定と違っている。", Servant.Job.DockerCommandPath) 44 } 45 if Servant.Job.DisuseJoblog != defaultDisuseJoblog { 46 t.Errorf("disuse_joblog[%d]が想定と違っている。", Servant.Job.DisuseJoblog) 47 } 48 if !strings.HasSuffix(Servant.Dir.JobDir, defaultJobDir) { 49 t.Errorf("job_dirの設定値[%s]が想定と違っている。", Servant.Dir.JobDir) 50 } 51 if !strings.HasSuffix(Servant.Dir.JoblogDir, defaultJoblogDir) { 52 t.Errorf("joblog_dirの設定値[%s]が想定と違っている。", Servant.Dir.JoblogDir) 53 } 54 if !strings.HasSuffix(Servant.Dir.LogDir, defaultLogDir) { 55 t.Errorf("log_dirの設定値[%s]が想定と違っている。", Servant.Dir.LogDir) 56 } 57 if Servant.Log.OutputLevel != defaultOutputLevel { 58 t.Errorf("output_levelの設定値[%s]が想定と違っている。", Servant.Log.OutputLevel) 59 } 60 if Servant.Log.MaxSizeKB != defaultMaxSizeKB { 61 t.Errorf("max_size_kbの設定値[%d]が想定と違っている。", Servant.Log.MaxSizeKB) 62 } 63 if Servant.Log.MaxGeneration != defaultMaxGeneration { 64 t.Errorf("max_generationの設定値[%d]が想定と違っている。", Servant.Log.MaxGeneration) 65 } 66 } 67 68 func TestLoadReader_Readerから設定値を取得できる(t *testing.T) { 69 conf := ` 70 [sys] 71 bind_address='0.0.0.0' 72 bind_port=2015 73 74 [job] 75 multi_proc=20 76 heartbeat_span_sec=30 77 docker_command_path='/usr/bin/docker' 78 disuse_joblog=1 79 80 [dir] 81 joblog_dir='.\joblog' 82 job_dir='.\jobscript' 83 log_dir='.\log' 84 85 [log] 86 output_level='info' 87 max_size_kb=10240 88 max_generation=2 89 ` 90 91 r := strings.NewReader(conf) 92 cfg, err := loadReader(r) 93 if err != nil { 94 t.Fatalf("想定外のエラーが発生した[%s]", err) 95 } 96 97 if cfg.Sys.BindAddress != `0.0.0.0` { 98 t.Errorf("bind_addressの値[%s]が想定と違っている。", cfg.Sys.BindAddress) 99 } 100 if cfg.Sys.BindPort != 2015 { 101 t.Errorf("bind_portの値[%d]が想定と違っている。", cfg.Sys.BindPort) 102 } 103 if cfg.Job.MultiProc != 20 { 104 t.Errorf("multi_procの値[%d]が想定と違っている。", cfg.Job.MultiProc) 105 } 106 if cfg.Job.HeartbeatSpanSec != 30 { 107 t.Errorf("heartbeat_span_sec[%d]が想定と違っている。", cfg.Job.HeartbeatSpanSec) 108 } 109 if cfg.Job.DockerCommandPath != `/usr/bin/docker` { 110 t.Errorf("docker_command_pathの設定値[%s]が想定と違っている。", cfg.Job.DockerCommandPath) 111 } 112 if cfg.Job.DisuseJoblog != 1 { 113 t.Errorf("disuse_joblog[%d]が想定と違っている。", cfg.Job.DisuseJoblog) 114 } 115 if cfg.Dir.JoblogDir != `.\joblog` { 116 t.Errorf("joblog_dirの値[%s]が想定と違っている。", cfg.Dir.JoblogDir) 117 } 118 if cfg.Dir.JobDir != `.\jobscript` { 119 t.Errorf("job_dirの値[%s]が想定と違っている。", cfg.Dir.JobDir) 120 } 121 if cfg.Dir.LogDir != `.\log` { 122 t.Errorf("log_dirの値[%s]が想定と違っている。", cfg.Dir.LogDir) 123 } 124 if cfg.Log.OutputLevel != `info` { 125 t.Errorf("output_levelの値[%s]が想定と違っている。", cfg.Log.OutputLevel) 126 } 127 if cfg.Log.MaxSizeKB != 10240 { 128 t.Errorf("max_size_kb[%d]は想定と違っている。", cfg.Log.MaxSizeKB) 129 } 130 if cfg.Log.MaxGeneration != 2 { 131 t.Errorf("max_generation[%d]は想定と違っている。", cfg.Log.MaxGeneration) 132 } 133 } 134 135 func TestLoadReader_CUTOROOTタグを展開できる(t *testing.T) { 136 conf := ` 137 [sys] 138 bind_address='0.0.0.0' 139 bind_port=2015 140 141 [job] 142 multi_proc=20 143 heartbeat_span_sec=30 144 docker_command_path='/usr/bin/docker' 145 disuse_joblog=1 146 147 [dir] 148 joblog_dir='<CUTOROOT>\joblog' 149 job_dir='<CUTOROOT>\jobscript' 150 log_dir='<CUTOROOT>\log' 151 152 [log] 153 output_level='info' 154 max_size_kb=10240 155 max_generation=2 156 ` 157 158 r := strings.NewReader(conf) 159 cfg, err := loadReader(r) 160 if err != nil { 161 t.Fatalf("想定外のエラーが発生した[%s]", err) 162 } 163 164 if cfg.Dir.JoblogDir == `<CUTOROOT>\joblog` { 165 t.Errorf("joblog_dir内のCUTOROOTタグが展開されていない。") 166 } 167 if cfg.Dir.JobDir == `<CUTOROOT>\jobscript` { 168 t.Errorf("job_dir内のCUTOROOTタグが展開されていない。") 169 } 170 if cfg.Dir.LogDir == `<CUTOROOT>\log` { 171 t.Errorf("log_dir内のCUTOROOTタグが展開されていない。") 172 } 173 } 174 175 func TestLoadReader_tomlの書式に沿っていない場合はエラーが発生する(t *testing.T) { 176 conf := ` 177 [sys] 178 bind_address=0.0.0.0 179 bind_port=2015 180 181 [job] 182 multi_proc=20 183 heartbeat_span_sec=30 184 docker_command_path='/usr/bin/docker' 185 disuse_joblog=1 186 187 [dir] 188 joblog_dir='.\joblog' 189 job_dir='.\jobscript' 190 log_dir='.\log' 191 192 [log] 193 output_level='info' 194 max_size_kb=10240 195 max_generation=2 196 ` 197 198 r := strings.NewReader(conf) 199 _, err := loadReader(r) 200 if err == nil { 201 t.Error("エラーが発生しなかった") 202 } 203 } 204 205 func TestDetectError_設定値が正常な場合はエラーが発生しない(t *testing.T) { 206 c := generateTestConfig() 207 if err := c.DetectError(); err != nil { 208 t.Errorf("想定以外のエラーが発生した: %s", err) 209 } 210 } 211 212 func TestDetectError_設定値が正常な場合はエラーが発生しない_ポート番号最大値(t *testing.T) { 213 c := generateTestConfig() 214 c.Sys.BindPort = 65535 215 if err := c.DetectError(); err != nil { 216 t.Errorf("想定以外のエラーが発生した: %s", err) 217 } 218 } 219 220 func TestDetectError_デフォルトのポート番号が負の値の場合はエラー(t *testing.T) { 221 c := generateTestConfig() 222 c.Sys.BindPort = -1 223 if err := c.DetectError(); err == nil { 224 t.Error("エラーが発生しなかった。") 225 } 226 } 227 228 func TestDetectError_デフォルトのポート番号が65535を超える場合はエラー(t *testing.T) { 229 c := generateTestConfig() 230 c.Sys.BindPort = 65536 231 if err := c.DetectError(); err == nil { 232 t.Error("エラーが発生しなかった。") 233 } 234 } 235 236 func TestDetectError_ハートビートメッセージ送信間隔が0以下の場合はエラー(t *testing.T) { 237 c := generateTestConfig() 238 c.Job.HeartbeatSpanSec = 0 239 if err := c.DetectError(); err == nil { 240 t.Error("エラーが発生しなかった。") 241 } 242 } 243 244 func TestDetectError_ジョブ多重度が0以下の場合はエラー(t *testing.T) { 245 c := generateTestConfig() 246 c.Job.MultiProc = 0 247 if err := c.DetectError(); err == nil { 248 t.Error("エラーが発生しなかった。") 249 } 250 } 251 252 func TestDetectError_ログファイル最大サイズが0以下の場合はエラー(t *testing.T) { 253 c := generateTestConfig() 254 c.Log.MaxSizeKB = 0 255 if err := c.DetectError(); err == nil { 256 t.Error("エラーが発生しなかった。") 257 } 258 } 259 260 func TestDetectError_ログファイル最大世代数が0以下の場合はエラー(t *testing.T) { 261 c := generateTestConfig() 262 c.Log.MaxGeneration = 0 263 if err := c.DetectError(); err == nil { 264 t.Error("エラーが発生しなかった。") 265 } 266 }