<p>George Joseph <strong>submitted</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/15676">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Joshua Colp: Looks good to me, but someone else must approve
  George Joseph: Looks good to me, approved; Approved for Submit

</div><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, 394 insertions(+), 0 deletions(-)<br><br></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..aec6c7d 100644</span><br><span>--- a/include/asterisk/time.h</span><br><span>+++ b/include/asterisk/time.h</span><br><span>@@ -237,4 +237,83 @@</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: us, usec, microsecond will all map to TIME_UNIT_MICROSECOND.</span><br><span style="color: hsl(120, 100%, 40%);">+ * So will uss, 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 Convert a timeval structure to microseconds</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param tv The timeval to convert</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The time in microseconds</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ast_suseconds_t ast_time_tv_to_usec(const struct timeval *tv);</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(unsigned 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(unsigned 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..b2a7868</span><br><span>--- /dev/null</span><br><span>+++ b/main/time.c</span><br><span>@@ -0,0 +1,145 @@</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[] = {"us", "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%);">+ast_suseconds_t ast_time_tv_to_usec(const struct timeval *tv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        return tv->tv_sec * 1000000 + tv->tv_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(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%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Create a timeval first onverting the given microsecond value</span><br><span style="color: hsl(120, 100%, 40%);">+ *        into seconds and microseconds</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param usec microsecond value</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return A timeval structure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct timeval normalize_and_create(unsigned long usec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        return ast_time_create(usec / 1000000, usec % 1000000);</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(unsigned 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 normalize_and_create(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 normalize_and_create(val);</span><br><span style="color: hsl(120, 100%, 40%);">+     case TIME_UNIT_MILLISECOND:</span><br><span style="color: hsl(120, 100%, 40%);">+           return normalize_and_create(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(unsigned 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..ceb2ae2 100644</span><br><span>--- a/tests/test_time.c</span><br><span>+++ b/tests/test_time.c</span><br><span>@@ -111,8 +111,174 @@</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("us") == 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%);">+      struct timeval tv;</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%);">+     /* timeval normalization */</span><br><span style="color: hsl(120, 100%, 40%);">+   tv = ast_time_create_by_unit(1500000000, TIME_UNIT_NANOSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, tv.tv_sec == 1 && tv.tv_usec == 500000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tv = ast_time_create_by_unit(1500000, TIME_UNIT_MICROSECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, tv.tv_sec == 1 && tv.tv_usec == 500000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tv = ast_time_create_by_unit(1500, TIME_UNIT_MILLISECOND);</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, tv.tv_sec == 1 && tv.tv_usec == 500000);</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%);">+  struct timeval tv;</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, "us").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%);">+ /* timeval normalization */</span><br><span style="color: hsl(120, 100%, 40%);">+   tv = ast_time_create_by_unit_str(1500000000, "ns");</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_test_validate(test, tv.tv_sec == 1 && tv.tv_usec == 500000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tv = ast_time_create_by_unit_str(1500000, "us");</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_test_validate(test, tv.tv_sec == 1 && tv.tv_usec == 500000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tv = ast_time_create_by_unit_str(1500, "ms");</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_test_validate(test, tv.tv_sec == 1 && tv.tv_usec == 500000);</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_tv_to_usec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct timeval tv;</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_tv_to_usec";</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 conversion of a timeval structure to microseconds";</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%);">+   tv = ast_time_create(0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_tv_to_usec(&tv) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ tv = ast_time_create(0, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_tv_to_usec(&tv) == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ tv = ast_time_create(1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_tv_to_usec(&tv) == 1000000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   tv = ast_time_create(1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, ast_time_tv_to_usec(&tv) == 1000001);</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 style="color: hsl(120, 100%, 40%);">+   AST_TEST_UNREGISTER(test_time_tv_to_usec);</span><br><span>   AST_TEST_UNREGISTER(test_timezone_watch);</span><br><span>    return 0;</span><br><span> }</span><br><span>@@ -120,6 +286,10 @@</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_tv_to_usec);</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/+/15676">change 15676</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/+/15676"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic31a1c3262a44f77a5ef78bfc85dcf69a8d47392 </div>
<div style="display:none"> Gerrit-Change-Number: 15676 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>