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)