Index: trunk/psLib/test/collections/Makefile.am
===================================================================
--- trunk/psLib/test/collections/Makefile.am	(revision 3341)
+++ trunk/psLib/test/collections/Makefile.am	(revision 3381)
@@ -36,4 +36,6 @@
 TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified 
 
+CLEANFILES = $(TESTS) $(check_DATA)
+
 tests: $(TESTS)
 
Index: trunk/psLib/test/collections/tst_psMetadataIO.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadataIO.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadataIO.c	(revision 3381)
@@ -1,22 +1,23 @@
 /** @file  tst_psMetadataIO.c
-*
-*  @brief Test driver for psMetadataIO functions
-*
-*  This test driver contains the following tests for psMetadata:
-*    Test A - Read config file with overwrite set true
-*    Test B - Read config file with overwrite set false
-*    Test C - Read config file without auto-allocation of metadata
-*    Test D - Attempt to use null fileName argument
-*    Test E - Attempt to open nonexistant file
-*    Test F - Free psMetadata
-*
-*  @author  Ross Harman, MHPCC
-*
-*  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
-*
-*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
-*
-*/
+ *
+ *  @brief Test driver for psMetadataIO functions
+ *
+ *  This test driver contains the following tests for psMetadata:
+ *    Test A - Read config file with overwrite set true
+ *    Test B - Read config file with overwrite set false
+ *    Test C - Read config file without auto-allocation of metadata
+ *    Test D - Attempt to use null fileName argument
+ *    Test E - Attempt to open nonexistant file
+ *    Test F - Free psMetadata
+ *
+ *  @author  Ross Harman, MHPCC
+ *  @author  Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-03-07 20:58:50 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
 
 #include <string.h>
@@ -69,5 +70,5 @@
 
     switch (metadataItem->type) {
-    case PS_META_LIST:
+    case PS_META_MULTI:
         printf("Key Value: %17c", ' ');
         break;
@@ -92,5 +93,5 @@
     printf("Key Comment: %s\n", metadataItem->comment);
 
-    if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
+    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
         printMetadataList(metadataItem->data.V, "    ");
     }
Index: trunk/psLib/test/collections/tst_psMetadata_01.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadata_01.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadata_01.c	(revision 3381)
@@ -18,6 +18,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
+*  @version $Revision: 1.22 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-03-07 20:58:50 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -75,5 +75,5 @@
 
     switch (metadataItem->type) {
-    case PS_META_LIST:
+    case PS_META_MULTI:
         printf("Key Value: %17c", ' ');
         break;
@@ -98,5 +98,5 @@
     printf("Key Comment: %s\n", metadataItem->comment);
 
-    if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
+    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
         printMetadataList(metadataItem->data.V, "    ");
     }
Index: trunk/psLib/test/collections/tst_psMetadata_02.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadata_02.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadata_02.c	(revision 3381)
@@ -1,23 +1,24 @@
 /** @file  tst_psMetadata_02.c
-*
-*  @brief Test driver for psMetadata functions
-*
-*  This test driver contains the following tests for psMetadata:
-*     Test A - Allocate metadata items
-*     Test B - Attempt to create metadata item with null name
-*     Test C - Attempt to create metadata item with invalid type
-*     Test D - Allocate metadata
-*     Test E - Attempt to add metadata item to null metadata
-*     Test F - Attempt to add null metadata item to metadata
-*     Test G - Free psMetadata
-*
-*  @author  Ross Harman, MHPCC
-*
-*  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
-*
-*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
-*
-*/
+ *
+ *  @brief Test driver for psMetadata functions
+ *
+ *  This test driver contains the following tests for psMetadata:
+ *     Test A - Allocate metadata items
+ *     Test B - Attempt to create metadata item with null name
+ *     Test C - Attempt to create metadata item with invalid type
+ *     Test D - Allocate metadata
+ *     Test E - Attempt to add metadata item to null metadata
+ *     Test F - Attempt to add null metadata item to metadata
+ *     Test G - Free psMetadata
+ *
+ *  @author  Ross Harman, MHPCC
+ *  @author  Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-03-07 20:58:50 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
 
 #include <string.h>
@@ -31,5 +32,5 @@
 
     switch (metadataItem->type) {
-    case PS_META_LIST:
+    case PS_META_MULTI:
         printf("Key Value: %17c", ' ');
         break;
@@ -110,5 +111,5 @@
     printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to add metadata item to null metadata",
                             "Null metadata collection not allowed", 0);
-    psMetadataAddItem(NULL, item1, PS_LIST_HEAD);
+    psMetadataAddItem(NULL, item1, PS_LIST_HEAD, PS_META_DEFAULT);
     printFooter(stdout, "psMetadata", "Test E - Attempt to add metadata item to null metadata", true);
 
@@ -117,5 +118,5 @@
     printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to add null metadata item to metadata",
                             "Null metadata item not allowed", 0);
-    psMetadataAddItem(metadata, NULL, PS_LIST_HEAD);
+    psMetadataAddItem(metadata, NULL, PS_LIST_HEAD, PS_META_DEFAULT);
     printFooter(stdout, "psMetadata", "Test F - Attempt to add null metadata item to metadata", true);
 
