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

     1  package remote
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/unirita/cuto/master/config"
    10  	"github.com/unirita/cuto/message"
    11  )
    12  
    13  const (
    14  	testHost = "localhost"
    15  	testPort = 12345
    16  )
    17  
    18  func init() {
    19  	config.Job.ConnectionTimeoutSec = 1
    20  }
    21  
    22  func runTestReceiver(t *testing.T, listener net.Listener, msq chan<- string, delay int) {
    23  	conn, err := listener.Accept()
    24  	if err != nil {
    25  		t.Log(err)
    26  		return
    27  	}
    28  
    29  	defer conn.Close()
    30  
    31  	buf := make([]byte, 1024)
    32  	readLen, err := conn.Read(buf)
    33  	if err != nil {
    34  		t.Log(err)
    35  	}
    36  
    37  	readMsg := string(buf[:readLen])
    38  	msq <- readMsg
    39  
    40  	d := time.Duration(delay) * time.Second
    41  	time.Sleep(d)
    42  
    43  	_, err = conn.Write([]byte("testresponse\n"))
    44  	if err != nil {
    45  		t.Log(err)
    46  	}
    47  }
    48  
    49  func runTestReceiverWithHearbeat(t *testing.T, listener net.Listener, msq chan<- string, delay int) {
    50  	conn, err := listener.Accept()
    51  	if err != nil {
    52  		t.Log(err)
    53  		return
    54  	}
    55  
    56  	defer conn.Close()
    57  
    58  	buf := make([]byte, 1024)
    59  	readLen, err := conn.Read(buf)
    60  	if err != nil {
    61  		t.Log(err)
    62  	}
    63  
    64  	readMsg := string(buf[:readLen])
    65  	msq <- readMsg
    66  
    67  	s := 500 * time.Millisecond
    68  	for i := 0; i < delay*2; i++ {
    69  		time.Sleep(s)
    70  		_, err = conn.Write([]byte(message.HEARTBEAT + "\n"))
    71  		if err != nil {
    72  			t.Log(err)
    73  		}
    74  	}
    75  
    76  	_, err = conn.Write([]byte(`testresponse` + "\n"))
    77  	if err != nil {
    78  		t.Log(err)
    79  	}
    80  }
    81  
    82  func runTestReceiverWithStartTime(t *testing.T, listener net.Listener, msq chan<- string, delay int) {
    83  	conn, err := listener.Accept()
    84  	if err != nil {
    85  		t.Log(err)
    86  		return
    87  	}
    88  
    89  	defer conn.Close()
    90  
    91  	buf := make([]byte, 1024)
    92  	readLen, err := conn.Read(buf)
    93  	if err != nil {
    94  		t.Log(err)
    95  	}
    96  
    97  	readMsg := string(buf[:readLen])
    98  	msq <- readMsg
    99  
   100  	d := time.Duration(delay) * time.Second
   101  	time.Sleep(d)
   102  
   103  	conn.Write([]byte(message.ST_HEADER + "20150401123456.789" + "\n"))
   104  
   105  	_, err = conn.Write([]byte(`testresponse` + "\n"))
   106  	if err != nil {
   107  		t.Log(err)
   108  	}
   109  }
   110  
   111  func TestSendMessage_メッセージを送信できる(t *testing.T) {
   112  	addr := fmt.Sprintf(":%d", testPort)
   113  
   114  	listener, listenErr := net.Listen("tcp", addr)
   115  	if listenErr != nil {
   116  		t.Fatalf("テスト用のlistenに失敗しました: %s", listenErr)
   117  	}
   118  
   119  	defer listener.Close()
   120  
   121  	msq := make(chan string, 10)
   122  	go runTestReceiver(t, listener, msq, 0)
   123  
   124  	stCh := make(chan string, 1)
   125  	defer close(stCh)
   126  	resMsg, err := SendRequest(testHost, testPort, `testrequest`, stCh)
   127  	if err != nil {
   128  		t.Fatalf("エラーが発生しました: %s", err)
   129  	}
   130  
   131  	if message := <-msq; message != "testrequest\n" {
   132  		t.Errorf("リスナに届いたメッセージが間違っています: %s", message)
   133  	}
   134  
   135  	if resMsg != `testresponse` {
   136  		t.Errorf("リスナからのレスポンスメッセージが間違っています: %s", resMsg)
   137  	}
   138  }
   139  
   140  func TestSendMessage_一定時間応答がない場合はタイムアウトする(t *testing.T) {
   141  	addr := fmt.Sprintf(":%d", testPort)
   142  
   143  	listener, listenErr := net.Listen("tcp", addr)
   144  	if listenErr != nil {
   145  		t.Fatalf("テスト用のlistenに失敗しました: %s", listenErr)
   146  	}
   147  
   148  	defer listener.Close()
   149  
   150  	msq := make(chan string, 10)
   151  	go runTestReceiver(t, listener, msq, 2)
   152  
   153  	stCh := make(chan string, 1)
   154  	defer close(stCh)
   155  	_, err := SendRequest(testHost, testPort, `testrequest`, stCh)
   156  	if err == nil {
   157  		t.Fatalf("タイムアウトが発生しない。")
   158  	}
   159  }
   160  
   161  func TestSendMessage_ハートビートが返される場合はタイムアウトしない(t *testing.T) {
   162  	addr := fmt.Sprintf(":%d", testPort)
   163  
   164  	listener, listenErr := net.Listen("tcp", addr)
   165  	if listenErr != nil {
   166  		t.Fatalf("テスト用のlistenに失敗しました: %s", listenErr)
   167  	}
   168  
   169  	defer listener.Close()
   170  
   171  	msq := make(chan string, 10)
   172  	go runTestReceiverWithHearbeat(t, listener, msq, 2)
   173  
   174  	stCh := make(chan string, 1)
   175  	defer close(stCh)
   176  	resMsg, err := SendRequest(testHost, testPort, `testrequest`, stCh)
   177  	if err != nil {
   178  		t.Fatalf("エラーが発生しました: %s", err)
   179  	}
   180  
   181  	if message := <-msq; message != "testrequest\n" {
   182  		t.Errorf("リスナに届いたメッセージが間違っています: %s", message)
   183  	}
   184  
   185  	if resMsg != `testresponse` {
   186  		t.Errorf("リスナからのレスポンスメッセージが間違っています: %s", resMsg)
   187  	}
   188  }
   189  
   190  func TestSendMessage_スタート時刻をチャンネルから取得できる(t *testing.T) {
   191  	addr := fmt.Sprintf(":%d", testPort)
   192  
   193  	listener, listenErr := net.Listen("tcp", addr)
   194  	if listenErr != nil {
   195  		t.Fatalf("テスト用のlistenに失敗しました: %s", listenErr)
   196  	}
   197  
   198  	defer listener.Close()
   199  
   200  	msq := make(chan string, 10)
   201  	go runTestReceiverWithStartTime(t, listener, msq, 0)
   202  
   203  	stCh := make(chan string, 1)
   204  	defer close(stCh)
   205  	resMsg, err := SendRequest(testHost, testPort, `testrequest`, stCh)
   206  	if err != nil {
   207  		t.Fatalf("エラーが発生しました: %s", err)
   208  	}
   209  
   210  	select {
   211  	case st := <-stCh:
   212  		if st != "20150401123456.789" {
   213  			t.Errorf("取得したスタート時刻[%s]が間違っている。", st)
   214  		}
   215  	case <-time.After(3 * time.Second):
   216  		t.Fatal("十分な時間待ったが、スタート時刻が取得できなかった。")
   217  	}
   218  
   219  	if message := <-msq; message != "testrequest\n" {
   220  		t.Errorf("リスナに届いたメッセージが間違っています: %s", message)
   221  	}
   222  
   223  	if resMsg != `testresponse` {
   224  		t.Errorf("リスナからのレスポンスメッセージが間違っています: %s", resMsg)
   225  	}
   226  }