15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/webrtc_audio_device_test.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/media/media_internals.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/audio_input_renderer_host.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/media/audio_mirroring_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/audio_renderer_host.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/media_stream_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/media/mock_media_observer.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/media/media_param_traits.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/resource_context.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_paths.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/audio_input_message_filter.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/audio_message_filter.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/webrtc_audio_device_impl.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_process.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webkitplatformsupport_impl.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_parameters.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_hardware_config.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/webrtc/voice_engine/include/voe_audio_processing.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/webrtc/voice_engine/include/voe_base.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/webrtc/voice_engine/include/voe_file.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/webrtc/voice_engine/include/voe_network.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::AudioParameters;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::ChannelLayout;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeWithoutArgs;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrEq;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is a mock of the child process singleton which is needed
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to be able to create a RenderThread object.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRTCMockRenderProcess : public RenderProcess {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebRTCMockRenderProcess() {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebRTCMockRenderProcess() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderProcess implementation.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual skia::PlatformCanvas* GetDrawingCanvas(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransportDIB** memory, const gfx::Rect& rect) OVERRIDE {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReleaseTransportDIB(TransportDIB* memory) OVERRIDE {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool UseInProcessPlugins() const OVERRIDE { return false; }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddBindings(int bindings) OVERRIDE {}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GetEnabledBindings() const OVERRIDE { return 0; }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual TransportDIB* CreateTransportDIB(size_t size) OVERRIDE {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FreeTransportDIB(TransportDIB*) OVERRIDE {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebRTCMockRenderProcess);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestAudioRendererHost : public AudioRendererHost {
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestAudioRendererHost(
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int render_process_id,
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      media::AudioManager* audio_manager,
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      AudioMirroringManager* mirroring_manager,
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      MediaInternals* media_internals,
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      MediaStreamManager* media_stream_manager,
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      IPC::Channel* channel)
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : AudioRendererHost(render_process_id, audio_manager, mirroring_manager,
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          media_internals, media_stream_manager),
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        channel_(channel) {}
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool Send(IPC::Message* message) OVERRIDE {
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (channel_)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return channel_->Send(message);
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ResetChannel() {
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    channel_ = NULL;
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~TestAudioRendererHost() {}
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IPC::Channel* channel_;
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestAudioInputRendererHost : public AudioInputRendererHost {
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestAudioInputRendererHost(
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      media::AudioManager* audio_manager,
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      MediaStreamManager* media_stream_manager,
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      AudioMirroringManager* audio_mirroring_manager,
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      media::UserInputMonitor* user_input_monitor,
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      IPC::Channel* channel)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : AudioInputRendererHost(audio_manager, media_stream_manager,
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                               audio_mirroring_manager, user_input_monitor),
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        channel_(channel) {}
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool Send(IPC::Message* message) OVERRIDE {
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (channel_)
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return channel_->Send(message);
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ResetChannel() {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    channel_ = NULL;
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~TestAudioInputRendererHost() {}
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  IPC::Channel* channel_;
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utility scoped class to replace the global content client's renderer for the
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// duration of the test.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReplaceContentClientRenderer {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ReplaceContentClientRenderer(ContentRendererClient* new_renderer) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    saved_renderer_ = SetRendererClientForTesting(new_renderer);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReplaceContentClientRenderer() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Restore the original renderer.
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetRendererClientForTesting(saved_renderer_);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentRendererClient* saved_renderer_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ReplaceContentClientRenderer);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRTCResourceContext : public ResourceContext {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRTCResourceContext() : test_request_context_(NULL) {}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockRTCResourceContext() {}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_request_context(net::URLRequestContext* request_context) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_request_context_ = request_context;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceContext implementation:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::HostResolver* GetHostResolver() OVERRIDE {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContext* GetRequestContext() OVERRIDE {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_request_context_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual bool AllowMicAccess(const GURL& origin) OVERRIDE {
1703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return false;
1713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
1723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual bool AllowCameraAccess(const GURL& origin) OVERRIDE {
1743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return false;
1753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
1763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* test_request_context_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockRTCResourceContext);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(QuitMessageLoop, loop_or_proxy) {
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  loop_or_proxy->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MAYBE_WebRTCAudioDeviceTest::MAYBE_WebRTCAudioDeviceTest()
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : render_thread_(NULL), audio_hardware_config_(NULL),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_input_devices_(false), has_output_devices_(false) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)MAYBE_WebRTCAudioDeviceTest::~MAYBE_WebRTCAudioDeviceTest() {}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::SetUp() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This part sets up a RenderThread environment to ensure that
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderThread::current() (<=> TLS pointer) is valid.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Main parts are inspired by the RenderViewFakeResourcesTest.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that, the IPC part is not utilized in this test.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  saved_content_renderer_.reset(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ReplaceContentClientRenderer(&content_renderer_client_));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_process_.reset(new WebRTCMockRenderProcess());
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_thread_.reset(
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new TestBrowserThread(BrowserThread::UI, base::MessageLoop::current()));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct the resource context on the UI thread.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_context_.reset(new MockRTCResourceContext);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kThreadName[] = "RenderThread";
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcess::current()->io_message_loop()->PostTask(FROM_HERE,
210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&MAYBE_WebRTCAudioDeviceTest::InitializeIOThread,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this), kThreadName));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForIOThreadCompletion();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sandbox_was_enabled_ =
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RendererWebKitPlatformSupportImpl::SetSandboxEnabledForTesting(false);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_thread_ = new RenderThreadImpl(kThreadName);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::TearDown() {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetAudioHardwareConfig(NULL);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run any pending cleanup tasks that may have been posted to the main thread.
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kick of the cleanup process by closing the channel. This queues up
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnStreamClosed calls to be executed on the audio thread.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcess::current()->io_message_loop()->PostTask(FROM_HERE,
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&MAYBE_WebRTCAudioDeviceTest::DestroyChannel,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForIOThreadCompletion();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When audio [input] render hosts are notified that the channel has
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been closed, they post tasks to the audio thread to close the
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AudioOutputController and once that's completed, a task is posted back to
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the IO thread to actually delete the AudioEntry for the audio stream. Only
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then is the reference to the audio manager released, so we wait for the
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // whole thing to be torn down before we finally uninitialize the io thread.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForAudioManagerCompletion();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcess::current()->io_message_loop()->PostTask(FROM_HERE,
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&MAYBE_WebRTCAudioDeviceTest::UninitializeIOThread,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained((this))));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForIOThreadCompletion();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_process_.reset();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_stream_manager_.reset();
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mirroring_manager_.reset();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererWebKitPlatformSupportImpl::SetSandboxEnabledForTesting(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sandbox_was_enabled_);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool MAYBE_WebRTCAudioDeviceTest::Send(IPC::Message* message) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return channel_->Send(message);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::SetAudioHardwareConfig(
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media::AudioHardwareConfig* hardware_config) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  audio_hardware_config_ = hardware_config;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_refptr<WebRtcAudioRenderer>
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MAYBE_WebRTCAudioDeviceTest::CreateDefaultWebRtcAudioRenderer(
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int render_view_id) {
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  media::AudioHardwareConfig* hardware_config =
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      RenderThreadImpl::current()->GetAudioHardwareConfig();
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int sample_rate = hardware_config->GetOutputSampleRate();
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int frames_per_buffer = hardware_config->GetOutputBufferSize();
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return new WebRtcAudioRenderer(render_view_id, 0, sample_rate,
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 frames_per_buffer);
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::InitializeIOThread(const char* thread_name) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We initialize COM (STA) on our IO thread as is done in Chrome.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See BrowserProcessSubThread::Init.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialize_com_.reset(new base::win::ScopedCOMInitializer());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the current thread as the IO thread.
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  io_thread_.reset(
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new TestBrowserThread(BrowserThread::IO, base::MessageLoop::current()));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate our resource context.
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_request_context_.reset(new net::TestURLRequestContext());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRTCResourceContext* resource_context =
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<MockRTCResourceContext*>(resource_context_.get());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_context->set_request_context(test_request_context_.get());
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create our own AudioManager, AudioMirroringManager and MediaStreamManager.
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  audio_manager_.reset(media::AudioManager::CreateForTesting());
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mirroring_manager_.reset(new AudioMirroringManager());
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_input_devices_ = audio_manager_->HasAudioInputDevices();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_output_devices_ = audio_manager_->HasAudioOutputDevices();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an IPC channel that handles incoming messages on the IO thread.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateChannel(thread_name);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::UninitializeIOThread() {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_context_.reset();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_request_context_.reset();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialize_com_.reset();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  audio_manager_.reset();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::CreateChannel(const char* name) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  channel_.reset(new IPC::Channel(name, IPC::Channel::MODE_SERVER, this));
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(channel_->Connect());
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const int kRenderProcessId = 1;
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  audio_render_host_ = new TestAudioRendererHost(kRenderProcessId,
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 audio_manager_.get(),
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 mirroring_manager_.get(),
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 MediaInternals::GetInstance(),
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 media_stream_manager_.get(),
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 channel_.get());
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  audio_render_host_->set_peer_pid_for_testing(base::GetCurrentProcId());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  audio_input_renderer_host_ =
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      new TestAudioInputRendererHost(audio_manager_.get(),
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     media_stream_manager_.get(),
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     mirroring_manager_.get(),
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     NULL,
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     channel_.get());
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  audio_input_renderer_host_->set_peer_pid_for_testing(
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::GetCurrentProcId());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::DestroyChannel() {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_render_host_->OnChannelClosing();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_render_host_->OnFilterRemoved();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_input_renderer_host_->OnChannelClosing();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_input_renderer_host_->OnFilterRemoved();
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  audio_render_host_->ResetChannel();
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  audio_input_renderer_host_->ResetChannel();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel_.reset();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_render_host_ = NULL;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_input_renderer_host_ = NULL;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::OnGetAudioHardwareConfig(
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AudioParameters* input_params, AudioParameters* output_params) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(audio_hardware_config_);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *input_params = audio_hardware_config_->GetInputConfig();
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_params = audio_hardware_config_->GetOutputConfig();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC::Listener implementation.
359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool MAYBE_WebRTCAudioDeviceTest::OnMessageReceived(
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const IPC::Message& message) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_thread_) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::ChannelProxy::MessageFilter* filter =
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_thread_->audio_input_message_filter();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filter->OnMessageReceived(message))
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    filter = render_thread_->audio_message_filter();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filter->OnMessageReceived(message))
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (audio_render_host_.get()) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool message_was_ok = false;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (audio_render_host_->OnMessageReceived(message, &message_was_ok))
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (audio_input_renderer_host_.get()) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool message_was_ok = false;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (audio_input_renderer_host_->OnMessageReceived(message, &message_was_ok))
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled ALLOW_UNUSED = true;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool message_is_ok = true;
386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(MAYBE_WebRTCAudioDeviceTest, message, message_is_ok)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_GetAudioHardwareConfig,
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnGetAudioHardwareConfig)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP_EX()
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(message_is_ok);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Posts a final task to the IO message loop and waits for completion.
398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::WaitForIOThreadCompletion() {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForMessageLoopCompletion(
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ChildProcess::current()->io_message_loop()->message_loop_proxy().get());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::WaitForAudioManagerCompletion() {
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (audio_manager_)
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WaitForMessageLoopCompletion(audio_manager_->GetMessageLoop().get());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MAYBE_WebRTCAudioDeviceTest::WaitForMessageLoopCompletion(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::MessageLoopProxy* loop) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WaitableEvent* event = new base::WaitableEvent(false, false);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop->PostTask(FROM_HERE, base::Bind(&base::WaitableEvent::Signal,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(event)));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->TimedWait(TestTimeouts::action_max_timeout())) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete event;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't delete the event object in case the message ever gets processed.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we do, we will crash the test process.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE() << "Failed to wait for message loop";
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)std::string MAYBE_WebRTCAudioDeviceTest::GetTestDataPath(
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::StringType& file_name) {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(DIR_TEST_DATA, &path));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(file_name);
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(path));
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WideToUTF8(path.value());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return path.value();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebRTCTransportImpl::WebRTCTransportImpl(webrtc::VoENetwork* network)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : network_(network) {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebRTCTransportImpl::~WebRTCTransportImpl() {}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebRTCTransportImpl::SendPacket(int channel, const void* data, int len) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return network_->ReceivedRTPPacket(channel, data, len);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebRTCTransportImpl::SendRTCPPacket(int channel, const void* data,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int len) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return network_->ReceivedRTCPPacket(channel, data, len);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
451