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',