github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/union/union_test.go (about)

     1  // Test Union filesystem interface
     2  package union_test
     3  
     4  import (
     5  	"testing"
     6  
     7  	_ "github.com/rclone/rclone/backend/local"
     8  	_ "github.com/rclone/rclone/backend/memory"
     9  	"github.com/rclone/rclone/backend/union"
    10  	"github.com/rclone/rclone/fstest"
    11  	"github.com/rclone/rclone/fstest/fstests"
    12  )
    13  
    14  var (
    15  	unimplementableFsMethods     = []string{"UnWrap", "WrapFs", "SetWrapper", "UserInfo", "Disconnect", "PublicLink", "PutUnchecked", "MergeDirs", "OpenWriterAt", "OpenChunkWriter"}
    16  	unimplementableObjectMethods = []string{}
    17  )
    18  
    19  // TestIntegration runs integration tests against the remote
    20  func TestIntegration(t *testing.T) {
    21  	if *fstest.RemoteName == "" {
    22  		t.Skip("Skipping as -remote not set")
    23  	}
    24  	fstests.Run(t, &fstests.Opt{
    25  		RemoteName:                   *fstest.RemoteName,
    26  		UnimplementableFsMethods:     unimplementableFsMethods,
    27  		UnimplementableObjectMethods: unimplementableObjectMethods,
    28  	})
    29  }
    30  
    31  func TestStandard(t *testing.T) {
    32  	if *fstest.RemoteName != "" {
    33  		t.Skip("Skipping as -remote set")
    34  	}
    35  	dirs := union.MakeTestDirs(t, 3)
    36  	upstreams := dirs[0] + " " + dirs[1] + " " + dirs[2]
    37  	name := "TestUnion"
    38  	fstests.Run(t, &fstests.Opt{
    39  		RemoteName: name + ":",
    40  		ExtraConfig: []fstests.ExtraConfigItem{
    41  			{Name: name, Key: "type", Value: "union"},
    42  			{Name: name, Key: "upstreams", Value: upstreams},
    43  			{Name: name, Key: "action_policy", Value: "epall"},
    44  			{Name: name, Key: "create_policy", Value: "epmfs"},
    45  			{Name: name, Key: "search_policy", Value: "ff"},
    46  		},
    47  		UnimplementableFsMethods:     unimplementableFsMethods,
    48  		UnimplementableObjectMethods: unimplementableObjectMethods,
    49  		QuickTestOK:                  true,
    50  	})
    51  }
    52  
    53  func TestRO(t *testing.T) {
    54  	if *fstest.RemoteName != "" {
    55  		t.Skip("Skipping as -remote set")
    56  	}
    57  	dirs := union.MakeTestDirs(t, 3)
    58  	upstreams := dirs[0] + " " + dirs[1] + ":ro " + dirs[2] + ":ro"
    59  	name := "TestUnionRO"
    60  	fstests.Run(t, &fstests.Opt{
    61  		RemoteName: name + ":",
    62  		ExtraConfig: []fstests.ExtraConfigItem{
    63  			{Name: name, Key: "type", Value: "union"},
    64  			{Name: name, Key: "upstreams", Value: upstreams},
    65  			{Name: name, Key: "action_policy", Value: "epall"},
    66  			{Name: name, Key: "create_policy", Value: "epmfs"},
    67  			{Name: name, Key: "search_policy", Value: "ff"},
    68  		},
    69  		UnimplementableFsMethods:     unimplementableFsMethods,
    70  		UnimplementableObjectMethods: unimplementableObjectMethods,
    71  		QuickTestOK:                  true,
    72  	})
    73  }
    74  
    75  func TestNC(t *testing.T) {
    76  	if *fstest.RemoteName != "" {
    77  		t.Skip("Skipping as -remote set")
    78  	}
    79  	dirs := union.MakeTestDirs(t, 3)
    80  	upstreams := dirs[0] + " " + dirs[1] + ":nc " + dirs[2] + ":nc"
    81  	name := "TestUnionNC"
    82  	fstests.Run(t, &fstests.Opt{
    83  		RemoteName: name + ":",
    84  		ExtraConfig: []fstests.ExtraConfigItem{
    85  			{Name: name, Key: "type", Value: "union"},
    86  			{Name: name, Key: "upstreams", Value: upstreams},
    87  			{Name: name, Key: "action_policy", Value: "epall"},
    88  			{Name: name, Key: "create_policy", Value: "epmfs"},
    89  			{Name: name, Key: "search_policy", Value: "ff"},
    90  		},
    91  		UnimplementableFsMethods:     unimplementableFsMethods,
    92  		UnimplementableObjectMethods: unimplementableObjectMethods,
    93  		QuickTestOK:                  true,
    94  	})
    95  }
    96  
    97  func TestPolicy1(t *testing.T) {
    98  	if *fstest.RemoteName != "" {
    99  		t.Skip("Skipping as -remote set")
   100  	}
   101  	dirs := union.MakeTestDirs(t, 3)
   102  	upstreams := dirs[0] + " " + dirs[1] + " " + dirs[2]
   103  	name := "TestUnionPolicy1"
   104  	fstests.Run(t, &fstests.Opt{
   105  		RemoteName: name + ":",
   106  		ExtraConfig: []fstests.ExtraConfigItem{
   107  			{Name: name, Key: "type", Value: "union"},
   108  			{Name: name, Key: "upstreams", Value: upstreams},
   109  			{Name: name, Key: "action_policy", Value: "all"},
   110  			{Name: name, Key: "create_policy", Value: "lus"},
   111  			{Name: name, Key: "search_policy", Value: "all"},
   112  		},
   113  		UnimplementableFsMethods:     unimplementableFsMethods,
   114  		UnimplementableObjectMethods: unimplementableObjectMethods,
   115  		QuickTestOK:                  true,
   116  	})
   117  }
   118  
   119  func TestPolicy2(t *testing.T) {
   120  	if *fstest.RemoteName != "" {
   121  		t.Skip("Skipping as -remote set")
   122  	}
   123  	dirs := union.MakeTestDirs(t, 3)
   124  	upstreams := dirs[0] + " " + dirs[1] + " " + dirs[2]
   125  	name := "TestUnionPolicy2"
   126  	fstests.Run(t, &fstests.Opt{
   127  		RemoteName: name + ":",
   128  		ExtraConfig: []fstests.ExtraConfigItem{
   129  			{Name: name, Key: "type", Value: "union"},
   130  			{Name: name, Key: "upstreams", Value: upstreams},
   131  			{Name: name, Key: "action_policy", Value: "all"},
   132  			{Name: name, Key: "create_policy", Value: "rand"},
   133  			{Name: name, Key: "search_policy", Value: "ff"},
   134  		},
   135  		UnimplementableFsMethods:     unimplementableFsMethods,
   136  		UnimplementableObjectMethods: unimplementableObjectMethods,
   137  		QuickTestOK:                  true,
   138  	})
   139  }
   140  
   141  func TestPolicy3(t *testing.T) {
   142  	if *fstest.RemoteName != "" {
   143  		t.Skip("Skipping as -remote set")
   144  	}
   145  	dirs := union.MakeTestDirs(t, 3)
   146  	upstreams := dirs[0] + " " + dirs[1] + " " + dirs[2]
   147  	name := "TestUnionPolicy3"
   148  	fstests.Run(t, &fstests.Opt{
   149  		RemoteName: name + ":",
   150  		ExtraConfig: []fstests.ExtraConfigItem{
   151  			{Name: name, Key: "type", Value: "union"},
   152  			{Name: name, Key: "upstreams", Value: upstreams},
   153  			{Name: name, Key: "action_policy", Value: "all"},
   154  			{Name: name, Key: "create_policy", Value: "all"},
   155  			{Name: name, Key: "search_policy", Value: "all"},
   156  		},
   157  		UnimplementableFsMethods:     unimplementableFsMethods,
   158  		UnimplementableObjectMethods: unimplementableObjectMethods,
   159  		QuickTestOK:                  true,
   160  	})
   161  }