transport_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package net
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "io/ioutil"
  7. "testing"
  8. "github.com/v2ray/v2ray-core/common/alloc"
  9. v2testing "github.com/v2ray/v2ray-core/testing"
  10. "github.com/v2ray/v2ray-core/testing/assert"
  11. )
  12. func TestReaderAndWrite(t *testing.T) {
  13. v2testing.Current(t)
  14. size := 1024 * 1024
  15. buffer := make([]byte, size)
  16. nBytes, err := rand.Read(buffer)
  17. assert.Int(nBytes).Equals(len(buffer))
  18. assert.Error(err).IsNil()
  19. readerBuffer := bytes.NewReader(buffer)
  20. writerBuffer := bytes.NewBuffer(make([]byte, 0, size))
  21. transportChan := make(chan *alloc.Buffer, 1024)
  22. err = ReaderToChan(transportChan, readerBuffer)
  23. assert.Error(err).Equals(io.EOF)
  24. close(transportChan)
  25. err = ChanToWriter(writerBuffer, transportChan)
  26. assert.Error(err).IsNil()
  27. assert.Bytes(buffer).Equals(writerBuffer.Bytes())
  28. }
  29. type StaticReader struct {
  30. total int
  31. current int
  32. }
  33. func (reader *StaticReader) Read(b []byte) (size int, err error) {
  34. size = len(b)
  35. if size > reader.total-reader.current {
  36. size = reader.total - reader.current
  37. }
  38. for i := 0; i < size; i++ {
  39. b[i] = byte(i)
  40. }
  41. //rand.Read(b[:size])
  42. reader.current += size
  43. if reader.current == reader.total {
  44. err = io.EOF
  45. }
  46. return
  47. }
  48. func BenchmarkTransport1K(b *testing.B) {
  49. size := 1 * 1024
  50. for i := 0; i < b.N; i++ {
  51. runBenchmarkTransport(size)
  52. }
  53. }
  54. func BenchmarkTransport2K(b *testing.B) {
  55. size := 2 * 1024
  56. for i := 0; i < b.N; i++ {
  57. runBenchmarkTransport(size)
  58. }
  59. }
  60. func BenchmarkTransport4K(b *testing.B) {
  61. size := 4 * 1024
  62. for i := 0; i < b.N; i++ {
  63. runBenchmarkTransport(size)
  64. }
  65. }
  66. func BenchmarkTransport10K(b *testing.B) {
  67. size := 10 * 1024
  68. for i := 0; i < b.N; i++ {
  69. runBenchmarkTransport(size)
  70. }
  71. }
  72. func BenchmarkTransport100K(b *testing.B) {
  73. size := 100 * 1024
  74. for i := 0; i < b.N; i++ {
  75. runBenchmarkTransport(size)
  76. }
  77. }
  78. func BenchmarkTransport1M(b *testing.B) {
  79. size := 1024 * 1024
  80. for i := 0; i < b.N; i++ {
  81. runBenchmarkTransport(size)
  82. }
  83. }
  84. func BenchmarkTransport10M(b *testing.B) {
  85. size := 10 * 1024 * 1024
  86. for i := 0; i < b.N; i++ {
  87. runBenchmarkTransport(size)
  88. }
  89. }
  90. func runBenchmarkTransport(size int) {
  91. transportChanA := make(chan *alloc.Buffer, 16)
  92. transportChanB := make(chan *alloc.Buffer, 16)
  93. readerA := &StaticReader{size, 0}
  94. readerB := &StaticReader{size, 0}
  95. writerA := ioutil.Discard
  96. writerB := ioutil.Discard
  97. finishA := make(chan bool)
  98. finishB := make(chan bool)
  99. go func() {
  100. ChanToWriter(writerA, transportChanA)
  101. close(finishA)
  102. }()
  103. go func() {
  104. ReaderToChan(transportChanA, readerA)
  105. close(transportChanA)
  106. }()
  107. go func() {
  108. ChanToWriter(writerB, transportChanB)
  109. close(finishB)
  110. }()
  111. go func() {
  112. ReaderToChan(transportChanB, readerB)
  113. close(transportChanB)
  114. }()
  115. <-transportChanA
  116. <-transportChanB
  117. }