diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:30 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:30 +0000 |
commit | c44379cc7d9c7aa113989237ab0f56db12aa5219 (patch) | |
tree | 66a84b20d47f2269d8bdc6e0323f338763424d3a /ACE/tests/Logging_Strategy_Test.cpp | |
parent | 3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c (diff) | |
download | ATCD-c44379cc7d9c7aa113989237ab0f56db12aa5219.tar.gz |
Repo restructuring
Diffstat (limited to 'ACE/tests/Logging_Strategy_Test.cpp')
-rw-r--r-- | ACE/tests/Logging_Strategy_Test.cpp | 514 |
1 files changed, 514 insertions, 0 deletions
diff --git a/ACE/tests/Logging_Strategy_Test.cpp b/ACE/tests/Logging_Strategy_Test.cpp new file mode 100644 index 00000000000..2a53c83606f --- /dev/null +++ b/ACE/tests/Logging_Strategy_Test.cpp @@ -0,0 +1,514 @@ +// $Id$ + +//========================================================================== +// +// = LIBRARY +// tests +// +// = FILENAME +// Logging_Strategy_Test.cpp +// +// = DESCRIPTION +// This program tests the <ACE_Logging_Strategy> class in various +// ways and also illustrates many of the features of the +// <ACE_Log_Msg>. The test works as follows: +// -Load the inserted arguments; +// -Remove existent log_files with the file_name specified by the +// user; +// -Generate 1000 messages to create the DEBUG statements to be +// stored in the files; +// -Counts the created log_files and if it was specified a maximum +// number of log_files, compare and verify if they are the same. +// -Verify the order of the files with the order argument. +// +// When Dlls are used, we utilize the dynamic service +// configuration mechanism to activate the logging strategy. This +// is not a must though, and you may activate the logging strategy +// as described in the non-DLL section below under DLL +// environments as well. +// +// = AUTHOR +// Orlando Ribeiro <oribeiro@inescporto.pt> +// +//========================================================================== + +#include "test_config.h" +#include "ace/OS_NS_stdio.h" +#include "ace/OS_NS_string.h" +#include "ace/OS_NS_unistd.h" +#include "ace/OS_NS_sys_stat.h" +#include "ace/Auto_Ptr.h" +#include "ace/Service_Config.h" +#include "ace/Reactor.h" +#include "ace/Thread_Manager.h" + +#if defined (ACE_AS_STATIC_LIBS) || \ + (!defined (ACE_WIN32) && !defined (ACE_HAS_SVR4_DYNAMIC_LINKING) && \ + !defined (__hpux)) +#include "ace/Logging_Strategy.h" +#endif + +#include "ace/Auto_Ptr.cpp" +#include "ace/Get_Opt.h" +#include "ace/OS_NS_time.h" + +ACE_RCSID(tests, Logging_Strategy_Test, "$Id$") + +// Considering UNIX OS to be default. On Win32 platforms, the symbols +// are got form the .exe as one cant have .exe and .dll for the same +// .cpp. Also, on Win32 platforms one cant use the .obj to obtain +// symbols dynamically at runtime. + +#if defined (ACE_WIN32) +# define OBJ_SUFFIX ACE_TEXT (".exe") +# define OBJ_PREFIX ACE_TEXT ("") +#else +# define OBJ_SUFFIX ACE_DLL_SUFFIX +# define OBJ_PREFIX "./" ACE_DLL_PREFIX +#endif /*ACE_WIN32*/ + +ACE_TCHAR const * +cdecl_decoration (ACE_TCHAR const *func_name) +{ +#if defined (__BORLANDC__) + static ACE_TCHAR decorated_func_name[10*1024]; + ACE_OS::sprintf (decorated_func_name, + ACE_TEXT ("_%s"), + func_name); + return decorated_func_name; +#else + return func_name; +#endif /* __BORLANDC__ */ +} + +// Global variables. +static ACE_TCHAR *file_name = 0; +static int max_size_files = 0; +static int max_num_files = 0; +static int interval_time = 0; +static bool order_state = false; +static int num_files = 0; +static bool wipeout_logfile = false; + +// This adapter function runs the Reactor's event loop in a separate +// thread of control. + +static void * +run_reactor (void *) +{ + ACE_Reactor::instance ()->owner + (ACE_Thread_Manager::instance ()->thr_self ()); + ACE_Reactor::instance ()->run_reactor_event_loop (); + return 0; +} + +// Initiate the cycle of messages. + +static +void print_till_death (void) +{ + ACE_DEBUG ((LM_DEBUG, + "\n-> start generating messages... \n")); + + for (int i = 0; i < 1000; i++) + { + if (i % 50 == 0) + ACE_OS::sleep (1); + + if (i == 0) + ACE_DEBUG ((LM_DEBUG, + " (%t) (%D) message\n")); + else + ACE_DEBUG ((LM_DEBUG, + " (%t) %d message\n", + i)); + } + + if (ACE_Reactor::instance ()->end_reactor_event_loop () == -1) + ACE_ERROR ((LM_ERROR, + "Error ending reactor.\n")); + + ACE_DEBUG ((LM_DEBUG, + "-< generating messages finished \n\n")); +} + +// Count the generated files. + +static void +count_files (void) +{ + int i = 0; + int error = 0; + FILE *stream; + ACE_TCHAR backup_ct[MAXPATHLEN+1]; + ACE_DEBUG ((LM_DEBUG, + "-> start counting...\n")); + + do + { + if (i == 0) + ACE_OS::sprintf (backup_ct, + ACE_TEXT ("%s"), + file_name); + else + ACE_OS::sprintf (backup_ct, + ACE_TEXT ("%s.%d"), + file_name, + i); + + stream = ACE_OS::fopen (backup_ct, ACE_TEXT ("r")); + if (stream == 0) + error = 1; + else + { + i++; + ACE_OS::fclose (stream); + } + + } + while (error != 1); + + num_files = i; + + if (max_num_files !=0) + { + if (max_num_files != num_files) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Creating files...Failed!") + ACE_TEXT (" Input value=%d, Checked value=%d"), + max_num_files, + num_files)); + else + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Creating files...OK!") + ACE_TEXT (" Input value=%d, Checked value=%d"), + max_num_files, + num_files)); + } + else + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" The number of files generated is: %d"), + num_files)); + + ACE_DEBUG ((LM_DEBUG, + "\n-< counting finished... \n")); +} + +// get the file statistics + +static time_t +get_statistics (ACE_TCHAR *f_name) +{ + ACE_stat buf; + int result; + + // Get data associated with "file_name": + result = ACE_OS::stat (f_name, &buf); + + // Check if statistics are valid: + if (result != 0) + ACE_OS::perror (ACE_TEXT ("\nProblem getting information")); + else + { + // Output some of the statistics: + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" File name : %s\n"), + f_name)); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" File size (B): %d\n"), + buf.st_size)); + +#if defined (ACE_HAS_WINCE) + time_t tm = buf.st_mtime.sec(); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Time modified : %s\n"), + ACE_OS::ctime (&tm))); +#else + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Time modified : %s\n"), + ACE_OS::ctime (&buf.st_mtime))); +#endif // ACE_HAS_WINCE + } + +#if defined (ACE_HAS_WINCE) + return buf.st_mtime.sec(); +#else + return buf.st_mtime; +#endif // ACE_HAS_WINCE +} + +// analyse the file order +static void +order (void) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("\n-> start testing order... \n"))); + + if (num_files <= 2) + { + if (num_files == 1) + get_statistics (file_name); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Ordering...OK! - ") + ACE_TEXT (" Only %d file (s) was (were) generated"), + num_files)); + } + else + { + time_t tm_bk_1, tm_bk_2; + ACE_TCHAR backup_1[MAXPATHLEN+1]; + ACE_TCHAR backup_2[MAXPATHLEN+1]; + ACE_OS::sprintf (backup_1, + ACE_TEXT ("%s.%d"), + file_name, + 1); + ACE_OS::sprintf (backup_2, + ACE_TEXT ("%s.%d"), + file_name, + num_files - 1); + + tm_bk_1 = get_statistics (backup_1); + tm_bk_2 = get_statistics (backup_2); + + if (tm_bk_1 > tm_bk_2 && !order_state) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" %s (newest) ; %s (oldest)\n"), + backup_1, + backup_2)); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Ordering...OK!"))); + } + else + { + if (tm_bk_1 < tm_bk_2 && order_state) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" %s (newest);") + ACE_TEXT ("%s (oldest)\n"), + backup_2, + backup_1)); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Ordering...OK!"))); + } + else + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" Ordering...FAILED!") + ACE_TEXT ("- The files are disorderly"))); + } + } + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("\n-< testing order finished...\n\n"))); +} + +// remove log_files + +static void +remove_files (void) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("-> removing existent files...\n"))); + + int error = 0; + int test; + int i = 0; + ACE_TCHAR backup[MAXPATHLEN+1]; + + do + { + i++; + ACE_OS::sprintf (backup, + ACE_TEXT ("%s.%d"), + file_name, + i); + test = ACE_OS::unlink (backup); + if (test != 0) + error = 1; + } + while (error != 1); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("-< removing existing files...\n\n"))); +} + +static int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Specifications:\n"))); + ACE_Get_Opt get_opt (argc, argv, ACE_TEXT ("s:i:m:f:N:ow")); + int c; + + while ((c = get_opt ()) != EOF) + { + switch (c) + { + case 's': + file_name = get_opt.opt_arg (); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("File name: %s\n"), + file_name)); + break; + case 'i': + interval_time = ACE_OS::atoi (get_opt.opt_arg ()); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Interval time (s): %d\n"), + interval_time)); + break; + case 'm': + max_size_files = ACE_OS::atoi (get_opt.opt_arg ()); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Maximum size (KB): %d\n"), + max_size_files)); + break; + case 'f': + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Modes: %s\n"), + get_opt.opt_arg ())); + break; + case 'N': + max_num_files = ACE_OS::atoi (get_opt.opt_arg ()); + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Maximum files number: %d\n"), + max_num_files)); + break; + case 'o': + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Ordering files activated\n"))); + order_state = true; + break; + case 'w': + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Wipeout logfile activated\n"))); + wipeout_logfile = true; + break; + default: + ACE_ERROR_RETURN + ((LM_ERROR, + ACE_TEXT ("usage: [-s]<file_name>") + ACE_TEXT ("[-i]<sample_interval> ") + ACE_TEXT ("[-m]<max_size> [-f]<msg_flags> ") + ACE_TEXT ("[-n]<num_files> [-o]\n") + ACE_TEXT ("\t-s: Specify the name of the log files.\n") + ACE_TEXT ("\t-i: Define the sample interval in secs.\n") + ACE_TEXT ("\t-m: Define the max size for the log_files in KB.\n") + ACE_TEXT ("\t-f: Indicates the Log_Msg flags.\n") + ACE_TEXT ("\t-N: Define the maximum number of log_files.\n") + ACE_TEXT ("\t-o: If activated puts the log_files ordered.\n"), + ACE_TEXT ("\t-w: If activated cause the logfile to be wiped out,") + ACE_TEXT (" both on startup and on reconfigure.\n")), + -1); + /* NOTREACHED */ + break; + } + } + + ACE_UNUSED_ARG (wipeout_logfile); + return 0; +} + +int run_main (int argc, ACE_TCHAR *argv []) +{ + ACE_START_TEST (ACE_TEXT ("Logging_Strategy_Test")); + + ACE_TCHAR *l_argv[4]; + + if (argc > 1) + { + if (parse_args (argc, argv) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "Invalid command-line parameters.\n"), + 1); + } + else + { + l_argv[0] = (ACE_TCHAR *)ACE_TEXT ("Logging_Strategy_Test"); + l_argv[1] = + (ACE_TCHAR *) ACE_TEXT ("-slog/Logging_Strategy_Test") + ACE_LOG_FILE_EXT_NAME; + l_argv[2] = (ACE_TCHAR *) ACE_TEXT ("-o"); + l_argv[3] = 0; + + if (parse_args (3, l_argv) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "Invalid command-line parameters.\n"), + 1); + argv = l_argv; + argc = 3; + } + + // Remove existing files. + remove_files (); + + // This is necessary only if the provided logfile name is the same + // as the default name. If so, nothing will be written as the + // previous ofstream is closed only at the end (ACE_END_TEST) + ACE_CLOSE_TEST_LOG; + + // When Dlls are used, we utilize the dynamic service configuration + // mechanism to activate the logging strategy. This is not a must + // though, and you may activate the logging strategy as described in + // the non-DLL section below under DLL environments as well. + +#if !defined (ACE_AS_STATIC_LIBS) && \ + (defined (ACE_WIN32) || defined (ACE_HAS_SVR4_DYNAMIC_LINKING) || \ + defined (__hpux)) + + // Platform support DLLs, and not configured to link statically + ACE_TCHAR arg_str[250]; + ACE_OS::sprintf (arg_str, + ACE_TEXT ("dynamic Logger Service_Object ") + ACE_TEXT ("*ACE:_make_ACE_Logging_Strategy()") + ACE_TEXT ("\"")); + + for (int i = 1; i < argc; i++) + { + ACE_OS::strcat (arg_str, argv[i]); + ACE_OS::strcat (arg_str, ACE_TEXT (" ")); + } + + ACE_OS::strcat (arg_str, ACE_TEXT ("\"")); + + if (ACE_Service_Config::process_directive (arg_str) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "Error opening _make_ACE_Log_Strategy.\n"), + 1); +#else // Platform doesn't support DLLs, or configured to link + // statically + ACE_Logging_Strategy logging_strategy; + char ls_argc = argc - 1; + ACE_Auto_Basic_Ptr<ACE_TCHAR *> ls_argv (new ACE_TCHAR *[ls_argc]); + + for (char c = 0; c < ls_argc; c++) + (ls_argv.get ())[c] = argv[c+1]; + + if (logging_strategy.init (ls_argc, ls_argv.get ()) == -1) + ACE_ERROR_RETURN + ((LM_ERROR, + "Error initializing the ACE_Logging_Strategy.\n"), + 1); +#endif /* !ACE_AS_STATIC_LIBS && (ACE_WIN32 || + ACE_HAS_SVR4_DYNAMIC_LINKING || __hpux) */ + + // launch a new Thread + if (ACE_Thread_Manager::instance ()->spawn + (ACE_THR_FUNC (run_reactor)) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "Spawning Reactor.\n"), + 1); + + // Function to print the message + print_till_death (); + + // Counts the generated files + count_files (); + + // Get the file order + order (); + + // Wait for the thread to exit before we exit. + ACE_Thread_Manager::instance ()->wait (); + ACE_END_TEST; + return 0; +} |