io_test.go 2.0 KB

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