transport_test.go 2.7 KB

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