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  }