2
0

protocol_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package pgserver
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "testing"
  6. )
  7. func TestReadMessageRejectsOversizedMessage(t *testing.T) {
  8. var buf bytes.Buffer
  9. buf.WriteByte('Q')
  10. if err := binary.Write(&buf, binary.BigEndian, uint32(MaxMessageSize+1)); err != nil {
  11. t.Fatal(err)
  12. }
  13. if _, err := ReadMessage(&buf); err == nil {
  14. t.Fatal("expected error for message larger than MaxMessageSize")
  15. }
  16. }
  17. func TestReadMessageAcceptsNormalMessage(t *testing.T) {
  18. payload := []byte("SELECT 1\x00")
  19. var buf bytes.Buffer
  20. buf.WriteByte(MsgQuery)
  21. if err := binary.Write(&buf, binary.BigEndian, uint32(len(payload)+4)); err != nil {
  22. t.Fatal(err)
  23. }
  24. buf.Write(payload)
  25. msg, err := ReadMessage(&buf)
  26. if err != nil {
  27. t.Fatalf("ReadMessage: %v", err)
  28. }
  29. if msg.Type != MsgQuery {
  30. t.Fatalf("type = %c, want %c", msg.Type, MsgQuery)
  31. }
  32. if !bytes.Equal(msg.Data, payload) {
  33. t.Fatalf("data = %q, want %q", msg.Data, payload)
  34. }
  35. }
  36. func TestReadStartupMessageRejectsOversizedMessage(t *testing.T) {
  37. var buf bytes.Buffer
  38. if err := binary.Write(&buf, binary.BigEndian, uint32(MaxStartupMessageSize+1)); err != nil {
  39. t.Fatal(err)
  40. }
  41. if _, err := ReadStartupMessage(&buf); err == nil {
  42. t.Fatal("expected error for startup message larger than MaxStartupMessageSize")
  43. }
  44. }
  45. func TestReadStartupMessageAcceptsNormalMessage(t *testing.T) {
  46. // Build a minimal startup payload: protocol version + user param.
  47. var payload bytes.Buffer
  48. if err := binary.Write(&payload, binary.BigEndian, uint32(196608)); err != nil { // 3.0
  49. t.Fatal(err)
  50. }
  51. payload.WriteString("user\x00tester\x00\x00")
  52. var buf bytes.Buffer
  53. if err := binary.Write(&buf, binary.BigEndian, uint32(payload.Len()+4)); err != nil {
  54. t.Fatal(err)
  55. }
  56. buf.Write(payload.Bytes())
  57. params, err := ReadStartupMessage(&buf)
  58. if err != nil {
  59. t.Fatalf("ReadStartupMessage: %v", err)
  60. }
  61. if params["user"] != "tester" {
  62. t.Fatalf("user = %q, want %q", params["user"], "tester")
  63. }
  64. if params["protocol_version"] != "196608" {
  65. t.Fatalf("protocol_version = %q, want %q", params["protocol_version"], "196608")
  66. }
  67. }