summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/unlink.c376
1 files changed, 376 insertions, 0 deletions
diff --git a/test/unlink.c b/test/unlink.c
new file mode 100644
index 0000000..2340777
--- /dev/null
+++ b/test/unlink.c
@@ -0,0 +1,376 @@
+/*
+ * Copyright (C) 1998 NCSA
+ * All rights reserved.
+ *
+ * Programmer: Robb Matzke <matzke@llnl.gov>
+ * Friday, September 25, 1998
+ *
+ * Purpose: Test H5Gunlink().
+ */
+#include <hdf5.h>
+#include <stdlib.h>
+
+#include <H5config.h>
+#ifndef HAVE_ATTRIBUTE
+# undef __attribute__
+# define __attribute__(X) /*void*/
+# define __unused__ /*void*/
+#else
+# define __unused__ __attribute__((unused))
+#endif
+
+#define FILE_NAME_1 "unlink.h5"
+#define THE_OBJECT "/foo"
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: cleanup
+ *
+ * Purpose: Removes test files
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ * Thursday, June 4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+cleanup (void)
+{
+ if (!getenv ("HDF5_NOCLEANUP")) {
+ remove (FILE_NAME_1);
+ }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: display_error_cb
+ *
+ * Purpose: Displays the error stack after printing "*FAILED*".
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, March 4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+display_error_cb (void __unused__ *client_data)
+{
+ puts ("*FAILED*");
+ H5Eprint (stdout);
+ return 0;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_one
+ *
+ * Purpose: Creates a group that has just one entry and then unlinks that
+ * entry.
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Robb Matzke
+ * Friday, September 25, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_one(hid_t file)
+{
+ hid_t work, grp;
+ herr_t status;
+
+ /* Create a test group */
+ if ((work=H5Gcreate(file, "/test_one", 0))<0) goto error;
+
+ /* Delete by absolute name */
+ printf("%-70s", "Testing unlink by absolute name");
+ fflush(stdout);
+ if ((grp=H5Gcreate(work, "foo", 0))<0) goto error;
+ if (H5Gclose(grp)<0) goto error;
+ if (H5Gunlink(file, "/test_one/foo")<0) goto error;
+ puts(" PASSED");
+
+ /* Delete by local name */
+ printf("%-70s", "Testing unlink by local name");
+ fflush(stdout);
+ if ((grp=H5Gcreate(work, "foo", 0))<0) goto error;
+ if (H5Gclose(grp)<0) goto error;
+ if (H5Gunlink(work, "foo")<0) goto error;
+ puts(" PASSED");
+
+ /* Delete directly - should fail */
+ printf("%-70s", "Testing unlink without a name");
+ fflush(stdout);
+ if ((grp=H5Gcreate(work, "foo", 0))<0) goto error;
+ H5E_BEGIN_TRY {
+ status = H5Gunlink(grp, ".");
+ } H5E_END_TRY;
+ if (status>=0) {
+ puts("*FAILED*");
+ puts(" Unlinking object w/o a name should have failed.");
+ goto error;
+ }
+ if (H5Gclose(grp)<0) goto error;
+ puts(" PASSED");
+
+ /* Cleanup */
+ if (H5Gclose(work)<0) goto error;
+ return 0;
+ error:
+ H5Gclose(work);
+ return 1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_many
+ *
+ * Purpose: Tests many unlinks in a single directory.
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Robb Matzke
+ * Friday, September 25, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_many(hid_t file)
+{
+ hid_t work, grp;
+ int i;
+ const int how_many=500;
+ char name[32];
+
+ /* Create a test group */
+ if ((work=H5Gcreate(file, "/test_many", 0))<0) goto error;
+ if ((grp = H5Gcreate(work, "/test_many_foo", 0))<0) goto error;
+
+ /* Create a bunch of names and unlink them in order */
+ printf("%-70s", "Testing forward unlink");
+ fflush(stdout);
+ for (i=0; i<how_many; i++) {
+ sprintf(name, "obj_%05d", i);
+ if (H5Glink(work, H5G_LINK_HARD, "/test_many_foo", name)<0) goto error;
+ }
+ for (i=0; i<how_many; i++) {
+ sprintf(name, "obj_%05d", i);
+ if (H5Gunlink(work, name)<0) goto error;
+ }
+ puts(" PASSED");
+
+ /* Create a bunch of names and unlink them in reverse order */
+ printf("%-70s", "Testing backward unlink");
+ fflush(stdout);
+ for (i=0; i<how_many; i++) {
+ sprintf(name, "obj_%05d", i);
+ if (H5Glink(work, H5G_LINK_HARD, "/test_many_foo", name)<0) goto error;
+ }
+ for (i=how_many-1; i>=0; --i) {
+ sprintf(name, "obj_%05d", i);
+ if (H5Gunlink(work, name)<0) goto error;
+ }
+ puts(" PASSED");
+
+ /* Create a bunch of names and unlink them from both directions */
+ printf("%-70s", "Testing inward unlink");
+ fflush(stdout);
+ for (i=0; i<how_many; i++) {
+ sprintf(name, "obj_%05d", i);
+ if (H5Glink(work, H5G_LINK_HARD, "/test_many_foo", name)<0) goto error;
+ }
+ for (i=0; i<how_many; i++) {
+ if (i%2) {
+ sprintf(name, "obj_%05d", how_many-(1+i/2));
+ } else {
+ sprintf(name, "obj_%05d", i/2);
+ }
+ if (H5Gunlink(work, name)<0) goto error;
+ }
+ puts(" PASSED");
+
+ /* Create a bunch of names and unlink them from the midle */
+ printf("%-70s", "Testing outward unlink");
+ fflush(stdout);
+ for (i=0; i<how_many; i++) {
+ sprintf(name, "obj_%05d", i);
+ if (H5Glink(work, H5G_LINK_HARD, "/test_many_foo", name)<0) goto error;
+ }
+ for (i=how_many-1; i>=0; --i) {
+ if (i%2) {
+ sprintf(name, "obj_%05d", how_many-(1+i/2));
+ } else {
+ sprintf(name, "obj_%05d", i/2);
+ }
+ if (H5Gunlink(work, name)<0) goto error;
+ }
+ puts(" PASSED");
+
+
+ /* Cleanup */
+ if (H5Gclose(work)<0) goto error;
+ return 0;
+ error:
+ H5Gclose(work);
+ return 1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_symlink
+ *
+ * Purpose: Tests removal of symbolic links.
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Robb Matzke
+ * Friday, September 25, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_symlink(hid_t file)
+{
+ hid_t work;
+
+ printf("%-70s", "Testing symlink removal");
+ fflush(stdout);
+
+ /* Create a test group and symlink */
+ if ((work=H5Gcreate(file, "/test_symlink", 0))<0) goto error;
+ if (H5Glink(work, H5G_LINK_SOFT, "link_value", "link")<0) goto error;
+ if (H5Gunlink(work, "link")<0) goto error;
+
+ /* Cleanup */
+ if (H5Gclose(work)<0) goto error;
+ puts(" PASSED");
+ return 0;
+ error:
+ H5Gclose(work);
+ return 1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_rename
+ *
+ * Purpose: Tests H5Gmove()
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Robb Matzke
+ * Friday, September 25, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_rename(hid_t file)
+{
+ hid_t work, foo, inner;
+
+
+ /* Create a test group and rename something */
+ printf("%-70s", "Testing object renaming");
+ fflush(stdout);
+ if ((work=H5Gcreate(file, "/test_rename", 0))<0) goto error;
+ if ((foo=H5Gcreate(work, "foo", 0))<0) goto error;
+ if (H5Gmove(work, "foo", "bar")<0) goto error;
+ if ((inner=H5Gcreate(foo, "inner", 0))<0) goto error;
+ if (H5Gclose(inner)<0) goto error;
+ if (H5Gclose(foo)<0) goto error;
+ if ((inner=H5Gopen(work, "bar/inner"))<0) goto error;
+ if (H5Gclose(inner)<0) goto error;
+ puts(" PASSED");
+
+ /* Try renaming a symlink */
+ printf("%-70s", "Testing symlink renaming");
+ fflush(stdout);
+ if (H5Glink(work, H5G_LINK_SOFT, "link_value", "link_one")<0) goto error;
+ if (H5Gmove(work, "link_one", "link_two")<0) goto error;
+ puts(" PASSED");
+
+ /* Cleanup */
+ if (H5Gclose(work)<0) goto error;
+ return 0;
+ error:
+ H5Gclose(work);
+ return 1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Test H5Gunlink()
+ *
+ * Return: Success: zero
+ *
+ * Failure: non-zero
+ *
+ * Programmer: Robb Matzke
+ * Friday, September 25, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+ hid_t file;
+ int nerrors = 0;
+
+ /* Open */
+ H5Eset_auto(display_error_cb, NULL);
+ if ((file=H5Fcreate(FILE_NAME_1, H5F_ACC_TRUNC,
+ H5P_DEFAULT, H5P_DEFAULT))<0) goto error;
+
+ /* Tests */
+ nerrors += test_one(file);
+ nerrors += test_many(file);
+ nerrors += test_symlink(file);
+ nerrors += test_rename(file);
+
+ /* Close */
+ if (H5Fclose(file)<0) goto error;
+ if (nerrors) {
+ printf("***** %d FAILURE%s! *****\n", nerrors, 1==nerrors?"":"S");
+ exit(1);
+ }
+ puts("All unlink tests passed.");
+ cleanup();
+ return 0;
+ error:
+ return 1;
+}
+
+