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