[asterisk-commits] dvossel: branch dvossel/test_api r235217 - in /team/dvossel/test_api: include...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Dec 15 16:13:41 CST 2009


Author: dvossel
Date: Tue Dec 15 16:13:39 2009
New Revision: 235217

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=235217
Log:
additional documentation, addition of test_cat_cmp function

Modified:
    team/dvossel/test_api/include/asterisk/test.h
    team/dvossel/test_api/main/test.c

Modified: team/dvossel/test_api/include/asterisk/test.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/test_api/include/asterisk/test.h?view=diff&rev=235217&r1=235216&r2=235217
==============================================================================
--- team/dvossel/test_api/include/asterisk/test.h (original)
+++ team/dvossel/test_api/include/asterisk/test.h Tue Dec 15 16:13:39 2009
@@ -28,12 +28,22 @@
    using the AST_TEST_DEFINE macro.
 
 AST_TEST_DEFINE(sample_test_cb, \\The first argument is the name of the callback function
-{                               \\* The second argument is the function's body
+{                               \\The second argument is the function's body *
 	\test code
 	.
 	.
 	.
-	return res ? AST_RESULT_FAIL : AST_RESULT_PASS;
+
+	                            \\ the following is just some example logic
+	
+	if (fail) {
+		ast_str_set(error_str, 0 , "an error occured because....");
+		res = AST_RESULT_FAIL;
+	} else {
+		res = AST_RESULT_PASS
+	}
+                                \\ result must be of type enum ast_test_result_state
+	return res;
 })
 
 Every callback function is passed a string buffer which allows

Modified: team/dvossel/test_api/main/test.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/test_api/main/test.c?view=diff&rev=235217&r1=235216&r2=235217
==============================================================================
--- team/dvossel/test_api/main/test.c (original)
+++ team/dvossel/test_api/main/test.c Tue Dec 15 16:13:39 2009
@@ -22,7 +22,6 @@
  *
  * \author David Vossel <dvossel at digium.com>
  */
-
 
 #include "asterisk.h"
 
@@ -41,18 +40,21 @@
 #define DEFAULT_XML_PATH "asterisk_test_result.xml"
 #define DEFAULT_TXT_PATH "asterisk_test_result.txt"
 
+/*! This array corrisponds to the values defined in the ast_test_result_state enum */
 static const char *test_result2str[] = {
 	"NOT RUN",
 	"PASS",
 	"FAIL",
 };
 
+/*! represents all the test result data for a single ast_test object */
 struct ast_test_result {
 	enum ast_test_result_state state; /*! current test result state */
 	struct ast_str *error;            /*! optional error str to describe error result */
 	int time;                         /*! time in ms test took */
 };
 
+/*! holds all the information pertaining to a single defined test */
 struct ast_test {
 	char *name;          /*! name of test, unique to catagory */
 	char *catagory;      /*! test catagory */
@@ -63,6 +65,7 @@
 	AST_LIST_ENTRY(ast_test) entry;
 };
 
+/*! global structure containing both total and last test execution results */
 static struct ast_test_execute_results {
 	int total_tests;  /* total number of tests, reguardless if they have been executed or not */
 	int total_passed; /* total number of executed tests passed */
@@ -81,6 +84,7 @@
 static struct ast_test *test_free(struct ast_test *test);
 static int test_insert(struct ast_test *test);
 static struct ast_test *test_remove(ast_test_cb_t *cb);
+static int test_cat_cmp(const char *cat1, const char *cat2);
 
 int ast_test_register(const char *name, const char *catagory, const char *summary, const char *description, ast_test_cb_t *cb)
 {
@@ -120,7 +124,12 @@
 	return 0;
 }
 
-/*! \brief executes a single test, storing the results in the test->result structure. */
+/*! 
+ * \brief executes a single test, storing the results in the test->result structure.
+ *
+ * \note The last_results structure which contains global statistics about test execution
+ * must be updated when using this function. See use in ast_test_execute().
+ */
 static void __test_execute(struct ast_test *test)
 {
 	struct timeval begin;
@@ -129,7 +138,7 @@
 	ast_str_reset(test->result.error);
 	/* get start time */
 	begin = ast_tvnow();
-	/* the callback gets the pointer to the pointer of our error buf */
+	/* the callback gets the pointer to the pointer of the error buf */
 	test->result.state = test->cb(&test->result.error);
 	/* record the total time the test took */
 	test->result.time = ast_tvdiff_ms(ast_tvnow(), begin);
@@ -165,7 +174,6 @@
 	fprintf(f,   "Result:            %s\n", test_result2str[test->result.state]);
 	fprintf(f,   "Error Description: %s\n", S_OR(ast_str_buffer(test->result.error), "NA"));
 	fprintf(f,   "Time:              %d\n", test->result.time);
-
 }
 
 int ast_test_execute(const char *name, const char *catagory, struct ast_cli_args *a)
@@ -176,18 +184,22 @@
 	int execute = 0;
 	int res = 0;
 
+	if (!ast_strlen_zero(catagory)) {
+		if (!ast_strlen_zero(name)) {
+			mode = 2;
+		} else {
+			mode = 1;
+		}
+	}
+
 	AST_LIST_LOCK(&tests);
 	/* clear previous execution results */
 	memset(&last_results, 0, sizeof(last_results));
-	if (!ast_strlen_zero(catagory) && ast_strlen_zero(name)) {
-		mode = 1;
-	} else if (!ast_strlen_zero(catagory) && !ast_strlen_zero(name)) {
-		mode = 2;
-	}
 	AST_LIST_TRAVERSE_SAFE_BEGIN(&tests, test, entry) {
+
 		execute = 0;
 		if ((!mode) ||
-			((mode == 1) && !(strcmp(test->catagory, catagory))) ||
+			((mode == 1) && !(test_cat_cmp(test->catagory, catagory))) ||
 			((mode == 2) && !(strcmp(test->catagory, catagory)) && !(strcmp(test->name, name)))) {
 
 			execute = 1;
@@ -198,6 +210,7 @@
 				ast_cli(a->fd, "START  %s/%s \n", test->catagory, test->name);
 			}
 
+			/* execute the test and save results */
 			__test_execute(test);
 
 			/* update execution specific counts here */
@@ -209,12 +222,22 @@
 			}
 
 			if (a) {
-				term_color(result_buf, test_result2str[test->result.state], (test->result.state == AST_TEST_FAIL) ? COLOR_RED : COLOR_GREEN, 0, sizeof(result_buf));
-				ast_cli(a->fd, "END    %s/%s Time: %dms Result: %s %s\n", test->catagory, test->name, test->result.time, result_buf, ast_str_buffer(test->result.error));
+				term_color(result_buf,
+					test_result2str[test->result.state],
+					(test->result.state == AST_TEST_FAIL) ? COLOR_RED : COLOR_GREEN,
+					0,
+					sizeof(result_buf));
+				ast_cli(a->fd, "END    %s/%s Time: %dms Result: %s %s\n",
+					test->catagory,
+					test->name,
+					test->result.time,
+					result_buf,
+					ast_str_buffer(test->result.error));
 			}
 		}
 
-		/* update total counts as well during this iteration */
+		/* update total counts as well during this iteration
+		 * even if the current test did not execute this time */
 		last_results.total_time += test->result.time;
 		last_results.total_tests++;
 		if (test->result.state != AST_TEST_NOT_RUN) {
@@ -402,6 +425,31 @@
 }
 
 /*!
+ * \brief compares two test catagories to determine if cat1 resides in cat2
+ *
+ * \return 0 if true
+ */
+
+static int test_cat_cmp(const char *cat1, const char *cat2)
+{
+	int len1 = 0;
+	int len2 = 0;
+
+	if (!cat1 || !cat2) {
+		return -1;
+	}
+
+	len1 = strlen(cat1);
+	len2 = strlen(cat2);
+
+	if (len2 > len1) {
+		return -1;
+	}
+
+	return strncmp(cat1, cat2, len2) ? 1 : 0;
+}
+
+/*!
  * \brief allocates an ast_test object.
  */
 static struct ast_test *test_alloc(const char *name, const char *catagory, const char *summary, const char *description, ast_test_cb_t *cb)
@@ -439,7 +487,7 @@
 		e->command = "test show registered";
 
 		e->usage =
-			"Usage: test execute can be used in three ways.\n"
+			"Usage: 'test show registered' can be used in three ways.\n"
 			"       1. 'test show registered all' shows all registered tests\n"
 			"       2. 'test show registered catagory [test catagory]' shows all tests in the given\n"
 			"          catagory.\n"
@@ -455,14 +503,16 @@
 		}
 		return NULL;
 	case CLI_HANDLER:
