io_test.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package io_test
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "testing"
  7. "v2ray.com/core/common/alloc"
  8. v2io "v2ray.com/core/common/io"
  9. . "v2ray.com/core/proxy/vmess/io"
  10. "v2ray.com/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. }
  52. writer.Write(alloc.NewBuffer().Clear())
  53. writer.Release()
  54. actualContent := make([]byte, 0, len(content))
  55. reader := NewAuthChunkReader(chunckContent)
  56. for {
  57. buffer, err := reader.Read()
  58. if err == io.EOF {
  59. break
  60. }
  61. assert.Error(err).IsNil()
  62. actualContent = append(actualContent, buffer.Value...)
  63. }
  64. assert.Int(len(actualContent)).Equals(len(content))
  65. assert.Bytes(actualContent).Equals(content)
  66. }