transport_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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, size/bufferSize*10)
  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. //rand.Read(b[:size])
  37. reader.current += size
  38. if reader.current == reader.total {
  39. err = io.EOF
  40. }
  41. return
  42. }
  43. func BenchmarkTransport(b *testing.B) {
  44. size := 1024 * 1024
  45. for i := 0; i < b.N; i++ {
  46. transportChanA := make(chan []byte, 128)
  47. transportChanB := make(chan []byte, 128)
  48. readerA := &StaticReader{size, 0}
  49. readerB := &StaticReader{size, 0}
  50. writerA := ioutil.Discard
  51. writerB := ioutil.Discard
  52. finishA := make(chan bool)
  53. finishB := make(chan bool)
  54. go func() {
  55. ChanToWriter(writerA, transportChanA)
  56. close(finishA)
  57. }()
  58. go func() {
  59. ReaderToChan(transportChanA, readerA)
  60. close(transportChanA)
  61. }()
  62. go func() {
  63. ChanToWriter(writerB, transportChanB)
  64. close(finishB)
  65. }()
  66. go func() {
  67. ReaderToChan(transportChanB, readerB)
  68. close(transportChanB)
  69. }()
  70. <-transportChanA
  71. <-transportChanB
  72. }
  73. }