github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/realtime/network/network_test.go (about)

     1  package network
     2  
     3  import (
     4  	"bytes"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  func TestLoadJobexFromReader(t *testing.T) {
    10  	csv := `
    11  ジョブ名,ノード名,ポート番号,実行ファイル,パラメータ,環境変数,作業フォルダ,警告コード,警告出力,異常コード,異常出力,タイムアウト,セカンダリ実行ノード,セカンダリポート番号
    12  job1,123.45.67.89,1234,/scripts/job1.sh,param1,env1,/work,10,warn1,20,err1,3600,secondary,12345
    13  job2,12.345.67.89,5678,/scripts/job2.sh,param2,env2,/work2,11,warn2,21,err2,3600,,`
    14  
    15  	jobex, err := loadJobexFromReader(strings.NewReader(csv))
    16  	if err != nil {
    17  		t.Fatalf("Unexpected error occured: %s", err)
    18  	}
    19  	if len(jobex) != 2 {
    20  		t.Fatalf("len(jobex) => %d, want %d", len(jobex), 2)
    21  	}
    22  }
    23  
    24  func TestExportJob(t *testing.T) {
    25  	expected := `,,,,,,,,,,,,,
    26  job1,node1,1234,/scripts/job1.sh,param1,env1,/work1,11,warn1,21,err1,100,snode1,1000
    27  job2,node2,2345,/scripts/job2.sh,param2,env2,/work2,12,warn2,22,err2,200,snode2,2000
    28  `
    29  
    30  	n := new(Network)
    31  	n.Jobs = []Job{
    32  		Job{
    33  			Name:    "job1",
    34  			Node:    "node1",
    35  			Port:    1234,
    36  			Path:    "/scripts/job1.sh",
    37  			Param:   "param1",
    38  			Env:     "env1",
    39  			Work:    "/work1",
    40  			WRC:     11,
    41  			WPtn:    "warn1",
    42  			ERC:     21,
    43  			EPtn:    "err1",
    44  			Timeout: 100,
    45  			SNode:   "snode1",
    46  			SPort:   1000,
    47  		},
    48  		Job{
    49  			Name:    "job2",
    50  			Node:    "node2",
    51  			Port:    2345,
    52  			Path:    "/scripts/job2.sh",
    53  			Param:   "param2",
    54  			Env:     "env2",
    55  			Work:    "/work2",
    56  			WRC:     12,
    57  			WPtn:    "warn2",
    58  			ERC:     22,
    59  			EPtn:    "err2",
    60  			Timeout: 200,
    61  			SNode:   "snode2",
    62  			SPort:   2000,
    63  		},
    64  	}
    65  
    66  	w := new(bytes.Buffer)
    67  	err := n.exportJob(w)
    68  	if err != nil {
    69  		t.Fatalf("Unexpected error occured: %s", err)
    70  	}
    71  	result := w.String()
    72  	if result != expected {
    73  		t.Log("Exported csv is not expected.")
    74  		t.Log("Expected:")
    75  		t.Log(expected)
    76  		t.Log("Actual:")
    77  		t.Log(result)
    78  		t.Fail()
    79  	}
    80  }
    81  
    82  func TestParse(t *testing.T) {
    83  	jsonStr := `
    84  {
    85  	"flow":"job1->job2->[job3,job4->job5]->job6",
    86  	"jobs":[
    87  		{
    88  			"name":"job1",
    89  			"node":"testnode",
    90  			"port":1234,
    91  			"path":"/scripts/job1.sh",
    92  			"param":"abc",
    93  			"env":"env1=test",
    94  			"work":"/work",
    95  			"wrc":5,
    96  			"wptn":"warning",
    97  			"erc":10,
    98  			"eptn":"error",
    99  			"timeout":30,
   100  			"snode":"secondary",
   101  			"sport":2345
   102  		}
   103  	]
   104  }
   105  `
   106  	network, err := Parse(strings.NewReader(jsonStr))
   107  	if err != nil {
   108  		t.Fatalf("Unexpected error occurd: %s", err)
   109  	}
   110  	if network.Flow != "job1->job2->[job3,job4->job5]->job6" {
   111  		t.Logf("Flow => %s", network.Flow)
   112  		t.Logf("Want %s", "job1->job2->[job3,job4->job5]->job6")
   113  		t.Fail()
   114  	}
   115  	if len(network.Jobs) != 1 {
   116  		t.Fatalf("len(Jobs) => %d, want %d", len(network.Jobs), 1)
   117  	}
   118  
   119  	job := network.Jobs[0]
   120  	if job.Name != "job1" {
   121  		t.Errorf("job.Name => %s, want %s", job.Name, "job1")
   122  	}
   123  	if job.Node != "testnode" {
   124  		t.Errorf("job.Node => %s, want %s", job.Node, "testnode")
   125  	}
   126  	if job.Port != 1234 {
   127  		t.Errorf("job.Port => %d, want %d", job.Port, 1234)
   128  	}
   129  	if job.Path != "/scripts/job1.sh" {
   130  		t.Errorf("job.Path => %s, want %s", job.Path, "/scripts/job1.sh")
   131  	}
   132  	if job.Param != "abc" {
   133  		t.Errorf("job.Param => %s, want %s", job.Param, "abc")
   134  	}
   135  	if job.Env != "env1=test" {
   136  		t.Errorf("job.Env => %s, want %s", job.Env, "env1=test")
   137  	}
   138  	if job.Work != "/work" {
   139  		t.Errorf("job.Work => %s, want %s", job.Work, "/work")
   140  	}
   141  	if job.WRC != 5 {
   142  		t.Errorf("job.WRC => %d, want %d", job.WRC, 5)
   143  	}
   144  	if job.WPtn != "warning" {
   145  		t.Errorf("job.WPtn => %s, want %s", job.WPtn, "warning")
   146  	}
   147  	if job.ERC != 10 {
   148  		t.Errorf("job.ERC => %d, want %d", job.ERC, 10)
   149  	}
   150  	if job.EPtn != "error" {
   151  		t.Errorf("job.EPtn => %s, want %s", job.EPtn, "error")
   152  	}
   153  	if job.Timeout != 30 {
   154  		t.Errorf("job.Timeout => %d, want %d", job.Timeout, 30)
   155  	}
   156  	if job.SNode != "secondary" {
   157  		t.Errorf("job.SNode => %s, want %s", job.SNode, "secondary")
   158  	}
   159  	if job.SPort != 2345 {
   160  		t.Errorf("job.SPort => %d, want %d", job.SPort, 2345)
   161  	}
   162  }
   163  
   164  func TestParse_WithNullValue(t *testing.T) {
   165  	jsonStr := `
   166  {
   167  	"flow":"job1->job2->[job3,job4->job5]->job6",
   168  	"jobs":[
   169  		{
   170  			"name":"job1"
   171  		},
   172  		{
   173  			"name":"job2"
   174  		},
   175  		{
   176  			"name":"job3",
   177  			"node":"realtimenode"
   178  		}
   179  	]
   180  }
   181  `
   182  	jobex = [][]string{
   183  		[]string{
   184  			"job2",
   185  			"node2",
   186  			"2345",
   187  			"/scripts/job2.sh",
   188  			"param2",
   189  			"env2",
   190  			"/work2",
   191  			"12",
   192  			"warn2",
   193  			"22",
   194  			"err2",
   195  			"200",
   196  			"snode2",
   197  			"2000",
   198  		},
   199  		[]string{
   200  			"job3",
   201  			"node3",
   202  			"3456",
   203  			"/scripts/job3.sh",
   204  			"param3",
   205  			"env3",
   206  			"/work3",
   207  			"13",
   208  			"warn3",
   209  			"23",
   210  			"err3",
   211  			"300",
   212  			"snode3",
   213  			"3000",
   214  		},
   215  	}
   216  	defer func() {
   217  		jobex := make([][]string, 1)
   218  		jobex[0] = make([]string, columns)
   219  	}()
   220  
   221  	network, err := Parse(strings.NewReader(jsonStr))
   222  	if err != nil {
   223  		t.Fatalf("Unexpected error occurd: %s", err)
   224  	}
   225  	if len(network.Jobs) != 3 {
   226  		t.Fatalf("len(Jobs) => %d, want %d", len(network.Jobs), 3)
   227  	}
   228  
   229  	firstJob := network.Jobs[0]
   230  	if firstJob.Name != "job1" {
   231  		t.Errorf("firstJob.Name => %s, want %s", firstJob.Name, "job1")
   232  	}
   233  	if firstJob.Node != "" {
   234  		t.Errorf("firstJob.Node => %s, want %s", firstJob.Node, "")
   235  	}
   236  	if firstJob.Port != 0 {
   237  		t.Errorf("firstJob.Port => %d, want %d", firstJob.Port, 0)
   238  	}
   239  	if firstJob.Path != "" {
   240  		t.Errorf("firstJob.Path => %s, want %s", firstJob.Path, "")
   241  	}
   242  	if firstJob.Param != "" {
   243  		t.Errorf("firstJob.Param => %s, want %s", firstJob.Param, "")
   244  	}
   245  	if firstJob.Env != "" {
   246  		t.Errorf("firstJob.Env => %s, want %s", firstJob.Env, "")
   247  	}
   248  	if firstJob.Work != "" {
   249  		t.Errorf("firstJob.Work => %s, want %s", firstJob.Work, "")
   250  	}
   251  	if firstJob.WRC != 0 {
   252  		t.Errorf("firstJob.WRC => %d, want %d", firstJob.WRC, 0)
   253  	}
   254  	if firstJob.WPtn != "" {
   255  		t.Errorf("firstJob.WPtn => %s, want %s", firstJob.WPtn, "")
   256  	}
   257  	if firstJob.ERC != 0 {
   258  		t.Errorf("firstJob.ERC => %d, want %d", firstJob.ERC, 0)
   259  	}
   260  	if firstJob.EPtn != "" {
   261  		t.Errorf("firstJob.EPtn => %s, want %s", firstJob.EPtn, "")
   262  	}
   263  	if firstJob.Timeout != 0 {
   264  		t.Errorf("firstJob.Timeout => %d, want %d", firstJob.Timeout, 0)
   265  	}
   266  	if firstJob.SNode != "" {
   267  		t.Errorf("firstJob.SNode => %s, want nil", firstJob.SNode)
   268  	}
   269  	if firstJob.SPort != 0 {
   270  		t.Errorf("firstJob.SPort => %d, want nil", firstJob.SPort)
   271  	}
   272  
   273  	secondJob := network.Jobs[1]
   274  	if secondJob.Name != "job2" {
   275  		t.Errorf("secondJob.Name => %s, want %s", secondJob.Name, "job2")
   276  	}
   277  	if secondJob.Node != "node2" {
   278  		t.Errorf("secondJob.Node => %s, want %s", secondJob.Node, "node2")
   279  	}
   280  	if secondJob.Port != 2345 {
   281  		t.Errorf("secondJob.Port => %d, want %d", secondJob.Port, 2345)
   282  	}
   283  	if secondJob.Path != "/scripts/job2.sh" {
   284  		t.Errorf("secondJob.Path => %s, want %s", secondJob.Path, "/scripts/job2.sh")
   285  	}
   286  	if secondJob.Param != "param2" {
   287  		t.Errorf("secondJob.Param => %s, want %s", secondJob.Param, "param2")
   288  	}
   289  	if secondJob.Env != "env2" {
   290  		t.Errorf("secondJob.Env => %s, want %s", secondJob.Env, "env2")
   291  	}
   292  	if secondJob.Work != "/work2" {
   293  		t.Errorf("secondJob.Work => %s, want %s", secondJob.Work, "/work2")
   294  	}
   295  	if secondJob.WRC != 12 {
   296  		t.Errorf("secondJob.WRC => %d, want %d", secondJob.WRC, 12)
   297  	}
   298  	if secondJob.WPtn != "warn2" {
   299  		t.Errorf("secondJob.WPtn => %s, want %s", secondJob.WPtn, "warn2")
   300  	}
   301  	if secondJob.ERC != 22 {
   302  		t.Errorf("secondJob.ERC => %d, want %d", secondJob.ERC, 22)
   303  	}
   304  	if secondJob.EPtn != "err2" {
   305  		t.Errorf("secondJob.EPtn => %s, want %s", secondJob.EPtn, "err2")
   306  	}
   307  	if secondJob.Timeout != 200 {
   308  		t.Errorf("secondJob.Timeout => %d, want %d", secondJob.Timeout, 200)
   309  	}
   310  	if secondJob.SNode != "snode2" {
   311  		t.Errorf("secondJob.SNode => %s, want %s", secondJob.SNode, "snode2")
   312  	}
   313  	if secondJob.SPort != 2000 {
   314  		t.Errorf("secondJob.SPort => %d, want %d", secondJob.SPort, 2000)
   315  	}
   316  
   317  	thirdJob := network.Jobs[2]
   318  	if thirdJob.Name != "job3" {
   319  		t.Errorf("thirdJob.Name => %s, want %s", thirdJob.Name, "job3")
   320  	}
   321  	if thirdJob.Node != "realtimenode" {
   322  		t.Errorf("thirdJob.Node => %s, want %s", thirdJob.Node, "realtimenode")
   323  	}
   324  	if thirdJob.Port != 3456 {
   325  		t.Errorf("thirdJob.Port => %d, want %d", thirdJob.Port, 3456)
   326  	}
   327  	if thirdJob.Path != "/scripts/job3.sh" {
   328  		t.Errorf("thirdJob.Path => %s, want %s", thirdJob.Path, "/scripts/job3.sh")
   329  	}
   330  	if thirdJob.Param != "param3" {
   331  		t.Errorf("thirdJob.Param => %s, want %s", thirdJob.Param, "param3")
   332  	}
   333  	if thirdJob.Env != "env3" {
   334  		t.Errorf("thirdJob.Env => %s, want %s", thirdJob.Env, "env3")
   335  	}
   336  	if thirdJob.Work != "/work3" {
   337  		t.Errorf("thirdJob.Work => %s, want %s", thirdJob.Work, "/work3")
   338  	}
   339  	if thirdJob.WRC != 13 {
   340  		t.Errorf("thirdJob.WRC => %d, want %d", thirdJob.WRC, 13)
   341  	}
   342  	if thirdJob.WPtn != "warn3" {
   343  		t.Errorf("thirdJob.WPtn => %s, want %s", thirdJob.WPtn, "warn3")
   344  	}
   345  	if thirdJob.ERC != 23 {
   346  		t.Errorf("thirdJob.ERC => %d, want %d", thirdJob.ERC, 23)
   347  	}
   348  	if thirdJob.EPtn != "err3" {
   349  		t.Errorf("thirdJob.EPtn => %s, want %s", thirdJob.EPtn, "err3")
   350  	}
   351  	if thirdJob.Timeout != 300 {
   352  		t.Errorf("thirdJob.Timeout => %d, want %d", thirdJob.Timeout, 300)
   353  	}
   354  	if thirdJob.SNode != "snode3" {
   355  		t.Errorf("thirdJob.SNode => %s, want %s", thirdJob.SNode, "snode3")
   356  	}
   357  	if thirdJob.SPort != 3000 {
   358  		t.Errorf("thirdJob.SPort => %d, want %d", thirdJob.SPort, 3000)
   359  	}
   360  }
   361  
   362  func TestParse_NonParameterJobex(t *testing.T) {
   363  	jsonStr := `
   364  {
   365  	"flow":"job1->job2->[job3,job4->job5]->job6",
   366  	"jobs":[]
   367  }
   368  `
   369  	jobex = [][]string{
   370  		[]string{
   371  			"job2",
   372  			"node2",
   373  			"2345",
   374  			"/scripts/job2.sh",
   375  			"param2",
   376  			"env2",
   377  			"/work2",
   378  			"12",
   379  			"warn2",
   380  			"22",
   381  			"err2",
   382  			"200",
   383  			"snode2",
   384  			"2000",
   385  		},
   386  	}
   387  	defer func() {
   388  		jobex := make([][]string, 1)
   389  		jobex[0] = make([]string, columns)
   390  	}()
   391  
   392  	network, err := Parse(strings.NewReader(jsonStr))
   393  	if err != nil {
   394  		t.Fatalf("Unexpected error occurd: %s", err)
   395  	}
   396  	if len(network.Jobs) != 1 {
   397  		t.Fatalf("len(Jobs) => %d, want %d", len(network.Jobs), 1)
   398  	}
   399  
   400  	job := network.Jobs[0]
   401  	if job.Name != "job2" {
   402  		t.Errorf("job.Name => %s, want %s", job.Name, "job2")
   403  	}
   404  	if job.Node != "node2" {
   405  		t.Errorf("job.Node => %s, want %s", job.Node, "node2")
   406  	}
   407  	if job.Port != 2345 {
   408  		t.Errorf("job.Port => %d, want %d", job.Port, 2345)
   409  	}
   410  	if job.Path != "/scripts/job2.sh" {
   411  		t.Errorf("job.Path => %s, want %s", job.Path, "/scripts/job2.sh")
   412  	}
   413  	if job.Param != "param2" {
   414  		t.Errorf("job.Param => %s, want %s", job.Param, "param2")
   415  	}
   416  	if job.Env != "env2" {
   417  		t.Errorf("job.Env => %s, want %s", job.Env, "env2")
   418  	}
   419  	if job.Work != "/work2" {
   420  		t.Errorf("job.Work => %s, want %s", job.Work, "/work2")
   421  	}
   422  	if job.WRC != 12 {
   423  		t.Errorf("job.WRC => %d, want %d", job.WRC, 12)
   424  	}
   425  	if job.WPtn != "warn2" {
   426  		t.Errorf("job.WPtn => %s, want %s", job.WPtn, "warn2")
   427  	}
   428  	if job.ERC != 22 {
   429  		t.Errorf("job.ERC => %d, want %d", job.ERC, 22)
   430  	}
   431  	if job.EPtn != "err2" {
   432  		t.Errorf("job.EPtn => %s, want %s", job.EPtn, "err2")
   433  	}
   434  	if job.Timeout != 200 {
   435  		t.Errorf("job.Timeout => %d, want %d", job.Timeout, 200)
   436  	}
   437  	if job.SNode != "snode2" {
   438  		t.Errorf("job.SNode => %s, want %s", job.SNode, "snode2")
   439  	}
   440  	if job.SPort != 2000 {
   441  		t.Errorf("job.SPort => %d, want %d", job.SPort, 2000)
   442  	}
   443  }
   444  
   445  func TestParse_WithJSONError(t *testing.T) {
   446  	jsonStr := `
   447  {
   448  	flow:"job1->job2->[job3,job4->job5]->job6",
   449  	"jobs":[
   450  		{
   451  			"name":"job2",
   452  			"node":"testnode",
   453  			"port":1234,
   454  			"path":"/scripts/job2.sh",
   455  			"param":"abc",
   456  			"env":"env1=test",
   457  			"work":"/work",
   458  			"wrc":5,
   459  			"wptn":"warning",
   460  			"erc":10,
   461  			"eptn":"error",
   462  			"timeout":30,
   463  			"snode":"secondary",
   464  			"sport":2345
   465  		},
   466  		{
   467  			"name":"job5",
   468  			"param":"bcd"
   469  		}
   470  	]
   471  }
   472  `
   473  	_, err := Parse(strings.NewReader(jsonStr))
   474  	if err == nil {
   475  		t.Fatalf("No error occured.")
   476  	}
   477  }
   478  
   479  func TestParse_WithAnonymousJob(t *testing.T) {
   480  	jsonStr := `
   481  {
   482  	"flow":"job1->job2->[job3,job4->job5]->job6",
   483  	"jobs":[
   484  		{
   485  			"node":"testnode",
   486  			"port":1234,
   487  			"path":"/scripts/job2.sh",
   488  			"param":"abc",
   489  			"env":"env1=test",
   490  			"work":"/work",
   491  			"wrc":5,
   492  			"wptn":"warning",
   493  			"erc":10,
   494  			"eptn":"error",
   495  			"timeout":30,
   496  			"snode":"secondary",
   497  			"sport":2345
   498  		},
   499  		{
   500  			"name":"job5",
   501  			"param":"bcd"
   502  		}
   503  	]
   504  }
   505  `
   506  	_, err := Parse(strings.NewReader(jsonStr))
   507  	if err == nil {
   508  		t.Fatalf("No error occured.")
   509  	}
   510  }