cache_sqlite_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package server
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/stretchr/testify/require"
  6. "path/filepath"
  7. "testing"
  8. "time"
  9. )
  10. func TestSqliteCache_Messages(t *testing.T) {
  11. testCacheMessages(t, newSqliteTestCache(t))
  12. }
  13. func TestSqliteCache_MessagesScheduled(t *testing.T) {
  14. testCacheMessagesScheduled(t, newSqliteTestCache(t))
  15. }
  16. func TestSqliteCache_Topics(t *testing.T) {
  17. testCacheTopics(t, newSqliteTestCache(t))
  18. }
  19. func TestSqliteCache_MessagesTagsPrioAndTitle(t *testing.T) {
  20. testCacheMessagesTagsPrioAndTitle(t, newSqliteTestCache(t))
  21. }
  22. func TestSqliteCache_Prune(t *testing.T) {
  23. testCachePrune(t, newSqliteTestCache(t))
  24. }
  25. func TestSqliteCache_Migration_From0(t *testing.T) {
  26. filename := newSqliteTestCacheFile(t)
  27. db, err := sql.Open("sqlite3", filename)
  28. require.Nil(t, err)
  29. // Create "version 0" schema
  30. _, err = db.Exec(`
  31. BEGIN;
  32. CREATE TABLE IF NOT EXISTS messages (
  33. id VARCHAR(20) PRIMARY KEY,
  34. time INT NOT NULL,
  35. topic VARCHAR(64) NOT NULL,
  36. message VARCHAR(1024) NOT NULL
  37. );
  38. CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
  39. COMMIT;
  40. `)
  41. require.Nil(t, err)
  42. // Insert a bunch of messages
  43. for i := 0; i < 10; i++ {
  44. _, err = db.Exec(`INSERT INTO messages (id, time, topic, message) VALUES (?, ?, ?, ?)`,
  45. fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i))
  46. require.Nil(t, err)
  47. }
  48. require.Nil(t, db.Close())
  49. // Create cache to trigger migration
  50. c := newSqliteTestCacheFromFile(t, filename)
  51. checkSchemaVersion(t, c.db)
  52. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  53. require.Nil(t, err)
  54. require.Equal(t, 10, len(messages))
  55. require.Equal(t, "some message 5", messages[5].Message)
  56. require.Equal(t, "", messages[5].Title)
  57. require.Nil(t, messages[5].Tags)
  58. require.Equal(t, 0, messages[5].Priority)
  59. }
  60. func TestSqliteCache_Migration_From1(t *testing.T) {
  61. filename := newSqliteTestCacheFile(t)
  62. db, err := sql.Open("sqlite3", filename)
  63. require.Nil(t, err)
  64. // Create "version 1" schema
  65. _, err = db.Exec(`
  66. CREATE TABLE IF NOT EXISTS messages (
  67. id VARCHAR(20) PRIMARY KEY,
  68. time INT NOT NULL,
  69. topic VARCHAR(64) NOT NULL,
  70. message VARCHAR(512) NOT NULL,
  71. title VARCHAR(256) NOT NULL,
  72. priority INT NOT NULL,
  73. tags VARCHAR(256) NOT NULL
  74. );
  75. CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
  76. CREATE TABLE IF NOT EXISTS schemaVersion (
  77. id INT PRIMARY KEY,
  78. version INT NOT NULL
  79. );
  80. INSERT INTO schemaVersion (id, version) VALUES (1, 1);
  81. `)
  82. require.Nil(t, err)
  83. // Insert a bunch of messages
  84. for i := 0; i < 10; i++ {
  85. _, err = db.Exec(`INSERT INTO messages (id, time, topic, message, title, priority, tags) VALUES (?, ?, ?, ?, ?, ?, ?)`,
  86. fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i), "", 0, "")
  87. require.Nil(t, err)
  88. }
  89. require.Nil(t, db.Close())
  90. // Create cache to trigger migration
  91. c := newSqliteTestCacheFromFile(t, filename)
  92. checkSchemaVersion(t, c.db)
  93. // Add delayed message
  94. delayedMessage := newDefaultMessage("mytopic", "some delayed message")
  95. delayedMessage.Time = time.Now().Add(time.Minute).Unix()
  96. require.Nil(t, c.AddMessage(delayedMessage))
  97. // 10, not 11!
  98. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  99. require.Nil(t, err)
  100. require.Equal(t, 10, len(messages))
  101. // 11!
  102. messages, err = c.Messages("mytopic", sinceAllMessages, true)
  103. require.Nil(t, err)
  104. require.Equal(t, 11, len(messages))
  105. }
  106. func checkSchemaVersion(t *testing.T, db *sql.DB) {
  107. rows, err := db.Query(`SELECT version FROM schemaVersion`)
  108. require.Nil(t, err)
  109. require.True(t, rows.Next())
  110. var schemaVersion int
  111. require.Nil(t, rows.Scan(&schemaVersion))
  112. require.Equal(t, currentSchemaVersion, schemaVersion)
  113. require.Nil(t, rows.Close())
  114. }
  115. func newSqliteTestCache(t *testing.T) *sqliteCache {
  116. c, err := newSqliteCache(newSqliteTestCacheFile(t))
  117. if err != nil {
  118. t.Fatal(err)
  119. }
  120. return c
  121. }
  122. func newSqliteTestCacheFile(t *testing.T) string {
  123. return filepath.Join(t.TempDir(), "cache.db")
  124. }
  125. func newSqliteTestCacheFromFile(t *testing.T, filename string) *sqliteCache {
  126. c, err := newSqliteCache(filename)
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. return c
  131. }