transport_test.go 2.6 KB

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