summaryrefslogtreecommitdiff
path: root/tests/CDR_Array_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/CDR_Array_Test.cpp')
-rw-r--r--tests/CDR_Array_Test.cpp256
1 files changed, 156 insertions, 100 deletions
diff --git a/tests/CDR_Array_Test.cpp b/tests/CDR_Array_Test.cpp
index cca75e89607..1a3e3be7f1f 100644
--- a/tests/CDR_Array_Test.cpp
+++ b/tests/CDR_Array_Test.cpp
@@ -49,7 +49,7 @@
#error "Can't define USE_GETRUSAGE on this platform."
#endif
-ACE_RCSID(tests, CDR_Array_Test, "$Id$");
+ACE_RCSID(tests, CDR_Array_Test, "$Id$")
// Default number of elements for check buffer, for each tested CDR type.
// Be aware that time will be affected by the buffer fitting/not fitting
@@ -62,7 +62,7 @@ static const int default_total = 32*1024;
// Repeat this many times for each tested CDR type.
// We then take the average time that took for each type and report that.
// You can change this value with -n option.
-static const int default_niter = 5;
+static const int default_niter = 10;
//
// A simple cronometer in seconds, that encapsulates our time
@@ -144,6 +144,7 @@ public:
~CDR_Test ();
static void ttoh (const T& t, char* s);
+ static T checkval(int i);
private:
CDR_Test (const CDR_Test&);
@@ -163,7 +164,7 @@ zero (char* p, int k)
}
inline int
-max (int a, int b)
+mymax (int a, int b)
{
return (a >= b) ? a : b;
}
@@ -229,7 +230,7 @@ CDR_Test<T, H>::CDR_Test (int total, int niter, int use_array)
int dk;
for (dk = 0; dk < delta; dk++)
{
- int tdelta = t - max(sk, dk);
+ int tdelta = t - mymax(sk, dk);
CDR_Test<T, H>::do_test(tdelta, niter, 1,
srcbuf, dstbuf,
@@ -248,20 +249,29 @@ CDR_Test<T, H>::CDR_Test (int total, int niter, int use_array)
delete[] dstbuf;
}
-// Generate a ``interesting'' value for testing at pos `i'.
-#if 0
-// egcs-1.0.2 (egcs-2.90.27 980315) generates an internal compiler
-// error 9 with this.
-template<class T> inline T
-checkval<T> (int i)
+// Generate an ``interesting'' value for testing at pos >i<.
+template<class T, class H> T
+CDR_Test<T, H>::checkval (int i)
{
- const int cycle = 17;
- return T(i % cycle);
+ if (!H::integral ())
+ {
+ // If T is not an integral type, we don't want to risk
+ // getting an invalid bit pattern for a T value.
+ return T(i);
+ }
+ else
+ {
+ T v;
+ unsigned char* s = ACE_reinterpret_cast(unsigned char*, (&v));
+ unsigned int j;
+ for (j = 0; j < sizeof(T); j++)
+ {
+ s[j] = (unsigned char) ((j + i*sizeof(T)) % 256);
+ }
+
+ return v;
+ }
}
-#else
-const int cycle = 17;
-#define checkval(T,x) ((T) ((x) % cycle))
-#endif
static char digits[16] = {
'0', '1', '2', '3',
@@ -286,9 +296,9 @@ CDR_Test<T, H>::ttoh (const T& t, char* s)
ACE_reinterpret_cast(const unsigned char*, &t);
const unsigned char* q;
- for (q = p; q < p + sizeof(t); ++q)
+ for (q = p; q < p + sizeof(T); ++q)
{
- int k = ACE_static_cast(int, *q);
+ int k = *q;
*s++ = digits[ k >> 4 ];
*s++ = digits[ k & 15 ];
}
@@ -320,7 +330,7 @@ check_seal (char* pos)
// returns the alignment of ptr, wrt ACE_CDR::MAX_ALIGNMENT.
//
int
-tellalign (char* ptr)
+tellalign (const char* const ptr)
{
int align = ACE_CDR::MAX_ALIGNMENT;
while (ptr != ACE_ptr_align_binary(ptr, align))
@@ -344,7 +354,7 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
ACE_DEBUG((LM_DEBUG,
ACE_TEXT( "Starting Test for %s: %d elements " )
ACE_TEXT( "%susing arrays.\n" ),
- ACE_TEXT( H::name ),
+ ACE_TEXT( H::name ()),
total,
((use_array) ? ACE_TEXT( "" ) : ACE_TEXT( "not " ))));
@@ -368,12 +378,12 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
int i;
for (i = 0; i < total; i++)
{
- idata[i] = checkval(T, i);
+ idata[i] = CDR_Test<T, H>::checkval (i);
}
}
ACE_DEBUG((LM_DEBUG,
- ACE_TEXT( "Writing data...\n" )));
+ ACE_TEXT( "Writting data...\n" )));
char* toread = 0;
{
@@ -386,9 +396,10 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
int size = sizeof(T)*(dst_offset + total);
ACE_OutputCDR os (dstbuf, size);
+ // This is intrusive...
char* const end = os.begin ()->wr_ptr() + size;
- do_seal(end);
+ do_seal (end);
double secs = 0.0;
if (use_array)
@@ -409,7 +420,6 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
tellalign (os.begin ()->wr_ptr ())));
}
-
Crono crono;
crono.start ();
H::write_array (os, idata, total);
@@ -444,16 +454,16 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
if (n == niter - 1)
{
- toread = os.begin()->rd_ptr();
+ toread = os.begin ()->rd_ptr ();
}
}
totalsecs = totalsecs / niter;
ACE_DEBUG((LM_DEBUG,
- ACE_TEXT ("Writing to stream %d %s values: %f seconds.\n"),
+ ACE_TEXT ("Writting to stream %d %s values: %f seconds.\n"),
total,
- ACE_TEXT (H::name),
+ ACE_TEXT (H::name ()),
totalsecs));
}
@@ -478,9 +488,10 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
int size = (total + dst_offset)*sizeof(T);
ACE_InputCDR is (toread, size, opposite_byte_order);
- char* const end = is.rd_ptr() + size;
+ // This is intrusive...
+ char* const end = is.rd_ptr () + size;
- do_seal(end);
+ do_seal (end);
double secs = 0.0;
if (use_array)
@@ -504,7 +515,7 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
Crono crono;
crono.start ();
- H::read_array(is, idata, total);
+ H::read_array (is, idata, total);
crono.stop ();
secs = crono.read_seconds ();
}
@@ -525,7 +536,7 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
}
totalsecs += secs;
- if (!check_seal(end))
+ if (!check_seal (end))
{
ACE_ERROR((LM_ERROR,
ACE_TEXT( "Broken seal, aborting.\n" )));
@@ -539,7 +550,7 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
ACE_TEXT ("Reading from stream %d %s values")
ACE_TEXT (" (byte swapping): %f seconds.\n"),
total,
- ACE_TEXT (H::name),
+ ACE_TEXT (H::name ()),
totalsecs));
}
@@ -553,51 +564,24 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
int i;
for (i = 0; i < total; i++)
{
- T v;
+ T rv;
const char* src = ACE_reinterpret_cast(const char*, (idata + i));
- char* dst = ACE_reinterpret_cast(char*, (&v));
-
- // Easier than writing each H::swap...
- switch(sizeof(T))
- {
- case 1:
- *dst = *src;
- break;
-
- case 2:
- ACE_CDR::swap_2(src, dst);
- break;
+ char* dst = ACE_reinterpret_cast(char*, (&rv));
- case 4:
- ACE_CDR::swap_4(src, dst);
- break;
+ H::swap(src, dst);
- case 8:
- ACE_CDR::swap_8(src, dst);
- break;
-
- case 16:
- ACE_CDR::swap_16(src, dst);
- break;
-
- default:
- ACE_ERROR((LM_DEBUG,
- ACE_TEXT ("Unsupported size, aborting.\n")));
- ACE_OS::exit(1);
- }
-
-
- if (v != checkval(T, i))
+ T cv = CDR_Test<T, H>::checkval (i);
+ if (rv != cv)
{
- static char s1[32 + 1];
- static char s2[32 + 1];
- CDR_Test::ttoh (v, s1);
- CDR_Test::ttoh (checkval(T, i), s2);
+ static char rs[32 + 1];
+ static char cs[32 + 1];
+ CDR_Test<T, H>::ttoh (rv, rs);
+ CDR_Test<T, H>::ttoh (cv, cs);
ACE_ERROR((LM_ERROR,
ACE_TEXT ( "Wrong value at pos %d:" )
ACE_TEXT ( " '%s' should be '%s'.\n" ),
- i, s1, s2));
+ i, rs, cs));
errors++;
if (errors == maxerrors)
{
@@ -620,7 +604,7 @@ CDR_Test<T, H>::do_test (int total, int niter, int use_array,
ACE_DEBUG((LM_DEBUG,
ACE_TEXT ("Data OK, Ending %s test.\n"),
- ACE_TEXT (H::name)));
+ ACE_TEXT (H::name ())));
}
template <class T, class N>
@@ -635,7 +619,14 @@ CDR_Test<T, N>::~CDR_Test ()
struct DoubleHelper
{
- static const char* name;
+ static const char* name ()
+ {
+ return "CDR::Double";
+ }
+ static const int integral ()
+ {
+ return 0;
+ }
static void read_array (ACE_InputCDR& is,
ACE_CDR::Double* x,
ACE_UINT32 n)
@@ -648,12 +639,22 @@ struct DoubleHelper
{
os.write_double_array (x, n);
}
+ static void swap (const char *src, char *dst)
+ {
+ ACE_CDR::swap_8 (src, dst);
+ }
};
-const char* DoubleHelper::name = "CDR::Double";
struct FloatHelper
{
- static const char* name;
+ static const char* name ()
+ {
+ return "CDR::Float";
+ }
+ static const int integral ()
+ {
+ return 0;
+ }
static void read_array (ACE_InputCDR& is,
ACE_CDR::Float* x,
ACE_UINT32 n)
@@ -666,12 +667,22 @@ struct FloatHelper
{
os.write_float_array (x, n);
}
+ static void swap (const char *src, char *dst)
+ {
+ ACE_CDR::swap_4 (src, dst);
+ }
};
-const char* FloatHelper::name = "CDR::Float";
struct ShortHelper
{
- static const char* name;
+ static const char* name ()
+ {
+ return "CDR::Short";
+ }
+ static const int integral ()
+ {
+ return 1;
+ }
static void read_array (ACE_InputCDR& is,
ACE_CDR::Short* x,
ACE_UINT32 n)
@@ -684,12 +695,22 @@ struct ShortHelper
{
os.write_short_array (x, n);
}
+ static void swap (const char *src, char *dst)
+ {
+ ACE_CDR::swap_2 (src, dst);
+ }
};
-const char* ShortHelper::name = "CDR::Short";
struct LongHelper
{
- static const char* name;
+ static const char* name ()
+ {
+ return "CDR::Long";
+ }
+ static const int integral ()
+ {
+ return 1;
+ }
static void read_array (ACE_InputCDR& is,
ACE_CDR::Long* x,
ACE_UINT32 n)
@@ -702,12 +723,22 @@ struct LongHelper
{
os.write_long_array (x, n);
}
+ static void swap (const char *src, char *dst)
+ {
+ ACE_CDR::swap_4 (src, dst);
+ }
};
-const char* LongHelper::name = "CDR::Long";
struct LongLongHelper
{
- static const char* name;
+ static const char* name ()
+ {
+ return "CDR::LongLong";
+ }
+ static const int integral ()
+ {
+ return 1;
+ }
static void read_array (ACE_InputCDR& is,
ACE_CDR::LongLong* x,
ACE_UINT32 n)
@@ -721,12 +752,22 @@ struct LongLongHelper
os.write_longlong_array (x, n);
}
+ static void swap (const char *src, char *dst)
+ {
+ ACE_CDR::swap_8 (src, dst);
+ }
};
-const char* LongLongHelper::name = "CDR::LongLong";
struct CharHelper
{
- static const char* name;
+ static const char* name ()
+ {
+ return "CDR::Char";
+ }
+ static const int integral ()
+ {
+ return 1;
+ }
static void read_array (ACE_InputCDR& is,
ACE_CDR::Char* x,
ACE_UINT32 n)
@@ -739,8 +780,11 @@ struct CharHelper
{
os.write_char_array (x, n);
}
+ static void swap (const char *src, char *dst)
+ {
+ *dst = *src;
+ }
};
-const char* CharHelper::name = "CDR::Char";
void usage (ACE_TCHAR* cmd)
{
@@ -758,12 +802,25 @@ void usage (ACE_TCHAR* cmd)
ACE_TEXT (" -t n: n iterations for every type.\n")
ACE_TEXT (" n must be >= 16 for dfqwhct.\n")
ACE_TEXT (" If you provide one of dfqwhc, then only the\n")
- ACE_TEXT (" corresponding type tests will be performed.\n"),
+ ACE_TEXT (" test for the corresponding type ")
+ ACE_TEXT ("will be performed.\n"),
cmd));
ACE_OS::exit(1);
}
int
+validtotal (int n)
+{
+ return n >= 16;
+}
+
+int
+validiters (int n)
+{
+ return n > 0;
+}
+
+int
main (int argc, ACE_TCHAR *argv[])
{
ACE_START_TEST (ACE_TEXT ("CDR_Array_Test"));
@@ -784,15 +841,15 @@ main (int argc, ACE_TCHAR *argv[])
int total = 0;
int niter = 0;
- struct { int c; int *v; } opts[] = {
- { 'd', &dtotal },
- { 'f', &ftotal },
- { 'q', &qtotal },
- { 'w', &wtotal },
- { 'h', &htotal },
- { 'c', &ctotal },
- { 't', &total },
- { 'n', &niter },
+ struct { int c; int *v; int (*checkf)(int); } opts[] = {
+ { 'd', &dtotal, validtotal },
+ { 'f', &ftotal, validtotal },
+ { 'q', &qtotal, validtotal },
+ { 'w', &wtotal, validtotal },
+ { 'h', &htotal, validtotal },
+ { 'c', &ctotal, validtotal },
+ { 't', &total, validtotal },
+ { 'n', &niter, validiters },
};
int n = sizeof(opts)/sizeof(opts[0]);
@@ -806,7 +863,13 @@ main (int argc, ACE_TCHAR *argv[])
{
if (opts[i].c == opt)
{
- *(opts[i].v) = ACE_OS::atoi (get_opt.optarg);
+ int v = ACE_OS::atoi (get_opt.optarg);
+ if (!(opts[i].checkf) (v))
+ {
+ usage(argv[0]);
+ }
+
+ *(opts[i].v) = v;
got = 1;
break;
}
@@ -822,13 +885,6 @@ main (int argc, ACE_TCHAR *argv[])
{
total = default_total;
}
- else
- {
- if (total < 16)
- {
- usage(argv[0]);
- }
- }
if (niter == 0)
{