multi_buffer_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package buf_test
  2. import (
  3. "crypto/rand"
  4. "io"
  5. "testing"
  6. "github.com/google/go-cmp/cmp"
  7. "v2ray.com/core/common"
  8. . "v2ray.com/core/common/buf"
  9. )
  10. func TestMultiBufferRead(t *testing.T) {
  11. b1 := New()
  12. common.Must2(b1.WriteString("ab"))
  13. b2 := New()
  14. common.Must2(b2.WriteString("cd"))
  15. mb := MultiBuffer{b1, b2}
  16. bs := make([]byte, 32)
  17. _, nBytes := SplitBytes(mb, bs)
  18. if nBytes != 4 {
  19. t.Error("expect 4 bytes split, but got ", nBytes)
  20. }
  21. if r := cmp.Diff(bs[:nBytes], []byte("abcd")); r != "" {
  22. t.Error(r)
  23. }
  24. }
  25. func TestMultiBufferAppend(t *testing.T) {
  26. var mb MultiBuffer
  27. b := New()
  28. common.Must2(b.WriteString("ab"))
  29. mb = append(mb, b)
  30. if mb.Len() != 2 {
  31. t.Error("expected length 2, but got ", mb.Len())
  32. }
  33. }
  34. func TestMultiBufferSliceBySizeLarge(t *testing.T) {
  35. lb := make([]byte, 8*1024)
  36. common.Must2(io.ReadFull(rand.Reader, lb))
  37. mb := MergeBytes(nil, lb)
  38. mb, mb2 := SplitSize(mb, 1024)
  39. if mb2.Len() != 1024 {
  40. t.Error("expect length 1024, but got ", mb2.Len())
  41. }
  42. if mb.Len() != 7*1024 {
  43. t.Error("expect length 7*1024, but got ", mb.Len())
  44. }
  45. mb, mb3 := SplitSize(mb, 7*1024)
  46. if mb3.Len() != 7*1024 {
  47. t.Error("expect length 7*1024, but got", mb.Len())
  48. }
  49. if !mb.IsEmpty() {
  50. t.Error("expect empty buffer, but got ", mb.Len())
  51. }
  52. }
  53. func TestMultiBufferSplitFirst(t *testing.T) {
  54. b1 := New()
  55. b1.WriteString("b1")
  56. b2 := New()
  57. b2.WriteString("b2")
  58. b3 := New()
  59. b3.WriteString("b3")
  60. var mb MultiBuffer
  61. mb = append(mb, b1, b2, b3)
  62. mb, c1 := SplitFirst(mb)
  63. if diff := cmp.Diff(b1.String(), c1.String()); diff != "" {
  64. t.Error(diff)
  65. }
  66. mb, c2 := SplitFirst(mb)
  67. if diff := cmp.Diff(b2.String(), c2.String()); diff != "" {
  68. t.Error(diff)
  69. }
  70. mb, c3 := SplitFirst(mb)
  71. if diff := cmp.Diff(b3.String(), c3.String()); diff != "" {
  72. t.Error(diff)
  73. }
  74. if !mb.IsEmpty() {
  75. t.Error("expect empty buffer, but got ", mb.String())
  76. }
  77. }
  78. func BenchmarkSplitBytes(b *testing.B) {
  79. var mb MultiBuffer
  80. raw := make([]byte, Size)
  81. b.ResetTimer()
  82. for i := 0; i < b.N; i++ {
  83. buffer := StackNew()
  84. buffer.Extend(Size)
  85. mb = append(mb, &buffer)
  86. mb, _ = SplitBytes(mb, raw)
  87. }
  88. }