2
0

identity_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package pgserver
  2. import (
  3. "bufio"
  4. "encoding/binary"
  5. "io"
  6. "net"
  7. "testing"
  8. "github.com/danfragoso/pizzasql-next/pkg/storage"
  9. "github.com/danfragoso/pizzasql-next/pkg/testkv"
  10. "github.com/danfragoso/pizzasql-next/pkg/version"
  11. )
  12. func startupMessage(params map[string]string) []byte {
  13. size := 4 + 4
  14. for k, v := range params {
  15. size += len(k) + 1 + len(v) + 1
  16. }
  17. size++ // terminator
  18. buf := make([]byte, 0, size)
  19. buf = binary.BigEndian.AppendUint32(buf, uint32(size))
  20. buf = binary.BigEndian.AppendUint32(buf, 196608) // protocol 3.0
  21. for k, v := range params {
  22. buf = append(buf, k...)
  23. buf = append(buf, 0)
  24. buf = append(buf, v...)
  25. buf = append(buf, 0)
  26. }
  27. return append(buf, 0)
  28. }
  29. func TestStartupReportsBuildIdentitySeparately(t *testing.T) {
  30. kv := testkv.New(t)
  31. pool := kv.Pool(2)
  32. t.Cleanup(func() { pool.Close() })
  33. dbManager := storage.NewDatabaseManager(pool, nil)
  34. server, client := net.Pipe()
  35. t.Cleanup(func() {
  36. client.Close()
  37. server.Close()
  38. })
  39. conn := NewConnection(server, dbManager, true)
  40. done := make(chan error, 1)
  41. go func() { done <- conn.Handle() }()
  42. go client.Write(startupMessage(map[string]string{"user": "tester", "database": "identity"}))
  43. reader := bufio.NewReader(client)
  44. statuses := map[string]string{}
  45. for {
  46. msg, err := ReadMessage(reader)
  47. if err != nil {
  48. t.Fatalf("read startup response: %v", err)
  49. }
  50. if msg.Type == MsgParameterStatus {
  51. data := msg.Data
  52. key, pos, err := readCString(data, 0)
  53. if err != nil {
  54. t.Fatalf("ParameterStatus key: %v", err)
  55. }
  56. value, _, err := readCString(data, pos)
  57. if err != nil {
  58. t.Fatalf("ParameterStatus value: %v", err)
  59. }
  60. statuses[key] = value
  61. }
  62. if msg.Type == MsgReadyForQuery {
  63. break
  64. }
  65. }
  66. if got := statuses["server_version"]; got != version.PostgreSQLCompatVersion+" (PizzaSQL)" {
  67. t.Fatalf("server_version = %q, want PostgreSQL compatibility string", got)
  68. }
  69. if got := statuses["pizzasql.version"]; got != version.String() {
  70. t.Fatalf("pizzasql.version = %q, want %q", got, version.String())
  71. }
  72. if got := statuses["pizzasql.commit"]; got != version.Commit {
  73. t.Fatalf("pizzasql.commit = %q, want %q", got, version.Commit)
  74. }
  75. client.Write([]byte{'X', 0, 0, 0, 4}) // Terminate
  76. if err := <-done; err != nil && err != io.EOF {
  77. t.Fatalf("Handle: %v", err)
  78. }
  79. }
  80. func TestVersionFunctionKeepsPostgresCompatibilityString(t *testing.T) {
  81. c, client := newDataConnection(t)
  82. msgs := runQuery(t, c, client, &Message{Type: MsgQuery, Data: append([]byte("SELECT version()"), 0)})
  83. values := dataRowValues(t, msgs[1])
  84. if len(values) != 1 || values[0] != "PostgreSQL "+version.PostgreSQLCompatVersion+" (PizzaSQL)" {
  85. t.Fatalf("version() = %v", values)
  86. }
  87. }
  88. func TestPizzasqlVersionFunctionReturnsBuild(t *testing.T) {
  89. c, client := newDataConnection(t)
  90. msgs := runQuery(t, c, client, &Message{Type: MsgQuery, Data: append([]byte("SELECT pizzasql_version()"), 0)})
  91. values := dataRowValues(t, msgs[1])
  92. if len(values) != 1 || values[0] != version.String() {
  93. t.Fatalf("pizzasql_version() = %v, want %q", values, version.String())
  94. }
  95. }