2014-10-23 18:57:54 +03:00
package p2p
import (
2014-11-04 14:21:44 +02:00
"bytes"
2014-12-12 12:39:07 +02:00
"fmt"
2015-02-05 04:07:58 +02:00
"io"
2014-11-04 14:21:44 +02:00
"io/ioutil"
2014-12-12 12:39:07 +02:00
"runtime"
2014-10-23 18:57:54 +03:00
"testing"
2014-12-12 12:39:07 +02:00
"time"
2014-10-23 18:57:54 +03:00
)
func TestNewMsg ( t * testing . T ) {
2014-11-04 14:21:44 +02:00
msg := NewMsg ( 3 , 1 , "000" )
if msg . Code != 3 {
t . Errorf ( "incorrect code %d, want %d" , msg . Code )
2014-10-23 18:57:54 +03:00
}
2014-11-04 14:21:44 +02:00
if msg . Size != 5 {
t . Errorf ( "incorrect size %d, want %d" , msg . Size , 5 )
2014-10-23 18:57:54 +03:00
}
2014-11-04 14:21:44 +02: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 18:57:54 +03:00
}
}
2015-02-05 04:07:58 +02: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 14:21:44 +02:00
2015-02-05 04:07:58 +02: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 17:01:39 +02:00
2015-02-05 04:07:58 +02: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 14:21:44 +02:00
2015-02-05 04:07:58 +02: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 14:21:44 +02:00
2015-02-05 04:07:58 +02:00
// if msg.Code != 0 {
// t.Errorf("incorrect code %d, want %d", msg.Code, 0)
// }
// }
2014-12-12 12:39:07 +02:00
func ExampleMsgPipe ( ) {
rw1 , rw2 := MsgPipe ( )
go func ( ) {
2015-01-06 12:35:09 +02:00
EncodeMsg ( rw1 , 8 , [ ] byte { 0 , 0 } )
EncodeMsg ( rw1 , 5 , [ ] byte { 1 , 1 } )
2014-12-12 12:39:07 +02: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 12:35:09 +02:00
if err := EncodeMsg ( rw1 , 1 ) ; err == nil {
2014-12-12 12:39:07 +02: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 04:07:58 +02: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 :
}
}