2014-10-23 16:57:54 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								package  p2p 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"bytes" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-12 11:39:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"fmt" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"io" 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"io/ioutil" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-12 11:39:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"runtime" 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 16:57:54 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									"testing" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-12 11:39:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									"time" 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 16:57:54 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  TestNewMsg ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									msg  :=  NewMsg ( 3 ,  1 ,  "000" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  msg . Code  !=  3  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "incorrect code %d, want %d" ,  msg . Code ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 16:57:54 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  msg . Size  !=  5  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "incorrect size %d, want %d" ,  msg . Size ,  5 ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 16:57:54 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pl ,  _  :=  ioutil . ReadAll ( msg . Payload ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									expect  :=  [ ] byte { 0x01 ,  0x83 ,  0x30 ,  0x30 ,  0x30 } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ! bytes . Equal ( pl ,  expect )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "incorrect payload content, got %x, want %x" ,  pl ,  expect ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 16:57:54 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// func TestEncodeDecodeMsg(t *testing.T) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	msg := NewMsg(3, 1, "000") 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	buf := new(bytes.Buffer) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if err := writeMsg(buf, msg); err != nil { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Fatalf("encodeMsg error: %v", err) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	// t.Logf("encoded: %x", buf.Bytes()) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// 	decmsg, err := readMsg(buf) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if err != nil { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Fatalf("readMsg error: %v", err) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if decmsg.Code != 3 { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Errorf("incorrect code %d, want %d", decmsg.Code, 3) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if decmsg.Size != 5 { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Errorf("incorrect size %d, want %d", decmsg.Size, 5) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-25 16:01:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// 	var data struct { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		I uint 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		S string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if err := decmsg.Decode(&data); err != nil { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Fatalf("Decode error: %v", err) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if data.I != 1 { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Errorf("incorrect data.I: got %v, expected %d", data.I, 1) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if data.S != "000" { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Errorf("incorrect data.S: got %q, expected %q", data.S, "000") 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// } 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// func TestDecodeRealMsg(t *testing.T) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	data := ethutil.Hex2Bytes("2240089100000080f87e8002b5457468657265756d282b2b292f5065657220536572766572204f6e652f76302e372e382f52656c656173652f4c696e75782f672b2bc082765fb84086dd80b7aefd6a6d2e3b93f4f300a86bfb6ef7bdc97cb03f793db6bb") 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	msg, err := readMsg(bytes.NewReader(data)) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	if err != nil { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Fatalf("unexpected error: %v", err) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 13:21:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// 	if msg.Code != 0 { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 		t.Errorf("incorrect code %d, want %d", msg.Code, 0) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 	} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// } 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-12 11:39:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  ExampleMsgPipe ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rw1 ,  rw2  :=  MsgPipe ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									go  func ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 11:35:09 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										EncodeMsg ( rw1 ,  8 ,  [ ] byte { 0 ,  0 } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										EncodeMsg ( rw1 ,  5 ,  [ ] byte { 1 ,  1 } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-12 11:39:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										rw1 . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										msg ,  err  :=  rw2 . ReadMsg ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										var  data  [ 1 ] [ ] byte 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										msg . Decode ( & data ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										fmt . Printf ( "msg: %d, %x\n" ,  msg . Code ,  data [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Output: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// msg: 8, 0000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// msg: 5, 0101 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  TestMsgPipeUnblockWrite ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								loop : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  i  :=  0 ;  i  <  100 ;  i ++  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										rw1 ,  rw2  :=  MsgPipe ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										done  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										go  func ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 11:35:09 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  err  :=  EncodeMsg ( rw1 ,  1 ) ;  err  ==  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-12 11:39:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												t . Error ( "EncodeMsg returned nil error" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											}  else  if  err  !=  ErrPipeClosed  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												t . Error ( "EncodeMsg returned wrong error: got %v, want %v" ,  err ,  ErrPipeClosed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											close ( done ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// this call should ensure that EncodeMsg is waiting to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// deliver sometimes. if this isn't done, Close is likely to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// be executed before EncodeMsg starts and then we won't test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// all the cases. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										runtime . Gosched ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										rw2 . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  <- done : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  <- time . After ( 200  *  time . Millisecond ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											t . Errorf ( "write didn't unblock" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break  loop 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// This test should panic if concurrent close isn't implemented correctly. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  TestMsgPipeConcurrentClose ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rw1 ,  _  :=  MsgPipe ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  i  :=  0 ;  i  <  10 ;  i ++  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										go  rw1 . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-05 03:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								func  TestEOFSignal ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rb  :=  make ( [ ] byte ,  10 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// empty reader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									eof  :=  make ( chan  struct { } ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sig  :=  & eofSignal { new ( bytes . Buffer ) ,  0 ,  eof } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  n ,  err  :=  sig . Read ( rb ) ;  n  !=  0  ||  err  !=  io . EOF  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "Read returned unexpected values: (%v, %v)" ,  n ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  <- eof : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Error ( "EOF chan not signaled" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// count before error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									eof  =  make ( chan  struct { } ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sig  =  & eofSignal { bytes . NewBufferString ( "aaaaaaaa" ) ,  4 ,  eof } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  n ,  err  :=  sig . Read ( rb ) ;  n  !=  4  ||  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "Read returned unexpected values: (%v, %v)" ,  n ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  <- eof : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Error ( "EOF chan not signaled" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// error before count 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									eof  =  make ( chan  struct { } ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sig  =  & eofSignal { bytes . NewBufferString ( "aaaa" ) ,  999 ,  eof } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  n ,  err  :=  sig . Read ( rb ) ;  n  !=  4  ||  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "Read returned unexpected values: (%v, %v)" ,  n ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  n ,  err  :=  sig . Read ( rb ) ;  n  !=  0  ||  err  !=  io . EOF  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "Read returned unexpected values: (%v, %v)" ,  n ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  <- eof : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Error ( "EOF chan not signaled" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// no signal if neither occurs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									eof  =  make ( chan  struct { } ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sig  =  & eofSignal { bytes . NewBufferString ( "aaaaaaaaaaaaaaaaaaaaa" ) ,  999 ,  eof } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  n ,  err  :=  sig . Read ( rb ) ;  n  !=  10  ||  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Errorf ( "Read returned unexpected values: (%v, %v)" ,  n ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  <- eof : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										t . Error ( "unexpected EOF signal" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}