s4/torture: test vfs_fruit "fruit:time machine max size" option
authorRalph Boehme <slow@samba.org>
Tue, 2 Jan 2018 18:09:04 +0000 (19:09 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 5 Jan 2018 23:07:17 +0000 (00:07 +0100)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
selftest/target/Samba3.pm
source3/selftest/tests.py
source4/torture/vfs/fruit.c
source4/torture/vfs/vfs.c

index c9888c2dca37edfcfe58ee65835d3d73080ae940..1e652d8e3f5ddb9e9d86c93b20d715812242fc96 100755 (executable)
@@ -1957,6 +1957,14 @@ sub provision($$$$$$$$$)
        path = $shrdir
        vfs objects = streams_depot acl_xattr
 
+[vfs_fruit_timemachine]
+       path = $shrdir
+       vfs objects = fruit streams_xattr acl_xattr
+       fruit:resource = file
+       fruit:metadata = stream
+       fruit:time machine = yes
+       fruit:time machine max size = 32K
+
 [badname-tmp]
        path = $badnames_shrdir
        guest ok = yes
index 34de4be230b4b48cb43b1d27804ce87a793cd281..8075f78b03f6377ad90ebec7854a3f3ea5708d06 100755 (executable)
@@ -395,7 +395,7 @@ nbt = ["nbt.dgram" ]
 
 libsmbclient = ["libsmbclient"]
 
-vfs = ["vfs.fruit", "vfs.acl_xattr", "vfs.fruit_netatalk", "vfs.fruit_file_id"]
+vfs = ["vfs.fruit", "vfs.acl_xattr", "vfs.fruit_netatalk", "vfs.fruit_file_id", "vfs.fruit_timemachine"]
 
 tests= base + raw + smb2 + rpc + unix + local + rap + nbt + libsmbclient + idmap + vfs
 
@@ -500,6 +500,8 @@ for t in tests:
         plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_stream_depot -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share --option=torture:share2=vfs_wo_fruit_stream_depot', 'streams_depot')
     elif t == "vfs.fruit_netatalk":
         plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share')
+    elif t == "vfs.fruit_timemachine":
+        plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_timemachine -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share')
     elif t == "vfs.fruit_file_id":
         plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD')
     elif t == "rpc.schannel_anon_setpw":
index 04f04e2cd5623f4afbc2b0c2aef9b2854807e900..476e9204ca7009e78e7c1bc8b257428a6b76c3cd 100644 (file)
@@ -4481,3 +4481,105 @@ struct torture_suite *torture_vfs_fruit_file_id(TALLOC_CTX *ctx)
 
        return suite;
 }
