From b1ac20348046d9de0778f937dc1d9d2bcdbd1a79 Mon Sep 17 00:00:00 2001 From: danilchap Date: Thu, 26 Nov 2015 09:01:10 -0800 Subject: [PATCH] Introduce helper class NtpTime Seconds and fractions parts of the ntp time presented with two values, but used as one. This helper structure can make that use more clear. (initially introduced into rtp_rtcp as https://codereview.webrtc.org/1435833003) BUG=webrtc:5260 Review URL: https://codereview.webrtc.org/1482593002 Cr-Commit-Position: refs/heads/master@{#10814} --- webrtc/system_wrappers/include/ntp_time.h | 63 +++++++++++++++++ .../source/ntp_time_unittest.cc | 69 +++++++++++++++++++ webrtc/system_wrappers/system_wrappers.gyp | 1 + .../system_wrappers/system_wrappers_tests.gyp | 1 + 4 files changed, 134 insertions(+) create mode 100644 webrtc/system_wrappers/include/ntp_time.h create mode 100644 webrtc/system_wrappers/source/ntp_time_unittest.cc diff --git a/webrtc/system_wrappers/include/ntp_time.h b/webrtc/system_wrappers/include/ntp_time.h new file mode 100644 index 0000000000..229666e8dd --- /dev/null +++ b/webrtc/system_wrappers/include/ntp_time.h @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. +* +* Use of this source code is governed by a BSD-style license +* that can be found in the LICENSE file in the root of the source +* tree. An additional intellectual property rights grant can be found +* in the file PATENTS. All contributing project authors may +* be found in the AUTHORS file in the root of the source tree. +*/ +#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_ +#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_ + +#include "webrtc/base/basictypes.h" +#include "webrtc/system_wrappers/include/clock.h" + +namespace webrtc { + +class NtpTime { + public: + NtpTime() : seconds_(0), fractions_(0) {} + explicit NtpTime(const Clock& clock) { + clock.CurrentNtp(seconds_, fractions_); + } + NtpTime(uint32_t seconds, uint32_t fractions) + : seconds_(seconds), fractions_(fractions) {} + + NtpTime(const NtpTime&) = default; + NtpTime& operator=(const NtpTime&) = default; + + void SetCurrent(const Clock& clock) { + clock.CurrentNtp(seconds_, fractions_); + } + void Set(uint32_t seconds, uint32_t fractions) { + seconds_ = seconds; + fractions_ = fractions; + } + void Reset() { + seconds_ = 0; + fractions_ = 0; + } + + int64_t ToMs() const { return Clock::NtpToMs(seconds_, fractions_); } + + // NTP standard (RFC1305, section 3.1) explicitly state value 0/0 is invalid. + bool Valid() const { return !(seconds_ == 0 && fractions_ == 0); } + + uint32_t seconds() const { return seconds_; } + uint32_t fractions() const { return fractions_; } + + private: + uint32_t seconds_; + uint32_t fractions_; +}; + +inline bool operator==(const NtpTime& n1, const NtpTime& n2) { + return n1.seconds() == n2.seconds() && n1.fractions() == n2.fractions(); +} +inline bool operator!=(const NtpTime& n1, const NtpTime& n2) { + return !(n1 == n2); +} + +} // namespace webrtc +#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_ diff --git a/webrtc/system_wrappers/source/ntp_time_unittest.cc b/webrtc/system_wrappers/source/ntp_time_unittest.cc new file mode 100644 index 0000000000..ff11288c1b --- /dev/null +++ b/webrtc/system_wrappers/source/ntp_time_unittest.cc @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "testing/gtest/include/gtest/gtest.h" + +#include "webrtc/system_wrappers/include/ntp_time.h" + +namespace webrtc { +namespace { + +const uint32_t kNtpSec = 0x12345678; +const uint32_t kNtpFrac = 0x23456789; + +TEST(NtpTimeTest, NoValueMeansInvalid) { + NtpTime ntp; + EXPECT_FALSE(ntp.Valid()); +} + +TEST(NtpTimeTest, CanResetValue) { + NtpTime ntp(kNtpSec, kNtpFrac); + EXPECT_TRUE(ntp.Valid()); + ntp.Reset(); + EXPECT_FALSE(ntp.Valid()); +} + +TEST(NtpTimeTest, CanGetWhatIsSet) { + NtpTime ntp; + ntp.Set(kNtpSec, kNtpFrac); + EXPECT_EQ(kNtpSec, ntp.seconds()); + EXPECT_EQ(kNtpFrac, ntp.fractions()); +} + +TEST(NtpTimeTest, SetIsSameAs2ParameterConstructor) { + NtpTime ntp1(kNtpSec, kNtpFrac); + NtpTime ntp2; + EXPECT_NE(ntp1, ntp2); + + ntp2.Set(kNtpSec, kNtpFrac); + EXPECT_EQ(ntp1, ntp2); +} + +TEST(NtpTimeTest, SetCurrentIsSameAs1ParameterConstructor) { + SimulatedClock clock(0x0123456789abcdef); + + NtpTime ntp1(clock); + NtpTime ntp2; + EXPECT_NE(ntp1, ntp2); + + ntp2.SetCurrent(clock); + EXPECT_EQ(ntp1, ntp2); +} + +TEST(NtpTimeTest, ToMsMeansToNtpMilliseconds) { + SimulatedClock clock(0x123456789abc); + + NtpTime ntp(clock); + EXPECT_EQ(ntp.ToMs(), Clock::NtpToMs(ntp.seconds(), ntp.fractions())); + EXPECT_EQ(ntp.ToMs(), clock.CurrentNtpInMilliseconds()); +} + +} // namespace +} // namespace webrtc diff --git a/webrtc/system_wrappers/system_wrappers.gyp b/webrtc/system_wrappers/system_wrappers.gyp index f5f2b2bdc8..507fc45311 100644 --- a/webrtc/system_wrappers/system_wrappers.gyp +++ b/webrtc/system_wrappers/system_wrappers.gyp @@ -35,6 +35,7 @@ 'include/logcat_trace_context.h', 'include/logging.h', 'include/metrics.h', + 'include/ntp_time.h', 'include/ref_count.h', 'include/rtp_to_ntp.h', 'include/rw_lock_wrapper.h', diff --git a/webrtc/system_wrappers/system_wrappers_tests.gyp b/webrtc/system_wrappers/system_wrappers_tests.gyp index 7f735337eb..f668dfa3ed 100644 --- a/webrtc/system_wrappers/system_wrappers_tests.gyp +++ b/webrtc/system_wrappers/system_wrappers_tests.gyp @@ -29,6 +29,7 @@ 'source/data_log_helpers_unittest.cc', 'source/data_log_c_helpers_unittest.c', 'source/data_log_c_helpers_unittest.h', + 'source/ntp_time_unittest.cc', 'source/rtp_to_ntp_unittest.cc', 'source/scoped_vector_unittest.cc', 'source/stringize_macros_unittest.cc',