github.com/jstaf/onedriver@v0.14.2-0.20240420231225-f07678f9e6ef/fs/inode_test.go (about) 1 package fs 2 3 import ( 4 "context" 5 "io/ioutil" 6 "path/filepath" 7 "testing" 8 "time" 9 10 "github.com/hanwen/go-fuse/v2/fuse" 11 "github.com/jstaf/onedriver/fs/graph" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 // verify that items automatically get created with an ID of "local-" 17 func TestConstructor(t *testing.T) { 18 t.Parallel() 19 inode := NewInode("Test Create", 0644|fuse.S_IFREG, nil) 20 if inode.ID() == "" || !isLocalID(inode.ID()) { 21 t.Fatalf("Expected an ID beginning with \"local-\", got \"%s\" instaed", 22 inode.ID()) 23 } 24 } 25 26 // verify that the mode of items fetched are correctly set when fetched from 27 // server 28 func TestMode(t *testing.T) { 29 t.Parallel() 30 item, _ := graph.GetItemPath("/Documents", auth) 31 inode := NewInodeDriveItem(item) 32 if inode.Mode() != uint32(0755|fuse.S_IFDIR) { 33 t.Fatalf("mode of /Documents wrong: %o != %o", 34 inode.Mode(), 0755|fuse.S_IFDIR) 35 } 36 37 fname := "/onedriver_tests/test_mode.txt" 38 require.NoError(t, ioutil.WriteFile("mount"+fname, []byte("test"), 0644)) 39 40 var err error 41 for i := 0; i < 10; i++ { 42 item, err = graph.GetItemPath(fname, auth) 43 if err == nil && item != nil { 44 break 45 } 46 time.Sleep(time.Second) 47 } 48 if item == nil { 49 t.Fatal("item cannot be nil, err:", err) 50 } 51 inode = NewInodeDriveItem(item) 52 if inode.Mode() != uint32(0644|fuse.S_IFREG) { 53 t.Fatalf("mode of file wrong: %o != %o", 54 inode.Mode(), 0644|fuse.S_IFREG) 55 } 56 } 57 58 // Do we properly detect whether something is a directory or not? 59 func TestIsDir(t *testing.T) { 60 t.Parallel() 61 item, _ := graph.GetItemPath("/Documents", auth) 62 inode := NewInodeDriveItem(item) 63 if !inode.IsDir() { 64 t.Fatal("/Documents not detected as a directory") 65 } 66 67 fname := "/onedriver_tests/test_is_dir.txt" 68 require.NoError(t, ioutil.WriteFile("mount"+fname, []byte("test"), 0644)) 69 70 assert.Eventually(t, func() bool { 71 item, err := graph.GetItemPath(fname, auth) 72 if err == nil && item != nil { 73 if inode := NewInodeDriveItem(item); inode.IsDir() { 74 t.Fatal("File created with mode 644 not detected as file") 75 } 76 return true 77 } 78 return false 79 }, 10*time.Second, time.Second, "Could not create item.") 80 } 81 82 // A filename like .~lock.libreoffice-test.docx# will fail to upload unless the 83 // filename is escaped. 84 func TestFilenameEscape(t *testing.T) { 85 t.Parallel() 86 fname := `.~lock.libreoffice-test.docx#` 87 require.NoError(t, ioutil.WriteFile(filepath.Join(TestDir, fname), []byte("argl bargl"), 0644)) 88 89 // make sure it made it to the server 90 assert.Eventually(t, func() bool { 91 children, err := graph.GetItemChildrenPath("/onedriver_tests", auth) 92 require.NoError(t, err) 93 for _, child := range children { 94 if child.Name == fname { 95 return true 96 } 97 } 98 return false 99 }, retrySeconds, 5*time.Second, "Could not find file: ", fname) 100 } 101 102 // When running creat() on an existing file, we should truncate the existing file and 103 // return the original inode. 104 // Related to: https://github.com/jstaf/onedriver/issues/99 105 func TestDoubleCreate(t *testing.T) { 106 t.Parallel() 107 fname := "double_create.txt" 108 109 parent, err := fs.GetPath("/onedriver_tests", auth) 110 require.NoError(t, err) 111 112 fs.Create( 113 context.Background().Done(), 114 &fuse.CreateIn{ 115 InHeader: fuse.InHeader{NodeId: parent.NodeID()}, 116 Mode: 0644, 117 }, 118 fname, 119 &fuse.CreateOut{}, 120 ) 121 child, err := fs.GetChild(parent.ID(), fname, auth) 122 123 // we clean up after ourselves to prevent failing some of the offline tests 124 defer fs.Unlink(context.Background().Done(), &fuse.InHeader{NodeId: parent.nodeID}, fname) 125 126 if err != nil || child == nil { 127 t.Fatal("Could not find child post-create") 128 } 129 childID := child.ID() 130 131 fs.Create( 132 context.Background().Done(), 133 &fuse.CreateIn{ 134 InHeader: fuse.InHeader{NodeId: parent.NodeID()}, 135 Mode: 0644, 136 }, 137 fname, 138 &fuse.CreateOut{}, 139 ) 140 child, err = fs.GetChild(parent.ID(), fname, auth) 141 require.NoError(t, err) 142 if child == nil { 143 t.Fatal("Could not find child post-create") 144 } 145 assert.Equal(t, childID, child.ID(), 146 "IDs did not match when create run twice on same file.", 147 ) 148 }