buffer_test.go 2.7 KB

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