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.8KB

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