<p>Kevin Harwell has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/15675">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">time: Add timeval create and unit conversion functions<br><br>Added a TIME_UNIT enumeration, and a function that converts a<br>string to one of the enumerated values. Also, added functions<br>that create and initialize a timeval object using a specified<br>value, and unit type.<br><br>Change-Id: Ic31a1c3262a44f77a5ef78bfc85dcf69a8d47392<br>---<br>M include/asterisk/time.h<br>A main/time.c<br>M tests/test_time.c<br>3 files changed, 311 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/75/15675/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/time.h b/include/asterisk/time.h</span><br><span>index f49d689..e07203d 100644</span><br><span>--- a/include/asterisk/time.h</span><br><span>+++ b/include/asterisk/time.h</span><br><span>@@ -237,4 +237,74 @@</span><br><span> }</span><br><span> )</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Time units enumeration.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum TIME_UNIT {</span><br><span style="color: hsl(120, 100%, 40%);">+  TIME_UNIT_ERROR = -1,</span><br><span style="color: hsl(120, 100%, 40%);">+ TIME_UNIT_NANOSECOND,</span><br><span style="color: hsl(120, 100%, 40%);">+ TIME_UNIT_MICROSECOND,</span><br><span style="color: hsl(120, 100%, 40%);">+        TIME_UNIT_MILLISECOND,</span><br><span style="color: hsl(120, 100%, 40%);">+        TIME_UNIT_SECOND,</span><br><span style="color: hsl(120, 100%, 40%);">+     TIME_UNIT_MINUTE,</span><br><span style="color: hsl(120, 100%, 40%);">+     TIME_UNIT_HOUR,</span><br><span style="color: hsl(120, 100%, 40%);">+       TIME_UNIT_DAY,</span><br><span style="color: hsl(120, 100%, 40%);">+        TIME_UNIT_WEEK,</span><br><span style="color: hsl(120, 100%, 40%);">+       TIME_UNIT_MONTH,</span><br><span style="color: hsl(120, 100%, 40%);">+      TIME_UNIT_YEAR,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Convert a string to a time unit enumeration value.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This method attempts to be as flexible, and forgiving as possible when</span><br><span style="color: hsl(120, 100%, 40%);">+ * converting. In most cases the algorithm will match on the beginning of</span><br><span style="color: hsl(120, 100%, 40%);">+ * up to three strings (short, medium, long form). So that means if the</span><br><span style="color: hsl(120, 100%, 40%);">+ * given string at least starts with one of the form values it will match.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example: mu, usec, microsecond will all map to TIME_UNIT_MICROSECOND.</span><br><span style="color: hsl(120, 100%, 40%);">+ * So will mus, usecs, miscroseconds, or even microsecondvals</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Matching is also not case sensitive.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param unit The string to map to an enumeration</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return A time unit enumeration</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum TIME_UNIT ast_time_str_to_unit(const char *unit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Create a timeval object initialized to given values.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param sec The timeval seconds value</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param usec The timeval microseconds value</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return A timeval object</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct timeval ast_time_create(ast_time_t sec, ast_suseconds_t usec);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Convert the given unit value, and create a timeval object from it.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param val The value to convert to a timeval</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param unit The time unit type of val</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return A timeval object</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct timeval ast_time_create_by_unit(long val, enum TIME_UNIT unit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Convert the given unit value, and create a timeval object from it.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This will first attempt to convert the unit from a string to a TIME_UNIT</span><br><span style="color: hsl(120, 100%, 40%);">+ * enumeration. If that conversion fails then a zeroed out timeval object</span><br><span style="color: hsl(120, 100%, 40%);">+ * is returned.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param val The value to convert to a timeval</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param unit The time unit type of val</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return A timeval object</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct timeval ast_time_create_by_unit_str(long val, const char *unit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _ASTERISK_TIME_H */</span><br><span>diff --git a/main/time.c b/main/time.c</span><br><span>new file mode 100644</span><br><span>index 0000000..33350da</span><br><span>--- /dev/null</span><br><span>+++ b/main/time.c</span><br><span>@@ -0,0 +1,127 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Asterisk -- An open source telephony toolkit.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2021, Sangoma Technologies Corporation</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * See http://www.asterisk.org for more information about</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Asterisk project. Please do not directly contact</span><br><span style="color: hsl(120, 100%, 40%);">+ * any of the maintainers of this project for assistance;</span><br><span style="color: hsl(120, 100%, 40%);">+ * the project provides a web site, mailing lists and IRC</span><br><span style="color: hsl(120, 100%, 40%);">+ * channels for your use.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software, distributed under the terms of</span><br><span style="color: hsl(120, 100%, 40%);">+ * the GNU General Public License Version 2. See the LICENSE file</span><br><span style="color: hsl(120, 100%, 40%);">+ * at the top of the source tree.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \file</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Date/Time utility functions</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*** MODULEINFO</span><br><span style="color: hsl(120, 100%, 40%);">+ <support_level>core</support_level></span><br><span style="color: hsl(120, 100%, 40%);">+ ***/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/time.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const char *nanosecond_labels[] = {"ns", "nsec", "nanosecond"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *microsecond_labels[] = {"mu", "usec", "microsecond"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *millisecond_labels[] = {"ms", "msec", "millisecond"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *second_labels[] = {"s", "sec", "second"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *minute_labels[] = {"m", "min", "minute"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *hour_labels[] = {"h", "hr", "hour"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *day_labels[] = {"d", "", "day"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *week_labels[] = {"w", "wk", "week"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *month_labels[] = {"mo", "mth", "month"};</span><br><span style="color: hsl(120, 100%, 40%);">+const char *year_labels[] = {"y", "yr", "year"};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_UNIT_LABELS 3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct time_unit_labels {</span><br><span style="color: hsl(120, 100%, 40%);">+      enum TIME_UNIT unit;</span><br><span style="color: hsl(120, 100%, 40%);">+  const char **values;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct time_unit_labels unit_labels[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { TIME_UNIT_NANOSECOND, nanosecond_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+  { TIME_UNIT_MICROSECOND, microsecond_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+        { TIME_UNIT_MILLISECOND, millisecond_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+        { TIME_UNIT_MONTH, month_labels }, /* Here so "mo" matches before "m" */</span><br><span style="color: hsl(120, 100%, 40%);">+  { TIME_UNIT_SECOND, second_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+  { TIME_UNIT_MINUTE, minute_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+  { TIME_UNIT_HOUR, hour_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TIME_UNIT_DAY, day_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+        { TIME_UNIT_WEEK, week_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TIME_UNIT_YEAR, year_labels },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const unsigned int unit_labels_size = sizeof(unit_labels) / sizeof(0[unit_labels]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum TIME_UNIT ast_time_str_to_unit(const char *unit)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!unit) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return TIME_UNIT_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < unit_labels_size; ++i) {</span><br><span style="color: hsl(120, 100%, 40%);">+           for (j = 0; j < MAX_UNIT_LABELS; ++j) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /*</span><br><span style="color: hsl(120, 100%, 40%);">+                     * A lazy pluralization check. If the given unit string at least starts</span><br><span style="color: hsl(120, 100%, 40%);">+                        * with a label assume a match.</span><br><span style="color: hsl(120, 100%, 40%);">+                        */</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (*unit_labels[i].values[j] && !strncasecmp(unit, unit_labels[i].values[j],</span><br><span style="color: hsl(120, 100%, 40%);">+                                 strlen(unit_labels[i].values[j]))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          return unit_labels[i].unit;</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return TIME_UNIT_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct timeval ast_time_create(ast_time_t sec, ast_suseconds_t usec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return ast_tv(sec, usec);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct timeval ast_time_create_by_unit(long val, enum TIME_UNIT unit)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (unit) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case TIME_UNIT_NANOSECOND:</span><br><span style="color: hsl(120, 100%, 40%);">+            return ast_time_create(0, val / 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+        case TIME_UNIT_MICROSECOND:</span><br><span style="color: hsl(120, 100%, 40%);">+           return ast_time_create(0, val);</span><br><span style="color: hsl(120, 100%, 40%);">+       case TIME_UNIT_MILLISECOND:</span><br><span style="color: hsl(120, 100%, 40%);">+           return ast_time_create(0, val * 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+        case TIME_UNIT_SECOND:</span><br><span style="color: hsl(120, 100%, 40%);">+                return ast_time_create(val, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       case TIME_UNIT_MINUTE:</span><br><span style="color: hsl(120, 100%, 40%);">+                return ast_time_create(val * 60, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  case TIME_UNIT_HOUR:</span><br><span style="color: hsl(120, 100%, 40%);">+          return ast_time_create(val * 3600, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        case TIME_UNIT_DAY:</span><br><span style="color: hsl(120, 100%, 40%);">+           return ast_time_create(val * 86400, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       case TIME_UNIT_WEEK:</span><br><span style="color: hsl(120, 100%, 40%);">+          return ast_time_create(val * 604800, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      case TIME_UNIT_MONTH:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Using Gregorian mean month - 30.436875 * 86400 */</span><br><span style="color: hsl(120, 100%, 40%);">+          return ast_time_create(val * 2629746, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     case TIME_UNIT_YEAR:</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Using Gregorian year - 365.2425 * 86400 */</span><br><span style="color: hsl(120, 100%, 40%);">+         return ast_time_create(val * 31556952, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return ast_time_create(0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct timeval ast_time_create_by_unit_str(long val, const char *unit)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return ast_time_create_by_unit(val, ast_time_str_to_unit(unit));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/test_time.c b/tests/test_time.c</span><br><span>index b58a473..f78fbc1 100644</span><br><span>--- a/tests/test_time.c</span><br><span>+++ b/tests/test_time.c</span><br><span>@@ -111,8 +111,119 @@</span><br><span>         return res;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AST_TEST_DEFINE(test_time_str_to_unit)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       switch (cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case TEST_INIT:</span><br><span style="color: hsl(120, 100%, 40%);">+               info->name = "time_str_to_unit";</span><br><span style="color: hsl(120, 100%, 40%);">+         info->category = "/main/stdtime/";</span><br><span style="color: hsl(120, 100%, 40%);">+               info->summary = "Verify string to time unit conversions";</span><br><span style="color: hsl(120, 100%, 40%);">+                info->description = info->summary;</span><br><span style="color: hsl(120, 100%, 40%);">+              return AST_TEST_NOT_RUN;</span><br><span style="color: hsl(120, 100%, 40%);">+      case TEST_EXECUTE:</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Nominal */</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, ast_time_str_to_unit("ns") == TIME_UNIT_NANOSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+        ast_test_validate(test, ast_time_str_to_unit("mu") == TIME_UNIT_MICROSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("ms") == TIME_UNIT_MILLISECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("s") == TIME_UNIT_SECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("m") == TIME_UNIT_MINUTE);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("h") == TIME_UNIT_HOUR);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("d") == TIME_UNIT_DAY);</span><br><span style="color: hsl(120, 100%, 40%);">+        ast_test_validate(test, ast_time_str_to_unit("w") == TIME_UNIT_WEEK);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("mo") == TIME_UNIT_MONTH);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("y") == TIME_UNIT_YEAR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Plural */</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_test_validate(test, ast_time_str_to_unit("nanoseconds") == TIME_UNIT_NANOSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("microseconds") == TIME_UNIT_MICROSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("milliseconds") == TIME_UNIT_MILLISECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("seconds") == TIME_UNIT_SECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("minutes") == TIME_UNIT_MINUTE);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_str_to_unit("hours") == TIME_UNIT_HOUR);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_str_to_unit("days") == TIME_UNIT_DAY);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("weeks") == TIME_UNIT_WEEK);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_str_to_unit("months") == TIME_UNIT_MONTH);</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, ast_time_str_to_unit("years") == TIME_UNIT_YEAR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Case */</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, ast_time_str_to_unit("Nsec") == TIME_UNIT_NANOSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_str_to_unit("Usec") == TIME_UNIT_MICROSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("Msec") == TIME_UNIT_MILLISECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, ast_time_str_to_unit("Sec") == TIME_UNIT_SECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_str_to_unit("Min") == TIME_UNIT_MINUTE);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_str_to_unit("Hr") == TIME_UNIT_HOUR);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_str_to_unit("Day") == TIME_UNIT_DAY);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_str_to_unit("Wk") == TIME_UNIT_WEEK);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_str_to_unit("Mth") == TIME_UNIT_MONTH);</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, ast_time_str_to_unit("Yr") == TIME_UNIT_YEAR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return AST_TEST_PASS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AST_TEST_DEFINE(test_time_create_by_unit)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case TEST_INIT:</span><br><span style="color: hsl(120, 100%, 40%);">+               info->name = "time_create_by_unit";</span><br><span style="color: hsl(120, 100%, 40%);">+              info->category = "/main/stdtime/";</span><br><span style="color: hsl(120, 100%, 40%);">+               info->summary = "Verify unit value to timeval conversions";</span><br><span style="color: hsl(120, 100%, 40%);">+              info->description = info->summary;</span><br><span style="color: hsl(120, 100%, 40%);">+              return AST_TEST_NOT_RUN;</span><br><span style="color: hsl(120, 100%, 40%);">+      case TEST_EXECUTE:</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Nominal */</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, ast_time_create_by_unit(1000, TIME_UNIT_NANOSECOND).tv_usec == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_MICROSECOND).tv_usec == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_MILLISECOND).tv_usec == 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_SECOND).tv_sec == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_MINUTE).tv_sec == 60);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_HOUR).tv_sec == 3600);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_DAY).tv_sec == 86400);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_WEEK).tv_sec == 604800);</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_MONTH).tv_sec == 2629746);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_create_by_unit(1, TIME_UNIT_YEAR).tv_sec == 31556952);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return AST_TEST_PASS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AST_TEST_DEFINE(test_time_create_by_unit_str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case TEST_INIT:</span><br><span style="color: hsl(120, 100%, 40%);">+               info->name = "time_create_by_unit_str";</span><br><span style="color: hsl(120, 100%, 40%);">+          info->category = "/main/stdtime/";</span><br><span style="color: hsl(120, 100%, 40%);">+               info->summary = "Verify value with unit as a string to timeval conversions";</span><br><span style="color: hsl(120, 100%, 40%);">+             info->description = info->summary;</span><br><span style="color: hsl(120, 100%, 40%);">+              return AST_TEST_NOT_RUN;</span><br><span style="color: hsl(120, 100%, 40%);">+      case TEST_EXECUTE:</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Nominal */</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, ast_time_create_by_unit_str(1000, "ns").tv_usec == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_create_by_unit_str(1, "mu").tv_usec == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, ast_time_create_by_unit_str(1, "ms").tv_usec == 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_create_by_unit_str(1, "s").tv_sec == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_create_by_unit_str(1, "m").tv_sec == 60);</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_test_validate(test, ast_time_create_by_unit_str(1, "h").tv_sec == 3600);</span><br><span style="color: hsl(120, 100%, 40%);">+        ast_test_validate(test, ast_time_create_by_unit_str(1, "d").tv_sec == 86400);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, ast_time_create_by_unit_str(1, "w").tv_sec == 604800);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_time_create_by_unit_str(1, "mo").tv_sec == 2629746);</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, ast_time_create_by_unit_str(1, "yr").tv_sec == 31556952);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return AST_TEST_PASS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int unload_module(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     AST_TEST_UNREGISTER(test_time_create_by_unit_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    AST_TEST_UNREGISTER(test_time_create_by_unit);</span><br><span style="color: hsl(120, 100%, 40%);">+        AST_TEST_UNREGISTER(test_time_str_to_unit);</span><br><span>  AST_TEST_UNREGISTER(test_timezone_watch);</span><br><span>    return 0;</span><br><span> }</span><br><span>@@ -120,6 +231,9 @@</span><br><span> static int load_module(void)</span><br><span> {</span><br><span>    AST_TEST_REGISTER(test_timezone_watch);</span><br><span style="color: hsl(120, 100%, 40%);">+       AST_TEST_REGISTER(test_time_str_to_unit);</span><br><span style="color: hsl(120, 100%, 40%);">+     AST_TEST_REGISTER(test_time_create_by_unit);</span><br><span style="color: hsl(120, 100%, 40%);">+  AST_TEST_REGISTER(test_time_create_by_unit_str);</span><br><span>     return AST_MODULE_LOAD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/15675">change 15675</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/15675"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 18 </div>
<div style="display:none"> Gerrit-Change-Id: Ic31a1c3262a44f77a5ef78bfc85dcf69a8d47392 </div>
<div style="display:none"> Gerrit-Change-Number: 15675 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>