github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/show/main_test.go (about)

     1  // Copyright 2015 unirita Inc.
     2  // Created 2015/04/10 shanxia
     3  
     4  package main
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  	"runtime"
    12  	"strings"
    13  	"syscall"
    14  	"testing"
    15  	"time"
    16  
    17  	"github.com/unirita/cuto/console"
    18  	"github.com/unirita/cuto/db"
    19  	"github.com/unirita/cuto/show/gen"
    20  	"github.com/unirita/cuto/testutil"
    21  )
    22  
    23  // テスト結果確認用の一時出力ファイル。
    24  const output_file string = "showtest.log"
    25  
    26  var (
    27  	confPath = setConfigPath()
    28  	confFile = setConfigFile()
    29  )
    30  var diffCommand = getDiff()
    31  
    32  func getDiff() string {
    33  	if runtime.GOOS == "windows" {
    34  		return "fc"
    35  	} else {
    36  		return "diff"
    37  	}
    38  }
    39  
    40  func setConfigPath() string {
    41  	return filepath.Join(testutil.GetBaseDir(), "show", "_testdata")
    42  }
    43  func setConfigFile() string {
    44  	return filepath.Join(confPath, "show_test.ini")
    45  }
    46  
    47  func init() {
    48  	time.Local = time.FixedZone("JST", 9*60*60)
    49  
    50  	os.Chdir(confPath) // 設定ファイル内を固定するため、作業フォルダを固定する。
    51  }
    52  
    53  func vefiry_stdout(output_file, vefiry_file string) error {
    54  	params := []string{output_file, vefiry_file}
    55  	cmd := exec.Command(diffCommand, params...)
    56  	err := cmd.Run()
    57  	if err != nil {
    58  		if e2, ok := err.(*exec.ExitError); ok {
    59  			if s, ok := e2.Sys().(syscall.WaitStatus); ok {
    60  				return fmt.Errorf("不正な戻り値[%v]が返りました。", s.ExitStatus())
    61  			} else {
    62  				return fmt.Errorf("不正な結果です。")
    63  			}
    64  		} else {
    65  			return fmt.Errorf("不正な結果です。")
    66  		}
    67  	}
    68  	return nil
    69  }
    70  
    71  func TestRealMain_1日分のジョブネットを表示(t *testing.T) {
    72  	vefiry_file := "showtest_verify1.txt"
    73  	arg := &arguments{
    74  		jobnet: "",
    75  		from:   "20150415",
    76  		to:     "20150415",
    77  		status: "",
    78  		format: "",
    79  		config: confFile,
    80  		isUTC:  true,
    81  	}
    82  	ce := testutil.NewStderrCapturer()
    83  	ce.Start()
    84  	co := testutil.NewStdoutCapturer()
    85  	co.Start()
    86  
    87  	ret := realMain(arg)
    88  	if ret != rc_OK {
    89  		t.Errorf("戻り値[%v]が返るはずが、[%v]が返りました。", rc_OK, ret)
    90  	}
    91  	cout := co.Stop()
    92  	cerr := ce.Stop()
    93  	if len(cerr) > 0 {
    94  		t.Errorf("エラーが出力されています。 - %v", cerr)
    95  	}
    96  	if _, exist := os.Stat(output_file); exist != nil {
    97  		os.Remove(output_file)
    98  	}
    99  	file, _ := os.OpenFile(output_file, os.O_CREATE|os.O_WRONLY, 0666)
   100  	file.WriteString(cout)
   101  	file.Close()
   102  
   103  	err := vefiry_stdout(output_file, vefiry_file)
   104  	if err != nil {
   105  		t.Errorf("不正な出力結果です。 - %v", err)
   106  	}
   107  }
   108  
   109  func TestRealMain_0件のジョブネットを表示(t *testing.T) {
   110  	arg := &arguments{
   111  		jobnet: "JNET",
   112  		from:   "",
   113  		to:     "",
   114  		status: "normal",
   115  		format: "csv",
   116  		config: confFile,
   117  	}
   118  	ce := testutil.NewStderrCapturer()
   119  	ce.Start()
   120  	co := testutil.NewStdoutCapturer()
   121  	co.Start()
   122  
   123  	ret := realMain(arg)
   124  	if ret != rc_NOTHING {
   125  		t.Errorf("戻り値[%v]が返るはずが、[%v]が返りました。", rc_NOTHING, ret)
   126  	}
   127  	cout := co.Stop()
   128  	cerr := ce.Stop()
   129  	if len(cerr) > 0 {
   130  		t.Errorf("エラーが出力されています。 - %v", cerr)
   131  	}
   132  	if len(cout) > 0 {
   133  		t.Errorf("出力されないはずが、何か出力されました。 - %v", cout)
   134  	}
   135  }
   136  
   137  func TestRealMain_ヘルプを表示(t *testing.T) {
   138  	arg := &arguments{
   139  		help:   true,
   140  		jobnet: "",
   141  		from:   "20150416",
   142  		to:     "20150416",
   143  		status: "",
   144  		format: "",
   145  		config: confFile,
   146  	}
   147  	ce := testutil.NewStderrCapturer()
   148  	ce.Start()
   149  	co := testutil.NewStdoutCapturer()
   150  	co.Start()
   151  
   152  	ret := realMain(arg)
   153  	if ret != rc_OK {
   154  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_OK, ret)
   155  	}
   156  
   157  	cout := co.Stop()
   158  	cerr := ce.Stop()
   159  	if len(cout) > 0 {
   160  		t.Errorf("不正な標準出力が出力されています。 - %v", cout)
   161  	}
   162  	if cerr != console.USAGE_SHOW {
   163  		t.Errorf("stderrへの出力値[%s]が想定と違います。", cerr)
   164  	}
   165  }
   166  
   167  func TestRealMain_バージョン情報を表示(t *testing.T) {
   168  	arg := &arguments{
   169  		v:      true,
   170  		jobnet: "",
   171  		from:   "20150416",
   172  		to:     "20150416",
   173  		status: "",
   174  		format: "",
   175  		config: confFile,
   176  	}
   177  	ce := testutil.NewStderrCapturer()
   178  	ce.Start()
   179  	co := testutil.NewStdoutCapturer()
   180  	co.Start()
   181  
   182  	ret := realMain(arg)
   183  	if ret != rc_OK {
   184  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_OK, ret)
   185  	}
   186  
   187  	cout := co.Stop()
   188  	cerr := ce.Stop()
   189  	if len(cout) > 0 {
   190  		t.Errorf("不正な標準出力が出力されています。 - %v", cout)
   191  	}
   192  	if !strings.Contains(cerr, Version) {
   193  		t.Errorf("stderrへの出力値[%s]が想定と違います。", cerr)
   194  	}
   195  }
   196  
   197  func TestRealMain_不正なFROM(t *testing.T) {
   198  	arg := &arguments{
   199  		jobnet: "",
   200  		from:   "20150416X",
   201  		to:     "20150416",
   202  		status: "",
   203  		format: "",
   204  		config: confFile,
   205  	}
   206  	ce := testutil.NewStderrCapturer()
   207  	ce.Start()
   208  	co := testutil.NewStdoutCapturer()
   209  	co.Start()
   210  
   211  	ret := realMain(arg)
   212  	if ret != rc_PARMERR {
   213  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret)
   214  	}
   215  
   216  	cout := co.Stop()
   217  	cerr := ce.Stop()
   218  	if len(cout) > 0 {
   219  		t.Errorf("不正な標準出力です。 - %v", cout)
   220  	}
   221  	if !strings.Contains(cerr, console.USAGE_SHOW) {
   222  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   223  	}
   224  }
   225  
   226  func TestRealMain_不正なTO(t *testing.T) {
   227  	arg := &arguments{
   228  		jobnet: "",
   229  		from:   "20150416",
   230  		to:     "20150416X",
   231  		status: "",
   232  		format: "",
   233  		config: confFile,
   234  	}
   235  	ce := testutil.NewStderrCapturer()
   236  	ce.Start()
   237  	co := testutil.NewStdoutCapturer()
   238  	co.Start()
   239  
   240  	ret := realMain(arg)
   241  	if ret != rc_PARMERR {
   242  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret)
   243  	}
   244  
   245  	cout := co.Stop()
   246  	cerr := ce.Stop()
   247  	if len(cout) > 0 {
   248  		t.Errorf("不正な標準出力です。 - %v", cout)
   249  	}
   250  	if !strings.Contains(cerr, console.USAGE_SHOW) {
   251  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   252  	}
   253  }
   254  
   255  func TestRealMain_不正なStatus(t *testing.T) {
   256  	arg := &arguments{
   257  		jobnet: "",
   258  		from:   "20150416",
   259  		to:     "20150416",
   260  		status: "abc",
   261  		format: "",
   262  		config: confFile,
   263  	}
   264  	ce := testutil.NewStderrCapturer()
   265  	ce.Start()
   266  	co := testutil.NewStdoutCapturer()
   267  	co.Start()
   268  
   269  	ret := realMain(arg)
   270  	if ret != rc_PARMERR {
   271  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret)
   272  	}
   273  
   274  	cout := co.Stop()
   275  	cerr := ce.Stop()
   276  	if len(cout) > 0 {
   277  		t.Errorf("不正な標準出力です。 - %v", cout)
   278  	}
   279  	if !strings.Contains(cerr, console.USAGE_SHOW) {
   280  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   281  	}
   282  }
   283  
   284  func TestRealMain_不正なFormat(t *testing.T) {
   285  	arg := &arguments{
   286  		jobnet: "",
   287  		from:   "20150416",
   288  		to:     "20150416",
   289  		status: "",
   290  		format: "abc",
   291  		config: confFile,
   292  	}
   293  	ce := testutil.NewStderrCapturer()
   294  	ce.Start()
   295  	co := testutil.NewStdoutCapturer()
   296  	co.Start()
   297  
   298  	ret := realMain(arg)
   299  	if ret != rc_PARMERR {
   300  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret)
   301  	}
   302  
   303  	cout := co.Stop()
   304  	cerr := ce.Stop()
   305  	if len(cout) > 0 {
   306  		t.Errorf("不正な標準出力です。 - %v", cout)
   307  	}
   308  	if !strings.Contains(cerr, console.USAGE_SHOW) {
   309  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   310  	}
   311  }
   312  
   313  func TestRealMain_不正な設定ファイル(t *testing.T) {
   314  	arg := &arguments{
   315  		jobnet: "",
   316  		from:   "20150416",
   317  		to:     "20150416",
   318  		status: "",
   319  		format: "",
   320  		config: "error.ini",
   321  	}
   322  	ce := testutil.NewStderrCapturer()
   323  	ce.Start()
   324  	co := testutil.NewStdoutCapturer()
   325  	co.Start()
   326  
   327  	ret := realMain(arg)
   328  	if ret != rc_PARMERR {
   329  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret)
   330  	}
   331  
   332  	cout := co.Stop()
   333  	cerr := ce.Stop()
   334  	if len(cout) > 0 {
   335  		t.Errorf("不正な標準出力です。 - %v", cout)
   336  	}
   337  	if !strings.Contains(cerr, "error.ini") {
   338  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   339  	}
   340  }
   341  
   342  func TestRealMain_RuntimeErrorX(t *testing.T) {
   343  	arg := &arguments{
   344  		jobnet: "",
   345  		from:   "20150414",
   346  		to:     "20150416",
   347  		status: "",
   348  		format: "",
   349  		config: filepath.Join(confPath, "show_testX.ini"),
   350  	}
   351  	ce := testutil.NewStderrCapturer()
   352  	ce.Start()
   353  	co := testutil.NewStdoutCapturer()
   354  	co.Start()
   355  
   356  	ret := realMain(arg)
   357  	if ret != rc_ERROR {
   358  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_ERROR, ret)
   359  	}
   360  
   361  	cout := co.Stop()
   362  	cerr := ce.Stop()
   363  	if len(cout) > 0 {
   364  		t.Errorf("不正な標準出力です。 - %v", cout)
   365  	}
   366  	if !strings.Contains(cerr, "AN INTERNAL ERROR OCCURRED.") {
   367  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   368  	}
   369  }
   370  
   371  func TestRealMain_RuntimeErrorY(t *testing.T) {
   372  	arg := &arguments{
   373  		jobnet: "",
   374  		from:   "20150414",
   375  		to:     "20150416",
   376  		status: "",
   377  		format: "",
   378  		config: filepath.Join(confPath, "show_testY.ini"),
   379  	}
   380  	ce := testutil.NewStderrCapturer()
   381  	ce.Start()
   382  	co := testutil.NewStdoutCapturer()
   383  	co.Start()
   384  
   385  	ret := realMain(arg)
   386  	if ret != rc_ERROR {
   387  		t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_ERROR, ret)
   388  	}
   389  
   390  	cout := co.Stop()
   391  	cerr := ce.Stop()
   392  	if len(cout) > 0 {
   393  		t.Errorf("不正な標準出力です。 - %v", cout)
   394  	}
   395  	if !strings.Contains(cerr, "AN INTERNAL ERROR OCCURRED.") {
   396  		t.Errorf("不正な標準エラー出力です。 - %v", cerr)
   397  	}
   398  }
   399  
   400  func TestGetStatusType_指定毎に返るステータスを確認(t *testing.T) {
   401  	s, err := getStatusType("running")
   402  	if err != nil {
   403  		t.Errorf("成功する予定が、エラーになった。 - %v", err)
   404  	} else if s != db.RUNNING {
   405  		t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.RUNNING, s)
   406  	}
   407  
   408  	s, err = getStatusType("normal")
   409  	if err != nil {
   410  		t.Errorf("成功する予定が、エラーになった。 - %v", err)
   411  	} else if s != db.NORMAL {
   412  		t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.NORMAL, s)
   413  	}
   414  
   415  	s, err = getStatusType("abnormal")
   416  	if err != nil {
   417  		t.Errorf("成功する予定が、エラーになった。 - %v", err)
   418  	} else if s != db.ABNORMAL {
   419  		t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.ABNORMAL, s)
   420  	}
   421  
   422  	s, err = getStatusType("warn")
   423  	if err != nil {
   424  		t.Errorf("成功する予定が、エラーになった。 - %v", err)
   425  	} else if s != db.WARN {
   426  		t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.WARN, s)
   427  	}
   428  
   429  	s, err = getStatusType("")
   430  	if err != nil {
   431  		t.Errorf("成功する予定が、エラーになった。 - %v", err)
   432  	} else if s != -1 {
   433  		t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", -1, s)
   434  	}
   435  
   436  	s, err = getStatusType("X")
   437  	if err == nil {
   438  		t.Error("失敗する予定が、エラーが返らなかった。")
   439  	}
   440  }
   441  
   442  func TestGetSeparatorType_指定毎に返るジェネレーターを確認(t *testing.T) {
   443  	g := getSeparatorType("")
   444  	switch g.(type) {
   445  	case *gen.JsonGenerator:
   446  	default:
   447  		t.Error("JsonGeneratorになるべきところ、異なる型が返った。")
   448  	}
   449  
   450  	g = getSeparatorType("json")
   451  	switch g.(type) {
   452  	case *gen.JsonGenerator:
   453  	default:
   454  		t.Error("JsonGeneratorになるべきところ、異なる型が返った。")
   455  	}
   456  
   457  	g = getSeparatorType("csv")
   458  	switch g.(type) {
   459  	case *gen.CsvGenerator:
   460  	default:
   461  		t.Error("CsvGeneratorになるべきところ、異なる型が返った。")
   462  	}
   463  
   464  	g = getSeparatorType("X")
   465  	if g != nil {
   466  		t.Error("誤った指定をしたにもかかわらず、nilが返らない。")
   467  	}
   468  }
   469  
   470  func TestShowVersion_バージョン表示(t *testing.T) {
   471  	c := testutil.NewStderrCapturer()
   472  	c.Start()
   473  
   474  	showVersion()
   475  
   476  	output := c.Stop()
   477  	if output != fmt.Sprintf("%v show-utility version.\n", Version) {
   478  		t.Errorf("stderrへの出力値[%s]が想定と違います。", output)
   479  	}
   480  }
   481  
   482  func TestShowUsage_Usage表示(t *testing.T) {
   483  	c := testutil.NewStderrCapturer()
   484  	c.Start()
   485  
   486  	showUsage()
   487  
   488  	output := c.Stop()
   489  	if output != console.USAGE_SHOW {
   490  		t.Errorf("stderrへの出力値[%s]が想定と違います。", output)
   491  	}
   492  }
   493  
   494  func TestFetchArgs_実行時引数のフェッチ(t *testing.T) {
   495  	fetchArgs()
   496  }
   497  
   498  func TestParseFromTo_UTCの場合(t *testing.T) {
   499  	from, to, err := parseFromTo("20150725", "20150801", true)
   500  	if err != nil {
   501  		t.Fatalf("想定外のエラーが発生した: %s", err)
   502  	}
   503  	if from != "2015-07-25 00:00:00.000" {
   504  		t.Errorf("fromの値が想定と違っている。")
   505  		t.Logf("想定値: %s", "2015-07-25 00:00:00.000")
   506  		t.Logf("実績値: %s", from)
   507  	}
   508  	if to != "2015-08-01 23:59:59.999" {
   509  		t.Errorf("toの値が想定と違っている。")
   510  		t.Logf("想定値: %s", "2015-08-01 23:59:59.999")
   511  		t.Logf("実績値: %s", to)
   512  	}
   513  }
   514  
   515  func TestParseFromTo_Localtimeの場合(t *testing.T) {
   516  	from, to, err := parseFromTo("20150725", "20150801", false)
   517  	if err != nil {
   518  		t.Fatalf("想定外のエラーが発生した: %s", err)
   519  	}
   520  	if from != "2015-07-24 15:00:00.000" {
   521  		t.Errorf("fromの値が想定と違っている。")
   522  		t.Logf("想定値: %s", "2015-07-24 15:00:00.000")
   523  		t.Logf("実績値: %s", from)
   524  	}
   525  	if to != "2015-08-01 14:59:59.999" {
   526  		t.Errorf("toの値が想定と違っている。")
   527  		t.Logf("想定値: %s", "2015-08-01 14:59:59.999")
   528  		t.Logf("実績値: %s", to)
   529  	}
   530  }
   531  
   532  func TestParseFromTo_指定なしの場合(t *testing.T) {
   533  	from, to, err := parseFromTo("", "", true)
   534  	if err != nil {
   535  		t.Fatalf("想定外のエラーが発生した: %s", err)
   536  	}
   537  	if from != "" {
   538  		t.Errorf("想定外のfrom[%s]が返却された。", from)
   539  	}
   540  	if to != "" {
   541  		t.Errorf("想定外のto[%s]が返却された。", to)
   542  	}
   543  }