memfs_test.go 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781
  1. // Copyright 2015 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package memfs_test
  15. import (
  16. "bytes"
  17. "io"
  18. "io/ioutil"
  19. "os"
  20. "os/user"
  21. "path"
  22. "runtime"
  23. "strconv"
  24. "syscall"
  25. "testing"
  26. "time"
  27. "github.com/jacobsa/fuse"
  28. "github.com/jacobsa/fuse/fusetesting"
  29. "github.com/jacobsa/fuse/samples"
  30. "github.com/jacobsa/fuse/samples/memfs"
  31. . "github.com/jacobsa/oglematchers"
  32. . "github.com/jacobsa/ogletest"
  33. "github.com/kahing/go-xattr"
  34. )
  35. func TestMemFS(t *testing.T) { RunTests(t) }
  36. // The radius we use for "expect mtime is within"-style assertions. We can't
  37. // share a synchronized clock with the ultimate source of mtimes because with
  38. // writeback caching enabled the kernel manufactures them based on wall time.
  39. const timeSlop = 25 * time.Millisecond
  40. ////////////////////////////////////////////////////////////////////////
  41. // Helpers
  42. ////////////////////////////////////////////////////////////////////////
  43. func currentUid() uint32 {
  44. user, err := user.Current()
  45. if err != nil {
  46. panic(err)
  47. }
  48. uid, err := strconv.ParseUint(user.Uid, 10, 32)
  49. if err != nil {
  50. panic(err)
  51. }
  52. return uint32(uid)
  53. }
  54. func currentGid() uint32 {
  55. user, err := user.Current()
  56. if err != nil {
  57. panic(err)
  58. }
  59. gid, err := strconv.ParseUint(user.Gid, 10, 32)
  60. if err != nil {
  61. panic(err)
  62. }
  63. return uint32(gid)
  64. }
  65. // Transform the supplied mode by the current umask.
  66. func applyUmask(m os.FileMode) os.FileMode {
  67. // HACK(jacobsa): Use umask(2) to change and restore the umask in order to
  68. // figure out what the mask is. See the listing in `man getumask`.
  69. umask := syscall.Umask(0)
  70. syscall.Umask(umask)
  71. // Apply it.
  72. return m &^ os.FileMode(umask)
  73. }
  74. ////////////////////////////////////////////////////////////////////////
  75. // Boilerplate
  76. ////////////////////////////////////////////////////////////////////////
  77. type memFSTest struct {
  78. samples.SampleTest
  79. }
  80. func (t *memFSTest) SetUp(ti *TestInfo) {
  81. t.Server = memfs.NewMemFS(currentUid(), currentGid())
  82. t.SampleTest.SetUp(ti)
  83. }
  84. ////////////////////////////////////////////////////////////////////////
  85. // Basics
  86. ////////////////////////////////////////////////////////////////////////
  87. type MemFSTest struct {
  88. memFSTest
  89. }
  90. func init() { RegisterTestSuite(&MemFSTest{}) }
  91. func (t *MemFSTest) ContentsOfEmptyFileSystem() {
  92. entries, err := fusetesting.ReadDirPicky(t.Dir)
  93. AssertEq(nil, err)
  94. ExpectThat(entries, ElementsAre())
  95. }
  96. func (t *MemFSTest) Mkdir_OneLevel() {
  97. var err error
  98. var fi os.FileInfo
  99. var stat *syscall.Stat_t
  100. var entries []os.FileInfo
  101. dirName := path.Join(t.Dir, "dir")
  102. // Create a directory within the root.
  103. createTime := time.Now()
  104. err = os.Mkdir(dirName, 0754)
  105. AssertEq(nil, err)
  106. // Stat the directory.
  107. fi, err = os.Stat(dirName)
  108. stat = fi.Sys().(*syscall.Stat_t)
  109. AssertEq(nil, err)
  110. ExpectEq("dir", fi.Name())
  111. ExpectEq(0, fi.Size())
  112. ExpectEq(os.ModeDir|applyUmask(0754), fi.Mode())
  113. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  114. ExpectThat(fi, fusetesting.BirthtimeIsWithin(createTime, timeSlop))
  115. ExpectTrue(fi.IsDir())
  116. ExpectNe(0, stat.Ino)
  117. ExpectEq(1, stat.Nlink)
  118. ExpectEq(currentUid(), stat.Uid)
  119. ExpectEq(currentGid(), stat.Gid)
  120. ExpectEq(0, stat.Size)
  121. // Check the root's mtime.
  122. fi, err = os.Stat(t.Dir)
  123. AssertEq(nil, err)
  124. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  125. // Read the directory.
  126. entries, err = fusetesting.ReadDirPicky(dirName)
  127. AssertEq(nil, err)
  128. ExpectThat(entries, ElementsAre())
  129. // Read the root.
  130. entries, err = fusetesting.ReadDirPicky(t.Dir)
  131. AssertEq(nil, err)
  132. AssertEq(1, len(entries))
  133. fi = entries[0]
  134. ExpectEq("dir", fi.Name())
  135. ExpectEq(os.ModeDir|applyUmask(0754), fi.Mode())
  136. }
  137. func (t *MemFSTest) Mkdir_TwoLevels() {
  138. var err error
  139. var fi os.FileInfo
  140. var stat *syscall.Stat_t
  141. var entries []os.FileInfo
  142. // Create a directory within the root.
  143. err = os.Mkdir(path.Join(t.Dir, "parent"), 0700)
  144. AssertEq(nil, err)
  145. // Create a child of that directory.
  146. createTime := time.Now()
  147. err = os.Mkdir(path.Join(t.Dir, "parent/dir"), 0754)
  148. AssertEq(nil, err)
  149. // Stat the directory.
  150. fi, err = os.Stat(path.Join(t.Dir, "parent/dir"))
  151. stat = fi.Sys().(*syscall.Stat_t)
  152. AssertEq(nil, err)
  153. ExpectEq("dir", fi.Name())
  154. ExpectEq(0, fi.Size())
  155. ExpectEq(os.ModeDir|applyUmask(0754), fi.Mode())
  156. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  157. ExpectThat(fi, fusetesting.BirthtimeIsWithin(createTime, timeSlop))
  158. ExpectTrue(fi.IsDir())
  159. ExpectNe(0, stat.Ino)
  160. ExpectEq(1, stat.Nlink)
  161. ExpectEq(currentUid(), stat.Uid)
  162. ExpectEq(currentGid(), stat.Gid)
  163. ExpectEq(0, stat.Size)
  164. // Check the parent's mtime.
  165. fi, err = os.Stat(path.Join(t.Dir, "parent"))
  166. AssertEq(nil, err)
  167. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  168. // Read the directory.
  169. entries, err = fusetesting.ReadDirPicky(path.Join(t.Dir, "parent/dir"))
  170. AssertEq(nil, err)
  171. ExpectThat(entries, ElementsAre())
  172. // Read the parent.
  173. entries, err = fusetesting.ReadDirPicky(path.Join(t.Dir, "parent"))
  174. AssertEq(nil, err)
  175. AssertEq(1, len(entries))
  176. fi = entries[0]
  177. ExpectEq("dir", fi.Name())
  178. ExpectEq(os.ModeDir|applyUmask(0754), fi.Mode())
  179. }
  180. func (t *MemFSTest) Mkdir_AlreadyExists() {
  181. var err error
  182. dirName := path.Join(t.Dir, "dir")
  183. // Create the directory once.
  184. err = os.Mkdir(dirName, 0754)
  185. AssertEq(nil, err)
  186. // Attempt to create it again.
  187. err = os.Mkdir(dirName, 0754)
  188. AssertNe(nil, err)
  189. ExpectThat(err, Error(HasSubstr("exists")))
  190. }
  191. func (t *MemFSTest) Mkdir_IntermediateIsFile() {
  192. var err error
  193. // Create a file.
  194. fileName := path.Join(t.Dir, "foo")
  195. err = ioutil.WriteFile(fileName, []byte{}, 0700)
  196. AssertEq(nil, err)
  197. // Attempt to create a directory within the file.
  198. dirName := path.Join(fileName, "dir")
  199. err = os.Mkdir(dirName, 0754)
  200. AssertNe(nil, err)
  201. ExpectThat(err, Error(HasSubstr("not a directory")))
  202. }
  203. func (t *MemFSTest) Mkdir_IntermediateIsNonExistent() {
  204. var err error
  205. // Attempt to create a sub-directory of a non-existent sub-directory.
  206. dirName := path.Join(t.Dir, "foo/dir")
  207. err = os.Mkdir(dirName, 0754)
  208. AssertNe(nil, err)
  209. ExpectThat(err, Error(HasSubstr("no such file or directory")))
  210. }
  211. func (t *MemFSTest) Mkdir_PermissionDenied() {
  212. var err error
  213. // Create a directory within the root without write permissions.
  214. err = os.Mkdir(path.Join(t.Dir, "parent"), 0500)
  215. AssertEq(nil, err)
  216. // Attempt to create a child of that directory.
  217. err = os.Mkdir(path.Join(t.Dir, "parent/dir"), 0754)
  218. AssertNe(nil, err)
  219. ExpectThat(err, Error(HasSubstr("permission denied")))
  220. }
  221. func (t *MemFSTest) CreateNewFile_InRoot() {
  222. var err error
  223. var fi os.FileInfo
  224. var stat *syscall.Stat_t
  225. // Write a file.
  226. fileName := path.Join(t.Dir, "foo")
  227. const contents = "Hello\x00world"
  228. createTime := time.Now()
  229. err = ioutil.WriteFile(fileName, []byte(contents), 0400)
  230. AssertEq(nil, err)
  231. // Stat it.
  232. fi, err = os.Stat(fileName)
  233. stat = fi.Sys().(*syscall.Stat_t)
  234. AssertEq(nil, err)
  235. ExpectEq("foo", fi.Name())
  236. ExpectEq(len(contents), fi.Size())
  237. ExpectEq(applyUmask(0400), fi.Mode())
  238. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  239. ExpectThat(fi, fusetesting.BirthtimeIsWithin(createTime, timeSlop))
  240. ExpectFalse(fi.IsDir())
  241. ExpectNe(0, stat.Ino)
  242. ExpectEq(1, stat.Nlink)
  243. ExpectEq(currentUid(), stat.Uid)
  244. ExpectEq(currentGid(), stat.Gid)
  245. ExpectEq(len(contents), stat.Size)
  246. // Read it back.
  247. slice, err := ioutil.ReadFile(fileName)
  248. AssertEq(nil, err)
  249. ExpectEq(contents, string(slice))
  250. }
  251. func (t *MemFSTest) CreateNewFile_InSubDir() {
  252. var err error
  253. var fi os.FileInfo
  254. var stat *syscall.Stat_t
  255. // Create a sub-dir.
  256. dirName := path.Join(t.Dir, "dir")
  257. err = os.Mkdir(dirName, 0700)
  258. AssertEq(nil, err)
  259. // Write a file.
  260. fileName := path.Join(dirName, "foo")
  261. const contents = "Hello\x00world"
  262. createTime := time.Now()
  263. err = ioutil.WriteFile(fileName, []byte(contents), 0400)
  264. AssertEq(nil, err)
  265. // Stat it.
  266. fi, err = os.Stat(fileName)
  267. stat = fi.Sys().(*syscall.Stat_t)
  268. AssertEq(nil, err)
  269. ExpectEq("foo", fi.Name())
  270. ExpectEq(len(contents), fi.Size())
  271. ExpectEq(applyUmask(0400), fi.Mode())
  272. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  273. ExpectThat(fi, fusetesting.BirthtimeIsWithin(createTime, timeSlop))
  274. ExpectFalse(fi.IsDir())
  275. ExpectNe(0, stat.Ino)
  276. ExpectEq(1, stat.Nlink)
  277. ExpectEq(currentUid(), stat.Uid)
  278. ExpectEq(currentGid(), stat.Gid)
  279. ExpectEq(len(contents), stat.Size)
  280. // Read it back.
  281. slice, err := ioutil.ReadFile(fileName)
  282. AssertEq(nil, err)
  283. ExpectEq(contents, string(slice))
  284. }
  285. func (t *MemFSTest) ModifyExistingFile_InRoot() {
  286. var err error
  287. var n int
  288. var fi os.FileInfo
  289. var stat *syscall.Stat_t
  290. // Write a file.
  291. fileName := path.Join(t.Dir, "foo")
  292. createTime := time.Now()
  293. err = ioutil.WriteFile(fileName, []byte("Hello, world!"), 0600)
  294. AssertEq(nil, err)
  295. // Open the file and modify it.
  296. f, err := os.OpenFile(fileName, os.O_WRONLY, 0400)
  297. t.ToClose = append(t.ToClose, f)
  298. AssertEq(nil, err)
  299. modifyTime := time.Now()
  300. n, err = f.WriteAt([]byte("H"), 0)
  301. AssertEq(nil, err)
  302. AssertEq(1, n)
  303. // Stat the file.
  304. fi, err = os.Stat(fileName)
  305. stat = fi.Sys().(*syscall.Stat_t)
  306. AssertEq(nil, err)
  307. ExpectEq("foo", fi.Name())
  308. ExpectEq(len("Hello, world!"), fi.Size())
  309. ExpectEq(applyUmask(0600), fi.Mode())
  310. ExpectThat(fi, fusetesting.MtimeIsWithin(modifyTime, timeSlop))
  311. ExpectThat(fi, fusetesting.BirthtimeIsWithin(createTime, timeSlop))
  312. ExpectFalse(fi.IsDir())
  313. ExpectNe(0, stat.Ino)
  314. ExpectEq(1, stat.Nlink)
  315. ExpectEq(currentUid(), stat.Uid)
  316. ExpectEq(currentGid(), stat.Gid)
  317. ExpectEq(len("Hello, world!"), stat.Size)
  318. // Read the file back.
  319. slice, err := ioutil.ReadFile(fileName)
  320. AssertEq(nil, err)
  321. ExpectEq("Hello, world!", string(slice))
  322. }
  323. func (t *MemFSTest) ModifyExistingFile_InSubDir() {
  324. var err error
  325. var n int
  326. var fi os.FileInfo
  327. var stat *syscall.Stat_t
  328. // Create a sub-directory.
  329. dirName := path.Join(t.Dir, "dir")
  330. err = os.Mkdir(dirName, 0700)
  331. AssertEq(nil, err)
  332. // Write a file.
  333. fileName := path.Join(dirName, "foo")
  334. createTime := time.Now()
  335. err = ioutil.WriteFile(fileName, []byte("Hello, world!"), 0600)
  336. AssertEq(nil, err)
  337. // Open the file and modify it.
  338. f, err := os.OpenFile(fileName, os.O_WRONLY, 0400)
  339. t.ToClose = append(t.ToClose, f)
  340. AssertEq(nil, err)
  341. modifyTime := time.Now()
  342. n, err = f.WriteAt([]byte("H"), 0)
  343. AssertEq(nil, err)
  344. AssertEq(1, n)
  345. // Stat the file.
  346. fi, err = os.Stat(fileName)
  347. stat = fi.Sys().(*syscall.Stat_t)
  348. AssertEq(nil, err)
  349. ExpectEq("foo", fi.Name())
  350. ExpectEq(len("Hello, world!"), fi.Size())
  351. ExpectEq(applyUmask(0600), fi.Mode())
  352. ExpectThat(fi, fusetesting.MtimeIsWithin(modifyTime, timeSlop))
  353. ExpectThat(fi, fusetesting.BirthtimeIsWithin(createTime, timeSlop))
  354. ExpectFalse(fi.IsDir())
  355. ExpectNe(0, stat.Ino)
  356. ExpectEq(1, stat.Nlink)
  357. ExpectEq(currentUid(), stat.Uid)
  358. ExpectEq(currentGid(), stat.Gid)
  359. ExpectEq(len("Hello, world!"), stat.Size)
  360. // Read the file back.
  361. slice, err := ioutil.ReadFile(fileName)
  362. AssertEq(nil, err)
  363. ExpectEq("Hello, world!", string(slice))
  364. }
  365. func (t *MemFSTest) UnlinkFile_Exists() {
  366. var err error
  367. // Write a file.
  368. fileName := path.Join(t.Dir, "foo")
  369. err = ioutil.WriteFile(fileName, []byte("Hello, world!"), 0600)
  370. AssertEq(nil, err)
  371. // Unlink it.
  372. err = os.Remove(fileName)
  373. AssertEq(nil, err)
  374. // Statting it should fail.
  375. _, err = os.Stat(fileName)
  376. AssertNe(nil, err)
  377. ExpectThat(err, Error(HasSubstr("no such file")))
  378. // Nothing should be in the directory.
  379. entries, err := fusetesting.ReadDirPicky(t.Dir)
  380. AssertEq(nil, err)
  381. ExpectThat(entries, ElementsAre())
  382. }
  383. func (t *MemFSTest) UnlinkFile_NonExistent() {
  384. err := os.Remove(path.Join(t.Dir, "foo"))
  385. AssertNe(nil, err)
  386. ExpectThat(err, Error(HasSubstr("no such file")))
  387. }
  388. func (t *MemFSTest) UnlinkFile_StillOpen() {
  389. fileName := path.Join(t.Dir, "foo")
  390. // Create and open a file.
  391. f, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0600)
  392. t.ToClose = append(t.ToClose, f)
  393. AssertEq(nil, err)
  394. // Write some data into it.
  395. n, err := f.Write([]byte("taco"))
  396. AssertEq(nil, err)
  397. AssertEq(4, n)
  398. // Unlink it.
  399. err = os.Remove(fileName)
  400. AssertEq(nil, err)
  401. // The directory should no longer contain it.
  402. entries, err := fusetesting.ReadDirPicky(t.Dir)
  403. AssertEq(nil, err)
  404. ExpectThat(entries, ElementsAre())
  405. // We should be able to stat the file. It should still show as having
  406. // contents, but with no links.
  407. fi, err := f.Stat()
  408. AssertEq(nil, err)
  409. ExpectEq(4, fi.Size())
  410. ExpectEq(0, fi.Sys().(*syscall.Stat_t).Nlink)
  411. // The contents should still be available.
  412. buf := make([]byte, 1024)
  413. n, err = f.ReadAt(buf, 0)
  414. AssertEq(io.EOF, err)
  415. AssertEq(4, n)
  416. ExpectEq("taco", string(buf[:4]))
  417. // Writing should still work, too.
  418. n, err = f.Write([]byte("burrito"))
  419. AssertEq(nil, err)
  420. AssertEq(len("burrito"), n)
  421. }
  422. func (t *MemFSTest) Rmdir_NonEmpty() {
  423. var err error
  424. // Create two levels of directories.
  425. err = os.MkdirAll(path.Join(t.Dir, "foo/bar"), 0754)
  426. AssertEq(nil, err)
  427. // Attempt to remove the parent.
  428. err = os.Remove(path.Join(t.Dir, "foo"))
  429. AssertNe(nil, err)
  430. ExpectThat(err, Error(HasSubstr("not empty")))
  431. }
  432. func (t *MemFSTest) Rmdir_Empty() {
  433. var err error
  434. var entries []os.FileInfo
  435. // Create two levels of directories.
  436. err = os.MkdirAll(path.Join(t.Dir, "foo/bar"), 0754)
  437. AssertEq(nil, err)
  438. // Remove the leaf.
  439. rmTime := time.Now()
  440. err = os.Remove(path.Join(t.Dir, "foo/bar"))
  441. AssertEq(nil, err)
  442. // There should be nothing left in the parent.
  443. entries, err = fusetesting.ReadDirPicky(path.Join(t.Dir, "foo"))
  444. AssertEq(nil, err)
  445. ExpectThat(entries, ElementsAre())
  446. // Check the parent's mtime.
  447. fi, err := os.Stat(path.Join(t.Dir, "foo"))
  448. AssertEq(nil, err)
  449. ExpectThat(fi, fusetesting.MtimeIsWithin(rmTime, timeSlop))
  450. // Remove the parent.
  451. err = os.Remove(path.Join(t.Dir, "foo"))
  452. AssertEq(nil, err)
  453. // Now the root directory should be empty, too.
  454. entries, err = fusetesting.ReadDirPicky(t.Dir)
  455. AssertEq(nil, err)
  456. ExpectThat(entries, ElementsAre())
  457. }
  458. func (t *MemFSTest) Rmdir_NonExistent() {
  459. err := os.Remove(path.Join(t.Dir, "blah"))
  460. AssertNe(nil, err)
  461. ExpectThat(err, Error(HasSubstr("no such file or directory")))
  462. }
  463. func (t *MemFSTest) Rmdir_OpenedForReading() {
  464. var err error
  465. // Create a directory.
  466. createTime := time.Now()
  467. err = os.Mkdir(path.Join(t.Dir, "dir"), 0700)
  468. AssertEq(nil, err)
  469. // Open the directory for reading.
  470. f, err := os.Open(path.Join(t.Dir, "dir"))
  471. defer func() {
  472. if f != nil {
  473. ExpectEq(nil, f.Close())
  474. }
  475. }()
  476. AssertEq(nil, err)
  477. // Remove the directory.
  478. err = os.Remove(path.Join(t.Dir, "dir"))
  479. AssertEq(nil, err)
  480. // Create a new directory, with the same name even, and add some contents
  481. // within it.
  482. err = os.MkdirAll(path.Join(t.Dir, "dir/foo"), 0700)
  483. AssertEq(nil, err)
  484. err = os.MkdirAll(path.Join(t.Dir, "dir/bar"), 0700)
  485. AssertEq(nil, err)
  486. err = os.MkdirAll(path.Join(t.Dir, "dir/baz"), 0700)
  487. AssertEq(nil, err)
  488. // We should still be able to stat the open file handle. It should show up as
  489. // unlinked.
  490. fi, err := f.Stat()
  491. ExpectEq("dir", fi.Name())
  492. ExpectThat(fi, fusetesting.MtimeIsWithin(createTime, timeSlop))
  493. ExpectEq(0, fi.Sys().(*syscall.Stat_t).Nlink)
  494. // Attempt to read from the directory. This shouldn't see any junk from the
  495. // new directory. It should either succeed with an empty result or should
  496. // return ENOENT.
  497. names, err := f.Readdirnames(0)
  498. if err != nil {
  499. ExpectThat(err, Error(HasSubstr("no such file")))
  500. } else {
  501. ExpectThat(names, ElementsAre())
  502. }
  503. }
  504. func (t *MemFSTest) CaseSensitive() {
  505. var err error
  506. // Create a file.
  507. err = ioutil.WriteFile(path.Join(t.Dir, "file"), []byte{}, 0400)
  508. AssertEq(nil, err)
  509. // Create a directory.
  510. err = os.Mkdir(path.Join(t.Dir, "dir"), 0400)
  511. AssertEq(nil, err)
  512. // Attempt to stat with the wrong case.
  513. names := []string{
  514. "FILE",
  515. "File",
  516. "filE",
  517. "DIR",
  518. "Dir",
  519. "dIr",
  520. }
  521. for _, name := range names {
  522. _, err = os.Stat(path.Join(t.Dir, name))
  523. AssertNe(nil, err, "Name: %s", name)
  524. AssertThat(err, Error(HasSubstr("no such file or directory")))
  525. }
  526. }
  527. func (t *MemFSTest) WriteOverlapsEndOfFile() {
  528. var err error
  529. var n int
  530. // Create a file.
  531. f, err := os.Create(path.Join(t.Dir, "foo"))
  532. t.ToClose = append(t.ToClose, f)
  533. AssertEq(nil, err)
  534. // Make it 4 bytes long.
  535. err = f.Truncate(4)
  536. AssertEq(nil, err)
  537. // Write the range [2, 6).
  538. n, err = f.WriteAt([]byte("taco"), 2)
  539. AssertEq(nil, err)
  540. AssertEq(4, n)
  541. // Read the full contents of the file.
  542. contents, err := ioutil.ReadAll(f)
  543. AssertEq(nil, err)
  544. ExpectEq("\x00\x00taco", string(contents))
  545. }
  546. func (t *MemFSTest) WriteStartsAtEndOfFile() {
  547. var err error
  548. var n int
  549. // Create a file.
  550. f, err := os.Create(path.Join(t.Dir, "foo"))
  551. t.ToClose = append(t.ToClose, f)
  552. AssertEq(nil, err)
  553. // Make it 2 bytes long.
  554. err = f.Truncate(2)
  555. AssertEq(nil, err)
  556. // Write the range [2, 6).
  557. n, err = f.WriteAt([]byte("taco"), 2)
  558. AssertEq(nil, err)
  559. AssertEq(4, n)
  560. // Read the full contents of the file.
  561. contents, err := ioutil.ReadAll(f)
  562. AssertEq(nil, err)
  563. ExpectEq("\x00\x00taco", string(contents))
  564. }
  565. func (t *MemFSTest) WriteStartsPastEndOfFile() {
  566. var err error
  567. var n int
  568. // Create a file.
  569. f, err := os.Create(path.Join(t.Dir, "foo"))
  570. t.ToClose = append(t.ToClose, f)
  571. AssertEq(nil, err)
  572. // Write the range [2, 6).
  573. n, err = f.WriteAt([]byte("taco"), 2)
  574. AssertEq(nil, err)
  575. AssertEq(4, n)
  576. // Read the full contents of the file.
  577. contents, err := ioutil.ReadAll(f)
  578. AssertEq(nil, err)
  579. ExpectEq("\x00\x00taco", string(contents))
  580. }
  581. func (t *MemFSTest) WriteAtDoesntChangeOffset_NotAppendMode() {
  582. var err error
  583. var n int
  584. // Create a file.
  585. f, err := os.Create(path.Join(t.Dir, "foo"))
  586. t.ToClose = append(t.ToClose, f)
  587. AssertEq(nil, err)
  588. // Make it 16 bytes long.
  589. err = f.Truncate(16)
  590. AssertEq(nil, err)
  591. // Seek to offset 4.
  592. _, err = f.Seek(4, 0)
  593. AssertEq(nil, err)
  594. // Write the range [10, 14).
  595. n, err = f.WriteAt([]byte("taco"), 2)
  596. AssertEq(nil, err)
  597. AssertEq(4, n)
  598. // We should still be at offset 4.
  599. offset, err := getFileOffset(f)
  600. AssertEq(nil, err)
  601. ExpectEq(4, offset)
  602. }
  603. func (t *MemFSTest) WriteAtDoesntChangeOffset_AppendMode() {
  604. var err error
  605. var n int
  606. // Create a file in append mode.
  607. f, err := os.OpenFile(
  608. path.Join(t.Dir, "foo"),
  609. os.O_RDWR|os.O_APPEND|os.O_CREATE,
  610. 0600)
  611. t.ToClose = append(t.ToClose, f)
  612. AssertEq(nil, err)
  613. // Make it 16 bytes long.
  614. err = f.Truncate(16)
  615. AssertEq(nil, err)
  616. // Seek to offset 4.
  617. _, err = f.Seek(4, 0)
  618. AssertEq(nil, err)
  619. // Write the range [10, 14).
  620. n, err = f.WriteAt([]byte("taco"), 2)
  621. AssertEq(nil, err)
  622. AssertEq(4, n)
  623. // We should still be at offset 4.
  624. offset, err := getFileOffset(f)
  625. AssertEq(nil, err)
  626. ExpectEq(4, offset)
  627. }
  628. func (t *MemFSTest) LargeFile() {
  629. var err error
  630. // Create a file.
  631. f, err := os.Create(path.Join(t.Dir, "foo"))
  632. t.ToClose = append(t.ToClose, f)
  633. AssertEq(nil, err)
  634. // Copy in large contents.
  635. const size = 1 << 24
  636. contents := bytes.Repeat([]byte{0x20}, size)
  637. _, err = io.Copy(f, bytes.NewReader(contents))
  638. AssertEq(nil, err)
  639. // Read the full contents of the file.
  640. contents, err = ioutil.ReadFile(f.Name())
  641. AssertEq(nil, err)
  642. ExpectEq(size, len(contents))
  643. }
  644. func (t *MemFSTest) AppendMode() {
  645. var err error
  646. var n int
  647. var off int64
  648. buf := make([]byte, 1024)
  649. // Create a file with some contents.
  650. fileName := path.Join(t.Dir, "foo")
  651. err = ioutil.WriteFile(fileName, []byte("Jello, "), 0600)
  652. AssertEq(nil, err)
  653. // Open the file in append mode.
  654. f, err := os.OpenFile(fileName, os.O_RDWR|os.O_APPEND, 0600)
  655. t.ToClose = append(t.ToClose, f)
  656. AssertEq(nil, err)
  657. // Seek to somewhere silly and then write.
  658. off, err = f.Seek(2, 0)
  659. AssertEq(nil, err)
  660. AssertEq(2, off)
  661. n, err = f.Write([]byte("world!"))
  662. AssertEq(nil, err)
  663. AssertEq(6, n)
  664. // The offset should have been updated to point at the end of the file.
  665. off, err = getFileOffset(f)
  666. AssertEq(nil, err)
  667. ExpectEq(13, off)
  668. // A random write should still work, without updating the offset.
  669. n, err = f.WriteAt([]byte("H"), 0)
  670. AssertEq(nil, err)
  671. AssertEq(1, n)
  672. off, err = getFileOffset(f)
  673. AssertEq(nil, err)
  674. ExpectEq(13, off)
  675. // Read back the contents of the file, which should be correct even though we
  676. // seeked to a silly place before writing the world part.
  677. //
  678. // Linux's support for pwrite is buggy; the pwrite(2) man page says this:
  679. //
  680. // POSIX requires that opening a file with the O_APPEND flag should have
  681. // no affect on the location at which pwrite() writes data. However, on
  682. // Linux, if a file is opened with O_APPEND, pwrite() appends data to
  683. // the end of the file, regardless of the value of offset.
  684. //
  685. // So we allow either the POSIX result or the Linux result.
  686. n, err = f.ReadAt(buf, 0)
  687. AssertEq(io.EOF, err)
  688. ExpectThat(string(buf[:n]), AnyOf("Hello, world!", "Jello, world!H"))
  689. }
  690. func (t *MemFSTest) ReadsPastEndOfFile() {
  691. var err error
  692. var n int
  693. buf := make([]byte, 1024)
  694. // Create a file.
  695. f, err := os.Create(path.Join(t.Dir, "foo"))
  696. t.ToClose = append(t.ToClose, f)
  697. AssertEq(nil, err)
  698. // Give it some contents.
  699. n, err = f.Write([]byte("taco"))
  700. AssertEq(nil, err)
  701. AssertEq(4, n)
  702. // Read a range overlapping EOF.
  703. n, err = f.ReadAt(buf[:4], 2)
  704. AssertEq(io.EOF, err)
  705. ExpectEq(2, n)
  706. ExpectEq("co", string(buf[:n]))
  707. // Read a range starting at EOF.
  708. n, err = f.ReadAt(buf[:4], 4)
  709. AssertEq(io.EOF, err)
  710. ExpectEq(0, n)
  711. ExpectEq("", string(buf[:n]))
  712. // Read a range starting past EOF.
  713. n, err = f.ReadAt(buf[:4], 100)
  714. AssertEq(io.EOF, err)
  715. ExpectEq(0, n)
  716. ExpectEq("", string(buf[:n]))
  717. }
  718. func (t *MemFSTest) Truncate_Smaller() {
  719. var err error
  720. fileName := path.Join(t.Dir, "foo")
  721. // Create a file.
  722. err = ioutil.WriteFile(fileName, []byte("taco"), 0600)
  723. AssertEq(nil, err)
  724. // Open it for modification.
  725. f, err := os.OpenFile(fileName, os.O_RDWR, 0)
  726. t.ToClose = append(t.ToClose, f)
  727. AssertEq(nil, err)
  728. // Truncate it.
  729. err = f.Truncate(2)
  730. AssertEq(nil, err)
  731. // Stat it.
  732. fi, err := f.Stat()
  733. AssertEq(nil, err)
  734. ExpectEq(2, fi.Size())
  735. // Read the contents.
  736. contents, err := ioutil.ReadFile(fileName)
  737. AssertEq(nil, err)
  738. ExpectEq("ta", string(contents))
  739. }
  740. func (t *MemFSTest) Truncate_SameSize() {
  741. var err error
  742. fileName := path.Join(t.Dir, "foo")
  743. // Create a file.
  744. err = ioutil.WriteFile(fileName, []byte("taco"), 0600)
  745. AssertEq(nil, err)
  746. // Open it for modification.
  747. f, err := os.OpenFile(fileName, os.O_RDWR, 0)
  748. t.ToClose = append(t.ToClose, f)
  749. AssertEq(nil, err)
  750. // Truncate it.
  751. err = f.Truncate(4)
  752. AssertEq(nil, err)
  753. // Stat it.
  754. fi, err := f.Stat()
  755. AssertEq(nil, err)
  756. ExpectEq(4, fi.Size())
  757. // Read the contents.
  758. contents, err := ioutil.ReadFile(fileName)
  759. AssertEq(nil, err)
  760. ExpectEq("taco", string(contents))
  761. }
  762. func (t *MemFSTest) Truncate_Larger() {
  763. var err error
  764. fileName := path.Join(t.Dir, "foo")
  765. // Create a file.
  766. err = ioutil.WriteFile(fileName, []byte("taco"), 0600)
  767. AssertEq(nil, err)
  768. // Open it for modification.
  769. f, err := os.OpenFile(fileName, os.O_RDWR, 0)
  770. t.ToClose = append(t.ToClose, f)
  771. AssertEq(nil, err)
  772. // Truncate it.
  773. err = f.Truncate(6)
  774. AssertEq(nil, err)
  775. // Stat it.
  776. fi, err := f.Stat()
  777. AssertEq(nil, err)
  778. ExpectEq(6, fi.Size())
  779. // Read the contents.
  780. contents, err := ioutil.ReadFile(fileName)
  781. AssertEq(nil, err)
  782. ExpectEq("taco\x00\x00", string(contents))
  783. }
  784. func (t *MemFSTest) Chmod() {
  785. var err error
  786. fileName := path.Join(t.Dir, "foo")
  787. // Create a file.
  788. err = ioutil.WriteFile(fileName, []byte(""), 0600)
  789. AssertEq(nil, err)
  790. // Chmod it.
  791. err = os.Chmod(fileName, 0754)
  792. AssertEq(nil, err)
  793. // Stat it.
  794. fi, err := os.Stat(fileName)
  795. AssertEq(nil, err)
  796. ExpectEq(0754, fi.Mode())
  797. }
  798. func (t *MemFSTest) Chtimes() {
  799. var err error
  800. fileName := path.Join(t.Dir, "foo")
  801. // Create a file.
  802. err = ioutil.WriteFile(fileName, []byte(""), 0600)
  803. AssertEq(nil, err)
  804. // Chtimes it.
  805. expectedMtime := time.Now().Add(123 * time.Second).Round(time.Second)
  806. err = os.Chtimes(fileName, time.Now(), expectedMtime)
  807. AssertEq(nil, err)
  808. // Stat it.
  809. fi, err := os.Stat(fileName)
  810. AssertEq(nil, err)
  811. ExpectThat(fi, fusetesting.MtimeIsWithin(expectedMtime, timeSlop))
  812. }
  813. func (t *MemFSTest) ReadDirWhileModifying() {
  814. dirName := path.Join(t.Dir, "dir")
  815. createFile := func(name string) {
  816. AssertEq(nil, ioutil.WriteFile(path.Join(dirName, name), []byte{}, 0400))
  817. }
  818. // Create a directory.
  819. err := os.Mkdir(dirName, 0700)
  820. AssertEq(nil, err)
  821. // Open the directory.
  822. d, err := os.Open(dirName)
  823. t.ToClose = append(t.ToClose, d)
  824. AssertEq(nil, err)
  825. // Add four files.
  826. createFile("foo")
  827. createFile("bar")
  828. createFile("baz")
  829. createFile("qux")
  830. // Read one entry from the directory.
  831. names, err := d.Readdirnames(1)
  832. AssertEq(nil, err)
  833. AssertThat(names, ElementsAre("foo"))
  834. // Make two holes in the directory.
  835. AssertEq(nil, os.Remove(path.Join(dirName, "foo")))
  836. AssertEq(nil, os.Remove(path.Join(dirName, "baz")))
  837. // Add a bunch of files to the directory.
  838. createFile("blah_0")
  839. createFile("blah_1")
  840. createFile("blah_2")
  841. createFile("blah_3")
  842. createFile("blah_4")
  843. // Continue reading from the directory, noting the names we see.
  844. namesSeen := make(map[string]bool)
  845. for {
  846. names, err = d.Readdirnames(1)
  847. for _, n := range names {
  848. namesSeen[n] = true
  849. }
  850. if err == io.EOF {
  851. break
  852. }
  853. AssertEq(nil, err)
  854. }
  855. // Posix requires that we should have seen bar and qux, which we didn't
  856. // delete.
  857. ExpectTrue(namesSeen["bar"])
  858. ExpectTrue(namesSeen["qux"])
  859. }
  860. func (t *MemFSTest) HardLinks() {
  861. var err error
  862. // Create a file and a directory.
  863. fileName := path.Join(t.Dir, "foo")
  864. err = ioutil.WriteFile(fileName, []byte{}, 0400)
  865. AssertEq(nil, err)
  866. dirName := path.Join(t.Dir, "bar")
  867. err = os.Mkdir(dirName, 0700)
  868. AssertEq(nil, err)
  869. // Attempt to link each. Neither should work, but for different reasons.
  870. err = os.Link(fileName, path.Join(t.Dir, "baz"))
  871. ExpectThat(err, Error(HasSubstr("not implemented")))
  872. err = os.Link(dirName, path.Join(t.Dir, "baz"))
  873. ExpectThat(err, Error(HasSubstr("not permitted")))
  874. }
  875. func (t *MemFSTest) CreateSymlink() {
  876. var fi os.FileInfo
  877. var err error
  878. symlinkName := path.Join(t.Dir, "foo")
  879. target := "taco/burrito"
  880. // Create the link.
  881. err = os.Symlink(target, symlinkName)
  882. AssertEq(nil, err)
  883. // Stat the link.
  884. fi, err = os.Lstat(symlinkName)
  885. AssertEq(nil, err)
  886. ExpectEq("foo", fi.Name())
  887. ExpectEq(0444|os.ModeSymlink, fi.Mode())
  888. // Read the link.
  889. actual, err := os.Readlink(symlinkName)
  890. AssertEq(nil, err)
  891. ExpectEq(target, actual)
  892. // Read the parent directory.
  893. entries, err := fusetesting.ReadDirPicky(t.Dir)
  894. AssertEq(nil, err)
  895. AssertEq(1, len(entries))
  896. fi = entries[0]
  897. ExpectEq("foo", fi.Name())
  898. ExpectEq(0444|os.ModeSymlink, fi.Mode())
  899. }
  900. func (t *MemFSTest) CreateSymlink_AlreadyExists() {
  901. var err error
  902. // Create a file and a directory.
  903. fileName := path.Join(t.Dir, "foo")
  904. err = ioutil.WriteFile(fileName, []byte{}, 0400)
  905. AssertEq(nil, err)
  906. dirName := path.Join(t.Dir, "bar")
  907. err = os.Mkdir(dirName, 0700)
  908. AssertEq(nil, err)
  909. // Create an existing symlink.
  910. symlinkName := path.Join(t.Dir, "baz")
  911. err = os.Symlink("blah", symlinkName)
  912. AssertEq(nil, err)
  913. // Symlinking on top of any of them should fail.
  914. names := []string{
  915. fileName,
  916. dirName,
  917. symlinkName,
  918. }
  919. for _, n := range names {
  920. err = os.Symlink("blah", n)
  921. ExpectThat(err, Error(HasSubstr("exists")))
  922. }
  923. }
  924. func (t *MemFSTest) ReadLink_NonExistent() {
  925. _, err := os.Readlink(path.Join(t.Dir, "foo"))
  926. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  927. }
  928. func (t *MemFSTest) ReadLink_NotASymlink() {
  929. var err error
  930. // Create a file and a directory.
  931. fileName := path.Join(t.Dir, "foo")
  932. err = ioutil.WriteFile(fileName, []byte{}, 0400)
  933. AssertEq(nil, err)
  934. dirName := path.Join(t.Dir, "bar")
  935. err = os.Mkdir(dirName, 0700)
  936. AssertEq(nil, err)
  937. // Reading either of them as a symlink should fail.
  938. names := []string{
  939. fileName,
  940. dirName,
  941. }
  942. for _, n := range names {
  943. _, err = os.Readlink(n)
  944. ExpectThat(err, Error(HasSubstr("invalid argument")))
  945. }
  946. }
  947. func (t *MemFSTest) DeleteSymlink() {
  948. var err error
  949. symlinkName := path.Join(t.Dir, "foo")
  950. target := "taco/burrito"
  951. // Create the link.
  952. err = os.Symlink(target, symlinkName)
  953. AssertEq(nil, err)
  954. // Remove it.
  955. err = os.Remove(symlinkName)
  956. AssertEq(nil, err)
  957. // Statting should now fail.
  958. _, err = os.Lstat(symlinkName)
  959. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  960. // Read the parent directory.
  961. entries, err := fusetesting.ReadDirPicky(t.Dir)
  962. AssertEq(nil, err)
  963. ExpectThat(entries, ElementsAre())
  964. }
  965. func (t *MemFSTest) CreateInParallel_NoTruncate() {
  966. fusetesting.RunCreateInParallelTest_NoTruncate(t.Ctx, t.Dir)
  967. }
  968. func (t *MemFSTest) CreateInParallel_Truncate() {
  969. fusetesting.RunCreateInParallelTest_Truncate(t.Ctx, t.Dir)
  970. }
  971. func (t *MemFSTest) CreateInParallel_Exclusive() {
  972. fusetesting.RunCreateInParallelTest_Exclusive(t.Ctx, t.Dir)
  973. }
  974. func (t *MemFSTest) MkdirInParallel() {
  975. fusetesting.RunMkdirInParallelTest(t.Ctx, t.Dir)
  976. }
  977. func (t *MemFSTest) SymlinkInParallel() {
  978. fusetesting.RunSymlinkInParallelTest(t.Ctx, t.Dir)
  979. }
  980. func (t *MemFSTest) RenameWithinDir_File() {
  981. var err error
  982. // Create a parent directory.
  983. parentPath := path.Join(t.Dir, "parent")
  984. err = os.Mkdir(parentPath, 0700)
  985. AssertEq(nil, err)
  986. // And a file within it.
  987. oldPath := path.Join(parentPath, "foo")
  988. err = ioutil.WriteFile(oldPath, []byte("taco"), 0400)
  989. AssertEq(nil, err)
  990. // Rename it.
  991. newPath := path.Join(parentPath, "bar")
  992. err = os.Rename(oldPath, newPath)
  993. AssertEq(nil, err)
  994. // The old name shouldn't work.
  995. _, err = os.Stat(oldPath)
  996. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  997. _, err = ioutil.ReadFile(oldPath)
  998. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  999. // The new name should.
  1000. fi, err := os.Stat(newPath)
  1001. AssertEq(nil, err)
  1002. ExpectEq(len("taco"), fi.Size())
  1003. ExpectEq(os.FileMode(0400), fi.Mode())
  1004. contents, err := ioutil.ReadFile(newPath)
  1005. AssertEq(nil, err)
  1006. ExpectEq("taco", string(contents))
  1007. // There should only be the new entry in the directory.
  1008. entries, err := fusetesting.ReadDirPicky(parentPath)
  1009. AssertEq(nil, err)
  1010. AssertEq(1, len(entries))
  1011. fi = entries[0]
  1012. ExpectEq(path.Base(newPath), fi.Name())
  1013. ExpectEq(os.FileMode(0400), fi.Mode())
  1014. }
  1015. func (t *MemFSTest) RenameWithinDir_Directory() {
  1016. var err error
  1017. // Create a parent directory.
  1018. parentPath := path.Join(t.Dir, "parent")
  1019. err = os.Mkdir(parentPath, 0700)
  1020. AssertEq(nil, err)
  1021. // And a non-empty directory within it.
  1022. oldPath := path.Join(parentPath, "foo")
  1023. err = os.MkdirAll(path.Join(oldPath, "child"), 0700)
  1024. AssertEq(nil, err)
  1025. // Rename it.
  1026. newPath := path.Join(parentPath, "bar")
  1027. err = os.Rename(oldPath, newPath)
  1028. AssertEq(nil, err)
  1029. // The old name shouldn't work.
  1030. _, err = os.Stat(oldPath)
  1031. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  1032. // The new name should.
  1033. fi, err := os.Stat(newPath)
  1034. AssertEq(nil, err)
  1035. ExpectEq(os.FileMode(0700)|os.ModeDir, fi.Mode())
  1036. // There should only be the new entry in the parent.
  1037. entries, err := fusetesting.ReadDirPicky(parentPath)
  1038. AssertEq(nil, err)
  1039. AssertEq(1, len(entries))
  1040. fi = entries[0]
  1041. ExpectEq(path.Base(newPath), fi.Name())
  1042. ExpectEq(os.FileMode(0700)|os.ModeDir, fi.Mode())
  1043. // And the child should still be present.
  1044. entries, err = fusetesting.ReadDirPicky(newPath)
  1045. AssertEq(nil, err)
  1046. AssertEq(1, len(entries))
  1047. fi = entries[0]
  1048. ExpectEq("child", fi.Name())
  1049. ExpectEq(os.FileMode(0700)|os.ModeDir, fi.Mode())
  1050. }
  1051. func (t *MemFSTest) RenameWithinDir_SameName() {
  1052. var err error
  1053. // Create a parent directory.
  1054. parentPath := path.Join(t.Dir, "parent")
  1055. err = os.Mkdir(parentPath, 0700)
  1056. AssertEq(nil, err)
  1057. // And a file within it.
  1058. filePath := path.Join(parentPath, "foo")
  1059. err = ioutil.WriteFile(filePath, []byte("taco"), 0400)
  1060. AssertEq(nil, err)
  1061. // Attempt to rename it.
  1062. err = os.Rename(filePath, filePath)
  1063. AssertEq(nil, err)
  1064. // The file should still exist.
  1065. contents, err := ioutil.ReadFile(filePath)
  1066. AssertEq(nil, err)
  1067. ExpectEq("taco", string(contents))
  1068. // There should only be the one entry in the directory.
  1069. entries, err := fusetesting.ReadDirPicky(parentPath)
  1070. AssertEq(nil, err)
  1071. AssertEq(1, len(entries))
  1072. fi := entries[0]
  1073. ExpectEq(path.Base(filePath), fi.Name())
  1074. ExpectEq(os.FileMode(0400), fi.Mode())
  1075. }
  1076. func (t *MemFSTest) RenameAcrossDirs_File() {
  1077. var err error
  1078. // Create two parent directories.
  1079. oldParentPath := path.Join(t.Dir, "old")
  1080. newParentPath := path.Join(t.Dir, "new")
  1081. err = os.Mkdir(oldParentPath, 0700)
  1082. AssertEq(nil, err)
  1083. err = os.Mkdir(newParentPath, 0700)
  1084. AssertEq(nil, err)
  1085. // And a file within the first.
  1086. oldPath := path.Join(oldParentPath, "foo")
  1087. err = ioutil.WriteFile(oldPath, []byte("taco"), 0400)
  1088. AssertEq(nil, err)
  1089. // Rename it.
  1090. newPath := path.Join(newParentPath, "bar")
  1091. err = os.Rename(oldPath, newPath)
  1092. AssertEq(nil, err)
  1093. // The old name shouldn't work.
  1094. _, err = os.Stat(oldPath)
  1095. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  1096. _, err = ioutil.ReadFile(oldPath)
  1097. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  1098. // The new name should.
  1099. fi, err := os.Stat(newPath)
  1100. AssertEq(nil, err)
  1101. ExpectEq(len("taco"), fi.Size())
  1102. ExpectEq(os.FileMode(0400), fi.Mode())
  1103. contents, err := ioutil.ReadFile(newPath)
  1104. AssertEq(nil, err)
  1105. ExpectEq("taco", string(contents))
  1106. // Check the old parent.
  1107. entries, err := fusetesting.ReadDirPicky(oldParentPath)
  1108. AssertEq(nil, err)
  1109. AssertEq(0, len(entries))
  1110. // And the new one.
  1111. entries, err = fusetesting.ReadDirPicky(newParentPath)
  1112. AssertEq(nil, err)
  1113. AssertEq(1, len(entries))
  1114. fi = entries[0]
  1115. ExpectEq(path.Base(newPath), fi.Name())
  1116. ExpectEq(os.FileMode(0400), fi.Mode())
  1117. }
  1118. func (t *MemFSTest) RenameAcrossDirs_Directory() {
  1119. var err error
  1120. // Create two parent directories.
  1121. oldParentPath := path.Join(t.Dir, "old")
  1122. newParentPath := path.Join(t.Dir, "new")
  1123. err = os.Mkdir(oldParentPath, 0700)
  1124. AssertEq(nil, err)
  1125. err = os.Mkdir(newParentPath, 0700)
  1126. AssertEq(nil, err)
  1127. // And a non-empty directory within the first.
  1128. oldPath := path.Join(oldParentPath, "foo")
  1129. err = os.MkdirAll(path.Join(oldPath, "child"), 0700)
  1130. AssertEq(nil, err)
  1131. // Rename it.
  1132. newPath := path.Join(newParentPath, "bar")
  1133. err = os.Rename(oldPath, newPath)
  1134. AssertEq(nil, err)
  1135. // The old name shouldn't work.
  1136. _, err = os.Stat(oldPath)
  1137. ExpectTrue(os.IsNotExist(err), "err: %v", err)
  1138. // The new name should.
  1139. fi, err := os.Stat(newPath)
  1140. AssertEq(nil, err)
  1141. ExpectEq(os.FileMode(0700)|os.ModeDir, fi.Mode())
  1142. // And the child should still be present.
  1143. entries, err := fusetesting.ReadDirPicky(newPath)
  1144. AssertEq(nil, err)
  1145. AssertEq(1, len(entries))
  1146. fi = entries[0]
  1147. ExpectEq("child", fi.Name())
  1148. ExpectEq(os.FileMode(0700)|os.ModeDir, fi.Mode())
  1149. // Check the old parent.
  1150. entries, err = fusetesting.ReadDirPicky(oldParentPath)
  1151. AssertEq(nil, err)
  1152. AssertEq(0, len(entries))
  1153. // And the new one.
  1154. entries, err = fusetesting.ReadDirPicky(newParentPath)
  1155. AssertEq(nil, err)
  1156. AssertEq(1, len(entries))
  1157. fi = entries[0]
  1158. ExpectEq(path.Base(newPath), fi.Name())
  1159. ExpectEq(os.FileMode(0700)|os.ModeDir, fi.Mode())
  1160. }
  1161. func (t *MemFSTest) RenameOutOfFileSystem() {
  1162. var err error
  1163. // Create a file.
  1164. oldPath := path.Join(t.Dir, "foo")
  1165. err = ioutil.WriteFile(oldPath, []byte("taco"), 0400)
  1166. AssertEq(nil, err)
  1167. // Attempt to move it out of the file system.
  1168. tempDir, err := ioutil.TempDir("", "memfs_test")
  1169. AssertEq(nil, err)
  1170. defer os.RemoveAll(tempDir)
  1171. err = os.Rename(oldPath, path.Join(tempDir, "bar"))
  1172. ExpectThat(err, Error(HasSubstr("cross-device")))
  1173. }
  1174. func (t *MemFSTest) RenameIntoFileSystem() {
  1175. var err error
  1176. // Create a file outside of our file system.
  1177. f, err := ioutil.TempFile("", "memfs_test")
  1178. AssertEq(nil, err)
  1179. defer f.Close()
  1180. oldPath := f.Name()
  1181. defer os.Remove(oldPath)
  1182. // Attempt to move it into the file system.
  1183. err = os.Rename(oldPath, path.Join(t.Dir, "bar"))
  1184. ExpectThat(err, Error(HasSubstr("cross-device")))
  1185. }
  1186. func (t *MemFSTest) RenameOverExistingFile() {
  1187. var err error
  1188. // Create two files.
  1189. oldPath := path.Join(t.Dir, "foo")
  1190. err = ioutil.WriteFile(oldPath, []byte("taco"), 0400)
  1191. AssertEq(nil, err)
  1192. newPath := path.Join(t.Dir, "bar")
  1193. err = ioutil.WriteFile(newPath, []byte("burrito"), 0600)
  1194. AssertEq(nil, err)
  1195. // Rename one over the other.
  1196. err = os.Rename(oldPath, newPath)
  1197. AssertEq(nil, err)
  1198. // Check the file contents.
  1199. contents, err := ioutil.ReadFile(newPath)
  1200. AssertEq(nil, err)
  1201. ExpectEq("taco", string(contents))
  1202. // And the parent listing.
  1203. entries, err := fusetesting.ReadDirPicky(t.Dir)
  1204. AssertEq(nil, err)
  1205. AssertEq(1, len(entries))
  1206. fi := entries[0]
  1207. ExpectEq(path.Base(newPath), fi.Name())
  1208. ExpectEq(os.FileMode(0400), fi.Mode())
  1209. ExpectEq(len("taco"), fi.Size())
  1210. }
  1211. func (t *MemFSTest) RenameOverExistingDirectory() {
  1212. var err error
  1213. // Create two directories, the first non-empty.
  1214. oldPath := path.Join(t.Dir, "foo")
  1215. err = os.MkdirAll(path.Join(oldPath, "child"), 0700)
  1216. AssertEq(nil, err)
  1217. newPath := path.Join(t.Dir, "bar")
  1218. err = os.Mkdir(newPath, 0600)
  1219. AssertEq(nil, err)
  1220. // Renaming over the non-empty directory shouldn't work.
  1221. err = os.Rename(newPath, oldPath)
  1222. ExpectThat(err, Error(MatchesRegexp("not empty|file exists")))
  1223. // As of Go 1.8 this shouldn't work the other way around either (see
  1224. // https://github.com/golang/go/commit/321c312).
  1225. if atLeastGo18 {
  1226. err = os.Rename(oldPath, newPath)
  1227. ExpectThat(err, Error(HasSubstr("file exists")))
  1228. // Both should still be present in the parent listing.
  1229. entries, err := fusetesting.ReadDirPicky(t.Dir)
  1230. AssertEq(nil, err)
  1231. ExpectEq(2, len(entries))
  1232. }
  1233. }
  1234. func (t *MemFSTest) RenameOverExisting_WrongType() {
  1235. var err error
  1236. // Create a file and a directory.
  1237. filePath := path.Join(t.Dir, "foo")
  1238. err = ioutil.WriteFile(filePath, []byte("taco"), 0400)
  1239. AssertEq(nil, err)
  1240. dirPath := path.Join(t.Dir, "bar")
  1241. err = os.Mkdir(dirPath, 0700)
  1242. AssertEq(nil, err)
  1243. // Renaming either over the other shouldn't work.
  1244. err = os.Rename(filePath, dirPath)
  1245. ExpectThat(err, Error(MatchesRegexp("is a directory|file exists")))
  1246. err = os.Rename(dirPath, filePath)
  1247. ExpectThat(err, Error(HasSubstr("not a directory")))
  1248. }
  1249. func (t *MemFSTest) RenameNonExistentFile() {
  1250. var err error
  1251. err = os.Rename(path.Join(t.Dir, "foo"), path.Join(t.Dir, "bar"))
  1252. ExpectThat(err, Error(HasSubstr("no such file")))
  1253. }
  1254. func (t *MemFSTest) NoXattrs() {
  1255. var err error
  1256. // Create a file.
  1257. filePath := path.Join(t.Dir, "foo")
  1258. err = ioutil.WriteFile(filePath, []byte("taco"), 0400)
  1259. AssertEq(nil, err)
  1260. // List xattr names.
  1261. names, err := xattr.List(filePath)
  1262. AssertEq(nil, err)
  1263. ExpectThat(names, ElementsAre())
  1264. // Attempt to read a non-existent xattr.
  1265. _, err = xattr.Getxattr(filePath, "foo", nil)
  1266. ExpectEq(fuse.ENOATTR, err)
  1267. }
  1268. func (t *MemFSTest) SetXAttr() {
  1269. var err error
  1270. // Create a file.
  1271. filePath := path.Join(t.Dir, "foo")
  1272. err = ioutil.WriteFile(filePath, []byte("taco"), 0600)
  1273. AssertEq(nil, err)
  1274. err = xattr.Setxattr(filePath, "foo", []byte("bar"), xattr.REPLACE)
  1275. AssertEq(fuse.ENOATTR, err)
  1276. err = xattr.Setxattr(filePath, "foo", []byte("bar"), xattr.CREATE)
  1277. AssertEq(nil, err)
  1278. value, err := xattr.Get(filePath, "foo")
  1279. AssertEq(nil, err)
  1280. AssertEq("bar", string(value))
  1281. err = xattr.Setxattr(filePath, "foo", []byte("hello world"), xattr.REPLACE)
  1282. AssertEq(nil, err)
  1283. value, err = xattr.Get(filePath, "foo")
  1284. AssertEq(nil, err)
  1285. AssertEq("hello world", string(value))
  1286. names, err := xattr.List(filePath)
  1287. AssertEq(nil, err)
  1288. AssertEq(1, len(names))
  1289. AssertEq("foo", names[0])
  1290. err = xattr.Setxattr(filePath, "bar", []byte("hello world"), 0x0)
  1291. AssertEq(nil, err)
  1292. names, err = xattr.List(filePath)
  1293. AssertEq(nil, err)
  1294. AssertEq(2, len(names))
  1295. ExpectThat(names, Contains("foo"))
  1296. ExpectThat(names, Contains("bar"))
  1297. }
  1298. func (t *MemFSTest) RemoveXAttr() {
  1299. var err error
  1300. // Create a file
  1301. filePath := path.Join(t.Dir, "foo")
  1302. err = ioutil.WriteFile(filePath, []byte("taco"), 0600)
  1303. AssertEq(nil, err)
  1304. err = xattr.Removexattr(filePath, "foo")
  1305. AssertEq(fuse.ENOATTR, err)
  1306. err = xattr.Setxattr(filePath, "foo", []byte("bar"), xattr.CREATE)
  1307. AssertEq(nil, err)
  1308. err = xattr.Removexattr(filePath, "foo")
  1309. AssertEq(nil, err)
  1310. _, err = xattr.Getxattr(filePath, "foo", nil)
  1311. AssertEq(fuse.ENOATTR, err)
  1312. }
  1313. ////////////////////////////////////////////////////////////////////////
  1314. // Mknod
  1315. ////////////////////////////////////////////////////////////////////////
  1316. type MknodTest struct {
  1317. memFSTest
  1318. }
  1319. func init() { RegisterTestSuite(&MknodTest{}) }
  1320. func (t *MknodTest) File() {
  1321. // mknod(2) only works for root on OS X.
  1322. if runtime.GOOS == "darwin" {
  1323. return
  1324. }
  1325. var err error
  1326. p := path.Join(t.Dir, "foo")
  1327. // Create
  1328. err = syscall.Mknod(p, syscall.S_IFREG|0641, 0)
  1329. AssertEq(nil, err)
  1330. // Stat
  1331. fi, err := os.Stat(p)
  1332. AssertEq(nil, err)
  1333. ExpectEq(path.Base(p), fi.Name())
  1334. ExpectEq(0, fi.Size())
  1335. ExpectEq(os.FileMode(0641), fi.Mode())
  1336. // Read
  1337. contents, err := ioutil.ReadFile(p)
  1338. AssertEq(nil, err)
  1339. ExpectEq("", string(contents))
  1340. }
  1341. func (t *MknodTest) Directory() {
  1342. // mknod(2) only works for root on OS X.
  1343. if runtime.GOOS == "darwin" {
  1344. return
  1345. }
  1346. var err error
  1347. p := path.Join(t.Dir, "foo")
  1348. // Quoth `man 2 mknod`: "Under Linux, this call cannot be used to create
  1349. // directories."
  1350. err = syscall.Mknod(p, syscall.S_IFDIR|0700, 0)
  1351. ExpectEq(syscall.EPERM, err)
  1352. }
  1353. func (t *MknodTest) AlreadyExists() {
  1354. // mknod(2) only works for root on OS X.
  1355. if runtime.GOOS == "darwin" {
  1356. return
  1357. }
  1358. var err error
  1359. p := path.Join(t.Dir, "foo")
  1360. // Create (first)
  1361. err = ioutil.WriteFile(p, []byte("taco"), 0600)
  1362. AssertEq(nil, err)
  1363. // Create (second)
  1364. err = syscall.Mknod(p, syscall.S_IFREG|0600, 0)
  1365. ExpectEq(syscall.EEXIST, err)
  1366. // Read
  1367. contents, err := ioutil.ReadFile(p)
  1368. AssertEq(nil, err)
  1369. ExpectEq("taco", string(contents))
  1370. }
  1371. func (t *MknodTest) NonExistentParent() {
  1372. // mknod(2) only works for root on OS X.
  1373. if runtime.GOOS == "darwin" {
  1374. return
  1375. }
  1376. var err error
  1377. p := path.Join(t.Dir, "foo/bar")
  1378. err = syscall.Mknod(p, syscall.S_IFREG|0600, 0)
  1379. ExpectEq(syscall.ENOENT, err)
  1380. }