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

     1  package jobnet
     2  
     3  import (
     4  	"path/filepath"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/unirita/cuto/master/config"
    10  	"github.com/unirita/cuto/master/jobnet/parser"
    11  	"github.com/unirita/cuto/testutil"
    12  )
    13  
    14  // ※補足事項
    15  // testJob構造体およびその生成関数generateTestJobはpath_test.goで定義されています。
    16  
    17  type undefinedElement struct {
    18  	next Element
    19  }
    20  
    21  func (u *undefinedElement) ID() string        { return "undefined" }
    22  func (u *undefinedElement) Type() elementType { return ELM_JOB }
    23  func (u *undefinedElement) AddNext(e Element) error {
    24  	u.next = e
    25  	return nil
    26  }
    27  func (u *undefinedElement) HasNext() bool {
    28  	if u.next == nil {
    29  		return false
    30  	}
    31  	return true
    32  }
    33  func (u *undefinedElement) Execute() (Element, error) {
    34  	return u.next, nil
    35  }
    36  
    37  func getTestDBPath() string {
    38  	return filepath.Join(testutil.GetBaseDir(),
    39  		"master", "jobnet", "_testdata", "test.sqlite")
    40  }
    41  
    42  func loadTestConfig() {
    43  	config.Job.DefaultNode = `localhost`
    44  	config.Job.DefaultPort = 2015
    45  	config.Job.DefaultTimeoutMin = 30
    46  	config.Dir.JobnetDir = `jobnet`
    47  	config.DB.DBFile = getTestDBPath()
    48  }
    49  
    50  func TestNewNetwork_各メンバの初期値をセットできる(t *testing.T) {
    51  	loadTestConfig()
    52  
    53  	n, _ := NewNetwork("test")
    54  
    55  	if n.Name != "test" {
    56  		t.Errorf("セットされたネットワーク名[%s]が間違っています。", n.Name)
    57  	}
    58  	if n.elements == nil {
    59  		t.Error("elementsがmakeされていません。")
    60  	}
    61  	expectedNwkPath := filepath.Join("jobnet", "test.bpmn")
    62  	if n.MasterPath != expectedNwkPath {
    63  		t.Errorf("セットされたネットワーク定義ファイルパス[%s]が間違っています。", n.MasterPath)
    64  	}
    65  	expectedExPath := filepath.Join("jobnet", "test.csv")
    66  	if n.JobExPath != expectedExPath {
    67  		t.Errorf("セットされた拡張ジョブ定義ファイルパス[%s]が間違っています。", n.JobExPath)
    68  	}
    69  }
    70  
    71  func TestLoadNetwork_定義ファイルが存在しない場合はnilを返す(t *testing.T) {
    72  	n := LoadNetwork("noexistnetwork")
    73  	if n != nil {
    74  		t.Errorf("返された値がnilではない。")
    75  	}
    76  }
    77  
    78  func TestLoadElements_要素をロードできる(t *testing.T) {
    79  	bpmn := `
    80  <definitions>
    81      <process>
    82  	    <startEvent id="start"/>
    83  	    <endEvent id="end"/>
    84  		<serviceTask id="job" name="jobname"/>
    85  		<sequenceFlow sourceRef="start" targetRef="job"/>
    86  		<sequenceFlow sourceRef="job" targetRef="end"/>
    87  	</process>
    88  </definitions>`
    89  
    90  	n, _ := NewNetwork("test")
    91  	err := n.LoadElements(strings.NewReader(bpmn))
    92  	if err != nil {
    93  		t.Fatalf("想定外のエラーが発生した: %s", err)
    94  	}
    95  	if len(n.elements) == 0 {
    96  		t.Fatal("Network.elementsが空のままになっている。")
    97  	}
    98  }
    99  
   100  func TestLoadElements_パースに失敗した場合はエラー(t *testing.T) {
   101  	bpmn := `CannotParseString`
   102  
   103  	n, _ := NewNetwork("test")
   104  	err := n.LoadElements(strings.NewReader(bpmn))
   105  	if err == nil {
   106  		t.Error("エラーが発生しなかった。")
   107  	}
   108  	if len(n.elements) != 0 {
   109  		t.Error("Network.elementsは空のままであるはずが、値がセットされた。")
   110  	}
   111  }
   112  
   113  func TestSetElements_JobとGatewayを追加できる(t *testing.T) {
   114  	proc := &parser.Process{
   115  		Start:   make([]parser.StartEvent, 1),
   116  		End:     make([]parser.EndEvent, 1),
   117  		Task:    make([]parser.ServiceTask, 1),
   118  		Gateway: make([]parser.ParallelGateway, 1),
   119  	}
   120  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   121  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   122  
   123  	nwk, _ := NewNetwork("test")
   124  	err := nwk.setElements(proc)
   125  	if err != nil {
   126  		t.Fatalf("想定外のエラーが発生した: %s")
   127  	}
   128  
   129  	elements := nwk.elements
   130  	if len(elements) != 2 {
   131  		t.Fatalf("要素数は2個であるはずだが、%d個存在する。", len(elements))
   132  	}
   133  
   134  	task1, ok := elements["task1"]
   135  	if !ok {
   136  		t.Fatal("task1がセットされなかった。")
   137  	}
   138  	if task1.ID() != "task1" {
   139  		t.Errorf("ジョブtask1のidはtask1であるはずだが、%sがセットされている。", task1.ID())
   140  	}
   141  
   142  	gw1, ok := elements["gw1"]
   143  	if !ok {
   144  		t.Fatal("gw1がセットされなかった。")
   145  	}
   146  	if gw1.ID() != "gw1" {
   147  		t.Errorf("ゲートウェイgw1のidはgw1であるはずだが、%sがセットされている。", gw1.ID())
   148  	}
   149  }
   150  
   151  func TestSetElements_Jobの先行関係を設定できる(t *testing.T) {
   152  	proc := &parser.Process{
   153  		Start: make([]parser.StartEvent, 1),
   154  		End:   make([]parser.EndEvent, 1),
   155  		Task:  make([]parser.ServiceTask, 2),
   156  		Flow:  make([]parser.SequenceFlow, 1),
   157  	}
   158  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   159  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   160  	proc.Flow[0] = parser.SequenceFlow{From: "task1", To: "task2"}
   161  
   162  	nwk, _ := NewNetwork("test")
   163  	err := nwk.setElements(proc)
   164  	if err != nil {
   165  		t.Fatalf("想定外のエラーが発生した: %s")
   166  	}
   167  
   168  	task1 := nwk.elements["task1"].(*Job)
   169  	if task1.Next == nil {
   170  		t.Fatal("task1の後続ジョブが設定されていない。")
   171  	}
   172  
   173  	task2, ok := task1.Next.(*Job)
   174  	if !ok {
   175  		t.Fatal("task1の後続ジョブがJob型になっていない。")
   176  	}
   177  	if task2.ID() != "task2" {
   178  		t.Error("task1の後続ジョブはtask2であるはずが、%sになっている。", task2.ID())
   179  	}
   180  }
   181  
   182  func TestSetElements_Gatewayの先行関係を設定できる(t *testing.T) {
   183  	proc := &parser.Process{
   184  		Start:   make([]parser.StartEvent, 1),
   185  		End:     make([]parser.EndEvent, 1),
   186  		Task:    make([]parser.ServiceTask, 3),
   187  		Gateway: make([]parser.ParallelGateway, 1),
   188  		Flow:    make([]parser.SequenceFlow, 3),
   189  	}
   190  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   191  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   192  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
   193  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   194  	proc.Flow[0] = parser.SequenceFlow{From: "task1", To: "gw1"}
   195  	proc.Flow[1] = parser.SequenceFlow{From: "gw1", To: "task2"}
   196  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task3"}
   197  
   198  	nwk, _ := NewNetwork("test")
   199  	err := nwk.setElements(proc)
   200  	if err != nil {
   201  		t.Fatalf("想定外のエラーが発生した: %s")
   202  	}
   203  
   204  	task1 := nwk.elements["task1"].(*Job)
   205  	if task1.Next == nil {
   206  		t.Fatal("task1の後続ゲートウェイが設定されていない。")
   207  	}
   208  
   209  	gw1, ok := task1.Next.(*Gateway)
   210  	if !ok {
   211  		t.Fatal("task1の後続ゲートウェイがGateway型になっていない。")
   212  	}
   213  	if gw1.ID() != "gw1" {
   214  		t.Error("task1の後続ゲートウェイはgw1であるはずが、%sになっている。", gw1.ID())
   215  	}
   216  
   217  	if len(gw1.Nexts) != 2 {
   218  		t.Fatal("gw1の後続ジョブ数が2つになるはずが、違っている。")
   219  	}
   220  	if gw1.Nexts[0] == nil || gw1.Nexts[1] == nil {
   221  		t.Fatal("gw1の後続ジョブのに設定されるはずのないnilが設定されている。")
   222  	}
   223  
   224  	task2, ok := gw1.Nexts[0].(*Job)
   225  	if !ok {
   226  		t.Fatal("gw1の1つめの後続ジョブがJob型になっていない。")
   227  	}
   228  	if task2.ID() != "task2" {
   229  		t.Error("gw1の1つめの後続ジョブはtask2であるはずが、%sになっている。", task2.ID())
   230  	}
   231  
   232  	task3, ok := gw1.Nexts[1].(*Job)
   233  	if !ok {
   234  		t.Fatal("gw1の2つめの後続ジョブがJob型になっていない。")
   235  	}
   236  	if task3.ID() != "task3" {
   237  		t.Error("gw1の1つめの後続ジョブはtask2であるはずが、%sになっている。", task3.ID())
   238  	}
   239  }
   240  
   241  func TestSetElements_開始要素と終了要素を設定できる(t *testing.T) {
   242  	proc := &parser.Process{
   243  		Start: make([]parser.StartEvent, 1),
   244  		End:   make([]parser.EndEvent, 1),
   245  		Task:  make([]parser.ServiceTask, 1),
   246  		Flow:  make([]parser.SequenceFlow, 2),
   247  	}
   248  	proc.Start[0] = parser.StartEvent{ID: "start"}
   249  	proc.End[0] = parser.EndEvent{ID: "end"}
   250  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   251  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   252  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "end"}
   253  
   254  	nwk, _ := NewNetwork("test")
   255  	err := nwk.setElements(proc)
   256  	if err != nil {
   257  		t.Fatalf("想定外のエラーが発生した: %s")
   258  	}
   259  
   260  	if nwk.Start == nil {
   261  		t.Fatal("開始要素が設定されなかった。")
   262  	}
   263  	if nwk.Start.ID() != "task1" {
   264  		t.Error("間違った要素が開始要素に設定された。")
   265  	}
   266  
   267  	if nwk.End == nil {
   268  		t.Fatal("終了要素が設定されなかった。")
   269  	}
   270  	if nwk.End.ID() != "task1" {
   271  		t.Error("間違った要素が終了要素に設定された。")
   272  	}
   273  }
   274  
   275  func TestSetElements_ジョブ名が不正な場合はエラーを吐く(t *testing.T) {
   276  	proc := &parser.Process{
   277  		Start: make([]parser.StartEvent, 1),
   278  		End:   make([]parser.EndEvent, 1),
   279  		Task:  make([]parser.ServiceTask, 1),
   280  	}
   281  	proc.Task[0] = parser.ServiceTask{ID: "j1", Name: "jo$b1"}
   282  
   283  	nwk, _ := NewNetwork("test")
   284  	err := nwk.setElements(proc)
   285  	if err == nil {
   286  		t.Fatal("エラーが発生しなかった。")
   287  	}
   288  }
   289  
   290  func TestSetElements_開始要素の接続先が複数ある場合はエラーを吐く(t *testing.T) {
   291  	proc := &parser.Process{
   292  		Start: make([]parser.StartEvent, 1),
   293  		End:   make([]parser.EndEvent, 1),
   294  		Task:  make([]parser.ServiceTask, 2),
   295  		Flow:  make([]parser.SequenceFlow, 2),
   296  	}
   297  	proc.Start[0] = parser.StartEvent{ID: "start"}
   298  	proc.End[0] = parser.EndEvent{ID: "end"}
   299  	proc.Task[0] = parser.ServiceTask{ID: "j1", Name: "job1"}
   300  	proc.Task[1] = parser.ServiceTask{ID: "j2", Name: "job2"}
   301  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "j1"}
   302  	proc.Flow[1] = parser.SequenceFlow{From: "start", To: "j2"}
   303  
   304  	nwk, _ := NewNetwork("test")
   305  	err := nwk.setElements(proc)
   306  	if err == nil {
   307  		t.Fatal("エラーが発生しなかった。")
   308  	}
   309  }
   310  
   311  func TestSetElements_終了要素の接続元が複数ある場合はエラーを吐く(t *testing.T) {
   312  	proc := &parser.Process{
   313  		Start: make([]parser.StartEvent, 1),
   314  		End:   make([]parser.EndEvent, 1),
   315  		Task:  make([]parser.ServiceTask, 2),
   316  		Flow:  make([]parser.SequenceFlow, 2),
   317  	}
   318  	proc.Start[0] = parser.StartEvent{ID: "start"}
   319  	proc.End[0] = parser.EndEvent{ID: "end"}
   320  	proc.Task[0] = parser.ServiceTask{ID: "j1", Name: "job1"}
   321  	proc.Task[1] = parser.ServiceTask{ID: "j2", Name: "job2"}
   322  	proc.Flow[0] = parser.SequenceFlow{From: "j1", To: "end"}
   323  	proc.Flow[1] = parser.SequenceFlow{From: "j2", To: "end"}
   324  
   325  	nwk, _ := NewNetwork("test")
   326  	err := nwk.setElements(proc)
   327  	if err == nil {
   328  		t.Fatal("エラーが発生しなかった。")
   329  	}
   330  }
   331  
   332  func TestSetElements_フローが空の場合はエラーを吐く(t *testing.T) {
   333  	proc := &parser.Process{
   334  		Start: make([]parser.StartEvent, 1),
   335  		End:   make([]parser.EndEvent, 1),
   336  		Flow:  make([]parser.SequenceFlow, 1),
   337  	}
   338  	proc.Start[0] = parser.StartEvent{ID: "start"}
   339  	proc.End[0] = parser.EndEvent{ID: "end"}
   340  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "end"}
   341  
   342  	nwk, _ := NewNetwork("test")
   343  	err := nwk.setElements(proc)
   344  	if err == nil {
   345  		t.Fatal("エラーが発生しなかった。")
   346  	}
   347  }
   348  
   349  func TestSetElements_ID重複時はエラーを吐く_Task同士の重複(t *testing.T) {
   350  	proc := &parser.Process{
   351  		Start: make([]parser.StartEvent, 1),
   352  		End:   make([]parser.EndEvent, 1),
   353  		Task:  make([]parser.ServiceTask, 2),
   354  	}
   355  	proc.Task[0] = parser.ServiceTask{ID: "same", Name: "job1"}
   356  	proc.Task[1] = parser.ServiceTask{ID: "same", Name: "job2"}
   357  
   358  	nwk, _ := NewNetwork("test")
   359  	err := nwk.setElements(proc)
   360  	if err == nil {
   361  		t.Fatal("エラーが発生しなかった。")
   362  	}
   363  }
   364  
   365  func TestSetElements_ID重複時はエラーを吐く_Gateway同士の重複(t *testing.T) {
   366  	proc := &parser.Process{
   367  		Start:   make([]parser.StartEvent, 1),
   368  		End:     make([]parser.EndEvent, 1),
   369  		Gateway: make([]parser.ParallelGateway, 2),
   370  	}
   371  	proc.Gateway[0] = parser.ParallelGateway{ID: "same"}
   372  	proc.Gateway[1] = parser.ParallelGateway{ID: "same"}
   373  
   374  	nwk, _ := NewNetwork("test")
   375  	err := nwk.setElements(proc)
   376  	if err == nil {
   377  		t.Fatal("エラーが発生しなかった。")
   378  	}
   379  }
   380  
   381  func TestSetElements_ID重複時はエラーを吐く_TaskとGatewayの重複(t *testing.T) {
   382  	proc := &parser.Process{
   383  		Start:   make([]parser.StartEvent, 1),
   384  		End:     make([]parser.EndEvent, 1),
   385  		Task:    make([]parser.ServiceTask, 1),
   386  		Gateway: make([]parser.ParallelGateway, 1),
   387  	}
   388  	proc.Task[0] = parser.ServiceTask{ID: "same", Name: "job1"}
   389  	proc.Gateway[0] = parser.ParallelGateway{ID: "same"}
   390  
   391  	nwk, _ := NewNetwork("test")
   392  	err := nwk.setElements(proc)
   393  	if err == nil {
   394  		t.Fatal("エラーが発生しなかった。")
   395  	}
   396  }
   397  
   398  func TestSetElements_開始要素の接続先が不正な場合はエラーを吐く(t *testing.T) {
   399  	proc := &parser.Process{
   400  		Start: make([]parser.StartEvent, 1),
   401  		End:   make([]parser.EndEvent, 1),
   402  		Flow:  make([]parser.SequenceFlow, 1),
   403  	}
   404  	proc.Start[0] = parser.StartEvent{ID: "start"}
   405  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "noexist"}
   406  
   407  	nwk, _ := NewNetwork("test")
   408  	err := nwk.setElements(proc)
   409  	if err == nil {
   410  		t.Fatal("エラーが発生しなかった。")
   411  	}
   412  }
   413  
   414  func TestSetElements_終了要素の接続元が不正な場合はエラーを吐く(t *testing.T) {
   415  	proc := &parser.Process{
   416  		Start: make([]parser.StartEvent, 1),
   417  		End:   make([]parser.EndEvent, 1),
   418  		Flow:  make([]parser.SequenceFlow, 1),
   419  	}
   420  	proc.End[0] = parser.EndEvent{ID: "end"}
   421  	proc.Flow[0] = parser.SequenceFlow{From: "noexist", To: "end"}
   422  
   423  	nwk, _ := NewNetwork("test")
   424  	err := nwk.setElements(proc)
   425  	if err == nil {
   426  		t.Fatal("エラーが発生しなかった。")
   427  	}
   428  }
   429  
   430  func TestSetElements_ジョブの接続先が不正な場合はエラーを吐く(t *testing.T) {
   431  	proc := &parser.Process{
   432  		Start: make([]parser.StartEvent, 1),
   433  		End:   make([]parser.EndEvent, 1),
   434  		Task:  make([]parser.ServiceTask, 1),
   435  		Flow:  make([]parser.SequenceFlow, 1),
   436  	}
   437  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   438  	proc.Flow[0] = parser.SequenceFlow{From: "task1", To: "noexist"}
   439  
   440  	nwk, _ := NewNetwork("test")
   441  	err := nwk.setElements(proc)
   442  	if err == nil {
   443  		t.Fatal("エラーが発生しなかった。")
   444  	}
   445  }
   446  
   447  func TestSetElements_ジョブの接続元が不正な場合はエラーを吐く(t *testing.T) {
   448  	proc := &parser.Process{
   449  		Start: make([]parser.StartEvent, 1),
   450  		End:   make([]parser.EndEvent, 1),
   451  		Task:  make([]parser.ServiceTask, 1),
   452  		Flow:  make([]parser.SequenceFlow, 1),
   453  	}
   454  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   455  	proc.Flow[0] = parser.SequenceFlow{From: "noexist", To: "task1"}
   456  
   457  	nwk, _ := NewNetwork("test")
   458  	err := nwk.setElements(proc)
   459  	if err == nil {
   460  		t.Fatal("エラーが発生しなかった。")
   461  	}
   462  }
   463  
   464  func TestSetElements_ゲートウェイの接続先が不正な場合はエラーを吐く(t *testing.T) {
   465  	proc := &parser.Process{
   466  		Start:   make([]parser.StartEvent, 1),
   467  		End:     make([]parser.EndEvent, 1),
   468  		Gateway: make([]parser.ParallelGateway, 1),
   469  		Flow:    make([]parser.SequenceFlow, 1),
   470  	}
   471  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   472  	proc.Flow[0] = parser.SequenceFlow{From: "gw1", To: "noexist"}
   473  
   474  	nwk, _ := NewNetwork("test")
   475  	err := nwk.setElements(proc)
   476  	if err == nil {
   477  		t.Fatal("エラーが発生しなかった。")
   478  	}
   479  }
   480  
   481  func TestSetElements_ゲートウェイの接続元が不正な場合はエラーを吐く(t *testing.T) {
   482  	proc := &parser.Process{
   483  		Start:   make([]parser.StartEvent, 1),
   484  		End:     make([]parser.EndEvent, 1),
   485  		Gateway: make([]parser.ParallelGateway, 1),
   486  		Flow:    make([]parser.SequenceFlow, 1),
   487  	}
   488  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   489  	proc.Flow[0] = parser.SequenceFlow{From: "noexist", To: "gw1"}
   490  
   491  	nwk, _ := NewNetwork("test")
   492  	err := nwk.setElements(proc)
   493  	if err == nil {
   494  		t.Fatal("エラーが発生しなかった。")
   495  	}
   496  }
   497  
   498  func TestSetElements_ジョブの後続が複数ある場合はエラー(t *testing.T) {
   499  	proc := &parser.Process{
   500  		Start: make([]parser.StartEvent, 1),
   501  		End:   make([]parser.EndEvent, 1),
   502  		Task:  make([]parser.ServiceTask, 3),
   503  		Flow:  make([]parser.SequenceFlow, 2),
   504  	}
   505  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   506  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   507  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
   508  	proc.Flow[0] = parser.SequenceFlow{From: "task1", To: "task2"}
   509  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "task3"}
   510  
   511  	nwk, _ := NewNetwork("test")
   512  	err := nwk.setElements(proc)
   513  	if err == nil {
   514  		t.Fatal("エラーが発生しなかった。")
   515  	}
   516  }
   517  
   518  func TestLoadJobEx_拡張ジョブファイルが存在しない場合にエラーとしない(t *testing.T) {
   519  	n, _ := NewNetwork("noexistsjobex")
   520  	err := n.LoadJobEx()
   521  	if err != nil {
   522  		t.Errorf("想定外のエラーが発生した: %s", err)
   523  	}
   524  }
   525  
   526  func TestSetJobEx_拡張ジョブ情報をセットできる(t *testing.T) {
   527  	proc := &parser.Process{
   528  		Start:   make([]parser.StartEvent, 1),
   529  		End:     make([]parser.EndEvent, 1),
   530  		Task:    make([]parser.ServiceTask, 2),
   531  		Gateway: make([]parser.ParallelGateway, 0),
   532  		Flow:    make([]parser.SequenceFlow, 0),
   533  	}
   534  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   535  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   536  
   537  	je1 := new(parser.JobEx)
   538  	je1.Node = "node1"
   539  	je1.Port = 1
   540  	je1.FilePath = "path1"
   541  	je1.Param = "param1"
   542  	je1.Env = "env1"
   543  	je1.Workspace = "work1"
   544  	je1.WrnRC = 11
   545  	je1.WrnPtn = "warn1"
   546  	je1.ErrRC = 21
   547  	je1.ErrPtn = "err1"
   548  	je1.TimeoutMin = 60
   549  	je1.SecondaryNode = "secondary"
   550  	je1.SecondaryPort = 2
   551  
   552  	je2 := new(parser.JobEx)
   553  	je2.Node = "node2"
   554  
   555  	jeMap := make(map[string]*parser.JobEx)
   556  	jeMap["job1"] = je1
   557  	jeMap["job2"] = je2
   558  
   559  	nwk, _ := NewNetwork("test")
   560  	err := nwk.setElements(proc)
   561  	if err != nil {
   562  		t.Fatalf("想定外のエラーが発生した: %s")
   563  	}
   564  
   565  	loadTestConfig()
   566  	nwk.setJobEx(jeMap)
   567  
   568  	task1 := nwk.elements["task1"].(*Job)
   569  	if task1.Node != "node1" {
   570  		t.Errorf("ノード名[%s]は想定と違っている", task1.Node)
   571  	}
   572  	if task1.Port != 1 {
   573  		t.Errorf("ポート番号[%d]は想定と違っている", task1.Port)
   574  	}
   575  	if task1.FilePath != "path1" {
   576  		t.Errorf("実行ファイル名[%s]は想定と違っている", task1.FilePath)
   577  	}
   578  	if task1.Param != "param1" {
   579  		t.Errorf("実行時パラメータ[%s]は想定と違っている", task1.Param)
   580  	}
   581  	if task1.Env != "env1" {
   582  		t.Errorf("ノード名[%s]は想定と違っている", task1.Env)
   583  	}
   584  	if task1.Workspace != "work1" {
   585  		t.Errorf("作業フォルダ[%s]は想定と違っている", task1.Workspace)
   586  	}
   587  	if task1.WrnRC != 11 {
   588  		t.Errorf("警告条件コード[%d]は想定と違っている", task1.WrnRC)
   589  	}
   590  	if task1.WrnPtn != "warn1" {
   591  		t.Errorf("警告出力パターン[%s]は想定と違っている", task1.WrnPtn)
   592  	}
   593  	if task1.ErrRC != 21 {
   594  		t.Errorf("異常条件コード[%d]は想定と違っている", task1.ErrRC)
   595  	}
   596  	if task1.ErrPtn != "err1" {
   597  		t.Errorf("異常出力パターン[%s]は想定と違っている", task1.ErrPtn)
   598  	}
   599  	if task1.Timeout != 3600 {
   600  		t.Errorf("実行タイムアウト時間[%d]は想定と違っている", task1.Timeout)
   601  	}
   602  	if task1.SecondaryNode != "secondary" {
   603  		t.Errorf("ノード名[%s]は想定と違っている", task1.SecondaryNode)
   604  	}
   605  	if task1.SecondaryPort != 2 {
   606  		t.Errorf("ポート番号[%d]は想定と違っている", task1.SecondaryPort)
   607  	}
   608  
   609  	task2 := nwk.elements["task2"].(*Job)
   610  	if task2.Node != "node2" {
   611  		t.Errorf("ノード名[%s]は想定と違っている", task2.Node)
   612  	}
   613  }
   614  
   615  func TestSetJobEx_ゼロ値が挿入されたカラムにデフォルト値をセットする(t *testing.T) {
   616  	proc := &parser.Process{
   617  		Start:   make([]parser.StartEvent, 1),
   618  		End:     make([]parser.EndEvent, 1),
   619  		Task:    make([]parser.ServiceTask, 2),
   620  		Gateway: make([]parser.ParallelGateway, 0),
   621  		Flow:    make([]parser.SequenceFlow, 0),
   622  	}
   623  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   624  
   625  	je1 := parser.NewJobEx()
   626  	jeMap := make(map[string]*parser.JobEx)
   627  	jeMap["job1"] = je1
   628  
   629  	nwk, _ := NewNetwork("test")
   630  	err := nwk.setElements(proc)
   631  	if err != nil {
   632  		t.Fatalf("想定外のエラーが発生した: %s")
   633  	}
   634  
   635  	loadTestConfig()
   636  	nwk.setJobEx(jeMap)
   637  
   638  	task1 := nwk.elements["task1"].(*Job)
   639  	if task1.Node != "localhost" {
   640  		t.Errorf("ノード名[%s]は想定と違っている", task1.Node)
   641  	}
   642  	if task1.Port != 2015 {
   643  		t.Errorf("ポート番号[%d]は想定と違っている", task1.Port)
   644  	}
   645  	if task1.FilePath != "job1" {
   646  		t.Errorf("実行ファイル名[%s]は想定と違っている", task1.FilePath)
   647  	}
   648  	if task1.Param != "" {
   649  		t.Errorf("実行時パラメータ[%s]は想定と違っている", task1.Param)
   650  	}
   651  	if task1.Env != "" {
   652  		t.Errorf("ノード名[%s]は想定と違っている", task1.Env)
   653  	}
   654  	if task1.Workspace != "" {
   655  		t.Errorf("作業フォルダ[%s]は想定と違っている", task1.Workspace)
   656  	}
   657  	if task1.WrnRC != 0 {
   658  		t.Errorf("警告条件コード[%d]は想定と違っている", task1.WrnRC)
   659  	}
   660  	if task1.WrnPtn != "" {
   661  		t.Errorf("警告出力パターン[%s]は想定と違っている", task1.WrnPtn)
   662  	}
   663  	if task1.ErrRC != 0 {
   664  		t.Errorf("異常条件コード[%d]は想定と違っている", task1.ErrRC)
   665  	}
   666  	if task1.ErrPtn != "" {
   667  		t.Errorf("異常出力パターン[%s]は想定と違っている", task1.ErrPtn)
   668  	}
   669  	if task1.Timeout != 1800 {
   670  		t.Errorf("実行タイムアウト時間[%d]は想定と違っている", task1.Timeout)
   671  	}
   672  	if task1.SecondaryNode != "" {
   673  		t.Errorf("ノード名[%s]は想定と違っている", task1.SecondaryNode)
   674  	}
   675  	if task1.SecondaryPort != 0 {
   676  		t.Errorf("ポート番号[%d]は想定と違っている", task1.SecondaryPort)
   677  	}
   678  }
   679  
   680  func TestSetJobEx_ゲートウェイには影響を与えない(t *testing.T) {
   681  	je1 := new(parser.JobEx)
   682  	je1.Node = "node1"
   683  	je1.Port = 1
   684  	je1.FilePath = "path1"
   685  	je1.Param = "param1"
   686  	je1.Env = "env1"
   687  	je1.Workspace = "work1"
   688  	je1.WrnRC = 11
   689  	je1.WrnPtn = "warn1"
   690  	je1.ErrRC = 21
   691  	je1.ErrPtn = "err1"
   692  	je1.TimeoutMin = 60
   693  	je1.SecondaryNode = "secondary"
   694  	je1.SecondaryPort = 2
   695  
   696  	jeMap := make(map[string]*parser.JobEx)
   697  	jeMap["job1"] = je1
   698  
   699  	n, _ := NewNetwork("test")
   700  	gw1 := NewGateway("job1")
   701  	original := *gw1
   702  	n.elements["job1"] = gw1
   703  
   704  	n.setJobEx(jeMap)
   705  	gw1After := n.elements["job1"].(*Gateway)
   706  	if !reflect.DeepEqual(original, *gw1After) {
   707  		t.Error("Gatewayが変更された。")
   708  		t.Log("setJobEx前: %v", original)
   709  		t.Log("setJobEx後: %v", *gw1After)
   710  	}
   711  }
   712  
   713  func TestDetectFlowError_正常なフローではエラーを検出しない(t *testing.T) {
   714  	proc := &parser.Process{
   715  		Start:   make([]parser.StartEvent, 1),
   716  		End:     make([]parser.EndEvent, 1),
   717  		Task:    make([]parser.ServiceTask, 3),
   718  		Gateway: make([]parser.ParallelGateway, 2),
   719  		Flow:    make([]parser.SequenceFlow, 7),
   720  	}
   721  	proc.Start[0] = parser.StartEvent{ID: "start"}
   722  	proc.End[0] = parser.EndEvent{ID: "end"}
   723  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   724  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   725  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
   726  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   727  	proc.Gateway[1] = parser.ParallelGateway{ID: "gw2"}
   728  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   729  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
   730  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task2"}
   731  	proc.Flow[3] = parser.SequenceFlow{From: "gw1", To: "task3"}
   732  	proc.Flow[4] = parser.SequenceFlow{From: "task2", To: "gw2"}
   733  	proc.Flow[5] = parser.SequenceFlow{From: "task3", To: "gw2"}
   734  	proc.Flow[6] = parser.SequenceFlow{From: "gw2", To: "end"}
   735  
   736  	nwk, _ := NewNetwork("test")
   737  	nwk.setElements(proc)
   738  	err := nwk.DetectFlowError()
   739  	if err != nil {
   740  		t.Fatalf("想定外のエラーが検出された: %s", err)
   741  	}
   742  }
   743  
   744  func TestDetectFlowError_分岐しないゲートウェイは正常なフローとして許容する(t *testing.T) {
   745  	proc := &parser.Process{
   746  		Start:   make([]parser.StartEvent, 1),
   747  		End:     make([]parser.EndEvent, 1),
   748  		Task:    make([]parser.ServiceTask, 2),
   749  		Gateway: make([]parser.ParallelGateway, 2),
   750  		Flow:    make([]parser.SequenceFlow, 5),
   751  	}
   752  	proc.Start[0] = parser.StartEvent{ID: "start"}
   753  	proc.End[0] = parser.EndEvent{ID: "end"}
   754  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   755  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   756  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   757  	proc.Gateway[1] = parser.ParallelGateway{ID: "gw2"}
   758  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   759  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
   760  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task2"}
   761  	proc.Flow[3] = parser.SequenceFlow{From: "task2", To: "gw2"}
   762  	proc.Flow[4] = parser.SequenceFlow{From: "gw2", To: "end"}
   763  
   764  	nwk, _ := NewNetwork("test")
   765  	nwk.setElements(proc)
   766  	err := nwk.DetectFlowError()
   767  	if err != nil {
   768  		t.Fatalf("想定外のエラーが検出された: %s", err)
   769  	}
   770  }
   771  
   772  func TestDetectFlowError_startEventがジョブやゲートウェイと接続されていない場合はエラー(t *testing.T) {
   773  	proc := &parser.Process{
   774  		Start:   make([]parser.StartEvent, 1),
   775  		End:     make([]parser.EndEvent, 1),
   776  		Task:    make([]parser.ServiceTask, 1),
   777  		Gateway: make([]parser.ParallelGateway, 0),
   778  		Flow:    make([]parser.SequenceFlow, 1),
   779  	}
   780  	proc.Start[0] = parser.StartEvent{ID: "start"}
   781  	proc.End[0] = parser.EndEvent{ID: "end"}
   782  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   783  	proc.Flow[0] = parser.SequenceFlow{From: "task1", To: "end"}
   784  
   785  	nwk, _ := NewNetwork("test")
   786  	nwk.setElements(proc)
   787  	err := nwk.DetectFlowError()
   788  	if err == nil {
   789  		t.Fatalf("エラーが検出されていない。")
   790  	}
   791  }
   792  
   793  func TestDetectFlowError_endEventがジョブやゲートウェイと接続されていない場合はエラー(t *testing.T) {
   794  	proc := &parser.Process{
   795  		Start:   make([]parser.StartEvent, 1),
   796  		End:     make([]parser.EndEvent, 1),
   797  		Task:    make([]parser.ServiceTask, 1),
   798  		Gateway: make([]parser.ParallelGateway, 0),
   799  		Flow:    make([]parser.SequenceFlow, 1),
   800  	}
   801  	proc.Start[0] = parser.StartEvent{ID: "start"}
   802  	proc.End[0] = parser.EndEvent{ID: "end"}
   803  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   804  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   805  
   806  	nwk, _ := NewNetwork("test")
   807  	nwk.setElements(proc)
   808  	err := nwk.DetectFlowError()
   809  	if err == nil {
   810  		t.Fatalf("エラーが検出されていない。")
   811  	}
   812  }
   813  
   814  func TestDetectFlowError_startEventに接続していない始端がある場合はエラー(t *testing.T) {
   815  	proc := &parser.Process{
   816  		Start:   make([]parser.StartEvent, 1),
   817  		End:     make([]parser.EndEvent, 1),
   818  		Task:    make([]parser.ServiceTask, 2),
   819  		Gateway: make([]parser.ParallelGateway, 1),
   820  		Flow:    make([]parser.SequenceFlow, 4),
   821  	}
   822  	proc.Start[0] = parser.StartEvent{ID: "start"}
   823  	proc.End[0] = parser.EndEvent{ID: "end"}
   824  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   825  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   826  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   827  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   828  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
   829  	proc.Flow[2] = parser.SequenceFlow{From: "task2", To: "gw1"}
   830  	proc.Flow[3] = parser.SequenceFlow{From: "gw1", To: "end"}
   831  
   832  	nwk, _ := NewNetwork("test")
   833  	nwk.setElements(proc)
   834  	err := nwk.DetectFlowError()
   835  	if err == nil {
   836  		t.Fatalf("エラーが検出されていない。")
   837  	}
   838  }
   839  
   840  func TestDetectFlowError_endEventとの接続要素に別の後続要素がある場合はエラー(t *testing.T) {
   841  	proc := &parser.Process{
   842  		Start:   make([]parser.StartEvent, 1),
   843  		End:     make([]parser.EndEvent, 1),
   844  		Task:    make([]parser.ServiceTask, 2),
   845  		Gateway: make([]parser.ParallelGateway, 0),
   846  		Flow:    make([]parser.SequenceFlow, 2),
   847  	}
   848  	proc.Start[0] = parser.StartEvent{ID: "start"}
   849  	proc.End[0] = parser.EndEvent{ID: "end"}
   850  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   851  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   852  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   853  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "end"}
   854  
   855  	nwk, _ := NewNetwork("test")
   856  	nwk.setElements(proc)
   857  	task1 := nwk.elements["task1"].(*Job)
   858  	task1.Next = nwk.elements["task2"]
   859  
   860  	err := nwk.DetectFlowError()
   861  	if err == nil {
   862  		t.Fatalf("エラーが検出されていない。")
   863  	}
   864  }
   865  
   866  func TestDetectFlowError_endEventに接続していない終端がある場合はエラー_分岐外(t *testing.T) {
   867  	proc := &parser.Process{
   868  		Start:   make([]parser.StartEvent, 1),
   869  		End:     make([]parser.EndEvent, 1),
   870  		Task:    make([]parser.ServiceTask, 2),
   871  		Gateway: make([]parser.ParallelGateway, 0),
   872  		Flow:    make([]parser.SequenceFlow, 2),
   873  	}
   874  	proc.Start[0] = parser.StartEvent{ID: "start"}
   875  	proc.End[0] = parser.EndEvent{ID: "end"}
   876  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   877  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   878  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   879  	proc.Flow[1] = parser.SequenceFlow{From: "task2", To: "end"}
   880  
   881  	nwk, _ := NewNetwork("test")
   882  	nwk.setElements(proc)
   883  	err := nwk.DetectFlowError()
   884  	if err == nil {
   885  		t.Fatalf("エラーが検出されていない。")
   886  	}
   887  }
   888  
   889  func TestDetectFlowError_endEventに接続していない終端がある場合はエラー_分岐内(t *testing.T) {
   890  	proc := &parser.Process{
   891  		Start:   make([]parser.StartEvent, 1),
   892  		End:     make([]parser.EndEvent, 1),
   893  		Task:    make([]parser.ServiceTask, 3),
   894  		Gateway: make([]parser.ParallelGateway, 2),
   895  		Flow:    make([]parser.SequenceFlow, 6),
   896  	}
   897  	proc.Start[0] = parser.StartEvent{ID: "start"}
   898  	proc.End[0] = parser.EndEvent{ID: "end"}
   899  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   900  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   901  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
   902  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   903  	proc.Gateway[1] = parser.ParallelGateway{ID: "gw2"}
   904  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   905  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
   906  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task2"}
   907  	proc.Flow[3] = parser.SequenceFlow{From: "gw1", To: "task3"}
   908  	proc.Flow[4] = parser.SequenceFlow{From: "task2", To: "gw2"}
   909  	proc.Flow[5] = parser.SequenceFlow{From: "gw2", To: "end"}
   910  
   911  	nwk, _ := NewNetwork("test")
   912  	nwk.setElements(proc)
   913  	err := nwk.DetectFlowError()
   914  	if err == nil {
   915  		t.Fatalf("エラーが検出されていない。")
   916  	}
   917  }
   918  
   919  func TestDetectFlowError_分岐を結合せずに終了した場合はエラー(t *testing.T) {
   920  	proc := &parser.Process{
   921  		Start:   make([]parser.StartEvent, 1),
   922  		End:     make([]parser.EndEvent, 1),
   923  		Task:    make([]parser.ServiceTask, 3),
   924  		Gateway: make([]parser.ParallelGateway, 1),
   925  		Flow:    make([]parser.SequenceFlow, 6),
   926  	}
   927  	proc.Start[0] = parser.StartEvent{ID: "start"}
   928  	proc.End[0] = parser.EndEvent{ID: "end"}
   929  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   930  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   931  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
   932  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   933  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   934  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
   935  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task2"}
   936  	proc.Flow[3] = parser.SequenceFlow{From: "gw1", To: "task3"}
   937  	proc.Flow[4] = parser.SequenceFlow{From: "task2", To: "end"}
   938  	proc.Flow[5] = parser.SequenceFlow{From: "task3", To: "end"}
   939  
   940  	nwk, _ := NewNetwork("test")
   941  	nwk.setElements(proc)
   942  	err := nwk.DetectFlowError()
   943  	if err == nil {
   944  		t.Fatalf("エラーが検出されていない。")
   945  	}
   946  }
   947  
   948  func TestDetectFlowError_分岐がネストした場合はエラー(t *testing.T) {
   949  	proc := &parser.Process{
   950  		Start:   make([]parser.StartEvent, 1),
   951  		End:     make([]parser.EndEvent, 1),
   952  		Task:    make([]parser.ServiceTask, 4),
   953  		Gateway: make([]parser.ParallelGateway, 3),
   954  		Flow:    make([]parser.SequenceFlow, 10),
   955  	}
   956  	proc.Start[0] = parser.StartEvent{ID: "start"}
   957  	proc.End[0] = parser.EndEvent{ID: "end"}
   958  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   959  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
   960  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
   961  	proc.Task[3] = parser.ServiceTask{ID: "task4", Name: "job4"}
   962  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
   963  	proc.Gateway[1] = parser.ParallelGateway{ID: "gw2"}
   964  	proc.Gateway[2] = parser.ParallelGateway{ID: "gw3"}
   965  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   966  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
   967  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task2"}
   968  	proc.Flow[3] = parser.SequenceFlow{From: "gw1", To: "gw2"}
   969  	proc.Flow[4] = parser.SequenceFlow{From: "gw2", To: "task3"}
   970  	proc.Flow[5] = parser.SequenceFlow{From: "gw2", To: "task4"}
   971  	proc.Flow[6] = parser.SequenceFlow{From: "task2", To: "gw3"}
   972  	proc.Flow[7] = parser.SequenceFlow{From: "task3", To: "gw3"}
   973  	proc.Flow[8] = parser.SequenceFlow{From: "task4", To: "gw3"}
   974  	proc.Flow[9] = parser.SequenceFlow{From: "gw3", To: "end"}
   975  
   976  	nwk, _ := NewNetwork("test")
   977  	nwk.setElements(proc)
   978  	err := nwk.DetectFlowError()
   979  	if err == nil {
   980  		t.Fatalf("エラーが検出されていない。")
   981  	}
   982  }
   983  
   984  func TestDetectFlowError_定義外の型の要素が発見されたらエラー_分岐外(t *testing.T) {
   985  	proc := &parser.Process{
   986  		Start: make([]parser.StartEvent, 1),
   987  		End:   make([]parser.EndEvent, 1),
   988  		Task:  make([]parser.ServiceTask, 1),
   989  		Flow:  make([]parser.SequenceFlow, 3),
   990  	}
   991  	proc.Start[0] = parser.StartEvent{ID: "start"}
   992  	proc.End[0] = parser.EndEvent{ID: "end"}
   993  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
   994  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
   995  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "end"}
   996  
   997  	nwk, _ := NewNetwork("test")
   998  	nwk.setElements(proc)
   999  
  1000  	task1 := nwk.elements["task1"].(*Job)
  1001  	undef := new(undefinedElement)
  1002  	nwk.elements[undef.ID()] = undef
  1003  	undef.AddNext(task1)
  1004  	nwk.Start = undef
  1005  
  1006  	err := nwk.DetectFlowError()
  1007  	if err == nil {
  1008  		t.Fatalf("エラーが検出されていない。")
  1009  	}
  1010  }
  1011  
  1012  func TestDetectFlowError_定義外の型の要素が発見されたらエラー_分岐内(t *testing.T) {
  1013  	proc := &parser.Process{
  1014  		Start:   make([]parser.StartEvent, 1),
  1015  		End:     make([]parser.EndEvent, 1),
  1016  		Task:    make([]parser.ServiceTask, 3),
  1017  		Gateway: make([]parser.ParallelGateway, 2),
  1018  		Flow:    make([]parser.SequenceFlow, 7),
  1019  	}
  1020  	proc.Start[0] = parser.StartEvent{ID: "start"}
  1021  	proc.End[0] = parser.EndEvent{ID: "end"}
  1022  	proc.Task[0] = parser.ServiceTask{ID: "task1", Name: "job1"}
  1023  	proc.Task[1] = parser.ServiceTask{ID: "task2", Name: "job2"}
  1024  	proc.Task[2] = parser.ServiceTask{ID: "task3", Name: "job3"}
  1025  	proc.Gateway[0] = parser.ParallelGateway{ID: "gw1"}
  1026  	proc.Gateway[1] = parser.ParallelGateway{ID: "gw2"}
  1027  	proc.Flow[0] = parser.SequenceFlow{From: "start", To: "task1"}
  1028  	proc.Flow[1] = parser.SequenceFlow{From: "task1", To: "gw1"}
  1029  	proc.Flow[2] = parser.SequenceFlow{From: "gw1", To: "task2"}
  1030  	proc.Flow[3] = parser.SequenceFlow{From: "gw1", To: "task3"}
  1031  	proc.Flow[4] = parser.SequenceFlow{From: "task2", To: "gw2"}
  1032  	proc.Flow[5] = parser.SequenceFlow{From: "task3", To: "gw2"}
  1033  	proc.Flow[6] = parser.SequenceFlow{From: "gw2", To: "end"}
  1034  
  1035  	nwk, _ := NewNetwork("test")
  1036  	nwk.setElements(proc)
  1037  
  1038  	task2 := nwk.elements["task2"].(*Job)
  1039  	undef := new(undefinedElement)
  1040  
  1041  	nwk.elements[undef.ID()] = undef
  1042  	undef.AddNext(task2.Next)
  1043  	task2.Next = undef
  1044  
  1045  	err := nwk.DetectFlowError()
  1046  	if err == nil {
  1047  		t.Fatalf("エラーが検出されていない。")
  1048  	}
  1049  }
  1050  
  1051  func TestNetworkRun_ネットワークを実行できる(t *testing.T) {
  1052  	loadTestConfig()
  1053  
  1054  	n, _ := NewNetwork("test")
  1055  	j1 := generateTestJob(1)
  1056  	j2 := generateTestJob(2)
  1057  	j3 := generateTestJob(3)
  1058  	j4 := generateTestJob(4)
  1059  	g1 := NewGateway("gwid1")
  1060  	g2 := NewGateway("gwid2")
  1061  	n.elements[j1.ID()] = j1
  1062  	n.elements[j2.ID()] = j2
  1063  	n.elements[j3.ID()] = j3
  1064  	n.elements[j4.ID()] = j4
  1065  	n.elements[g1.ID()] = g1
  1066  	n.elements[g2.ID()] = g2
  1067  
  1068  	n.Start = j1
  1069  	j1.AddNext(g1)
  1070  	g1.AddNext(j2)
  1071  	g1.AddNext(j3)
  1072  	j2.AddNext(g2)
  1073  	j3.AddNext(g2)
  1074  	g2.AddNext(j4)
  1075  	n.End = j4
  1076  
  1077  	if err := n.Run(); err != nil {
  1078  		t.Fatalf("想定外のエラーが発生した: %s", err)
  1079  	}
  1080  	if !j1.isExecuted {
  1081  		t.Errorf("j1が実行されていない。")
  1082  	}
  1083  	if !j2.isExecuted {
  1084  		t.Errorf("j2が実行されていない。")
  1085  	}
  1086  	if !j3.isExecuted {
  1087  		t.Errorf("j3が実行されていない。")
  1088  	}
  1089  	if !j4.isExecuted {
  1090  		t.Errorf("j4が実行されていない。")
  1091  	}
  1092  }
  1093  
  1094  func TestNetworkRun_開始要素がnilの場合はエラー(t *testing.T) {
  1095  	loadTestConfig()
  1096  
  1097  	n, _ := NewNetwork("test")
  1098  	j1 := generateTestJob(1)
  1099  	j1.hasError = true
  1100  	n.elements[j1.ID()] = j1
  1101  
  1102  	n.End = j1
  1103  
  1104  	if err := n.Run(); err == nil {
  1105  		t.Error("エラーが発生しなかった。")
  1106  	}
  1107  }
  1108  
  1109  func TestNetworkRun_ジョブネットワークの開始処理で失敗したらエラー(t *testing.T) {
  1110  	config.DB.DBFile = ""
  1111  
  1112  	n, _ := NewNetwork("test")
  1113  	j1 := generateTestJob(1)
  1114  	n.elements[j1.ID()] = j1
  1115  
  1116  	n.Start = j1
  1117  	n.End = j1
  1118  
  1119  	if err := n.Run(); err == nil {
  1120  		t.Error("エラーが発生しなかった。")
  1121  	}
  1122  	if j1.isExecuted {
  1123  		t.Error("j1が実行された。")
  1124  	}
  1125  }
  1126  
  1127  func TestNetworkRun_ネットワーク中のジョブが異常終了したらエラー(t *testing.T) {
  1128  	loadTestConfig()
  1129  
  1130  	n, _ := NewNetwork("test")
  1131  	j1 := generateTestJob(1)
  1132  	j1.hasError = true
  1133  	n.elements[j1.ID()] = j1
  1134  
  1135  	n.Start = j1
  1136  	n.End = j1
  1137  
  1138  	if err := n.Run(); err == nil {
  1139  		t.Error("エラーが発生しなかった。")
  1140  	}
  1141  }
  1142  
  1143  func TestNetworkRun_ジョブネットワークがendEvent以外で終端したらエラー(t *testing.T) {
  1144  	loadTestConfig()
  1145  
  1146  	n, _ := NewNetwork("test")
  1147  	j1 := generateTestJob(1)
  1148  	n.elements[j1.ID()] = j1
  1149  
  1150  	n.Start = j1
  1151  
  1152  	if err := n.Run(); err == nil {
  1153  		t.Error("エラーが発生しなかった。")
  1154  	}
  1155  }