Added randomly generated harness seed.
authorMarkus Kauppila <markus.kauppila@gmail.com>
Wed, 27 Jul 2011 18:37:47 +0300
changeset 5786 b6df0fc13504
parent 5785 7fc252ce5d1d
child 5787 46cddba50600
Added randomly generated harness seed.
test/test-automation/logger.h
test/test-automation/runner.c
--- a/test/test-automation/logger.h	Wed Jul 27 17:48:07 2011 +0300
+++ b/test/test-automation/logger.h	Wed Jul 27 18:37:47 2011 +0300
@@ -40,7 +40,7 @@
  * logging interface. See the headers of implementations (plain_logger.h or
  * xml_logger.h) for more information.
  */
-typedef	void (*RunStartedFp)(int parameterCount, char *runnerParameters[], char *runSeed, time_t eventTime, void *data);
+typedef	void (*RunStartedFp)(int parameterCount, char *runnerParameters[], char *runSeed, time_t eventTime, LoggerData *data);
 typedef	void (*RunEndedFp)(int testCount, int suiteCount, int testPassCount, int testFailCount,
                            int testSkippedCount, time_t endTime, double totalRuntime);
 
--- a/test/test-automation/runner.c	Wed Jul 27 17:48:07 2011 +0300
+++ b/test/test-automation/runner.c	Wed Jul 27 18:37:47 2011 +0300
@@ -74,6 +74,8 @@
 static int universal_timeout_enabled = 0;
 //! Flag for enabling verbose logging
 static int enable_verbose_logger = 0;
+//! Flag for using user supplied run seed
+static int userRunSeed = 0;
 
 
 //!< Size of the test and suite name buffers
@@ -94,15 +96,20 @@
 //! Default directory of the test suites
 #define DEFAULT_TEST_DIRECTORY "tests/"
 
+//! Fuzzer seed for the harness
+char *runSeed = NULL;
+
+
+//! Variable is used to pass the generated execution key to a test
 char *globalExecKey = NULL;
-char *runSeed = "seed";
 
+//! Execution key that user supplied via command options
 char *userExecKey = NULL;
 
 //! How man time a test will be invocated
 int testInvocationCount = 1;
 
-// \todo move this upper!! (and add comments)
+// \todo add comments
 int totalTestFailureCount = 0, totalTestPassCount = 0, totalTestSkipCount = 0;
 int testFailureCount = 0, testPassCount = 0, testSkipCount = 0;
 
@@ -805,6 +812,40 @@
 
 
 /*!
+ * Generates a random run seed for the harness.
+ *
+ * \param length The length of the generated seed
+ *
+ * \returns The generated seed
+ */
+char *
+GenerateRunSeed(const int length)
+{
+	if(length <= 0) {
+		fprintf(stderr, "Error: lenght of harness seed can't be less than zero\n");
+		return NULL;
+	}
+
+	char *seed = SDL_malloc(length * sizeof(8));
+	if(seed == NULL) {
+		fprintf(stderr, "Error: malloc for run seed failed\n");
+		return NULL;
+	}
+
+	RND_CTX randomContext;
+
+	utl_randomInitTime(&randomContext);
+
+	int counter = 0;
+	for( ; counter < length; ++counter) {
+		int number = abs(utl_random(&randomContext));
+		seed[counter] = (char) (number % (127-34)) + 34;
+	}
+
+	return seed;
+}
+
+/*!
  * Sets up the logger.
  *
  * \return Logger data structure (that needs be deallocated)
@@ -943,6 +984,8 @@
     	  universal_timeout = atoi(timeoutString);
       }
       else if(SDL_strcmp(arg, "--seed") == 0) {
+    	  userRunSeed = 1;
+
     	  if( (i + 1) < argc)  {
     		  runSeed = argv[++i];
     	  }  else {
@@ -1077,6 +1120,14 @@
 	char *extension = "dylib";
 #endif
 
+	if(userRunSeed == 0) {
+		runSeed = GenerateRunSeed(16);
+		if(runSeed == NULL) {
+			fprintf(stderr, "Error: Generating harness seed failed\n");
+			return 1;
+		}
+	}
+
 	LoggerData *loggerData = SetUpLogger();
 
 	const Uint32 startTicks = SDL_GetTicks();