request_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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, 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. }
  59. }
  60. func testResponse(t *testing.T, name string, res protocolBody, expected []byte) {
  61. encoded, err := encode(res)
  62. if err != nil {
  63. t.Error(err)
  64. } else if expected != nil && !bytes.Equal(encoded, expected) {
  65. t.Error("Encoding", name, "failed\ngot ", encoded, "\nwant", expected)
  66. }
  67. decoded := reflect.New(reflect.TypeOf(res).Elem()).Interface().(versionedDecoder)
  68. if err := versionedDecode(encoded, decoded, res.version()); err != nil {
  69. t.Error("Decoding", name, "failed:", err)
  70. }
  71. if !reflect.DeepEqual(decoded, res) {
  72. t.Errorf("Decoded response does not match the encoded one\nencoded: %#v\ndecoded: %#v", res, decoded)
  73. }
  74. }