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 }