diff options
Diffstat (limited to 'TAO/tests/Queued_Message_Test/Queued_Message_Test.cpp')
-rw-r--r-- | TAO/tests/Queued_Message_Test/Queued_Message_Test.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/TAO/tests/Queued_Message_Test/Queued_Message_Test.cpp b/TAO/tests/Queued_Message_Test/Queued_Message_Test.cpp new file mode 100644 index 00000000000..2742e76a92b --- /dev/null +++ b/TAO/tests/Queued_Message_Test/Queued_Message_Test.cpp @@ -0,0 +1,163 @@ +// ============================================================================ +/** + * @brief Unit test for the TAO_Queued_Message class + * + * $Id$ + * + * @author Carlos O'Ryan <coryan@uci.edu> + */ +// ============================================================================ + +#include "tao/Asynch_Queued_Message.h" + +ACE_RCSID(tests, Queued_Message_Test, "$Id$") + +/// Max number of bytes on each message block +const size_t max_block_length = 256; + +static TAO_Queued_Message * +create_new_message (ACE_RANDR_TYPE &seed) +{ + // First create a message block + size_t block_size = + 64 + ACE_OS::rand_r(seed) % (max_block_length - 64); + ACE_Message_Block mb (block_size); + mb.wr_ptr (block_size); + + return new TAO_Asynch_Queued_Message (&mb); +} + +/// Add a new message at the tail of the queue. +static void push_back_message (TAO_Queued_Message *&head, + TAO_Queued_Message *&tail, + ACE_RANDR_TYPE &seed) +{ + TAO_Queued_Message *msg = create_new_message (seed); + msg->push_back (head, tail); +} + +/// Add a new message at the head of the queue. +static void push_front_message (TAO_Queued_Message *&head, + TAO_Queued_Message *&tail, + ACE_RANDR_TYPE &seed) +{ + TAO_Queued_Message *msg = create_new_message (seed); + msg->push_front (head, tail); +} + +/// Remove the message at the head of the queue, and simulate the +/// behavior of the I/O subsystem when processing such messages. +static void del_message (TAO_Queued_Message *&head, + TAO_Queued_Message *&tail, + ACE_RANDR_TYPE &seed) +{ + // ACE_DEBUG ((LM_DEBUG, "Removing message\n")); + TAO_Queued_Message *current = head; + current->remove_from_list (head, tail); + + // Simulate message writing: each message is 'sent' using + // multiple write() calls, in this simulation, we call the + // bytes_transferred() method until all messages are removed. + + size_t total_length = current->message_length (); + while (total_length > 0) + { + // select how many bytes we want to 'send' in this iteration. + size_t t = ACE_OS::rand_r(seed) % 256 + 1; + if (t > total_length) + t = total_length; + + current->bytes_transferred (t); + total_length -= t; + } + if (!current->all_data_sent ()) + { + ACE_ERROR ((LM_DEBUG, + "ERROR: inconsistent state in Queued_Message\n")); + ACE_OS::exit (1); + } + current->destroy (); +} + +int +main (int, ACE_TCHAR *[]) +{ + + // Initialize a random seed to get better coverage. + // @@ The random seed and default values should be configurable + // using command line options. + + ACE_hrtime_t current_hrtime = ACE_OS::gethrtime (); + ACE_UINT32 low_bits = + ACE_CU64_TO_CU32(current_hrtime); + ACE_RANDR_TYPE seed = + ACE_static_cast(ACE_RANDR_TYPE,low_bits); + + ACE_DEBUG ((LM_DEBUG, "Running test SEED = %d\n", seed)); + + TAO_Queued_Message *head = 0; + TAO_Queued_Message *tail = 0; + + int add_count = 0; + int del_count = 0; + + const int iterations = 100; + int i; + for (i = 0; i != iterations; ++i) + { + push_back_message (head, tail, seed); + add_count++; + if (ACE_OS::rand_r(seed) % 100 > 90) + { + // every so often remove a message also. + if (head != 0) + { + del_message (head, tail, seed); + del_count++; + } + } + } + + // second phase, change the probabilities of removing a message. + for (i = 0; i != iterations; ++i) + { + if (ACE_OS::rand_r(seed) % 100 > 90) + { + push_back_message (head, tail, seed); add_count++; + } + if (ACE_OS::rand_r(seed) % 100 > 90) + { + push_front_message (head, tail, seed); add_count++; + } + if (head != 0) + { + del_message (head, tail, seed); + del_count++; + } + } + + // Go through a phase where all messages are removed. + while (head != 0) + { + del_message (head, tail, seed); + del_count++; + } + + if (tail != 0) + { + ACE_ERROR_RETURN ((LM_ERROR, + "ERROR: inconsistent state in message queue\n"), + 1); + } + + if (add_count != del_count) + { + ACE_ERROR_RETURN ((LM_ERROR, + "ERROR: mismatched (%d != %d) add and del counts\n", + add_count, del_count), + 1); + } + + + return 0; +} |