Index: trunk/psLib/test/collections/tst_psMetadata_03.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadata_03.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadata_03.c	(revision 3381)
@@ -18,6 +18,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.14 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
+*  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-03-07 20:58:50 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -35,5 +35,5 @@
 
     switch (metadataItem->type) {
-    case PS_META_LIST:
+    case PS_META_MULTI:
         printf("Key Value: %17c", ' ');
         break;
@@ -90,5 +90,5 @@
     // Test B - Remove items from metadata by name
     printPositiveTestHeader(stdout, "psMetadata", "Test B - Remove items from metadata by name");
-    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD)) {
+    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
         return 10;
@@ -111,5 +111,5 @@
     // Test C - Remove items from metadata by index
     printPositiveTestHeader(stdout, "psMetadata", "Test C - Remove items from metadata by index");
-    if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD) ) {
+    if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
         return 14;
@@ -166,5 +166,5 @@
     mdTable = errMetadata->table;
     errMetadata->table = NULL;
-    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD) ) {
+    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
         return 21;
@@ -182,5 +182,5 @@
     mdList = errMetadata->list;
     errMetadata->list = NULL;
-    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD) ) {
+    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o link list.");
         return 22;
@@ -198,5 +198,5 @@
     errName = errItem->name;
     errItem->name = NULL;
-    if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD) ) {
+    if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD, PS_META_DEFAULT) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false with item with null name.");
         return 23;
Index: trunk/psLib/test/collections/tst_psMetadata_04.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadata_04.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadata_04.c	(revision 3381)
@@ -23,6 +23,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
+*  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-03-07 20:58:50 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -40,5 +40,5 @@
 
     switch (metadataItem->type) {
-    case PS_META_LIST:
+    case PS_META_MULTI:
         printf("Key Value: %17c", ' ');
         break;
@@ -95,10 +95,10 @@
     printMetadataItem(item4);
     printMetadataItem(item5);
-    psMetadataAddItem(metadata, item1, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item2, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item3, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item4, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item5, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item6, PS_LIST_HEAD);
+    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item5, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item6, PS_LIST_HEAD, PS_META_DEFAULT);
     psFree(vec);
     printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
Index: trunk/psLib/test/collections/tst_psMetadata_05.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadata_05.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadata_05.c	(revision 3381)
@@ -22,6 +22,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.20 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
+*  @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-03-07 20:58:50 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -39,5 +39,5 @@
 
     switch (metadataItem->type) {
-    case PS_META_LIST:
+    case PS_META_MULTI:
         printf("Key Value: %17c", ' ');
         break;
@@ -92,8 +92,8 @@
     printMetadataItem(item3);
     printMetadataItem(item4);
-    psMetadataAddItem(metadata, item1, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item2, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item3, PS_LIST_HEAD);
-    psMetadataAddItem(metadata, item4, PS_LIST_HEAD);
+    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
     printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
 
Index: trunk/psLib/test/collections/tst_psMetadata_06.c
===================================================================
--- trunk/psLib/test/collections/tst_psMetadata_06.c	(revision 3341)
+++ trunk/psLib/test/collections/tst_psMetadata_06.c	(revision 3381)
@@ -13,6 +13,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-02-28 23:34:10 $
+*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-03-07 20:58:50 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -30,6 +30,9 @@
 
     switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
     case PS_META_LIST:
-        printf("Key Value: %17c", ' ');
+        printf("Key Value: %15s  ", "psList");
         break;
     case PS_META_BOOL:
@@ -71,5 +74,5 @@
     item1c = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 222);
     item2a = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 333);
-    item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a folder node", NULL);
+    item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a list", NULL);
     metadata = psMetadataAlloc();
     printMetadataItem(item1a);
@@ -82,37 +85,60 @@
 
     // Test B - Add leaf node on top of existing leaf node
-    printPositiveTestHeader(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node");
-    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD)) {
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - replace an item in the metadata");
+    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD, PS_META_DEFAULT)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
         return 20;
     }
-    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD)) {
+    psMetadataItem* tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem != item1a) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add the metadata entry.");
+        return 20;
+    }
+
+    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD, PS_META_REPLACE)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
         return 21;
     }
 
-    printFooter(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node", true);
+    tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem != item1b) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't replace the metadata entry.");
+        return 21;
+    }
+
+    printFooter(stdout, "psMetadata", "Test B - replace an item in the metadata", true);
 
 
     // Test C - Add leaf node to existing folder node
-    printPositiveTestHeader(stdout, "psMetadata", "Test C - Add leaf node to existing folder node");
-    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD)) {
+    printPositiveTestHeader(stdout, "psMetadata", "Test C - add duplicate-key metadata item");
+    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem return false for adding a not to existing node.");
         return 22;
     }
-    printFooter(stdout, "psMetadata", "Test C - Add leaf node to existing folder node", true);
+
+    tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
+        return 22;
+    }
+    printFooter(stdout, "psMetadata", "Test C - add duplicate-key metadata item", true);
 
 
     // Test D - Add folder node on top of existing leaf node
     printPositiveTestHeader(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node");
-    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD)) {
+    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD, PS_META_DEFAULT)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node to existing leaf node.");
         return 23;
     }
-    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD)) {
+    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a nod to existing leaf node.");
         return 24;
     }
     printFooter(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node", true);
+    tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
+        return 24;
+    }
 
 
