From 50caed33bd5c848c2635572e2af1ee86ad122f40 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 27 Feb 2001 17:27:45 -0500 Subject: [svn-r3521] Purpose: Test checkpoint Description: Checkpointing generic property tests before removing the older [non-generic] property list implementation and switching all the property lists to use the generic code. Generic properties are feature complete and as fully tested as I can determine. Platforms tested: FreeBSD 4.2 (hawkwind) --- test/tgenprop.c | 736 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 719 insertions(+), 17 deletions(-) diff --git a/test/tgenprop.c b/test/tgenprop.c index c89cf91..a70ac06 100644 --- a/test/tgenprop.c +++ b/test/tgenprop.c @@ -182,11 +182,11 @@ test_genprop_basic_class_prop(void) VERIFY(ret, 0, "H5Pexist"); /* Insert first property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Try to insert the first property again (should fail) */ - ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); VERIFY(ret, FAIL, "H5Pregister"); /* Check the existance of the first property */ @@ -204,11 +204,11 @@ test_genprop_basic_class_prop(void) VERIFY(nprops, 1, "H5Pget_nprops"); /* Insert second property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Try to insert the second property again (should fail) */ - ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); VERIFY(ret, FAIL, "H5Pregister"); /* Check the existance of the second property */ @@ -226,7 +226,7 @@ test_genprop_basic_class_prop(void) VERIFY(nprops, 2, "H5Pget_nprops"); /* Insert third property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Check the existance of the third property */ @@ -329,19 +329,19 @@ test_genprop_class_iter(void) CHECK_I(cid1, "H5Pcreate_class"); /* Insert first property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Insert second property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Insert third property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Insert third property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP4_NAME,PROP4_SIZE,PROP4_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP4_NAME,PROP4_SIZE,PROP4_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Check the number of properties in class */ @@ -368,6 +368,125 @@ test_genprop_class_iter(void) /**************************************************************** ** +** test_genprop_cls_cb1(): Property List callback for test_genprop_class_callback +** +****************************************************************/ +static herr_t +test_genprop_cls_cb1(hid_t list_id, void *create_data) +{ + struct { /* Struct for iterations */ + int count; + hid_t id; + } *count_struct=create_data; + + count_struct->count++; + count_struct->id=list_id; + + return(SUCCEED); +} + +/**************************************************************** +** +** test_genprop_class_callback(): Test basic generic property list code. +** Tests callbacks for property lists in a generic class. +** +****************************************************************/ +static void +test_genprop_class_callback(void) +{ + hid_t cid1; /* Generic Property class ID */ + hid_t lid1; /* Generic Property list ID */ + hid_t lid2; /* Generic Property list ID */ + size_t nprops; /* Number of properties in class */ + struct { /* Struct for callbacks */ + int count; + hid_t id; + } crt_cb_struct, cls_cb_struct; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Generic Property List Class Callback Functionality\n")); + + /* Create a new generic class, derived from the root of the class hierarchy */ + cid1 = H5Pcreate_class(H5P_NO_CLASS_NEW,CLASS1_NAME,CLASS1_HASHSIZE,test_genprop_cls_cb1,&crt_cb_struct,test_genprop_cls_cb1,&cls_cb_struct); + CHECK_I(cid1, "H5Pcreate_class"); + + /* Insert first property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert second property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert third property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert fourth property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP4_NAME,PROP4_SIZE,PROP4_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Check the number of properties in class */ + ret = H5Pget_nprops(cid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 4, "H5Pget_nprops"); + + /* Initialize class callback structs */ + crt_cb_struct.count=0; + crt_cb_struct.id=(-1); + cls_cb_struct.count=0; + cls_cb_struct.id=(-1); + + /* Create a property list from the class */ + lid1 = H5Pcreate_list(cid1); + CHECK_I(lid1, "H5Pcreate_list"); + + /* Verify that the creation callback occurred */ + VERIFY(crt_cb_struct.count, 1, "H5Pcreate_list"); + VERIFY(crt_cb_struct.id, lid1, "H5Pcreate_list"); + + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 4, "H5Pget_nprops"); + + /* Create another property list from the class */ + lid2 = H5Pcreate_list(cid1); + CHECK_I(lid2, "H5Pcreate_list"); + + /* Verify that the creation callback occurred */ + VERIFY(crt_cb_struct.count, 2, "H5Pcreate_list"); + VERIFY(crt_cb_struct.id, lid2, "H5Pcreate_list"); + + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid2,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 4, "H5Pget_nprops"); + + /* Close first list */ + ret = H5Pclose_list(lid1); + CHECK_I(ret, "H5Pclose_list"); + + /* Verify that the close callback occurred */ + VERIFY(cls_cb_struct.count, 1, "H5Pclose_list"); + VERIFY(cls_cb_struct.id, lid1, "H5Pclose_list"); + + /* Close second list */ + ret = H5Pclose_list(lid2); + CHECK_I(ret, "H5Pclose_list"); + + /* Verify that the close callback occurred */ + VERIFY(cls_cb_struct.count, 2, "H5Pclose_list"); + VERIFY(cls_cb_struct.id, lid2, "H5Pclose_list"); + + /* Close class */ + ret = H5Pclose_class(cid1); + CHECK_I(ret, "H5Pclose_class"); +} /* end test_genprop_class_callback() */ + +/**************************************************************** +** ** test_genprop_basic_list(): Test basic generic property list code. ** Tests creating new generic property lists. ** @@ -378,6 +497,10 @@ test_genprop_basic_list(void) hid_t cid1; /* Generic Property class ID */ hid_t cid2; /* Generic Property class ID */ hid_t lid1; /* Generic Property list ID */ + size_t nprops; /* Number of properties */ + size_t size; /* Size of property */ + int prop1_value; /* Value for property #1 */ + float prop2_value; /* Value for property #2 */ herr_t ret; /* Generic return value */ /* Output message about test being performed */ @@ -387,16 +510,21 @@ test_genprop_basic_list(void) cid1 = H5Pcreate_class(H5P_NO_CLASS_NEW,CLASS1_NAME,CLASS1_HASHSIZE,NULL,NULL,NULL,NULL); CHECK_I(cid1, "H5Pcreate_class"); - /* Add several properties (several w/default values) */ + /* Add several properties (w/default values) */ /* Insert first property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); /* Insert second property into class (with no callbacks) */ - ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL); + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); CHECK_I(ret, "H5Pregister"); + /* Check the number of properties in class */ + ret = H5Pget_nprops(cid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 2, "H5Pget_nprops"); + /* Create a property list from the class */ lid1 = H5Pcreate_list(cid1); CHECK_I(lid1, "H5Pcreate_list"); @@ -409,17 +537,177 @@ test_genprop_basic_list(void) ret = H5Pequal(cid1,cid2); VERIFY(ret, 1, "H5Pequal"); - /* Check "is a" class/list relationship */ + /* Check correct "is a" class/list relationship */ + ret = H5Pisa_class(lid1,cid1); + VERIFY(ret, 1, "H5Pisa_class"); + + /* Check "is a" class/list relationship another way */ + ret = H5Pisa_class(lid1,cid2); + VERIFY(ret, 1, "H5Pisa_class"); /* Close class */ ret = H5Pclose_class(cid2); CHECK_I(ret, "H5Pclose_class"); - /* Check number of properties */ + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 2, "H5Pget_nprops"); + /* Check existence of properties */ + ret = H5Pexist(lid1,PROP1_NAME); + VERIFY(ret, 1, "H5Pexist"); + ret = H5Pexist(lid1,PROP2_NAME); + VERIFY(ret, 1, "H5Pexist"); + + /* Check the sizes of the properties */ + ret = H5Pget_size(lid1,PROP1_NAME,&size); + CHECK_I(ret, "H5Pget_size"); + VERIFY(size, PROP1_SIZE, "H5Pget_size"); + ret = H5Pget_size(lid1,PROP2_NAME,&size); + CHECK_I(ret, "H5Pget_size"); + VERIFY(size, PROP2_SIZE, "H5Pget_size"); + + /* Check values of properties (set with default values) */ + ret = H5Pget(lid1,PROP1_NAME,&prop1_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); + ret = H5Pget(lid1,PROP2_NAME,&prop2_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop2_value, *PROP2_DEF_VALUE, "H5Pget"); + + /* Close list */ + ret = H5Pclose_list(lid1); + CHECK_I(ret, "H5Pclose_list"); + + /* Close class */ + ret = H5Pclose_class(cid1); + CHECK_I(ret, "H5Pclose_class"); + +} /* end test_genprop_basic_list() */ + +/**************************************************************** +** +** test_genprop_basic_list_prop(): Test basic generic property list code. +** Tests creating new generic property lists and adding and +** removing properties from them. +** +****************************************************************/ +static void +test_genprop_basic_list_prop(void) +{ + hid_t cid1; /* Generic Property class ID */ + hid_t lid1; /* Generic Property list ID */ + size_t nprops; /* Number of properties */ + int prop1_value; /* Value for property #1 */ + float prop2_value; /* Value for property #2 */ + char prop3_value[10];/* Property #3 value */ + double prop4_value; /* Property #4 value */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Generic Property List Property Functionality\n")); + + /* Create a new generic class, derived from the root of the class hierarchy */ + cid1 = H5Pcreate_class(H5P_NO_CLASS_NEW,CLASS1_NAME,CLASS1_HASHSIZE,NULL,NULL,NULL,NULL); + CHECK_I(cid1, "H5Pcreate_class"); + + /* Add several properties (several w/default values) */ + + /* Insert first property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert second property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Create a property list from the class */ + lid1 = H5Pcreate_list(cid1); + CHECK_I(lid1, "H5Pcreate_list"); + + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 2, "H5Pget_nprops"); + /* Add temporary properties */ + + /* Insert first temporary property into class (with no callbacks) */ + ret = H5Pinsert(lid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pinsert"); + + /* Insert second temporary property into class (with no callbacks) */ + ret = H5Pinsert(lid1,PROP4_NAME,PROP4_SIZE,PROP4_DEF_VALUE,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pinsert"); + + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 4, "H5Pget_nprops"); + + /* Check existence of all properties */ + ret = H5Pexist(lid1,PROP1_NAME); + VERIFY(ret, 1, "H5Pexist"); + ret = H5Pexist(lid1,PROP2_NAME); + VERIFY(ret, 1, "H5Pexist"); + ret = H5Pexist(lid1,PROP3_NAME); + VERIFY(ret, 1, "H5Pexist"); + ret = H5Pexist(lid1,PROP4_NAME); + VERIFY(ret, 1, "H5Pexist"); + + /* Check values of permanent properties (set with default values) */ + ret = H5Pget(lid1,PROP1_NAME,&prop1_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); + ret = H5Pget(lid1,PROP2_NAME,&prop2_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop2_value, *PROP2_DEF_VALUE, "H5Pget"); + + /* Check values of temporary properties (set with regular values) */ + ret = H5Pget(lid1,PROP3_NAME,&prop3_value); + CHECK_I(ret, "H5Pget"); + if(memcmp(&prop3_value,PROP3_DEF_VALUE,PROP3_SIZE)!=0) { + num_errs++; + printf("Property #3 doesn't match!, line=%d\n",__LINE__); + } /* end if */ + ret = H5Pget(lid1,PROP4_NAME,&prop4_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop4_value, *PROP4_DEF_VALUE, "H5Pget"); + + /* Delete permanent property */ + ret = H5Premove(lid1,PROP2_NAME); + CHECK_I(ret, "H5Premove"); + + /* Check number of properties */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 3, "H5Pget_nprops"); + + /* Delete temporary property */ + ret = H5Premove(lid1,PROP3_NAME); + CHECK_I(ret, "H5Premove"); + /* Check number of properties */ - /* Check existence of new properties */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 2, "H5Pget_nprops"); + + /* Check existence of remaining properties */ + ret = H5Pexist(lid1,PROP1_NAME); + VERIFY(ret, 1, "H5Pexist"); + ret = H5Pexist(lid1,PROP4_NAME); + VERIFY(ret, 1, "H5Pexist"); + + /* Check values of permanent properties (set with default values) */ + ret = H5Pget(lid1,PROP1_NAME,&prop1_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); + + /* Check values of temporary properties (set with regular values) */ + ret = H5Pget(lid1,PROP4_NAME,&prop4_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop4_value, *PROP4_DEF_VALUE, "H5Pget"); /* Close list */ ret = H5Pclose_list(lid1); @@ -429,7 +717,416 @@ test_genprop_basic_list(void) ret = H5Pclose_class(cid1); CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_basic_list() */ +} /* end test_genprop_basic_list_prop() */ + +/**************************************************************** +** +** test_genprop_iter2(): Property iterator for test_genprop_list_iter +** +****************************************************************/ +static int +test_genprop_iter2(hid_t id, const char *name, void *iter_data) +{ + struct { /* Struct for iterations */ + int iter_count; + const char **names; + } *iter_struct=iter_data; + + /* Shut compiler up */ + id=id; + + return(HDstrcmp(name,iter_struct->names[iter_struct->iter_count++])); +} + +/**************************************************************** +** +** test_genprop_list_iter(): Test basic generic property list code. +** Tests iterating over generic property list properties. +** +****************************************************************/ +static void +test_genprop_list_iter(void) +{ + hid_t cid1; /* Generic Property class ID */ + hid_t lid1; /* Generic Property list ID */ + size_t nprops; /* Number of properties */ + int idx; /* Index to start iteration at */ + struct { /* Struct for iterations */ + int iter_count; + const char **names; + } iter_struct; + const char *pnames[4]={ /* Names of properties for iterator */ + PROP1_NAME, + PROP2_NAME, + PROP3_NAME, + PROP4_NAME}; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Generic Property List Iteration Functionality\n")); + + /* Create a new generic class, derived from the root of the class hierarchy */ + cid1 = H5Pcreate_class(H5P_NO_CLASS_NEW,CLASS1_NAME,CLASS1_HASHSIZE,NULL,NULL,NULL,NULL); + CHECK_I(cid1, "H5Pcreate_class"); + + /* Add several properties (several w/default values) */ + + /* Insert first property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert second property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Create a property list from the class */ + lid1 = H5Pcreate_list(cid1); + CHECK_I(lid1, "H5Pcreate_list"); + + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 2, "H5Pget_nprops"); + + /* Add temporary properties */ + + /* Insert first temporary property into class (with no callbacks) */ + ret = H5Pinsert(lid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pinsert"); + + /* Insert second temporary property into class (with no callbacks) */ + ret = H5Pinsert(lid1,PROP4_NAME,PROP4_SIZE,PROP4_DEF_VALUE,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pinsert"); + + /* Check the number of properties in list */ + ret = H5Pget_nprops(lid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 4, "H5Pget_nprops"); + + /* Iterate over all properties in list */ + iter_struct.iter_count=0; + iter_struct.names=pnames; + ret = H5Piterate(lid1,NULL,test_genprop_iter2,&iter_struct); + VERIFY(ret, 0, "H5Piterate"); + + /* Iterate over last three properties in list */ + idx=iter_struct.iter_count=1; + ret = H5Piterate(lid1,&idx,test_genprop_iter2,&iter_struct); + VERIFY(ret, 0, "H5Piterate"); + VERIFY(idx, (int)nprops, "H5Piterate"); + + /* Close list */ + ret = H5Pclose_list(lid1); + CHECK_I(ret, "H5Pclose_list"); + + /* Close class */ + ret = H5Pclose_class(cid1); + CHECK_I(ret, "H5Pclose_class"); + +} /* end test_genprop_list_iter() */ + +typedef struct { + /* Creation information */ + int crt_count; + char *crt_name; + void *crt_value; + + /* Set information */ + int set_count; + hid_t set_plist_id; + char *set_name; + void *set_value; + + /* Get information */ + int get_count; + hid_t get_plist_id; + char *get_name; + void *get_value; + + /* Delete information */ + int del_count; + hid_t del_plist_id; + char *del_name; + void *del_value; + + /* Close information */ + int cls_count; + char *cls_name; + void *cls_value; +} prop_cb_info; + +/* Global variables for Callback information */ +prop_cb_info prop1_cb_info; /* Callback statistics for property #1 */ +prop_cb_info prop2_cb_info; /* Callback statistics for property #2 */ + +/**************************************************************** +** +** test_genprop_prop_crt_cb1(): Property creation callback for test_genprop_list_callback +** +****************************************************************/ +static herr_t +test_genprop_prop_crt_cb1(const char *name, void *def_value) +{ + /* Set the information from the creation call */ + prop1_cb_info.crt_count++; + prop1_cb_info.crt_name=HDstrdup(name); + prop1_cb_info.crt_value=HDmalloc(PROP1_SIZE); + HDmemcpy(prop1_cb_info.crt_value,def_value,PROP1_SIZE); + + return(SUCCEED); +} + +/**************************************************************** +** +** test_genprop_prop_set_cb1(): Property set callback for test_genprop_list_callback +** +****************************************************************/ +static herr_t +test_genprop_prop_set_cb1(hid_t plist_id, const char *name, void *value) +{ + /* Set the information from the set call */ + prop1_cb_info.set_count++; + prop1_cb_info.set_plist_id=plist_id; + if(prop1_cb_info.set_name==NULL) + prop1_cb_info.set_name=HDstrdup(name); + if(prop1_cb_info.set_value==NULL) + prop1_cb_info.set_value=HDmalloc(PROP1_SIZE); + HDmemcpy(prop1_cb_info.set_value,value,PROP1_SIZE); + + return(SUCCEED); +} + +/**************************************************************** +** +** test_genprop_prop_get_cb1(): Property get callback for test_genprop_list_callback +** +****************************************************************/ +static herr_t +test_genprop_prop_get_cb1(hid_t plist_id, const char *name, void *value) +{ + /* Set the information from the get call */ + prop1_cb_info.get_count++; + prop1_cb_info.get_plist_id=plist_id; + if(prop1_cb_info.get_name==NULL) + prop1_cb_info.get_name=HDstrdup(name); + if(prop1_cb_info.get_value==NULL) + prop1_cb_info.get_value=HDmalloc(PROP1_SIZE); + HDmemcpy(prop1_cb_info.get_value,value,PROP1_SIZE); + + return(SUCCEED); +} + +/**************************************************************** +** +** test_genprop_prop_cls_cb1(): Property close callback for test_genprop_list_callback +** +****************************************************************/ +static herr_t +test_genprop_prop_cls_cb1(const char *name, void *value) +{ + /* Set the information from the close call */ + prop1_cb_info.cls_count++; + prop1_cb_info.cls_name=HDstrdup(name); + prop1_cb_info.cls_value=HDmalloc(PROP1_SIZE); + HDmemcpy(prop1_cb_info.cls_value,value,PROP1_SIZE); + + return(SUCCEED); +} + +/**************************************************************** +** +** test_genprop_prop_del_cb2(): Property delete callback for test_genprop_list_callback +** +****************************************************************/ +static herr_t +test_genprop_prop_del_cb2(hid_t plist_id, const char *name, void *value) +{ + /* Set the information from the delete call */ + prop2_cb_info.del_count++; + prop2_cb_info.del_plist_id=plist_id; + prop2_cb_info.del_name=HDstrdup(name); + prop2_cb_info.del_value=HDmalloc(PROP2_SIZE); + HDmemcpy(prop2_cb_info.del_value,value,PROP2_SIZE); + + return(SUCCEED); +} + +/**************************************************************** +** +** test_genprop_list_callback(): Test basic generic property list code. +** Tests callbacks for properties in a generic property list. +** +****************************************************************/ +static void +test_genprop_list_callback(void) +{ + hid_t cid1; /* Generic Property class ID */ + hid_t lid1; /* Generic Property list ID */ + size_t nprops; /* Number of properties in class */ + int prop1_value; /* Value for property #1 */ + int prop1_new_value=20; /* Property #1 new value */ + float prop2_value; /* Value for property #2 */ + char prop3_value[10];/* Property #3 value */ + double prop4_value; /* Property #4 value */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Generic Property List Property Callback Functionality\n")); + + /* Create a new generic class, derived from the root of the class hierarchy */ + cid1 = H5Pcreate_class(H5P_NO_CLASS_NEW,CLASS1_NAME,CLASS1_HASHSIZE,NULL,NULL,NULL,NULL); + CHECK_I(cid1, "H5Pcreate_class"); + + /* Insert first property into class (with callbacks) */ + ret = H5Pregister(cid1,PROP1_NAME,PROP1_SIZE,PROP1_DEF_VALUE,test_genprop_prop_crt_cb1,test_genprop_prop_set_cb1,test_genprop_prop_get_cb1,NULL,test_genprop_prop_cls_cb1); + CHECK_I(ret, "H5Pregister"); + + /* Insert second property into class (with only delete callback) */ + ret = H5Pregister(cid1,PROP2_NAME,PROP2_SIZE,PROP2_DEF_VALUE,NULL,NULL,NULL,test_genprop_prop_del_cb2,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert third property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP3_NAME,PROP3_SIZE,PROP3_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Insert fourth property into class (with no callbacks) */ + ret = H5Pregister(cid1,PROP4_NAME,PROP4_SIZE,PROP4_DEF_VALUE,NULL,NULL,NULL,NULL,NULL); + CHECK_I(ret, "H5Pregister"); + + /* Check the number of properties in class */ + ret = H5Pget_nprops(cid1,&nprops); + CHECK_I(ret, "H5Pget_nprops"); + VERIFY(nprops, 4, "H5Pget_nprops"); + + /* Initialize callback information for properties tracked */ + HDmemset(&prop1_cb_info,0,sizeof(prop_cb_info)); + + /* Create a property list from the class */ + lid1 = H5Pcreate_list(cid1); + CHECK_I(lid1, "H5Pcreate_list"); + + /* Verify creation callback information for properties tracked */ + VERIFY(prop1_cb_info.crt_count, 1, "H5Pcreate_list"); + if(HDstrcmp(prop1_cb_info.crt_name,PROP1_NAME)!=0) { + num_errs++; + printf("Property #1 name doesn't match!, line=%d\n",__LINE__); + } /* end if */ + if(HDmemcmp(prop1_cb_info.crt_value,PROP1_DEF_VALUE,PROP1_SIZE)!=0) { + num_errs++; + printf("Property #1 value doesn't match!, line=%d\n",__LINE__); + } /* end if */ + + /* Check values of permanent properties (set with default values) */ + ret = H5Pget(lid1,PROP1_NAME,&prop1_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); + ret = H5Pget(lid1,PROP2_NAME,&prop2_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop2_value, *PROP2_DEF_VALUE, "H5Pget"); + + /* Check values of temporary properties (set with regular values) */ + ret = H5Pget(lid1,PROP3_NAME,&prop3_value); + CHECK_I(ret, "H5Pget"); + if(memcmp(&prop3_value,PROP3_DEF_VALUE,PROP3_SIZE)!=0) { + num_errs++; + printf("Property #3 doesn't match!, line=%d\n",__LINE__); + } /* end if */ + ret = H5Pget(lid1,PROP4_NAME,&prop4_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop4_value, *PROP4_DEF_VALUE, "H5Pget"); + + /* Verify get callback information for properties tracked */ + VERIFY(prop1_cb_info.get_count, 1, "H5Pget"); + VERIFY(prop1_cb_info.get_plist_id, lid1, "H5Pget"); + if(HDstrcmp(prop1_cb_info.get_name,PROP1_NAME)!=0) { + num_errs++; + printf("Property #1 name doesn't match!, line=%d\n",__LINE__); + } /* end if */ + if(HDmemcmp(prop1_cb_info.get_value,PROP1_DEF_VALUE,PROP1_SIZE)!=0) { + num_errs++; + printf("Property #1 value doesn't match!, line=%d\n",__LINE__); + } /* end if */ + + /* Set value of property #1 to different value */ + ret = H5Pset(lid1,PROP1_NAME,&prop1_new_value); + CHECK_I(ret, "H5Pset"); + + /* Verify set callback information for properties tracked */ + VERIFY(prop1_cb_info.set_count, 1, "H5Pset"); + VERIFY(prop1_cb_info.set_plist_id, lid1, "H5Pset"); + if(HDstrcmp(prop1_cb_info.set_name,PROP1_NAME)!=0) { + num_errs++; + printf("Property #1 name doesn't match!, line=%d\n",__LINE__); + } /* end if */ + if(HDmemcmp(prop1_cb_info.set_value,&prop1_new_value,PROP1_SIZE)!=0) { + num_errs++; + printf("Property #1 value doesn't match!, line=%d\n",__LINE__); + } /* end if */ + + /* Check new value of tracked properties */ + ret = H5Pget(lid1,PROP1_NAME,&prop1_value); + CHECK_I(ret, "H5Pget"); + VERIFY(prop1_value, prop1_new_value, "H5Pget"); + + /* Verify get callback information again for properties tracked */ + VERIFY(prop1_cb_info.get_count, 2, "H5Pget"); + VERIFY(prop1_cb_info.get_plist_id, lid1, "H5Pget"); + if(HDstrcmp(prop1_cb_info.get_name,PROP1_NAME)!=0) { + num_errs++; + printf("Property #1 name doesn't match!, line=%d\n",__LINE__); + } /* end if */ + if(HDmemcmp(prop1_cb_info.get_value,&prop1_new_value,PROP1_SIZE)!=0) { + num_errs++; + printf("Property #1 value doesn't match!, line=%d\n",__LINE__); + } /* end if */ + + /* Delete property #2 */ + ret = H5Premove(lid1,PROP2_NAME); + CHECK_I(ret, "H5Premove"); + + /* Verify delete callback information for properties tracked */ + VERIFY(prop2_cb_info.del_count, 1, "H5Premove"); + VERIFY(prop2_cb_info.del_plist_id, lid1, "H5Premove"); + if(HDstrcmp(prop2_cb_info.del_name,PROP2_NAME)!=0) { + num_errs++; + printf("Property #2 name doesn't match!, line=%d\n",__LINE__); + } /* end if */ + if(HDmemcmp(prop2_cb_info.del_value,PROP2_DEF_VALUE,PROP2_SIZE)!=0) { + num_errs++; + printf("Property #2 value doesn't match!, line=%d\n",__LINE__); + } /* end if */ + + /* Close first list */ + ret = H5Pclose_list(lid1); + CHECK_I(ret, "H5Pclose_list"); + + /* Verify close callback information for properties tracked */ + VERIFY(prop1_cb_info.cls_count, 1, "H5Pclose"); + if(HDstrcmp(prop1_cb_info.cls_name,PROP1_NAME)!=0) { + num_errs++; + printf("Property #1 name doesn't match!, line=%d\n",__LINE__); + } /* end if */ + if(HDmemcmp(prop1_cb_info.cls_value,&prop1_new_value,PROP1_SIZE)!=0) { + num_errs++; + printf("Property #1 value doesn't match!, line=%d\n",__LINE__); + } /* end if */ + + /* Free memory allocated for tracking properties */ + HDfree(prop1_cb_info.crt_name); + HDfree(prop1_cb_info.crt_value); + HDfree(prop1_cb_info.get_name); + HDfree(prop1_cb_info.get_value); + HDfree(prop1_cb_info.set_name); + HDfree(prop1_cb_info.set_value); + HDfree(prop1_cb_info.cls_name); + HDfree(prop1_cb_info.cls_value); + HDfree(prop2_cb_info.del_name); + HDfree(prop2_cb_info.del_value); + + /* Close class */ + ret = H5Pclose_class(cid1); + CHECK_I(ret, "H5Pclose_class"); +} /* end test_genprop_list_callback() */ /**************************************************************** ** @@ -445,8 +1142,13 @@ test_genprop(void) /* These tests use the same file... */ test_genprop_basic_class(); /* Test basic code for creating a generic class */ test_genprop_basic_class_prop(); /* Test basic code for adding properties to a generic class */ - test_genprop_class_iter(); /* Test basic code for iterating over properties in a generic class */ + test_genprop_class_iter(); /* Test code for iterating over properties in a generic class */ + test_genprop_class_callback(); /* Test code for property class callbacks */ + test_genprop_basic_list(); /* Test basic code for creating a generic property list */ + test_genprop_basic_list_prop(); /* Test basic code for adding properties to a generic property list */ + test_genprop_list_iter(); /* Test basic code for iterating over properties in a generic property list */ + test_genprop_list_callback(); /* Test code for property list callbacks */ } /* test_genprop() */ -- cgit v0.12