Merge branch 'v4-0-test' of git://git.samba.org/samba into 4-0-local
[gd/samba-autobuild/.git] / source4 / torture / raw / mkdir.c
index d7b3baa2dba56f174cfb1d858590e37846e759ff..93e94150d74b9a855f67c2c9791fcb191438b202 100644 (file)
@@ -5,7 +5,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -23,6 +22,7 @@
 #include "libcli/raw/libcliraw.h"
 #include "libcli/libcli.h"
 #include "torture/util.h"
+#include "param/param.h"
 
 #define BASEDIR "\\mkdirtest"
 
        if (!NT_STATUS_EQUAL(status, correct)) { \
                printf("(%s) Incorrect status %s - should be %s\n", \
                       __location__, nt_errstr(status), nt_errstr(correct)); \
-               ret = False; \
+               ret = false; \
                goto done; \
        }} while (0)
 
 /*
   test mkdir ops
 */
-static BOOL test_mkdir(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
+static bool test_mkdir(struct smbcli_state *cli, struct torture_context *tctx)
 {
        union smb_mkdir md;
        struct smb_rmdir rd;
        const char *path = BASEDIR "\\mkdir.dir";
        NTSTATUS status;
-       BOOL ret = True;
+       bool ret = true;
 
        if (!torture_setup_dir(cli, BASEDIR)) {
-               return False;
+               return false;
        }
 
        /* 
@@ -75,7 +75,7 @@ static BOOL test_mkdir(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        printf("testing mkdir collision with file\n");
 
        /* name collision with a file */
-       smbcli_close(cli->tree, create_complex_file(cli, mem_ctx, path));
+       smbcli_close(cli->tree, create_complex_file(cli, tctx, path));
        status = smb_raw_mkdir(cli->tree, &md);
        CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);
 
@@ -106,34 +106,50 @@ static BOOL test_mkdir(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        status = smb_raw_rmdir(cli->tree, &rd);
        CHECK_STATUS(status, NT_STATUS_OK);
 
+       printf("testing t2mkdir bad path\n");
+       md.t2mkdir.in.path = talloc_asprintf(tctx, "%s\\bad_path\\bad_path",
+                                            BASEDIR);
+       status = smb_raw_mkdir(cli->tree, &md);
+       CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
        printf("testing t2mkdir with EAs\n");
 
        /* with EAs */
        md.t2mkdir.level = RAW_MKDIR_T2MKDIR;
        md.t2mkdir.in.path = path;
        md.t2mkdir.in.num_eas = 3;
-       md.t2mkdir.in.eas = talloc_array(mem_ctx, struct ea_struct, md.t2mkdir.in.num_eas);
+       md.t2mkdir.in.eas = talloc_array(tctx, struct ea_struct, md.t2mkdir.in.num_eas);
        md.t2mkdir.in.eas[0].flags = 0;
        md.t2mkdir.in.eas[0].name.s = "EAONE";
-       md.t2mkdir.in.eas[0].value = data_blob_talloc(mem_ctx, "blah", 4);
+       md.t2mkdir.in.eas[0].value = data_blob_talloc(tctx, "blah", 4);
        md.t2mkdir.in.eas[1].flags = 0;
        md.t2mkdir.in.eas[1].name.s = "EA TWO";
-       md.t2mkdir.in.eas[1].value = data_blob_talloc(mem_ctx, "foo bar", 7);
+       md.t2mkdir.in.eas[1].value = data_blob_talloc(tctx, "foo bar", 7);
        md.t2mkdir.in.eas[2].flags = 0;
        md.t2mkdir.in.eas[2].name.s = "EATHREE";
-       md.t2mkdir.in.eas[2].value = data_blob_talloc(mem_ctx, "xx1", 3);
+       md.t2mkdir.in.eas[2].value = data_blob_talloc(tctx, "xx1", 3);
        status = smb_raw_mkdir(cli->tree, &md);
-       CHECK_STATUS(status, NT_STATUS_OK);
-
-       status = torture_check_ea(cli, path, "EAONE", "blah");
-       CHECK_STATUS(status, NT_STATUS_OK);
-       status = torture_check_ea(cli, path, "EA TWO", "foo bar");
-       CHECK_STATUS(status, NT_STATUS_OK);
-       status = torture_check_ea(cli, path, "EATHREE", "xx1");
-       CHECK_STATUS(status, NT_STATUS_OK);
 
-       status = smb_raw_rmdir(cli->tree, &rd);
-       CHECK_STATUS(status, NT_STATUS_OK);
+       if (torture_setting_bool(tctx, "samba3", false)
+           && NT_STATUS_EQUAL(status, NT_STATUS_EAS_NOT_SUPPORTED)) {
+               d_printf("EAS not supported -- not treating as fatal\n");
+       }
+       else {
+               /*
+                * In Samba3, don't see this error as fatal
+                */
+               CHECK_STATUS(status, NT_STATUS_OK);
+
+               status = torture_check_ea(cli, path, "EAONE", "blah");
+               CHECK_STATUS(status, NT_STATUS_OK);
+               status = torture_check_ea(cli, path, "EA TWO", "foo bar");
+               CHECK_STATUS(status, NT_STATUS_OK);
+               status = torture_check_ea(cli, path, "EATHREE", "xx1");
+               CHECK_STATUS(status, NT_STATUS_OK);
+
+               status = smb_raw_rmdir(cli->tree, &rd);
+               CHECK_STATUS(status, NT_STATUS_OK);
+       }
 
 done:
        smb_raw_exit(cli->session);
@@ -145,23 +161,14 @@ done:
 /* 
    basic testing of all RAW_MKDIR_* calls 
 */
-BOOL torture_raw_mkdir(struct torture_context *torture)
+bool torture_raw_mkdir(struct torture_context *torture, 
+                      struct smbcli_state *cli)
 {
-       struct smbcli_state *cli;
-       BOOL ret = True;
-       TALLOC_CTX *mem_ctx;
-
-       if (!torture_open_connection(&cli)) {
-               return False;
-       }
-
-       mem_ctx = talloc_init("torture_raw_mkdir");
+       bool ret = true;
 
-       if (!test_mkdir(cli, mem_ctx)) {
-               ret = False;
+       if (!test_mkdir(cli, torture)) {
+               ret = false;
        }
 
-       torture_close_connection(cli);
-       talloc_free(mem_ctx);
        return ret;
 }