gitea源码

dbfs_test.go 4.6KB

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