summaryrefslogtreecommitdiffstats
path: root/media/mtransport/test/nrappkit_unittest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/mtransport/test/nrappkit_unittest.cpp')
-rw-r--r--media/mtransport/test/nrappkit_unittest.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/media/mtransport/test/nrappkit_unittest.cpp b/media/mtransport/test/nrappkit_unittest.cpp
new file mode 100644
index 000000000..48f904758
--- /dev/null
+++ b/media/mtransport/test/nrappkit_unittest.cpp
@@ -0,0 +1,134 @@
+
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Original author: ekr@rtfm.com
+#include <iostream>
+
+#include "nsThreadUtils.h"
+#include "nsXPCOM.h"
+
+// nrappkit includes
+extern "C" {
+#include "nr_api.h"
+#include "async_timer.h"
+}
+
+#include "runnable_utils.h"
+
+#define GTEST_HAS_RTTI 0
+#include "gtest/gtest.h"
+#include "gtest_utils.h"
+
+using namespace mozilla;
+
+namespace {
+
+class TimerTest : public MtransportTest {
+ public:
+ TimerTest() : MtransportTest(), handle_(nullptr), fired_(false) {}
+ virtual ~TimerTest() {}
+
+ int ArmTimer(int timeout) {
+ int ret;
+
+ test_utils_->sts_target()->Dispatch(
+ WrapRunnableRet(&ret, this, &TimerTest::ArmTimer_w, timeout),
+ NS_DISPATCH_SYNC);
+
+ return ret;
+ }
+
+ int ArmCancelTimer(int timeout) {
+ int ret;
+
+ test_utils_->sts_target()->Dispatch(
+ WrapRunnableRet(&ret, this, &TimerTest::ArmCancelTimer_w, timeout),
+ NS_DISPATCH_SYNC);
+
+ return ret;
+ }
+
+ int ArmTimer_w(int timeout) {
+ return NR_ASYNC_TIMER_SET(timeout, cb, this, &handle_);
+ }
+
+ int ArmCancelTimer_w(int timeout) {
+ int r;
+ r = ArmTimer_w(timeout);
+ if (r)
+ return r;
+
+ return CancelTimer_w();
+ }
+
+ int CancelTimer() {
+ int ret;
+
+ test_utils_->sts_target()->Dispatch(
+ WrapRunnableRet(&ret, this, &TimerTest::CancelTimer_w),
+ NS_DISPATCH_SYNC);
+
+ return ret;
+ }
+
+ int CancelTimer_w() {
+ return NR_async_timer_cancel(handle_);
+ }
+
+ int Schedule() {
+ int ret;
+
+ test_utils_->sts_target()->Dispatch(
+ WrapRunnableRet(&ret, this, &TimerTest::Schedule_w),
+ NS_DISPATCH_SYNC);
+
+ return ret;
+ }
+
+ int Schedule_w() {
+ NR_ASYNC_SCHEDULE(cb, this);
+
+ return 0;
+ }
+
+
+ static void cb(NR_SOCKET r, int how, void *arg) {
+ std::cerr << "Timer fired " << std::endl;
+
+ TimerTest *t = static_cast<TimerTest *>(arg);
+
+ t->fired_ = true;
+ }
+
+ protected:
+ void *handle_;
+ bool fired_;
+};
+}
+
+TEST_F(TimerTest, SimpleTimer) {
+ ArmTimer(100);
+ ASSERT_TRUE_WAIT(fired_, 1000);
+}
+
+TEST_F(TimerTest, CancelTimer) {
+ ArmTimer(1000);
+ CancelTimer();
+ PR_Sleep(2000);
+ ASSERT_FALSE(fired_);
+}
+
+TEST_F(TimerTest, CancelTimer0) {
+ ArmCancelTimer(0);
+ PR_Sleep(100);
+ ASSERT_FALSE(fired_);
+}
+
+TEST_F(TimerTest, ScheduleTest) {
+ Schedule();
+ ASSERT_TRUE_WAIT(fired_, 1000);
+}