buffer_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package buf_test
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "testing"
  6. "github.com/google/go-cmp/cmp"
  7. "v2ray.com/core/common"
  8. . "v2ray.com/core/common/buf"
  9. )
  10. func TestBufferClear(t *testing.T) {
  11. buffer := New()
  12. defer buffer.Release()
  13. payload := "Bytes"
  14. buffer.Write([]byte(payload))
  15. if diff := cmp.Diff(buffer.Bytes(), payload); diff != "" {
  16. t.Error(diff)
  17. }
  18. buffer.Clear()
  19. if buffer.Len() != 0 {
  20. t.Error("expect 0 lenght, but got ", buffer.Len())
  21. }
  22. }
  23. func TestBufferIsEmpty(t *testing.T) {
  24. buffer := New()
  25. defer buffer.Release()
  26. if buffer.IsEmpty() != true {
  27. t.Error("expect empty buffer, but not")
  28. }
  29. }
  30. func TestBufferString(t *testing.T) {
  31. buffer := New()
  32. defer buffer.Release()
  33. const payload = "Test String"
  34. common.Must2(buffer.WriteString(payload))
  35. if buffer.String() != payload {
  36. t.Error("expect buffer content as ", payload, " but actually ", buffer.String())
  37. }
  38. }
  39. func TestBufferSlice(t *testing.T) {
  40. {
  41. b := New()
  42. common.Must2(b.Write([]byte("abcd")))
  43. bytes := b.BytesFrom(-2)
  44. if diff := cmp.Diff(bytes, []byte{'c', 'd'}); diff != "" {
  45. t.Error(diff)
  46. }
  47. }
  48. {
  49. b := New()
  50. common.Must2(b.Write([]byte("abcd")))
  51. bytes := b.BytesTo(-2)
  52. if diff := cmp.Diff(bytes, []byte{'a', 'b'}); diff != "" {
  53. t.Error(diff)
  54. }
  55. }
  56. {
  57. b := New()
  58. common.Must2(b.Write([]byte("abcd")))
  59. bytes := b.BytesRange(-3, -1)
  60. if diff := cmp.Diff(bytes, []byte{'b', 'c'}); diff != "" {
  61. t.Error(diff)
  62. }
  63. }
  64. }
  65. func TestBufferReadFullFrom(t *testing.T) {
  66. payload := make([]byte, 1024)
  67. common.Must2(rand.Read(payload))
  68. reader := bytes.NewReader(payload)
  69. b := New()
  70. n, err := b.ReadFullFrom(reader, 1024)
  71. common.Must(err)
  72. if n != 1024 {
  73. t.Error("expect reading 1024 bytes, but actually ", n)
  74. }
  75. if diff := cmp.Diff(payload, b.Bytes()); diff != "" {
  76. t.Error(diff)
  77. }
  78. }
  79. func BenchmarkNewBuffer(b *testing.B) {
  80. for i := 0; i < b.N; i++ {
  81. buffer := New()
  82. buffer.Release()
  83. }
  84. }
  85. func BenchmarkWrite2(b *testing.B) {
  86. buffer := New()
  87. b.ResetTimer()
  88. for i := 0; i < b.N; i++ {
  89. _, _ = buffer.Write([]byte{'a', 'b'})
  90. buffer.Clear()
  91. }
  92. }
  93. func BenchmarkWrite8(b *testing.B) {
  94. buffer := New()
  95. b.ResetTimer()
  96. for i := 0; i < b.N; i++ {
  97. _, _ = buffer.Write([]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'})
  98. buffer.Clear()
  99. }
  100. }
  101. func BenchmarkWrite32(b *testing.B) {
  102. buffer := New()
  103. payload := make([]byte, 32)
  104. rand.Read(payload)
  105. b.ResetTimer()
  106. for i := 0; i < b.N; i++ {
  107. _, _ = buffer.Write(payload)
  108. buffer.Clear()
  109. }
  110. }
  111. func BenchmarkWriteByte2(b *testing.B) {
  112. buffer := New()
  113. b.ResetTimer()
  114. for i := 0; i < b.N; i++ {
  115. _ = buffer.WriteByte('a')
  116. _ = buffer.WriteByte('b')
  117. buffer.Clear()
  118. }
  119. }
  120. func BenchmarkWriteByte8(b *testing.B) {
  121. buffer := New()
  122. b.ResetTimer()
  123. for i := 0; i < b.N; i++ {
  124. _ = buffer.WriteByte('a')
  125. _ = buffer.WriteByte('b')
  126. _ = buffer.WriteByte('c')
  127. _ = buffer.WriteByte('d')
  128. _ = buffer.WriteByte('e')
  129. _ = buffer.WriteByte('f')
  130. _ = buffer.WriteByte('g')
  131. _ = buffer.WriteByte('h')
  132. buffer.Clear()
  133. }
  134. }