summaryrefslogtreecommitdiffstats
path: root/hl/c++/test
diff options
context:
space:
mode:
authorBinh-Minh Ribler <bmribler@hdfgroup.org>2016-10-24 14:27:37 (GMT)
committerBinh-Minh Ribler <bmribler@hdfgroup.org>2016-10-24 14:27:37 (GMT)
commitf653b779eb0e2280c227302b22af336325b16a76 (patch)
tree561f29bb3a742027d2994a9a9e87df693cc5d4b5 /hl/c++/test
parent1be95fbe104fb52f1361a4fe7b05ec07e72e9855 (diff)
downloadhdf5-f653b779eb0e2280c227302b22af336325b16a76.zip
hdf5-f653b779eb0e2280c227302b22af336325b16a76.tar.gz
hdf5-f653b779eb0e2280c227302b22af336325b16a76.tar.bz2
Purpose: Fixed Packet Table issues
Description: - Removed calls to H5Tget_native_type from PT APIs because it is up to the application, whether it wants the buffer to be read into memory in the machine’s native architecture. Currently, however, the PT doesn't allow an application to specify memory datatype. Perhaps, a new API can be added to provide that capability. - Added calls to H5Tcopy to H5PTcreate/H5PTcreate_fl/H5PTopen to save a copy of the application's datatype or the dataset's datatype. - Added various missing H5Tclose to the packet table tests, and various error checkings. Note: leave out changes to test_packet_vlen.c for 1.8 to wait on QAK about merging the commit ec2fbe0883f9e76df60bcfbebbd4b6f62d5a09e6 [svn-r30158] first. Platforms tested: Linux/32 2.6 (jam) Linux/64 (platypus) Darwin (osx1010test)
Diffstat (limited to 'hl/c++/test')
-rw-r--r--hl/c++/test/ptableTest.cpp191
-rw-r--r--hl/c++/test/ptableTest.h5
2 files changed, 127 insertions, 69 deletions
diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp
index dd3d2ba..68b040e 100644
--- a/hl/c++/test/ptableTest.cpp
+++ b/hl/c++/test/ptableTest.cpp
@@ -38,23 +38,22 @@ int main(void)
}
else {
- num_errors += BasicTest();
+ num_errors += BasicTest();
- num_errors += TestCompoundDatatype();
+ num_errors += TestCompoundDatatype();
- num_errors += TestGetPacket();
+ num_errors += TestGetPacket();
- num_errors += TestGetNext();
+ num_errors += TestGetNext();
- num_errors += TestCompress();
+ num_errors += TestCompress();
- num_errors += TestErrors();
+ num_errors += TestErrors();
- num_errors += SystemTest();
+ num_errors += SystemTest();
-#ifdef VLPT_REMOVED
- num_errors += VariableLengthTest();
-#endif /* VLPT_REMOVED */
+ /* Test data corruption in packed structs */
+ num_errors += TestHDFFV_9758();
/* Terminate access to the file. */
err = H5Fclose(fileID);
@@ -562,73 +561,131 @@ error:
return 1;
}
-#ifdef VLPT_REMOVED
-int VariableLengthTest(void)
+/*-------------------------------------------------------------------------
+ * TestHDFFV_9758(): Test that a packet table with compound datatype which
+ * contains string type can be created and written correctly. (HDFFV-9758)
+ *
+ * Notes:
+ * Previously, data of the field that follows the string was read back
+ * as garbage when #pragma pack(1) is used.
+ * 2016/10/20 -BMR
+ *-------------------------------------------------------------------------
+ */
+#pragma pack(1) // no padding
+const char* ABHI_PT("/abhiTest");
+const hsize_t NUM_PACKETS = 5;
+const int STRING_LENGTH = 19; // including terminating NULL
+int TestHDFFV_9758()
{
- long test_long;
- short test_short;
- hvl_t read_buf;
- VL_PacketTable* test_VLPT;
- PacketTable* new_pt;
-
- TESTING("variable-length packet tables")
-
- /* Create a variable length table */
- test_VLPT = new VL_PacketTable(fileID, "/VariableLengthTest", 1);
-
- /* Verify that the creation succeeded */
- if(! test_VLPT->IsValid())
- goto error;
-
- /* Append some packets */
- test_short = 9;
- test_VLPT->AppendPacket(&test_short, sizeof(short));
- test_long = 16;
- test_VLPT->AppendPacket(&test_long, sizeof(long));
-
- /* Read them back and make sure they are correct */
- test_VLPT->GetNextPackets(1, &read_buf);
-
- if(read_buf.len != sizeof(short))
- goto error;
- if(*(short *)(read_buf.p) != test_short)
- goto error;
-
- /* Free the memory used by the read */
- test_VLPT->FreeReadbuff(1, &read_buf);
-
- /* Read the second record */
- test_VLPT->GetNextPackets(1, &read_buf);
-
- if(read_buf.len != sizeof(long))
- goto error;
- if(*(long *)(read_buf.p) != test_long)
- goto error;
-
- /* Free the memory used by the read */
- test_VLPT->FreeReadbuff(1, &read_buf);
-
- /* Close the packet table */
- delete test_VLPT;
+ hid_t strtype;
+ hid_t compound_type;
+ herr_t err;
+ struct s1_t
+ {
+ int a;
+ float b;
+ double c;
+ char d[STRING_LENGTH]; // null terminated string
+ int e;
+ };
- /* Reopen the packet table and verify that it is variable length */
- new_pt = new PacketTable(fileID, "/VariableLengthTest");
+ s1_t s1[NUM_PACKETS];
+
+ for (hsize_t i = 0; i < NUM_PACKETS; i++)
+ {
+ s1[i].a = i;
+ s1[i].b = 1.f * static_cast<float>(i * i);
+ s1[i].c = 1. / (i + 1);
+ sprintf(s1[i].d, "string%d", (int)i);
+ s1[i].e = 100+i;
+ }
- /* Verify that the open succeeded */
- if(! new_pt->IsValid())
- goto error;
+ TESTING("data corruption in packed structs (HDFFV-9758)")
+
+ // Build a compound datatype
+ compound_type = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
+ if (compound_type < 0)
+ goto error;
+
+ err = H5Tinsert(compound_type, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ if (err < 0)
+ goto error;
+ err = H5Tinsert(compound_type, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
+ if (err < 0)
+ goto error;
+ err = H5Tinsert(compound_type, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+ if (err < 0)
+ goto error;
+
+ strtype = H5Tcopy (H5T_C_S1);
+ if (compound_type < 0)
+ goto error;
+ err = H5Tset_size (strtype, STRING_LENGTH); /* create string */
+ if (err < 0)
+ goto error;
+ err = H5Tinsert(compound_type, "d_name", HOFFSET(s1_t, d), strtype);
+ if (err < 0)
+ goto error;
+ err = H5Tinsert(compound_type, "e_name", HOFFSET(s1_t, e), H5T_NATIVE_INT);
+ if (err < 0)
+ goto error;
+
+ { // so ptable will go out of scope before PASSED
+
+ // Create a packet table
+ FL_PacketTable ptable(fileID, "/examplePacketTable", compound_type, 1);
+ if (not ptable.IsValid())
+ goto error;
+
+ // Add packets to the table
+ for (size_t i = 0; i < NUM_PACKETS; i++)
+ {
+ /* Appends one packet at the current position */
+ err = ptable.AppendPacket(s1 + i);
+ if (err < 0) goto error;
+ }
- if(new_pt->IsVariableLength() != 1)
- goto error;
+ // Check packet count
+ const hsize_t count = ptable.GetPacketCount(err);
+ if (err < 0)
+ goto error;
+
+ if (count != NUM_PACKETS)
+ {
+ std::cerr
+ << "Number of packets in packet table should be " << NUM_PACKETS
+ << " but is " << count << endl;
+ }
- /* Close the packet table */
- delete new_pt;
+ // Read and verify the data
+ ptable.ResetIndex();
+ for (size_t i = 0; i < NUM_PACKETS; i++)
+ {
+ s1_t s2;
+ memset(&s2, 0, sizeof(s1_t));
+ err = ptable.GetNextPacket(&s2);
+ if (err < 0)
+ goto error;
+
+ if (s2.a != s1[i].a || s2.e != s1[i].e)
+ goto error;
+ else if (HDstrcmp(s2.d, s1[i].d))
+ goto error;
+ }
+ } // end of ptable block
PASSED();
return 0;
error:
+
+ H5E_BEGIN_TRY {
+ H5Tclose(strtype);
+ H5Tclose(compound_type);
+ H5Fclose(fileID);
+ } H5E_END_TRY;
+
H5_FAILED();
return 1;
}
-#endif /* VLPT_REMOVED */
+
diff --git a/hl/c++/test/ptableTest.h b/hl/c++/test/ptableTest.h
index d351e34..60b55ca 100644
--- a/hl/c++/test/ptableTest.h
+++ b/hl/c++/test/ptableTest.h
@@ -52,7 +52,8 @@ int TestGetPacket(void);
Test for unusual interactions between multiple packet tables. */
int SystemTest(void);
-/* Test the variable length dataset functionality */
-int VariableLengthTest(void);
+/* Create a packet table with compound type, which has a string type. Verify
+ that data was written and read correctly. */
+int TestHDFFV_9758(void);
#endif /* PTABLETEST */