/* * Copyright (c) 2015 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <vlib/vlib.h> #include <vppinfra/time_range.h> static int test_time_range_main (unformat_input_t * input) { vlib_main_t *vm = vlib_get_main (); clib_timebase_t _tb, *tb = &_tb; clib_timebase_component_t _c, *cp = &_c; clib_timebase_range_t *rp = 0; clib_timebase_range_t *this_rp; unformat_input_t _input2, *input2 = &_input2; char *test_range_string; f64 sunday_midnight; f64 now, then; f64 start_time, end_time; f64 timezone_offset; /* Init time base */ clib_timebase_init (tb, -5 /* EST */ , CLIB_TIMEBASE_DAYLIGHT_USA, &vm->clib_time); /* Set up summer time cache */ now = clib_timebase_now (tb); /* Test it */ now = clib_timebase_now (tb); /* show current time */ fformat (stdout, "Current time in UTC%f, US daylight time rules:\n", tb->timezone_offset / 3600.0); fformat (stdout, "%U", format_clib_timebase_time, now); /* Test conversion to component structure */ clib_timebase_time_to_components (now, cp); now = clib_timebase_components_to_time (cp); fformat (stdout, " -> %U\n", format_clib_timebase_time, now); /* * test a few other dates, to verify summer time operation * 2011: started sunday 3/13, ended sunday 11/6 */ fformat (stdout, "Test daylight time rules:\n"); clib_memset (cp, 0, sizeof (*cp)); /* Just before DST starts */ cp->year = 2011; cp->month = 2; cp->day = 13; cp->hour = 1; cp->minute = 59; cp->second = 59; then = clib_timebase_components_to_time (cp); timezone_offset = clib_timebase_summer_offset_fastpath (tb, then); fformat (stdout, "%U should not be in DST, and it %s\n", format_clib_timebase_time, then, (timezone_offset != 0.0) ? "is" : "is not"); /* add two seconds */ then += 2.0; timezone_offset = clib_timebase_summer_offset_fastpath (tb, then); fformat (stdout, "%U should be in DST, and it %s\n", format_clib_timebase_time, then, (timezone_offset != 0.0) ? "is" : "is not"); /* Just before DST ends */ cp->year = 2011; cp->month = 10; cp->day = 6; cp->hour = 1; cp->minute = 59; cp->second = 59; then = clib_timebase_components_to_time (cp); timezone_offset = clib_timebase_summer_offset_fastpath (tb, then); fformat (stdout, "%U should be in DST, and it %s\n", format_clib_timebase_time, then, (timezone_offset != 0.0) ? "is" : "is not"); /* add two seconds. */ then += 2.0; timezone_offset = clib_timebase_summer_offset_fastpath (tb, then); fformat (stdout, "%U should not be in DST, and it %s\n", format_clib_timebase_time, then, (timezone_offset != 0.0) ? "is" : "is not"); /* Back to the future... */ clib_timebase_time_to_components (now, cp); fformat (stdout, "Test time range calculations:\n"); /* Find previous Sunday midnight */ sunday_midnight = now = clib_timebase_find_sunday_midnight (now); clib_timebase_time_to_components (now, cp); fformat (stdout, "Sunday midnight: %U\n", format_clib_timebase_time, now); test_range_string = "Mon 11 - 17 Tue 7 - 11 Wed - Fri 8 - 18"; unformat_init_string (input2, test_range_string, strlen (test_range_string)); if (unformat (input2, "%U", unformat_clib_timebase_range_vector, &rp)) { vec_foreach (this_rp, rp) { start_time = sunday_midnight + this_rp->start; end_time = sunday_midnight + this_rp->end; fformat (stdout, "range: %U - %U\n", format_clib_timebase_time, start_time, format_clib_timebase_time, end_time); } vec_free (rp); } else { fformat (stdout, "Time convert fail!\n"); return -1; } unformat_free (input2); return 0; } static clib_error_t * test_time_range_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { int rv; rv = test_time_range_main (input); if (rv) return clib_error_return (0, "test time range FAILED, error %d", rv); return 0; } /* *INDENT-OFF* */ VLIB_CLI_COMMAND (test_time_range_command, static) = { .path = "test time-range", .short_help = "test time-range", .function = test_time_range_command_fn, }; /* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */