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

write.go 3.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package vfstest
  2. import (
  3. "os"
  4. "runtime"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. )
  9. // TestWriteFileNoWrite tests writing a file with no write()'s to it
  10. func TestWriteFileNoWrite(t *testing.T) {
  11. run.skipIfNoFUSE(t)
  12. fd, err := osCreate(run.path("testnowrite"))
  13. require.NoError(t, err)
  14. err = fd.Close()
  15. assert.NoError(t, err)
  16. run.waitForWriters()
  17. run.checkDir(t, "testnowrite 0")
  18. run.rm(t, "testnowrite")
  19. }
  20. // FIXMETestWriteOpenFileInDirListing tests open file in directory listing
  21. func FIXMETestWriteOpenFileInDirListing(t *testing.T) {
  22. run.skipIfNoFUSE(t)
  23. fd, err := osCreate(run.path("testnowrite"))
  24. assert.NoError(t, err)
  25. run.checkDir(t, "testnowrite 0")
  26. err = fd.Close()
  27. assert.NoError(t, err)
  28. run.waitForWriters()
  29. run.rm(t, "testnowrite")
  30. }
  31. // TestWriteFileWrite tests writing a file and reading it back
  32. func TestWriteFileWrite(t *testing.T) {
  33. run.skipIfNoFUSE(t)
  34. run.createFile(t, "testwrite", "data")
  35. run.checkDir(t, "testwrite 4")
  36. contents := run.readFile(t, "testwrite")
  37. assert.Equal(t, "data", contents)
  38. run.rm(t, "testwrite")
  39. }
  40. // TestWriteFileOverwrite tests overwriting a file
  41. func TestWriteFileOverwrite(t *testing.T) {
  42. run.skipIfNoFUSE(t)
  43. run.createFile(t, "testwrite", "data")
  44. run.checkDir(t, "testwrite 4")
  45. run.createFile(t, "testwrite", "potato")
  46. contents := run.readFile(t, "testwrite")
  47. assert.Equal(t, "potato", contents)
  48. run.rm(t, "testwrite")
  49. }
  50. // TestWriteFileFsync tests Fsync
  51. //
  52. // NB the code for this is in file.go rather than write.go
  53. func TestWriteFileFsync(t *testing.T) {
  54. run.skipIfNoFUSE(t)
  55. filepath := run.path("to be synced")
  56. fd, err := osCreate(filepath)
  57. require.NoError(t, err)
  58. _, err = fd.Write([]byte("hello"))
  59. require.NoError(t, err)
  60. err = fd.Sync()
  61. require.NoError(t, err)
  62. err = fd.Close()
  63. require.NoError(t, err)
  64. run.waitForWriters()
  65. run.rm(t, "to be synced")
  66. }
  67. // TestWriteFileDup tests behavior of mmap() in Python by using dup() on a file handle
  68. func TestWriteFileDup(t *testing.T) {
  69. run.skipIfVFS(t)
  70. run.skipIfNoFUSE(t)
  71. filepath := run.path("to be synced")
  72. fh, err := osCreate(filepath)
  73. require.NoError(t, err)
  74. testData := []byte("0123456789")
  75. err = fh.Truncate(int64(len(testData) + 2))
  76. require.NoError(t, err)
  77. err = fh.Sync()
  78. require.NoError(t, err)
  79. var dupFd uintptr
  80. dupFd, err = writeTestDup(fh.Fd())
  81. require.NoError(t, err)
  82. dupFile := os.NewFile(dupFd, fh.Name())
  83. _, err = dupFile.Write(testData)
  84. require.NoError(t, err)
  85. err = dupFile.Close()
  86. require.NoError(t, err)
  87. _, err = fh.Seek(int64(len(testData)), 0)
  88. require.NoError(t, err)
  89. _, err = fh.Write([]byte("10"))
  90. require.NoError(t, err)
  91. err = fh.Close()
  92. require.NoError(t, err)
  93. run.waitForWriters()
  94. run.rm(t, "to be synced")
  95. }
  96. // TestWriteFileAppend tests that O_APPEND works on cache backends >= writes
  97. func TestWriteFileAppend(t *testing.T) {
  98. run.skipIfNoFUSE(t)
  99. // TODO: Windows needs the v1.5 release of WinFsp to handle O_APPEND properly.
  100. // Until it gets released, skip this test on Windows.
  101. if runtime.GOOS == "windows" {
  102. t.Skip("currently unsupported on Windows")
  103. }
  104. filepath := run.path("to be synced")
  105. fh, err := osCreate(filepath)
  106. require.NoError(t, err)
  107. testData := []byte("0123456789")
  108. appendData := []byte("10")
  109. _, err = fh.Write(testData)
  110. require.NoError(t, err)
  111. err = fh.Close()
  112. require.NoError(t, err)
  113. fh, err = osAppend(filepath)
  114. require.NoError(t, err)
  115. _, err = fh.Write(appendData)
  116. require.NoError(t, err)
  117. err = fh.Close()
  118. require.NoError(t, err)
  119. info, err := run.os.Stat(filepath)
  120. require.NoError(t, err)
  121. require.EqualValues(t, len(testData)+len(appendData), info.Size())
  122. run.waitForWriters()
  123. run.rm(t, "to be synced")
  124. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。