request_test.go 2.7 KB

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