Author: tschoening
Date: Fri Oct  9 21:39:16 2015
New Revision: 1707820

URL: http://svn.apache.org/viewvc?rev=1707820&view=rev
Log:
LOGCXX-457: Changed test4, 5 and 6 to delete their generic files before running 
and changed test7 to execute 4, 5 and 6 and simulate a non empty directory that 
way. The tests now pass using empty and non empty directory and I hope to not 
have totally wasted my time... :-( But all other tests worked with and without 
empty directory, so I hope my changes have some purpose.

Modified:
    incubator/log4cxx/trunk/src/test/cpp/rolling/timebasedrollingtest.cpp

Modified: incubator/log4cxx/trunk/src/test/cpp/rolling/timebasedrollingtest.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/test/cpp/rolling/timebasedrollingtest.cpp?rev=1707820&r1=1707819&r2=1707820&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/test/cpp/rolling/timebasedrollingtest.cpp 
(original)
+++ incubator/log4cxx/trunk/src/test/cpp/rolling/timebasedrollingtest.cpp Fri 
Oct  9 21:39:16 2015
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#include <vector>
+
 #include <log4cxx/rolling/rollingfileappender.h>
 #include <log4cxx/logger.h>
 #include <log4cxx/consoleappender.h>
@@ -73,13 +75,21 @@ LOGUNIT_CLASS(TimeBasedRollingTest)
                LOGUNIT_TEST(test4);
                LOGUNIT_TEST(test5);
                LOGUNIT_TEST(test6);
-               //LOGUNIT_TEST(test7);
+               LOGUNIT_TEST(test7);
        LOGUNIT_TEST_SUITE_END();
 
 private:
        static LoggerPtr logger;
 
        /**
+        * Currently running test.
+        * <p>
+        * Number of currently running test, used e.g. for some generic code in 
{@link setUp()}.
+        * </p>
+        */
+       size_t num_test;
+
+       /**
         * Build file names with timestamps.
         * <p>
         * This method builds some file names based on a hard coded date 
pattern, while the important
@@ -307,7 +317,69 @@ private:
                std::cout << "Done waiting." << std::endl;
        }
 
+       /**
+        * Delete generic log files.
+        * <p>
+        * Some tests use generic log file names which may already be available 
during subsequent calls
+        * to the test and influence their behavior, e.g. because 
RollingFileAppender uses the last
+        * modification time of already existing files to create their internal 
names. Such a date may
+        * be from the arbitrary past, but ost of the test assumes operations 
like rollovers within few
+        * seconds around "new". Thos assumptions will fail for older existing 
files. So this method can
+        * be called during {@link setUp()} of an test to clear such 
generically named files for each
+        * test. We currently only care about {@code output/testxy.log}.
+        * </p>
+        * @param[in] num_test
+        */
+       void deleteGenericLogFilePerTest(size_t num_test)
+       {
+               Pool            pool;
+               LogString       path(LOG4CXX_STR("output/test"));
+
+               StringHelper::toString(num_test, pool, path);
+               path.append(LOG4CXX_STR(".log"));
+
+               File(path).deleteFile(pool);
+       }
+
+       /**
+        * Setup for internal test call.
+        * <p>
+        * This method has a similar intention like {@link setUp()}, only that 
it focusses on internal
+        * calls of the tests, where we don't need to create some loggers and 
such, but may need to
+        * delete some files etc. to make tests work.
+        * </p>
+        * @param[in] num_test
+        */
+       void internalSetUp(size_t num_test)
+       {
+               this->deleteGenericLogFilePerTest(num_test);
+       }
+
+       /**
+        * Counterpart for {@like internalSetUp(size_t)}.
+        * <p>
+        * Counterpart for {@like internalSetUp(size_t)}.
+        * </p>
+        */
+       void internalTearDown()
+       {
+               // Nothing to do currently.
+    }
+
 public:
+       /**
+        * Extract number of current test.
+        * <p>
+        * {@code setUp()} needs the number of the current runnign test for 
some generic work and this
+        * is the only place where we can extract and save it in the instance.
+        * </p>
+        */
+       void setCase(abts_case* tc)
+       {
+               LogUnit::TestFixture::setCase(tc);
+               this->num_test = tc->suite->num_test;
+       }
+
        void setUp()
        {
                LoggerPtr root(Logger::getRootLogger());
@@ -315,10 +387,12 @@ public:
                        new ConsoleAppender(
                                new PatternLayout(
                                        LOG4CXX_STR("%d{ABSOLUTE} [%t] %level 
%c{2}#%M:%L - %m%n"))));
+               this->internalSetUp(this->num_test);
        }
 
        void tearDown()
        {
+               this->internalTearDown();
                LogManager::shutdown();
        }
 
@@ -522,23 +596,35 @@ public:
        }
 
        /**
-        * Repeat test 6 N times.
+        * Repeat some test with generic file name.s
         * <p>
-        * This test calls {@link test6} N times, because tests showed that the 
test can succeed by luck
-        * and depending on the current hardware.
+        * This test calls some tests which use generic file names and will 
only work properly if those
+        * got deleted before running the test during setup.
         * </p>
         */
        void test7()
        {
-               const size_t max = 10;
+               typedef void (TimeBasedRollingTest::*Test)();
+               typedef std::vector<Test> Tests;
 
-               for (size_t i = 0; i < max; ++i)
-               {
-                       std::cout << "Running test6 as part of test7 " << i + 1 
<< "/" << max << ":" << std::endl;
+               Tests   tests(10);
+               size_t  numTest = 0;
 
-                       this->setUp();
-                       this->test6();
-                       this->tearDown();
+               tests.at(4) = &TimeBasedRollingTest::test4;
+               tests.at(5) = &TimeBasedRollingTest::test5;
+               tests.at(6) = &TimeBasedRollingTest::test6;
+
+               for (size_t numTest = 1; numTest < tests.size(); ++numTest)
+               {
+                       Test test(tests.at(numTest));
+                       if (!test)
+                       {
+                               continue;
+                       }
+
+                       this->internalSetUp(numTest);
+                       (this->*test)();
+                       this->internalTearDown();
                }
        }
 };


Reply via email to