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  }