| Index: media/audio/virtual_audio_input_stream_unittest.cc
 | 
| diff --git a/media/audio/virtual_audio_input_stream_unittest.cc b/media/audio/virtual_audio_input_stream_unittest.cc
 | 
| index 144ce8216f13decc1177303dc3af4b17fb569773..d444cf70d4af4d4d01bd067a67ec52443e422297 100644
 | 
| --- a/media/audio/virtual_audio_input_stream_unittest.cc
 | 
| +++ b/media/audio/virtual_audio_input_stream_unittest.cc
 | 
| @@ -97,10 +97,11 @@ class TestAudioSource : public SineWaveAudioSource {
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| -class VirtualAudioInputStreamTest : public testing::Test {
 | 
| +class VirtualAudioInputStreamTest : public testing::TestWithParam<bool> {
 | 
|   public:
 | 
|    VirtualAudioInputStreamTest()
 | 
|        : audio_thread_(new base::Thread("AudioThread")),
 | 
| +        worker_thread_(new base::Thread("AudioWorkerThread")),
 | 
|          stream_(NULL),
 | 
|          closed_stream_(false, false) {
 | 
|      audio_thread_->Start();
 | 
| @@ -115,8 +116,9 @@ class VirtualAudioInputStreamTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void Create() {
 | 
| +    const bool worker_is_separate_thread = GetParam();
 | 
|      stream_ = new VirtualAudioInputStream(
 | 
| -        kParams, audio_message_loop_,
 | 
| +        kParams, GetWorkerLoop(worker_is_separate_thread),
 | 
|          base::Bind(&base::DeletePointer<VirtualAudioInputStream>));
 | 
|      stream_->Open();
 | 
|    }
 | 
| @@ -134,7 +136,6 @@ class VirtualAudioInputStreamTest : public testing::Test {
 | 
|      ASSERT_TRUE(!!stream_);
 | 
|      AudioOutputStream* const output_stream = new VirtualAudioOutputStream(
 | 
|          kParams,
 | 
| -        audio_message_loop_.get(),
 | 
|          stream_,
 | 
|          base::Bind(&base::DeletePointer<VirtualAudioOutputStream>));
 | 
|      output_streams_.push_back(output_stream);
 | 
| @@ -212,6 +213,19 @@ class VirtualAudioInputStreamTest : public testing::Test {
 | 
|      return audio_message_loop_;
 | 
|    }
 | 
|  
 | 
| +  const scoped_refptr<base::MessageLoopProxy>& GetWorkerLoop(
 | 
| +      bool worker_is_separate_thread) {
 | 
| +    if (worker_is_separate_thread) {
 | 
| +      if (!worker_thread_->IsRunning()) {
 | 
| +        worker_thread_->Start();
 | 
| +        worker_message_loop_ = worker_thread_->message_loop_proxy();
 | 
| +      }
 | 
| +      return worker_message_loop_;
 | 
| +    } else {
 | 
| +      return audio_message_loop_;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
|   private:
 | 
|    void SyncWithAudioThread() {
 | 
|      base::WaitableEvent done(false, false);
 | 
| @@ -223,6 +237,8 @@ class VirtualAudioInputStreamTest : public testing::Test {
 | 
|  
 | 
|    scoped_ptr<base::Thread> audio_thread_;
 | 
|    scoped_refptr<base::MessageLoopProxy> audio_message_loop_;
 | 
| +  scoped_ptr<base::Thread> worker_thread_;
 | 
| +  scoped_refptr<base::MessageLoopProxy> worker_message_loop_;
 | 
|  
 | 
|    VirtualAudioInputStream* stream_;
 | 
|    MockInputCallback input_callback_;
 | 
| @@ -240,13 +256,13 @@ class VirtualAudioInputStreamTest : public testing::Test {
 | 
|        FROM_HERE, base::Bind(&VirtualAudioInputStreamTest::method,  \
 | 
|                              base::Unretained(this)))
 | 
|  
 | 
| -TEST_F(VirtualAudioInputStreamTest, CreateAndClose) {
 | 
| +TEST_P(VirtualAudioInputStreamTest, CreateAndClose) {
 | 
|    RUN_ON_AUDIO_THREAD(Create);
 | 
|    RUN_ON_AUDIO_THREAD(Close);
 | 
|    WaitUntilClosed();
 | 
|  }
 | 
|  
 | 
| -TEST_F(VirtualAudioInputStreamTest, NoOutputs) {
 | 
| +TEST_P(VirtualAudioInputStreamTest, NoOutputs) {
 | 
|    RUN_ON_AUDIO_THREAD(Create);
 | 
|    RUN_ON_AUDIO_THREAD(Start);
 | 
|    WaitForDataToFlow();
 | 
| @@ -255,7 +271,7 @@ TEST_F(VirtualAudioInputStreamTest, NoOutputs) {
 | 
|    WaitUntilClosed();
 | 
|  }
 | 
|  
 | 
| -TEST_F(VirtualAudioInputStreamTest, SingleOutput) {
 | 
| +TEST_P(VirtualAudioInputStreamTest, SingleOutput) {
 | 
|    RUN_ON_AUDIO_THREAD(Create);
 | 
|    RUN_ON_AUDIO_THREAD(Start);
 | 
|    RUN_ON_AUDIO_THREAD(CreateAndStartOneOutputStream);
 | 
| @@ -266,7 +282,7 @@ TEST_F(VirtualAudioInputStreamTest, SingleOutput) {
 | 
|    WaitUntilClosed();
 | 
|  }
 | 
|  
 | 
| -TEST_F(VirtualAudioInputStreamTest, SingleOutputPausedAndRestarted) {
 | 
| +TEST_P(VirtualAudioInputStreamTest, SingleOutputPausedAndRestarted) {
 | 
|    RUN_ON_AUDIO_THREAD(Create);
 | 
|    RUN_ON_AUDIO_THREAD(Start);
 | 
|    RUN_ON_AUDIO_THREAD(CreateAndStartOneOutputStream);
 | 
| @@ -280,7 +296,7 @@ TEST_F(VirtualAudioInputStreamTest, SingleOutputPausedAndRestarted) {
 | 
|    WaitUntilClosed();
 | 
|  }
 | 
|  
 | 
| -TEST_F(VirtualAudioInputStreamTest, MultipleOutputs) {
 | 
| +TEST_P(VirtualAudioInputStreamTest, MultipleOutputs) {
 | 
|    RUN_ON_AUDIO_THREAD(Create);
 | 
|    RUN_ON_AUDIO_THREAD(Start);
 | 
|    RUN_ON_AUDIO_THREAD(CreateAndStartOneOutputStream);
 | 
| @@ -303,7 +319,7 @@ TEST_F(VirtualAudioInputStreamTest, MultipleOutputs) {
 | 
|  }
 | 
|  
 | 
|  // A combination of all of the above tests with many output streams.
 | 
| -TEST_F(VirtualAudioInputStreamTest, ComprehensiveTest) {
 | 
| +TEST_P(VirtualAudioInputStreamTest, ComprehensiveTest) {
 | 
|    static const int kNumOutputs = 8;
 | 
|    static const int kHalfNumOutputs = kNumOutputs / 2;
 | 
|    static const int kPauseIterations = 5;
 | 
| @@ -335,4 +351,8 @@ TEST_F(VirtualAudioInputStreamTest, ComprehensiveTest) {
 | 
|    WaitUntilClosed();
 | 
|  }
 | 
|  
 | 
| +INSTANTIATE_TEST_CASE_P(SingleVersusMultithreaded,
 | 
| +                        VirtualAudioInputStreamTest,
 | 
| +                        ::testing::Values(false, true));
 | 
| +
 | 
|  }  // namespace media
 | 
| 
 |