transport_test.go 2.8 KB

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