You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dbfs_test.go 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package dbfs
  4. import (
  5. "bufio"
  6. "io"
  7. "os"
  8. "testing"
  9. "code.gitea.io/gitea/models/db"
  10. "github.com/stretchr/testify/assert"
  11. _ "github.com/mattn/go-sqlite3"
  12. )
  13. func changeDefaultFileBlockSize(n int64) (restore func()) {
  14. old := defaultFileBlockSize
  15. defaultFileBlockSize = n
  16. return func() {
  17. defaultFileBlockSize = old
  18. }
  19. }
  20. func TestDbfsBasic(t *testing.T) {
  21. defer changeDefaultFileBlockSize(4)()
  22. // test basic write/read
  23. f, err := OpenFile(db.DefaultContext, "test.txt", os.O_RDWR|os.O_CREATE)
  24. assert.NoError(t, err)
  25. n, err := f.Write([]byte("0123456789")) // blocks: 0123 4567 89
  26. assert.NoError(t, err)
  27. assert.EqualValues(t, 10, n)
  28. _, err = f.Seek(0, io.SeekStart)
  29. assert.NoError(t, err)
  30. buf, err := io.ReadAll(f)
  31. assert.NoError(t, err)
  32. assert.EqualValues(t, 10, n)
  33. assert.EqualValues(t, "0123456789", string(buf))
  34. // write some new data
  35. _, err = f.Seek(1, io.SeekStart)
  36. assert.NoError(t, err)
  37. _, err = f.Write([]byte("bcdefghi")) // blocks: 0bcd efgh i9
  38. assert.NoError(t, err)
  39. // read from offset
  40. buf, err = io.ReadAll(f)
  41. assert.NoError(t, err)
  42. assert.EqualValues(t, "9", string(buf))
  43. // read all
  44. _, err = f.Seek(0, io.SeekStart)
  45. assert.NoError(t, err)
  46. buf, err = io.ReadAll(f)
  47. assert.NoError(t, err)
  48. assert.EqualValues(t, "0bcdefghi9", string(buf))
  49. // write to new size
  50. _, err = f.Seek(-1, io.SeekEnd)
  51. assert.NoError(t, err)
  52. _, err = f.Write([]byte("JKLMNOP")) // blocks: 0bcd efgh iJKL MNOP
  53. assert.NoError(t, err)
  54. _, err = f.Seek(0, io.SeekStart)
  55. assert.NoError(t, err)
  56. buf, err = io.ReadAll(f)
  57. assert.NoError(t, err)
  58. assert.EqualValues(t, "0bcdefghiJKLMNOP", string(buf))
  59. // write beyond EOF and fill with zero
  60. _, err = f.Seek(5, io.SeekCurrent)
  61. assert.NoError(t, err)
  62. _, err = f.Write([]byte("xyzu")) // blocks: 0bcd efgh iJKL MNOP 0000 0xyz u
  63. assert.NoError(t, err)
  64. _, err = f.Seek(0, io.SeekStart)
  65. assert.NoError(t, err)
  66. buf, err = io.ReadAll(f)
  67. assert.NoError(t, err)
  68. assert.EqualValues(t, "0bcdefghiJKLMNOP\x00\x00\x00\x00\x00xyzu", string(buf))
  69. // write to the block with zeros
  70. _, err = f.Seek(-6, io.SeekCurrent)
  71. assert.NoError(t, err)
  72. _, err = f.Write([]byte("ABCD")) // blocks: 0bcd efgh iJKL MNOP 000A BCDz u
  73. assert.NoError(t, err)
  74. _, err = f.Seek(0, io.SeekStart)
  75. assert.NoError(t, err)
  76. buf, err = io.ReadAll(f)
  77. assert.NoError(t, err)
  78. assert.EqualValues(t, "0bcdefghiJKLMNOP\x00\x00\x00ABCDzu", string(buf))
  79. assert.NoError(t, f.Close())
  80. // test rename
  81. err = Rename(db.DefaultContext, "test.txt", "test2.txt")
  82. assert.NoError(t, err)
  83. _, err = OpenFile(db.DefaultContext, "test.txt", os.O_RDONLY)
  84. assert.Error(t, err)
  85. f, err = OpenFile(db.DefaultContext, "test2.txt", os.O_RDONLY)
  86. assert.NoError(t, err)
  87. assert.NoError(t, f.Close())
  88. // test remove
  89. err = Remove(db.DefaultContext, "test2.txt")
  90. assert.NoError(t, err)
  91. _, err = OpenFile(db.DefaultContext, "test2.txt", os.O_RDONLY)
  92. assert.Error(t, err)
  93. }
  94. func TestDbfsReadWrite(t *testing.T) {
  95. defer changeDefaultFileBlockSize(4)()
  96. f1, err := OpenFile(db.DefaultContext, "test.log", os.O_RDWR|os.O_CREATE)
  97. assert.NoError(t, err)
  98. defer f1.Close()
  99. f2, err := OpenFile(db.DefaultContext, "test.log", os.O_RDONLY)
  100. assert.NoError(t, err)
  101. defer f2.Close()
  102. _, err = f1.Write([]byte("line 1\n"))
  103. assert.NoError(t, err)
  104. f2r := bufio.NewReader(f2)
  105. line, err := f2r.ReadString('\n')
  106. assert.NoError(t, err)
  107. assert.EqualValues(t, "line 1\n", line)
  108. _, err = f2r.ReadString('\n')
  109. assert.ErrorIs(t, err, io.EOF)
  110. _, err = f1.Write([]byte("line 2\n"))
  111. assert.NoError(t, err)
  112. line, err = f2r.ReadString('\n')
  113. assert.NoError(t, err)
  114. assert.EqualValues(t, "line 2\n", line)
  115. _, err = f2r.ReadString('\n')
  116. assert.ErrorIs(t, err, io.EOF)
  117. }
  118. func TestDbfsSeekWrite(t *testing.T) {
  119. defer changeDefaultFileBlockSize(4)()
  120. f, err := OpenFile(db.DefaultContext, "test2.log", os.O_RDWR|os.O_CREATE)
  121. assert.NoError(t, err)
  122. defer f.Close()
  123. n, err := f.Write([]byte("111"))
  124. assert.NoError(t, err)
  125. _, err = f.Seek(int64(n), io.SeekStart)
  126. assert.NoError(t, err)
  127. _, err = f.Write([]byte("222"))
  128. assert.NoError(t, err)
  129. _, err = f.Seek(int64(n), io.SeekStart)
  130. assert.NoError(t, err)
  131. _, err = f.Write([]byte("333"))
  132. assert.NoError(t, err)
  133. fr, err := OpenFile(db.DefaultContext, "test2.log", os.O_RDONLY)
  134. assert.NoError(t, err)
  135. defer f.Close()
  136. buf, err := io.ReadAll(fr)
  137. assert.NoError(t, err)
  138. assert.EqualValues(t, "111333", string(buf))
  139. }