request_test.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package sarama
  2. import (
  3. "bytes"
  4. "reflect"
  5. "testing"
  6. )
  7. type testRequestBody struct {
  8. }
  9. func (s *testRequestBody) key() int16 {
  10. return 0x666
  11. }
  12. func (s *testRequestBody) version() int16 {
  13. return 0xD2
  14. }
  15. func (s *testRequestBody) encode(pe packetEncoder) error {
  16. return pe.putString("abc")
  17. }
  18. // not specific to request tests, just helper functions for testing structures that
  19. // implement the encoder or decoder interfaces that needed somewhere to live
  20. func testEncodable(t *testing.T, name string, in encoder, expect []byte) {
  21. packet, err := encode(in)
  22. if err != nil {
  23. t.Error(err)
  24. } else if !bytes.Equal(packet, expect) {
  25. t.Error("Encoding", name, "failed\ngot ", packet, "\nwant", expect)
  26. }
  27. }
  28. func testDecodable(t *testing.T, name string, out decoder, in []byte) {
  29. err := decode(in, out)
  30. if err != nil {
  31. t.Error("Decoding", name, "failed:", err)
  32. }
  33. }
  34. func testVersionDecodable(t *testing.T, name string, out versionedDecoder, in []byte, version int16) {
  35. err := versionedDecode(in, out, version)
  36. if err != nil {
  37. t.Error("Decoding", name, "version", version, "failed:", err)
  38. }
  39. }
  40. func testRequest(t *testing.T, name string, rb protocolBody, expected []byte) {
  41. // Encoder request
  42. req := &request{correlationID: 123, clientID: "foo", body: rb}
  43. packet, err := encode(req)
  44. headerSize := 14 + len("foo")
  45. if err != nil {
  46. t.Error(err)
  47. } else if !bytes.Equal(packet[headerSize:], expected) {
  48. t.Error("Encoding", name, "failed\ngot ", packet[headerSize:], "\nwant", expected)
  49. }
  50. // Decoder request
  51. decoded, n, err := decodeRequest(bytes.NewReader(packet))
  52. if err != nil {
  53. t.Error("Failed to decode request", err)
  54. } else if decoded.correlationID != 123 || decoded.clientID != "foo" {
  55. t.Errorf("Decoded header is not valid: %v", decoded)
  56. } else if !reflect.DeepEqual(rb, decoded.body) {
  57. t.Errorf("Decoded request does not match the encoded one\nencoded: %v\ndecoded: %v", rb, decoded.body)
  58. } else if n != len(packet) {
  59. t.Errorf("Decoded request bytes: %d does not match the encoded one: %d\n", n, len(packet))
  60. }
  61. }
  62. func testResponse(t *testing.T, name string, res protocolBody, expected []byte) {
  63. encoded, err := encode(res)
  64. if err != nil {
  65. t.Error(err)
  66. } else if expected != nil && !bytes.Equal(encoded, expected) {
  67. t.Error("Encoding", name, "failed\ngot ", encoded, "\nwant", expected)
  68. }
  69. decoded := reflect.New(reflect.TypeOf(res).Elem()).Interface().(versionedDecoder)
  70. if err := versionedDecode(encoded, decoded, res.version()); err != nil {
  71. t.Error("Decoding", name, "failed:", err)
  72. }
  73. if !reflect.DeepEqual(decoded, res) {
  74. t.Errorf("Decoded response does not match the encoded one\nencoded: %#v\ndecoded: %#v", res, decoded)
  75. }
  76. }