io_test.go 2.0 KB

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