-		if ((a->argc < 4) || ((a->argc == 4) && strcmp(a->argv[3], "all")) || (a->argc > 7)) {
+		if ((a->argc < 4) || (a->argc == 6) || (a->argc > 7) ||
+			((a->argc == 4) && strcmp(a->argv[3], "all")) ||
+			((a->argc == 7) && strcmp(a->argv[5], "name"))) {
 			return CLI_SHOWUSAGE;
 		}
 		ast_cli(a->fd, FORMAT, "Name", "Catagory", "Summary", "Test Result");
 		AST_LIST_LOCK(&tests);
 		AST_LIST_TRAVERSE_SAFE_BEGIN(&tests, test, entry) {
 			if ((a->argc == 4) ||
-				 ((a->argc == 5) && !strcmp(test->catagory, a->argv[4])) ||
+				 ((a->argc == 5) && !test_cat_cmp(test->catagory, a->argv[4])) ||
 				 ((a->argc == 7) && !strcmp(test->catagory, a->argv[4]) && !strcmp(test->name, a->argv[6]))) {
 
 				ast_cli(a->fd, FORMAT, test->name, test->catagory, test->summary, test_result2str[test->result.state]);
@@ -601,7 +651,6 @@
 	default:
 		return NULL;
 	}
-
 	return CLI_SUCCESS;
 }
 
@@ -614,7 +663,7 @@
 	case CLI_INIT:
 		e->command = "test generate results";
 		e->usage =
-			"Usage: test generate results\n"
+			"Usage: 'test generate results'\n"
 			"       Generates test results in either xml or txt format. An optional \n"
 			"       file path may be provided to specify the location of the xml or\n"
 			"       txt file\n"
@@ -657,7 +706,7 @@
 	AST_CLI_DEFINE(test_cli_show_registered,           "show registered tests"),
 	AST_CLI_DEFINE(test_cli_execute_registered,        "execute registered tests"),
 	AST_CLI_DEFINE(test_cli_show_results,              "show last test results"),
-	AST_CLI_DEFINE(test_cli_generate_results,          "generate test results"),
+	AST_CLI_DEFINE(test_cli_generate_results,          "generate test results to file"),
 };
 
 int ast_test_init()
@@ -665,6 +714,9 @@
 	/* Register cli commands */
 	ast_cli_register_multiple(test_cli, ARRAY_LEN(test_cli));
 
+	/* in the future this function could be used to register functions not
+	 * defined within a module */
+
 	return 0;
 }
 #endif




More information about the asterisk-commits mailing list