| 
					
				 | 
			
			
				@@ -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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 |