1f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org/*
2f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *
4f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org */
10f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
11f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "webrtc/modules/audio_device/android/low_latency_event.h"
12f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
13f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
15f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "webrtc/system_wrappers/interface/sleep.h"
16f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "webrtc/system_wrappers/interface/thread_wrapper.h"
17f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
18f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgnamespace webrtc {
19f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
20f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgstatic const int kEventMsg = 1;
21f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
22f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgclass LowLatencyEventTest : public testing::Test {
23f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org public:
24f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  LowLatencyEventTest()
25f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org      : process_thread_(ThreadWrapper::CreateThread(CbThread,
26f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org                                                    this,
27f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org                                                    kRealtimePriority,
28f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org                                                    "test_thread")),
29f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org        terminated_(false),
30f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org        iteration_count_(0),
31f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org        allowed_iterations_(0) {
32f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    EXPECT_TRUE(event_.Start());
33f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    Start();
34f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
35f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  ~LowLatencyEventTest() {
36f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    EXPECT_GE(allowed_iterations_, 1);
37f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    EXPECT_GE(iteration_count_, 1);
38f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    Stop();
39f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
40f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
41f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  void AllowOneIteration() {
42f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    ++allowed_iterations_;
43f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    event_.SignalEvent(allowed_iterations_, kEventMsg);
44f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
45f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
46f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org private:
47f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  void Start() {
48f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    unsigned int thread_id = 0;
49f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    EXPECT_TRUE(process_thread_->Start(thread_id));
50f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
51f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  void Stop() {
52f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    terminated_ = true;
53f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    event_.Stop();
54f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    process_thread_->Stop();
55f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
56f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
57f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  static bool CbThread(void* context) {
58f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    return reinterpret_cast<LowLatencyEventTest*>(context)->CbThreadImpl();
59f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
60f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  bool CbThreadImpl() {
61f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    int allowed_iterations;
62f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    int message;
63f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    ++iteration_count_;
64f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    event_.WaitOnEvent(&allowed_iterations, &message);
65f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    EXPECT_EQ(iteration_count_, allowed_iterations);
66f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    EXPECT_EQ(message, kEventMsg);
67f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    return !terminated_;
68f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
69f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
70f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  LowLatencyEvent event_;
71f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
72f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  scoped_ptr<ThreadWrapper> process_thread_;
73f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  bool terminated_;
74f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  int iteration_count_;
75f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  int allowed_iterations_;
76f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org};
77f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
78f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
79f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgTEST_F(LowLatencyEventTest, TriggerEvent) {
80f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  for (int i = 0; i < 3; ++i) {
81f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org    AllowOneIteration();
82f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  }
83f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org}
84f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
85f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// Events trigger in less than 3ms. Wait for 3 ms to ensure there are no
86f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// spurious wakeups.
87f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgTEST_F(LowLatencyEventTest, NoTriggerEvent) {
88f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  SleepMs(3);
89f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  // If there were spurious wakeups either the wakeups would have triggered a
90f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  // failure as we haven't allowed an iteration yet. Or the wakeup happened
91f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  // to signal 0, 0 in which case the mismatch will be discovered when allowing
92f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  // an iteration to happen.
93f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org  AllowOneIteration();
94f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org}
95f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org
96f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org}  // namespace webrtc
97