message_cache_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. package server
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "net/netip"
  6. "path/filepath"
  7. "testing"
  8. "time"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. )
  12. var (
  13. exampleIP1234 = netip.MustParseAddr("1.2.3.4")
  14. )
  15. func TestSqliteCache_Messages(t *testing.T) {
  16. testCacheMessages(t, newSqliteTestCache(t))
  17. }
  18. func TestMemCache_Messages(t *testing.T) {
  19. testCacheMessages(t, newMemTestCache(t))
  20. }
  21. func testCacheMessages(t *testing.T, c *messageCache) {
  22. m1 := newDefaultMessage("mytopic", "my message")
  23. m1.Time = 1
  24. m2 := newDefaultMessage("mytopic", "my other message")
  25. m2.Time = 2
  26. require.Nil(t, c.AddMessage(m1))
  27. require.Nil(t, c.AddMessage(newDefaultMessage("example", "my example message")))
  28. require.Nil(t, c.AddMessage(m2))
  29. // Adding invalid
  30. require.Equal(t, errUnexpectedMessageType, c.AddMessage(newKeepaliveMessage("mytopic"))) // These should not be added!
  31. require.Equal(t, errUnexpectedMessageType, c.AddMessage(newOpenMessage("example"))) // These should not be added!
  32. // mytopic: count
  33. counts, err := c.MessageCounts()
  34. require.Nil(t, err)
  35. require.Equal(t, 2, counts["mytopic"])
  36. // mytopic: since all
  37. messages, _ := c.Messages("mytopic", sinceAllMessages, false)
  38. require.Equal(t, 2, len(messages))
  39. require.Equal(t, "my message", messages[0].Message)
  40. require.Equal(t, "mytopic", messages[0].Topic)
  41. require.Equal(t, messageEvent, messages[0].Event)
  42. require.Equal(t, "", messages[0].Title)
  43. require.Equal(t, 0, messages[0].Priority)
  44. require.Nil(t, messages[0].Tags)
  45. require.Equal(t, "my other message", messages[1].Message)
  46. // mytopic: since none
  47. messages, _ = c.Messages("mytopic", sinceNoMessages, false)
  48. require.Empty(t, messages)
  49. // mytopic: since m1 (by ID)
  50. messages, _ = c.Messages("mytopic", newSinceID(m1.ID), false)
  51. require.Equal(t, 1, len(messages))
  52. require.Equal(t, m2.ID, messages[0].ID)
  53. require.Equal(t, "my other message", messages[0].Message)
  54. require.Equal(t, "mytopic", messages[0].Topic)
  55. // mytopic: since 2
  56. messages, _ = c.Messages("mytopic", newSinceTime(2), false)
  57. require.Equal(t, 1, len(messages))
  58. require.Equal(t, "my other message", messages[0].Message)
  59. // example: count
  60. counts, err = c.MessageCounts()
  61. require.Nil(t, err)
  62. require.Equal(t, 1, counts["example"])
  63. // example: since all
  64. messages, _ = c.Messages("example", sinceAllMessages, false)
  65. require.Equal(t, "my example message", messages[0].Message)
  66. // non-existing: count
  67. counts, err = c.MessageCounts()
  68. require.Nil(t, err)
  69. require.Equal(t, 0, counts["doesnotexist"])
  70. // non-existing: since all
  71. messages, _ = c.Messages("doesnotexist", sinceAllMessages, false)
  72. require.Empty(t, messages)
  73. }
  74. func TestSqliteCache_MessagesScheduled(t *testing.T) {
  75. testCacheMessagesScheduled(t, newSqliteTestCache(t))
  76. }
  77. func TestMemCache_MessagesScheduled(t *testing.T) {
  78. testCacheMessagesScheduled(t, newMemTestCache(t))
  79. }
  80. func testCacheMessagesScheduled(t *testing.T, c *messageCache) {
  81. m1 := newDefaultMessage("mytopic", "message 1")
  82. m2 := newDefaultMessage("mytopic", "message 2")
  83. m2.Time = time.Now().Add(time.Hour).Unix()
  84. m3 := newDefaultMessage("mytopic", "message 3")
  85. m3.Time = time.Now().Add(time.Minute).Unix() // earlier than m2!
  86. m4 := newDefaultMessage("mytopic2", "message 4")
  87. m4.Time = time.Now().Add(time.Minute).Unix()
  88. require.Nil(t, c.AddMessage(m1))
  89. require.Nil(t, c.AddMessage(m2))
  90. require.Nil(t, c.AddMessage(m3))
  91. messages, _ := c.Messages("mytopic", sinceAllMessages, false) // exclude scheduled
  92. require.Equal(t, 1, len(messages))
  93. require.Equal(t, "message 1", messages[0].Message)
  94. messages, _ = c.Messages("mytopic", sinceAllMessages, true) // include scheduled
  95. require.Equal(t, 3, len(messages))
  96. require.Equal(t, "message 1", messages[0].Message)
  97. require.Equal(t, "message 3", messages[1].Message) // Order!
  98. require.Equal(t, "message 2", messages[2].Message)
  99. messages, _ = c.MessagesDue()
  100. require.Empty(t, messages)
  101. }
  102. func TestSqliteCache_Topics(t *testing.T) {
  103. testCacheTopics(t, newSqliteTestCache(t))
  104. }
  105. func TestMemCache_Topics(t *testing.T) {
  106. testCacheTopics(t, newMemTestCache(t))
  107. }
  108. func testCacheTopics(t *testing.T, c *messageCache) {
  109. require.Nil(t, c.AddMessage(newDefaultMessage("topic1", "my example message")))
  110. require.Nil(t, c.AddMessage(newDefaultMessage("topic2", "message 1")))
  111. require.Nil(t, c.AddMessage(newDefaultMessage("topic2", "message 2")))
  112. require.Nil(t, c.AddMessage(newDefaultMessage("topic2", "message 3")))
  113. topics, err := c.Topics()
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. require.Equal(t, 2, len(topics))
  118. require.Equal(t, "topic1", topics["topic1"].ID)
  119. require.Equal(t, "topic2", topics["topic2"].ID)
  120. }
  121. func TestSqliteCache_MessagesTagsPrioAndTitle(t *testing.T) {
  122. testCacheMessagesTagsPrioAndTitle(t, newSqliteTestCache(t))
  123. }
  124. func TestMemCache_MessagesTagsPrioAndTitle(t *testing.T) {
  125. testCacheMessagesTagsPrioAndTitle(t, newMemTestCache(t))
  126. }
  127. func testCacheMessagesTagsPrioAndTitle(t *testing.T, c *messageCache) {
  128. m := newDefaultMessage("mytopic", "some message")
  129. m.Tags = []string{"tag1", "tag2"}
  130. m.Priority = 5
  131. m.Title = "some title"
  132. require.Nil(t, c.AddMessage(m))
  133. messages, _ := c.Messages("mytopic", sinceAllMessages, false)
  134. require.Equal(t, []string{"tag1", "tag2"}, messages[0].Tags)
  135. require.Equal(t, 5, messages[0].Priority)
  136. require.Equal(t, "some title", messages[0].Title)
  137. }
  138. func TestSqliteCache_MessagesSinceID(t *testing.T) {
  139. testCacheMessagesSinceID(t, newSqliteTestCache(t))
  140. }
  141. func TestMemCache_MessagesSinceID(t *testing.T) {
  142. testCacheMessagesSinceID(t, newMemTestCache(t))
  143. }
  144. func testCacheMessagesSinceID(t *testing.T, c *messageCache) {
  145. m1 := newDefaultMessage("mytopic", "message 1")
  146. m1.Time = 100
  147. m2 := newDefaultMessage("mytopic", "message 2")
  148. m2.Time = 200
  149. m3 := newDefaultMessage("mytopic", "message 3")
  150. m3.Time = time.Now().Add(time.Hour).Unix() // Scheduled, in the future, later than m7 and m5
  151. m4 := newDefaultMessage("mytopic", "message 4")
  152. m4.Time = 400
  153. m5 := newDefaultMessage("mytopic", "message 5")
  154. m5.Time = time.Now().Add(time.Minute).Unix() // Scheduled, in the future, later than m7
  155. m6 := newDefaultMessage("mytopic", "message 6")
  156. m6.Time = 600
  157. m7 := newDefaultMessage("mytopic", "message 7")
  158. m7.Time = 700
  159. require.Nil(t, c.AddMessage(m1))
  160. require.Nil(t, c.AddMessage(m2))
  161. require.Nil(t, c.AddMessage(m3))
  162. require.Nil(t, c.AddMessage(m4))
  163. require.Nil(t, c.AddMessage(m5))
  164. require.Nil(t, c.AddMessage(m6))
  165. require.Nil(t, c.AddMessage(m7))
  166. // Case 1: Since ID exists, exclude scheduled
  167. messages, _ := c.Messages("mytopic", newSinceID(m2.ID), false)
  168. require.Equal(t, 3, len(messages))
  169. require.Equal(t, "message 4", messages[0].Message)
  170. require.Equal(t, "message 6", messages[1].Message) // Not scheduled m3/m5!
  171. require.Equal(t, "message 7", messages[2].Message)
  172. // Case 2: Since ID exists, include scheduled
  173. messages, _ = c.Messages("mytopic", newSinceID(m2.ID), true)
  174. require.Equal(t, 5, len(messages))
  175. require.Equal(t, "message 4", messages[0].Message)
  176. require.Equal(t, "message 6", messages[1].Message)
  177. require.Equal(t, "message 7", messages[2].Message)
  178. require.Equal(t, "message 5", messages[3].Message) // Order!
  179. require.Equal(t, "message 3", messages[4].Message) // Order!
  180. // Case 3: Since ID does not exist (-> Return all messages), include scheduled
  181. messages, _ = c.Messages("mytopic", newSinceID("doesntexist"), true)
  182. require.Equal(t, 7, len(messages))
  183. require.Equal(t, "message 1", messages[0].Message)
  184. require.Equal(t, "message 2", messages[1].Message)
  185. require.Equal(t, "message 4", messages[2].Message)
  186. require.Equal(t, "message 6", messages[3].Message)
  187. require.Equal(t, "message 7", messages[4].Message)
  188. require.Equal(t, "message 5", messages[5].Message) // Order!
  189. require.Equal(t, "message 3", messages[6].Message) // Order!
  190. // Case 4: Since ID exists and is last message (-> Return no messages), exclude scheduled
  191. messages, _ = c.Messages("mytopic", newSinceID(m7.ID), false)
  192. require.Equal(t, 0, len(messages))
  193. // Case 5: Since ID exists and is last message (-> Return no messages), include scheduled
  194. messages, _ = c.Messages("mytopic", newSinceID(m7.ID), true)
  195. require.Equal(t, 2, len(messages))
  196. require.Equal(t, "message 5", messages[0].Message)
  197. require.Equal(t, "message 3", messages[1].Message)
  198. }
  199. func TestSqliteCache_Prune(t *testing.T) {
  200. testCachePrune(t, newSqliteTestCache(t))
  201. }
  202. func TestMemCache_Prune(t *testing.T) {
  203. testCachePrune(t, newMemTestCache(t))
  204. }
  205. func testCachePrune(t *testing.T, c *messageCache) {
  206. m1 := newDefaultMessage("mytopic", "my message")
  207. m1.Time = 1
  208. m2 := newDefaultMessage("mytopic", "my other message")
  209. m2.Time = 2
  210. m3 := newDefaultMessage("another_topic", "and another one")
  211. m3.Time = 1
  212. require.Nil(t, c.AddMessage(m1))
  213. require.Nil(t, c.AddMessage(m2))
  214. require.Nil(t, c.AddMessage(m3))
  215. require.Nil(t, c.Prune(time.Unix(2, 0)))
  216. counts, err := c.MessageCounts()
  217. require.Nil(t, err)
  218. require.Equal(t, 1, counts["mytopic"])
  219. counts, err = c.MessageCounts()
  220. require.Nil(t, err)
  221. require.Equal(t, 0, counts["another_topic"])
  222. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  223. require.Nil(t, err)
  224. require.Equal(t, 1, len(messages))
  225. require.Equal(t, "my other message", messages[0].Message)
  226. }
  227. func TestSqliteCache_Attachments(t *testing.T) {
  228. testCacheAttachments(t, newSqliteTestCache(t))
  229. }
  230. func TestMemCache_Attachments(t *testing.T) {
  231. testCacheAttachments(t, newMemTestCache(t))
  232. }
  233. func testCacheAttachments(t *testing.T, c *messageCache) {
  234. expires1 := time.Now().Add(-4 * time.Hour).Unix()
  235. m := newDefaultMessage("mytopic", "flower for you")
  236. m.ID = "m1"
  237. m.Sender = exampleIP1234
  238. m.Attachment = &attachment{
  239. Name: "flower.jpg",
  240. Type: "image/jpeg",
  241. Size: 5000,
  242. Expires: expires1,
  243. URL: "https://ntfy.sh/file/AbDeFgJhal.jpg",
  244. }
  245. require.Nil(t, c.AddMessage(m))
  246. expires2 := time.Now().Add(2 * time.Hour).Unix() // Future
  247. m = newDefaultMessage("mytopic", "sending you a car")
  248. m.ID = "m2"
  249. m.Sender = exampleIP1234
  250. m.Attachment = &attachment{
  251. Name: "car.jpg",
  252. Type: "image/jpeg",
  253. Size: 10000,
  254. Expires: expires2,
  255. URL: "https://ntfy.sh/file/aCaRURL.jpg",
  256. }
  257. require.Nil(t, c.AddMessage(m))
  258. expires3 := time.Now().Add(1 * time.Hour).Unix() // Future
  259. m = newDefaultMessage("another-topic", "sending you another car")
  260. m.ID = "m3"
  261. m.Sender = exampleIP1234
  262. m.Attachment = &attachment{
  263. Name: "another-car.jpg",
  264. Type: "image/jpeg",
  265. Size: 20000,
  266. Expires: expires3,
  267. URL: "https://ntfy.sh/file/zakaDHFW.jpg",
  268. }
  269. require.Nil(t, c.AddMessage(m))
  270. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  271. require.Nil(t, err)
  272. require.Equal(t, 2, len(messages))
  273. require.Equal(t, "flower for you", messages[0].Message)
  274. require.Equal(t, "flower.jpg", messages[0].Attachment.Name)
  275. require.Equal(t, "image/jpeg", messages[0].Attachment.Type)
  276. require.Equal(t, int64(5000), messages[0].Attachment.Size)
  277. require.Equal(t, expires1, messages[0].Attachment.Expires)
  278. require.Equal(t, "https://ntfy.sh/file/AbDeFgJhal.jpg", messages[0].Attachment.URL)
  279. require.Equal(t, "1.2.3.4", messages[0].Sender.String())
  280. require.Equal(t, "sending you a car", messages[1].Message)
  281. require.Equal(t, "car.jpg", messages[1].Attachment.Name)
  282. require.Equal(t, "image/jpeg", messages[1].Attachment.Type)
  283. require.Equal(t, int64(10000), messages[1].Attachment.Size)
  284. require.Equal(t, expires2, messages[1].Attachment.Expires)
  285. require.Equal(t, "https://ntfy.sh/file/aCaRURL.jpg", messages[1].Attachment.URL)
  286. require.Equal(t, "1.2.3.4", messages[1].Sender.String())
  287. size, err := c.AttachmentBytesUsedBySender("1.2.3.4")
  288. require.Nil(t, err)
  289. require.Equal(t, int64(30000), size)
  290. size, err = c.AttachmentBytesUsedBySender("5.6.7.8")
  291. require.Nil(t, err)
  292. require.Equal(t, int64(0), size)
  293. }
  294. func TestSqliteCache_Migration_From0(t *testing.T) {
  295. filename := newSqliteTestCacheFile(t)
  296. db, err := sql.Open("sqlite3", filename)
  297. require.Nil(t, err)
  298. // Create "version 0" schema
  299. _, err = db.Exec(`
  300. BEGIN;
  301. CREATE TABLE IF NOT EXISTS messages (
  302. id VARCHAR(20) PRIMARY KEY,
  303. time INT NOT NULL,
  304. topic VARCHAR(64) NOT NULL,
  305. message VARCHAR(1024) NOT NULL
  306. );
  307. CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
  308. COMMIT;
  309. `)
  310. require.Nil(t, err)
  311. // Insert a bunch of messages
  312. for i := 0; i < 10; i++ {
  313. _, err = db.Exec(`INSERT INTO messages (id, time, topic, message) VALUES (?, ?, ?, ?)`,
  314. fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i))
  315. require.Nil(t, err)
  316. }
  317. require.Nil(t, db.Close())
  318. // Create cache to trigger migration
  319. c := newSqliteTestCacheFromFile(t, filename, "")
  320. checkSchemaVersion(t, c.db)
  321. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  322. require.Nil(t, err)
  323. require.Equal(t, 10, len(messages))
  324. require.Equal(t, "some message 5", messages[5].Message)
  325. require.Equal(t, "", messages[5].Title)
  326. require.Nil(t, messages[5].Tags)
  327. require.Equal(t, 0, messages[5].Priority)
  328. }
  329. func TestSqliteCache_Migration_From1(t *testing.T) {
  330. filename := newSqliteTestCacheFile(t)
  331. db, err := sql.Open("sqlite3", filename)
  332. require.Nil(t, err)
  333. // Create "version 1" schema
  334. _, err = db.Exec(`
  335. CREATE TABLE IF NOT EXISTS messages (
  336. id VARCHAR(20) PRIMARY KEY,
  337. time INT NOT NULL,
  338. topic VARCHAR(64) NOT NULL,
  339. message VARCHAR(512) NOT NULL,
  340. title VARCHAR(256) NOT NULL,
  341. priority INT NOT NULL,
  342. tags VARCHAR(256) NOT NULL
  343. );
  344. CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
  345. CREATE TABLE IF NOT EXISTS schemaVersion (
  346. id INT PRIMARY KEY,
  347. version INT NOT NULL
  348. );
  349. INSERT INTO schemaVersion (id, version) VALUES (1, 1);
  350. `)
  351. require.Nil(t, err)
  352. // Insert a bunch of messages
  353. for i := 0; i < 10; i++ {
  354. _, err = db.Exec(`INSERT INTO messages (id, time, topic, message, title, priority, tags) VALUES (?, ?, ?, ?, ?, ?, ?)`,
  355. fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i), "", 0, "")
  356. require.Nil(t, err)
  357. }
  358. require.Nil(t, db.Close())
  359. // Create cache to trigger migration
  360. c := newSqliteTestCacheFromFile(t, filename, "")
  361. checkSchemaVersion(t, c.db)
  362. // Add delayed message
  363. delayedMessage := newDefaultMessage("mytopic", "some delayed message")
  364. delayedMessage.Time = time.Now().Add(time.Minute).Unix()
  365. require.Nil(t, c.AddMessage(delayedMessage))
  366. // 10, not 11!
  367. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  368. require.Nil(t, err)
  369. require.Equal(t, 10, len(messages))
  370. // 11!
  371. messages, err = c.Messages("mytopic", sinceAllMessages, true)
  372. require.Nil(t, err)
  373. require.Equal(t, 11, len(messages))
  374. }
  375. func TestSqliteCache_StartupQueries_WAL(t *testing.T) {
  376. filename := newSqliteTestCacheFile(t)
  377. startupQueries := `pragma journal_mode = WAL;
  378. pragma synchronous = normal;
  379. pragma temp_store = memory;`
  380. db, err := newSqliteCache(filename, startupQueries, 0, 0, false)
  381. require.Nil(t, err)
  382. require.Nil(t, db.AddMessage(newDefaultMessage("mytopic", "some message")))
  383. require.FileExists(t, filename)
  384. require.FileExists(t, filename+"-wal")
  385. require.FileExists(t, filename+"-shm")
  386. }
  387. func TestSqliteCache_StartupQueries_None(t *testing.T) {
  388. filename := newSqliteTestCacheFile(t)
  389. startupQueries := ""
  390. db, err := newSqliteCache(filename, startupQueries, 0, 0, false)
  391. require.Nil(t, err)
  392. require.Nil(t, db.AddMessage(newDefaultMessage("mytopic", "some message")))
  393. require.FileExists(t, filename)
  394. require.NoFileExists(t, filename+"-wal")
  395. require.NoFileExists(t, filename+"-shm")
  396. }
  397. func TestSqliteCache_StartupQueries_Fail(t *testing.T) {
  398. filename := newSqliteTestCacheFile(t)
  399. startupQueries := `xx error`
  400. _, err := newSqliteCache(filename, startupQueries, 0, 0, false)
  401. require.Error(t, err)
  402. }
  403. func TestSqliteCache_Sender(t *testing.T) {
  404. testSender(t, newSqliteTestCache(t))
  405. }
  406. func TestMemCache_Sender(t *testing.T) {
  407. testSender(t, newMemTestCache(t))
  408. }
  409. func testSender(t *testing.T, c *messageCache) {
  410. m1 := newDefaultMessage("mytopic", "mymessage")
  411. m1.Sender = netip.MustParseAddr("1.2.3.4")
  412. require.Nil(t, c.AddMessage(m1))
  413. m2 := newDefaultMessage("mytopic", "mymessage without sender")
  414. require.Nil(t, c.AddMessage(m2))
  415. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  416. require.Nil(t, err)
  417. require.Equal(t, 2, len(messages))
  418. require.Equal(t, messages[0].Sender, netip.MustParseAddr("1.2.3.4"))
  419. require.Equal(t, messages[1].Sender, netip.Addr{})
  420. }
  421. func checkSchemaVersion(t *testing.T, db *sql.DB) {
  422. rows, err := db.Query(`SELECT version FROM schemaVersion`)
  423. require.Nil(t, err)
  424. require.True(t, rows.Next())
  425. var schemaVersion int
  426. require.Nil(t, rows.Scan(&schemaVersion))
  427. require.Equal(t, currentSchemaVersion, schemaVersion)
  428. require.Nil(t, rows.Close())
  429. }
  430. func TestMemCache_NopCache(t *testing.T) {
  431. c, _ := newNopCache()
  432. assert.Nil(t, c.AddMessage(newDefaultMessage("mytopic", "my message")))
  433. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  434. assert.Nil(t, err)
  435. assert.Empty(t, messages)
  436. topics, err := c.Topics()
  437. assert.Nil(t, err)
  438. assert.Empty(t, topics)
  439. }
  440. func newSqliteTestCache(t *testing.T) *messageCache {
  441. c, err := newSqliteCache(newSqliteTestCacheFile(t), "", 0, 0, false)
  442. if err != nil {
  443. t.Fatal(err)
  444. }
  445. return c
  446. }
  447. func newSqliteTestCacheFile(t *testing.T) string {
  448. return filepath.Join(t.TempDir(), "cache.db")
  449. }
  450. func newSqliteTestCacheFromFile(t *testing.T, filename, startupQueries string) *messageCache {
  451. c, err := newSqliteCache(filename, startupQueries, 0, 0, false)
  452. if err != nil {
  453. t.Fatal(err)
  454. }
  455. return c
  456. }
  457. func newMemTestCache(t *testing.T) *messageCache {
  458. c, err := newMemCache()
  459. if err != nil {
  460. t.Fatal(err)
  461. }
  462. return c
  463. }