|  | @@ -1,153 +0,0 @@
 | 
	
		
			
				|  |  | -package net_test
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import (
 | 
	
		
			
				|  |  | -	"bytes"
 | 
	
		
			
				|  |  | -	"crypto/rand"
 | 
	
		
			
				|  |  | -	"io"
 | 
	
		
			
				|  |  | -	"io/ioutil"
 | 
	
		
			
				|  |  | -	"testing"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	"github.com/v2ray/v2ray-core/common/alloc"
 | 
	
		
			
				|  |  | -	v2net "github.com/v2ray/v2ray-core/common/net"
 | 
	
		
			
				|  |  | -	v2testing "github.com/v2ray/v2ray-core/testing"
 | 
	
		
			
				|  |  | -	"github.com/v2ray/v2ray-core/testing/assert"
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func TestReaderAndWrite(t *testing.T) {
 | 
	
		
			
				|  |  | -	v2testing.Current(t)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	size := 1024 * 1024
 | 
	
		
			
				|  |  | -	buffer := make([]byte, size)
 | 
	
		
			
				|  |  | -	nBytes, err := rand.Read(buffer)
 | 
	
		
			
				|  |  | -	assert.Int(nBytes).Equals(len(buffer))
 | 
	
		
			
				|  |  | -	assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	readerBuffer := bytes.NewReader(buffer)
 | 
	
		
			
				|  |  | -	writerBuffer := bytes.NewBuffer(make([]byte, 0, size))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	transportChan := make(chan *alloc.Buffer, 1024)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	err = v2net.ReaderToChan(transportChan, readerBuffer)
 | 
	
		
			
				|  |  | -	assert.Error(err).Equals(io.EOF)
 | 
	
		
			
				|  |  | -	close(transportChan)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	err = v2net.ChanToWriter(writerBuffer, transportChan)
 | 
	
		
			
				|  |  | -	assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	assert.Bytes(buffer).Equals(writerBuffer.Bytes())
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -type StaticReader struct {
 | 
	
		
			
				|  |  | -	total   int
 | 
	
		
			
				|  |  | -	current int
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (reader *StaticReader) Read(b []byte) (size int, err error) {
 | 
	
		
			
				|  |  | -	size = len(b)
 | 
	
		
			
				|  |  | -	if size > reader.total-reader.current {
 | 
	
		
			
				|  |  | -		size = reader.total - reader.current
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	for i := 0; i < size; i++ {
 | 
	
		
			
				|  |  | -		b[i] = byte(i)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	//rand.Read(b[:size])
 | 
	
		
			
				|  |  | -	reader.current += size
 | 
	
		
			
				|  |  | -	if reader.current == reader.total {
 | 
	
		
			
				|  |  | -		err = io.EOF
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport1K(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 1 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport2K(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 2 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport4K(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 4 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport10K(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 10 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport100K(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 100 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport1M(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 1024 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func BenchmarkTransport10M(b *testing.B) {
 | 
	
		
			
				|  |  | -	size := 10 * 1024 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | -		runBenchmarkTransport(size)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func runBenchmarkTransport(size int) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	transportChanA := make(chan *alloc.Buffer, 16)
 | 
	
		
			
				|  |  | -	transportChanB := make(chan *alloc.Buffer, 16)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	readerA := &StaticReader{size, 0}
 | 
	
		
			
				|  |  | -	readerB := &StaticReader{size, 0}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	writerA := ioutil.Discard
 | 
	
		
			
				|  |  | -	writerB := ioutil.Discard
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	finishA := make(chan bool)
 | 
	
		
			
				|  |  | -	finishB := make(chan bool)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	go func() {
 | 
	
		
			
				|  |  | -		v2net.ChanToWriter(writerA, transportChanA)
 | 
	
		
			
				|  |  | -		close(finishA)
 | 
	
		
			
				|  |  | -	}()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	go func() {
 | 
	
		
			
				|  |  | -		v2net.ReaderToChan(transportChanA, readerA)
 | 
	
		
			
				|  |  | -		close(transportChanA)
 | 
	
		
			
				|  |  | -	}()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	go func() {
 | 
	
		
			
				|  |  | -		v2net.ChanToWriter(writerB, transportChanB)
 | 
	
		
			
				|  |  | -		close(finishB)
 | 
	
		
			
				|  |  | -	}()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	go func() {
 | 
	
		
			
				|  |  | -		v2net.ReaderToChan(transportChanB, readerB)
 | 
	
		
			
				|  |  | -		close(transportChanB)
 | 
	
		
			
				|  |  | -	}()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	<-transportChanA
 | 
	
		
			
				|  |  | -	<-transportChanB
 | 
	
		
			
				|  |  | -}
 |