+
+static bool test_timemachine_volsize(struct torture_context *tctx,
+                                    struct smb2_tree *tree)
+{
+       TALLOC_CTX *mem_ctx = talloc_new(tctx);
+       struct smb2_handle h = {{0}};
+       union smb_fsinfo fsinfo;
+       NTSTATUS status;
+       bool ok = true;
+       const char *info_plist =
+               "<dict>\n"
+               "        <key>band-size</key>\n"
+               "        <integer>8192</integer>\n"
+               "</dict>\n";
+
+       smb2_deltree(tree, "test.sparsebundle");
+
+       ok = enable_aapl(tctx, tree);
+       torture_assert_goto(tctx, ok, ok, done, "enable_aapl failed");
+
+       status = smb2_util_mkdir(tree, "test.sparsebundle");
+       torture_assert_ntstatus_ok_goto(tctx, status, ok, done,
+                                       "smb2_util_mkdir\n");
+
+       ok = write_stream(tree, __location__, tctx, mem_ctx,
+                         "test.sparsebundle/Info.plist", NULL,
+                          0, strlen(info_plist), info_plist);
+       torture_assert_goto(tctx, ok, ok, done, "write_stream failed\n");
+
+       status = smb2_util_mkdir(tree, "test.sparsebundle/bands");
+       torture_assert_ntstatus_ok_goto(tctx, status, ok, done,
+                                       "smb2_util_mkdir\n");
+
+       ok = torture_setup_file(tctx, tree, "test.sparsebundle/bands/1", false);
+       torture_assert_goto(tctx, ok, ok, done, "torture_setup_file failed\n");
+
+       ok = torture_setup_file(tctx, tree, "test.sparsebundle/bands/2", false);
+       torture_assert_goto(tctx, ok, ok, done, "torture_setup_file failed\n");
+
+       status = smb2_util_roothandle(tree, &h);
+       torture_assert_ntstatus_ok(tctx, status, "Unable to create root handle");
+
+       ZERO_STRUCT(fsinfo);
+       fsinfo.generic.level = RAW_QFS_SIZE_INFORMATION;
+       fsinfo.generic.handle = h;
+
+       status = smb2_getinfo_fs(tree, tree, &fsinfo);
+       torture_assert_ntstatus_ok(tctx, status, "smb2_getinfo_fs failed");
+
+       torture_comment(tctx, "sectors_per_unit: %" PRIu32"\n"
+                       "bytes_per_sector: %" PRIu32"\n"
+                       "total_alloc_units: %" PRIu64"\n"
+                       "avail_alloc_units: %" PRIu64"\n",
+                       fsinfo.size_info.out.sectors_per_unit,
+                       fsinfo.size_info.out.bytes_per_sector,
+                       fsinfo.size_info.out.total_alloc_units,
+                       fsinfo.size_info.out.avail_alloc_units);
+
+       /*
+        * Let me explain the numbers:
+        *
+        * - the share is set to "fruit:time machine max size = 32K"
+        * - we've faked a bandsize of 8 K in the Info.plist file
+        * - we've created two bands files
+        * - one allocation unit is made of two sectors with 512 B each
+        * => we've consumed 16 allocation units, there should be 16 free
+        */
+
+       torture_assert_goto(tctx, fsinfo.size_info.out.sectors_per_unit == 2,
+                           ok, done, "Bad sectors_per_unit");
+
+       torture_assert_goto(tctx, fsinfo.size_info.out.bytes_per_sector == 512,
+                           ok, done, "Bad bytes_per_sector");
+
+       torture_assert_goto(tctx, fsinfo.size_info.out.total_alloc_units == 32,
+                           ok, done, "Bad total_alloc_units");
+
+       torture_assert_goto(tctx, fsinfo.size_info.out.avail_alloc_units == 16,
+                           ok, done, "Bad avail_alloc_units");
+
+done:
+       if (!smb2_util_handle_empty(h)) {
+               smb2_util_close(tree, h);
+       }
+       smb2_deltree(tree, "test.sparsebundle");
+       talloc_free(mem_ctx);
+       return ok;
+}
+
+struct torture_suite *torture_vfs_fruit_timemachine(TALLOC_CTX *ctx)
+{
+       struct torture_suite *suite = torture_suite_create(
+               ctx, "fruit_timemachine");
+
+       suite->description = talloc_strdup(
+               suite, "vfs_fruit tests for TimeMachine");
+
+       torture_suite_add_1smb2_test(suite, "Timemachine-volsize",
+                                    test_timemachine_volsize);
+
+       return suite;
+}
index eef1f89a37ceee44d77cfcf9b7b66e8e2f3a8bec..64cb0e3d6c4e78132c0b11e6e05dd4cdf38488bc 100644 (file)
@@ -112,6 +112,7 @@ NTSTATUS torture_vfs_init(TALLOC_CTX *ctx)
        torture_suite_add_suite(suite, torture_vfs_fruit_netatalk(suite));
        torture_suite_add_suite(suite, torture_acl_xattr(suite));
        torture_suite_add_suite(suite, torture_vfs_fruit_file_id(suite));
+       torture_suite_add_suite(suite, torture_vfs_fruit_timemachine(suite));
 
        torture_register_suite(ctx, suite);