diff --git a/broadcast/causal_test.go b/broadcast/causal_test.go new file mode 100644 index 0000000..0e20464 --- /dev/null +++ b/broadcast/causal_test.go @@ -0,0 +1,81 @@ +package broadcast + +import ( + "testing" + "time" +) + +func TestCausalBroadcast(t *testing.T) { + peer_addrs := []string{"localhost:9991", "localhost:9992"} + messages := [][]byte{randStringBytes(2 << 23), []byte("hello gofret!")} + incoming_channels := []chan []byte{make(chan []byte), make(chan []byte)} + done_signal := make(chan bool) + ready_signal := make(chan bool) + + emitter_routine := func(address string, messages [][]byte, incoming_channel chan []byte, done chan bool) { + broadcaster := CausalBroadcast(Configuration{ + SelfAddress: address, + PeerAddresses: peer_addrs, + }) + + incoming_messages, err := broadcaster.Init() + if err != nil { + t.Errorf("%v", err) + } + + go func() { + for { + incoming_channel <- <-incoming_messages + } + }() + + for _, message := range messages { + if err := broadcaster.Broadcast(message); err != nil { + t.Errorf("cannot broadcast: %v", err) + } + } + + done <- true + } + + receiver_routine := func(address string, incoming_channel chan []byte, ready chan bool) { + broadcaster := CausalBroadcast(Configuration{ + SelfAddress: address, + PeerAddresses: peer_addrs, + }) + + incoming_messages, err := broadcaster.Init() + if err != nil { + t.Errorf("%v", err) + } + + go func() { + for { + incoming_channel <- <-incoming_messages + } + }() + ready_signal <- true + } + + go receiver_routine(peer_addrs[0], incoming_channels[0], ready_signal) + <-ready_signal + + go emitter_routine(peer_addrs[1], messages, incoming_channels[1], done_signal) + <-done_signal + + timeout := time.After(30000 * time.Millisecond) + select { + case incoming_message := <-incoming_channels[0]: + if string(incoming_message[:len(messages[1])-1]) == string(messages[1]) { + t.Errorf("order is not correct") + return + } + case incoming_message := <-incoming_channels[1]: + if string(incoming_message[:len(messages[1])-1]) == string(messages[1]) { + t.Errorf("order is not correct") + return + } + case <-timeout: + t.Errorf("timed out") + } +} diff --git a/broadcast/fifo_test.go b/broadcast/fifo_test.go index 2247ac7..f156168 100644 --- a/broadcast/fifo_test.go +++ b/broadcast/fifo_test.go @@ -8,7 +8,7 @@ import ( const letter_bytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -func RandStringBytes(length int) []byte { +func randStringBytes(length int) []byte { bytes_array := make([]byte, length) for i := range bytes_array { bytes_array[i] = letter_bytes[rand.Intn(len(letter_bytes))] @@ -18,7 +18,7 @@ func RandStringBytes(length int) []byte { func TestFIFOBroadcast(t *testing.T) { peer_addrs := []string{"localhost:9991", "localhost:9992"} - messages := [][]byte{RandStringBytes(2 << 23), []byte("hello gofret!")} + messages := [][]byte{randStringBytes(2 << 23), []byte("hello gofret!")} incoming_channels := []chan []byte{make(chan []byte), make(chan []byte)} done_signal := make(chan bool) ready_signal := make(chan bool)