From f10935ad2e37d7662dc92a1bbc2b6e14cbb52b44 Mon Sep 17 00:00:00 2001
From: Asim <asim@chuhnk.me>
Date: Sat, 19 Mar 2016 15:29:04 +0000
Subject: [PATCH] http bench test

---
 transport/http/http_test.go | 138 ++++++++++++++++++++++++++++++++++++
 1 file changed, 138 insertions(+)
 create mode 100644 transport/http/http_test.go

diff --git a/transport/http/http_test.go b/transport/http/http_test.go
new file mode 100644
index 00000000..faaf5215
--- /dev/null
+++ b/transport/http/http_test.go
@@ -0,0 +1,138 @@
+package http
+
+import (
+	"sync"
+	"testing"
+
+	"github.com/micro/go-micro/transport"
+)
+
+func call(b *testing.B, c int) {
+	b.StopTimer()
+
+	tr := NewTransport()
+
+	// server listen
+	l, err := tr.Listen("localhost:0")
+	if err != nil {
+		b.Fatal(err)
+	}
+	defer l.Close()
+
+	// socket func
+	fn := func(sock transport.Socket) {
+		defer sock.Close()
+
+		for {
+			var m transport.Message
+			if err := sock.Recv(&m); err != nil {
+				return
+			}
+
+			if err := sock.Send(&m); err != nil {
+				return
+			}
+		}
+	}
+
+	done := make(chan bool)
+
+	// accept connections
+	go func() {
+		if err := l.Accept(fn); err != nil {
+			select {
+			case <-done:
+			default:
+				b.Fatalf("Unexpected accept err: %v", err)
+			}
+		}
+	}()
+
+	m := transport.Message{
+		Header: map[string]string{
+			"Content-Type": "application/json",
+		},
+		Body: []byte(`{"message": "Hello World"}`),
+	}
+
+	// client connection
+	client, err := tr.Dial(l.Addr())
+	if err != nil {
+		b.Fatalf("Unexpected dial err: %v", err)
+	}
+
+	send := func(c transport.Client) {
+		// send message
+		if err := c.Send(&m); err != nil {
+			b.Fatalf("Unexpected send err: %v", err)
+		}
+
+		var rm transport.Message
+		// receive message
+		if err := c.Recv(&rm); err != nil {
+			b.Fatalf("Unexpected recv err: %v", err)
+		}
+	}
+
+	// warm
+	for i := 0; i < 10; i++ {
+		send(client)
+	}
+
+	client.Close()
+
+	ch := make(chan int, c*4)
+
+	var wg sync.WaitGroup
+	wg.Add(c)
+
+	for i := 0; i < c; i++ {
+		go func() {
+			cl, err := tr.Dial(l.Addr())
+			if err != nil {
+				b.Fatalf("Unexpected dial err: %v", err)
+			}
+			defer cl.Close()
+
+			for range ch {
+				send(cl)
+			}
+
+			wg.Done()
+		}()
+	}
+
+	b.StartTimer()
+
+	for i := 0; i < b.N; i++ {
+		ch <- i
+	}
+
+	b.StopTimer()
+	close(ch)
+
+	wg.Wait()
+
+	// finish
+	close(done)
+}
+
+func BenchmarkTransport1(b *testing.B) {
+	call(b, 1)
+}
+
+func BenchmarkTransport8(b *testing.B) {
+	call(b, 8)
+}
+
+func BenchmarkTransport16(b *testing.B) {
+	call(b, 16)
+}
+
+func BenchmarkTransport64(b *testing.B) {
+	call(b, 64)
+}
+
+func BenchmarkTransport128(b *testing.B) {
+	call(b, 128)
+}