buffer_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright 2014 The Go Authors.
  2. // See https://code.google.com/p/go/source/browse/CONTRIBUTORS
  3. // Licensed under the same terms as Go itself:
  4. // https://code.google.com/p/go/source/browse/LICENSE
  5. package http2
  6. import (
  7. "io"
  8. "reflect"
  9. "testing"
  10. )
  11. var bufferReadTests = []struct {
  12. buf buffer
  13. read, wn int
  14. werr error
  15. wp []byte
  16. wbuf buffer
  17. }{
  18. {
  19. buffer{[]byte{'a', 0}, 0, 1, false, nil},
  20. 5, 1, nil, []byte{'a'},
  21. buffer{[]byte{'a', 0}, 1, 1, false, nil},
  22. },
  23. {
  24. buffer{[]byte{'a', 0}, 0, 1, true, io.EOF},
  25. 5, 1, io.EOF, []byte{'a'},
  26. buffer{[]byte{'a', 0}, 1, 1, true, io.EOF},
  27. },
  28. {
  29. buffer{[]byte{0, 'a'}, 1, 2, false, nil},
  30. 5, 1, nil, []byte{'a'},
  31. buffer{[]byte{0, 'a'}, 2, 2, false, nil},
  32. },
  33. {
  34. buffer{[]byte{0, 'a'}, 1, 2, true, io.EOF},
  35. 5, 1, io.EOF, []byte{'a'},
  36. buffer{[]byte{0, 'a'}, 2, 2, true, io.EOF},
  37. },
  38. {
  39. buffer{[]byte{}, 0, 0, false, nil},
  40. 5, 0, errReadEmpty, []byte{},
  41. buffer{[]byte{}, 0, 0, false, nil},
  42. },
  43. {
  44. buffer{[]byte{}, 0, 0, true, io.EOF},
  45. 5, 0, io.EOF, []byte{},
  46. buffer{[]byte{}, 0, 0, true, io.EOF},
  47. },
  48. }
  49. func TestBufferRead(t *testing.T) {
  50. for i, tt := range bufferReadTests {
  51. read := make([]byte, tt.read)
  52. n, err := tt.buf.Read(read)
  53. if n != tt.wn {
  54. t.Errorf("#%d: wn = %d want %d", i, n, tt.wn)
  55. continue
  56. }
  57. if err != tt.werr {
  58. t.Errorf("#%d: werr = %v want %v", i, err, tt.werr)
  59. continue
  60. }
  61. read = read[:n]
  62. if !reflect.DeepEqual(read, tt.wp) {
  63. t.Errorf("#%d: read = %+v want %+v", i, read, tt.wp)
  64. }
  65. if !reflect.DeepEqual(tt.buf, tt.wbuf) {
  66. t.Errorf("#%d: buf = %+v want %+v", i, tt.buf, tt.wbuf)
  67. }
  68. }
  69. }
  70. var bufferWriteTests = []struct {
  71. buf buffer
  72. write, wn int
  73. werr error
  74. wbuf buffer
  75. }{
  76. {
  77. buf: buffer{
  78. buf: []byte{},
  79. },
  80. wbuf: buffer{
  81. buf: []byte{},
  82. },
  83. },
  84. {
  85. buf: buffer{
  86. buf: []byte{1, 'a'},
  87. },
  88. write: 1,
  89. wn: 1,
  90. wbuf: buffer{
  91. buf: []byte{0, 'a'},
  92. w: 1,
  93. },
  94. },
  95. {
  96. buf: buffer{
  97. buf: []byte{'a', 1},
  98. r: 1,
  99. w: 1,
  100. },
  101. write: 2,
  102. wn: 2,
  103. wbuf: buffer{
  104. buf: []byte{0, 0},
  105. w: 2,
  106. },
  107. },
  108. {
  109. buf: buffer{
  110. buf: []byte{},
  111. r: 1,
  112. closed: true,
  113. },
  114. write: 5,
  115. werr: errWriteClosed,
  116. wbuf: buffer{
  117. buf: []byte{},
  118. r: 1,
  119. closed: true,
  120. },
  121. },
  122. {
  123. buf: buffer{
  124. buf: []byte{},
  125. },
  126. write: 5,
  127. werr: errWriteFull,
  128. wbuf: buffer{
  129. buf: []byte{},
  130. },
  131. },
  132. }
  133. func TestBufferWrite(t *testing.T) {
  134. for i, tt := range bufferWriteTests {
  135. n, err := tt.buf.Write(make([]byte, tt.write))
  136. if n != tt.wn {
  137. t.Errorf("#%d: wrote %d bytes; want %d", i, n, tt.wn)
  138. continue
  139. }
  140. if err != tt.werr {
  141. t.Errorf("#%d: error = %v; want %v", i, err, tt.werr)
  142. continue
  143. }
  144. if !reflect.DeepEqual(tt.buf, tt.wbuf) {
  145. t.Errorf("#%d: buf = %+v; want %+v", i, tt.buf, tt.wbuf)
  146. }
  147. }
  148. }