io_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package io_test
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "testing"
  7. "github.com/v2ray/v2ray-core/common/alloc"
  8. v2io "github.com/v2ray/v2ray-core/common/io"
  9. . "github.com/v2ray/v2ray-core/proxy/vmess/io"
  10. "github.com/v2ray/v2ray-core/testing/assert"
  11. )
  12. func TestAuthenticate(t *testing.T) {
  13. assert := assert.On(t)
  14. buffer := alloc.NewBuffer().Clear()
  15. buffer.AppendBytes(1, 2, 3, 4)
  16. Authenticate(buffer)
  17. assert.Bytes(buffer.Value).Equals([]byte{0, 8, 87, 52, 168, 125, 1, 2, 3, 4})
  18. b2, err := NewAuthChunkReader(buffer).Read()
  19. assert.Error(err).IsNil()
  20. assert.Bytes(b2.Value).Equals([]byte{1, 2, 3, 4})
  21. }
  22. func TestSingleIO(t *testing.T) {
  23. assert := assert.On(t)
  24. content := bytes.NewBuffer(make([]byte, 0, 1024*1024))
  25. writer := NewAuthChunkWriter(v2io.NewAdaptiveWriter(content))
  26. writer.Write(alloc.NewBuffer().Clear().AppendString("abcd"))
  27. writer.Write(alloc.NewBuffer().Clear())
  28. writer.Release()
  29. reader := NewAuthChunkReader(content)
  30. buffer, err := reader.Read()
  31. assert.Error(err).IsNil()
  32. assert.Bytes(buffer.Value).Equals([]byte("abcd"))
  33. }
  34. func TestLargeIO(t *testing.T) {
  35. assert := assert.On(t)
  36. content := make([]byte, 1024*1024)
  37. rand.Read(content)
  38. chunckContent := bytes.NewBuffer(make([]byte, 0, len(content)*2))
  39. writer := NewAuthChunkWriter(v2io.NewAdaptiveWriter(chunckContent))
  40. writeSize := 0
  41. for {
  42. chunkSize := 7 * 1024
  43. if chunkSize+writeSize > len(content) {
  44. chunkSize = len(content) - writeSize
  45. }
  46. writer.Write(alloc.NewBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  47. writeSize += chunkSize
  48. if writeSize == len(content) {
  49. break
  50. }
  51. chunkSize = 8 * 1024
  52. if chunkSize+writeSize > len(content) {
  53. chunkSize = len(content) - writeSize
  54. }
  55. writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  56. writeSize += chunkSize
  57. if writeSize == len(content) {
  58. break
  59. }
  60. chunkSize = 63 * 1024
  61. if chunkSize+writeSize > len(content) {
  62. chunkSize = len(content) - writeSize
  63. }
  64. writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  65. writeSize += chunkSize
  66. if writeSize == len(content) {
  67. break
  68. }
  69. chunkSize = 64*1024 - 16
  70. if chunkSize+writeSize > len(content) {
  71. chunkSize = len(content) - writeSize
  72. }
  73. writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  74. writeSize += chunkSize
  75. if writeSize == len(content) {
  76. break
  77. }
  78. }
  79. writer.Write(alloc.NewBuffer().Clear())
  80. writer.Release()
  81. actualContent := make([]byte, 0, len(content))
  82. reader := NewAuthChunkReader(chunckContent)
  83. for {
  84. buffer, err := reader.Read()
  85. if err == io.EOF {
  86. break
  87. }
  88. assert.Error(err).IsNil()
  89. actualContent = append(actualContent, buffer.Value...)
  90. }
  91. assert.Int(len(actualContent)).Equals(len(content))
  92. assert.Bytes(actualContent).Equals(content)
  93. }