io_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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.Release()
  28. reader := NewAuthChunkReader(content)
  29. buffer, err := reader.Read()
  30. assert.Error(err).IsNil()
  31. assert.Bytes(buffer.Value).Equals([]byte("abcd"))
  32. }
  33. func TestLargeIO(t *testing.T) {
  34. assert := assert.On(t)
  35. content := make([]byte, 1024*1024)
  36. rand.Read(content)
  37. chunckContent := bytes.NewBuffer(make([]byte, 0, len(content)*2))
  38. writer := NewAuthChunkWriter(v2io.NewAdaptiveWriter(chunckContent))
  39. writeSize := 0
  40. for {
  41. chunkSize := 7 * 1024
  42. if chunkSize+writeSize > len(content) {
  43. chunkSize = len(content) - writeSize
  44. }
  45. writer.Write(alloc.NewBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  46. writeSize += chunkSize
  47. if writeSize == len(content) {
  48. break
  49. }
  50. chunkSize = 8 * 1024
  51. if chunkSize+writeSize > len(content) {
  52. chunkSize = len(content) - writeSize
  53. }
  54. writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  55. writeSize += chunkSize
  56. if writeSize == len(content) {
  57. break
  58. }
  59. chunkSize = 63 * 1024
  60. if chunkSize+writeSize > len(content) {
  61. chunkSize = len(content) - writeSize
  62. }
  63. writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  64. writeSize += chunkSize
  65. if writeSize == len(content) {
  66. break
  67. }
  68. chunkSize = 64*1024 - 16
  69. if chunkSize+writeSize > len(content) {
  70. chunkSize = len(content) - writeSize
  71. }
  72. writer.Write(alloc.NewLargeBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
  73. writeSize += chunkSize
  74. if writeSize == len(content) {
  75. break
  76. }
  77. }
  78. writer.Release()
  79. actualContent := make([]byte, 0, len(content))
  80. reader := NewAuthChunkReader(chunckContent)
  81. for {
  82. buffer, err := reader.Read()
  83. if err == io.EOF {
  84. break
  85. }
  86. assert.Error(err).IsNil()
  87. actualContent = append(actualContent, buffer.Value...)
  88. }
  89. assert.Int(len(actualContent)).Equals(len(content))
  90. assert.Bytes(actualContent).Equals(content)
  91. }