12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/media/capture/audio_mirroring_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <utility>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_thread_impl.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_parameters.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::AudioOutputStream;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::AudioParameters;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing testing::Invoke;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::NotNull;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Ref;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Return;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::ReturnRef;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockDiverter : public AudioMirroringManager::Diverter {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(GetAudioParameters, const AudioParameters&());
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(StartDiverting, void(AudioOutputStream*));
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(StopDiverting, void());
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockMirroringDestination
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public AudioMirroringManager::MirroringDestination {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef AudioMirroringManager::SourceFrameRef SourceFrameRef;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockMirroringDestination(int render_process_id, int render_frame_id)
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : render_process_id_(render_process_id),
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        render_frame_id_(render_frame_id),
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        query_count_(0) {}
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD2(QueryForMatches,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               void(const std::set<SourceFrameRef>& candidates,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const MatchesCallback& results_callback));
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(AddInput,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               media::AudioOutputStream*(const media::AudioParameters& params));
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SimulateQuery(const std::set<SourceFrameRef>& candidates,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const MatchesCallback& results_callback) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++query_count_;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::set<SourceFrameRef> result;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (candidates.find(SourceFrameRef(render_process_id_, render_frame_id_)) !=
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            candidates.end()) {
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result.insert(SourceFrameRef(render_process_id_, render_frame_id_));
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    results_callback.Run(result);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  media::AudioOutputStream* SimulateAddInput(
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const media::AudioParameters& params) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static AudioOutputStream* const kNonNullPointer =
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reinterpret_cast<AudioOutputStream*>(0x11111110);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return kNonNullPointer;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int query_count() const {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return query_count_;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int render_process_id_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int render_frame_id_;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int query_count_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AudioMirroringManagerTest : public testing::Test {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef AudioMirroringManager::Diverter Diverter;
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef AudioMirroringManager::MirroringDestination MirroringDestination;
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef AudioMirroringManager::StreamRoutes StreamRoutes;
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioMirroringManagerTest()
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : io_thread_(BrowserThread::IO, &message_loop_),
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params_(AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AudioParameters::kAudioCDSampleRate, 16,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AudioParameters::kAudioCDSampleRate / 10) {}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* CreateStream(
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int render_process_id, int render_frame_id, int expected_times_diverted) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockDiverter* const diverter = new MockDiverter();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (expected_times_diverted > 0) {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(*diverter, GetAudioParameters())
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Times(expected_times_diverted)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .WillRepeatedly(ReturnRef(params_));
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(*diverter, StartDiverting(NotNull()))
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Times(expected_times_diverted);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(*diverter, StopDiverting())
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Times(expected_times_diverted);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mirroring_manager_.AddDiverter(
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        render_process_id, render_frame_id, diverter);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return diverter;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void KillStream(MockDiverter* diverter) {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mirroring_manager_.RemoveDiverter(diverter);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete diverter;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void StartMirroringTo(const scoped_ptr<MockMirroringDestination>& dest,
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        int expected_inputs_added) {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_CALL(*dest, QueryForMatches(_, _))
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .WillRepeatedly(Invoke(dest.get(),
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               &MockMirroringDestination::SimulateQuery));
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (expected_inputs_added > 0) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(*dest, AddInput(Ref(params_)))
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Times(expected_inputs_added)
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          .WillRepeatedly(Invoke(dest.get(),
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 &MockMirroringDestination::SimulateAddInput))
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          .RetiresOnSaturation();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mirroring_manager_.StartMirroring(dest.get());
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void StopMirroringTo(const scoped_ptr<MockMirroringDestination>& dest) {
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mirroring_manager_.StopMirroring(dest.get());
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int CountStreamsDivertedTo(
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_ptr<MockMirroringDestination>& dest) const {
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int count = 0;
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (StreamRoutes::const_iterator it = mirroring_manager_.routes_.begin();
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         it != mirroring_manager_.routes_.end(); ++it) {
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (it->destination == dest.get())
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ++count;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return count;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ExpectNoLongerManagingAnything() const {
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(mirroring_manager_.routes_.empty());
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(mirroring_manager_.sessions_.empty());
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoopForIO message_loop_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThreadImpl io_thread_;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioParameters params_;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioMirroringManager mirroring_manager_;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioMirroringManagerTest);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kRenderProcessId = 123;
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kRenderFrameId = 456;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kAnotherRenderProcessId = 789;
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kAnotherRenderFrameId = 1234;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kYetAnotherRenderProcessId = 4560;
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kYetAnotherRenderFrameId = 7890;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioMirroringManagerTest, MirroringSessionOfNothing) {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 0);
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, destination->query_count());
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioMirroringManagerTest, TwoMirroringSessionsOfNothing) {
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 0);
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, destination->query_count());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> another_destination(
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kAnotherRenderProcessId,
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   kAnotherRenderFrameId));
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(another_destination, 0);
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(another_destination);
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, another_destination->query_count());
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that a mirroring session starts after, and ends before, a stream that
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// will be diverted to it.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioMirroringManagerTest, StreamLifetimeAroundMirroringSession) {
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockDiverter* const stream =
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that a mirroring session starts before, and ends after, a stream that
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// will be diverted to it.
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioMirroringManagerTest, StreamLifetimeWithinMirroringSession) {
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, destination->query_count());
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockDiverter* const stream =
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that a stream is diverted correctly as two mirroring sessions come and
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// go.
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(AudioMirroringManagerTest, StreamLifetimeAcrossTwoMirroringSessions) {
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockDiverter* const stream =
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 2);
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> second_destination(
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(second_destination, 1);
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, second_destination->query_count());
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(second_destination));
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(second_destination);
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, second_destination->query_count());
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(second_destination));
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, second_destination->query_count());
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(second_destination));
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that a stream does not flip-flop between two destinations that are a
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// match for it.
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(AudioMirroringManagerTest, StreamDivertingStickyToOneDestination_1) {
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockDiverter* const stream =
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 2);
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> replacement_destination(
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(replacement_destination, 1);
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, replacement_destination->query_count());
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, replacement_destination->query_count());
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(replacement_destination));
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(replacement_destination);
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, replacement_destination->query_count());
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, replacement_destination->query_count());
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Same as StreamDivertingStickyToOneDestination_1, with a different order of
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// operations that should have the same effects.
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(AudioMirroringManagerTest, StreamDivertingStickyToOneDestination_2) {
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockDiverter* const stream =
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 2);
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> replacement_destination(
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(replacement_destination, 1);
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, replacement_destination->query_count());
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, replacement_destination->query_count());
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(replacement_destination));
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, replacement_destination->query_count());
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(replacement_destination);
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, replacement_destination->query_count());
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Same as StreamDivertingStickyToOneDestination_1, except that the stream is
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// killed before the first destination is stopped.  Therefore, the second
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// destination should never see the stream.
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(AudioMirroringManagerTest, StreamDivertingStickyToOneDestination_3) {
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockDiverter* const stream =
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> replacement_destination(
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(replacement_destination, 0);
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, replacement_destination->query_count());
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, replacement_destination->query_count());
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, replacement_destination->query_count());
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(replacement_destination);
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, replacement_destination->query_count());
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(replacement_destination));
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that multiple streams are diverted/mixed to one destination.
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioMirroringManagerTest, MultipleStreamsInOneMirroringSession) {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* const stream1 =
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 3);
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* const stream2 =
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, destination->query_count());
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, CountStreamsDivertedTo(destination));
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* const stream3 =
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, CountStreamsDivertedTo(destination));
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream2);
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, CountStreamsDivertedTo(destination));
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream3);
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream1);
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A random interleaving of operations for three separate targets, each of which
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// has one stream mirrored to one destination.
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioMirroringManagerTest, ThreeSeparateMirroringSessions) {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* const stream =
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kRenderProcessId, kRenderFrameId, 1);
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> destination(
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kRenderProcessId, kRenderFrameId));
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(destination, 1);
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> another_destination(
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kAnotherRenderProcessId,
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   kAnotherRenderFrameId));
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(another_destination, 1);
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, destination->query_count());
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, another_destination->query_count());
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* const another_stream =
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kAnotherRenderProcessId, kAnotherRenderFrameId, 1);
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, destination->query_count());
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(destination));
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, another_destination->query_count());
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(another_destination));
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(stream);
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, destination->query_count());
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, another_destination->query_count());
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(another_destination));
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDiverter* const yet_another_stream =
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateStream(kYetAnotherRenderProcessId, kYetAnotherRenderFrameId, 1);
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(another_destination));
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_ptr<MockMirroringDestination> yet_another_destination(
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new MockMirroringDestination(kYetAnotherRenderProcessId,
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   kYetAnotherRenderFrameId));
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartMirroringTo(yet_another_destination, 1);
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, destination->query_count());
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(another_destination));
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, yet_another_destination->query_count());
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(yet_another_destination));
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(another_destination);
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(4, destination->query_count());
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, yet_another_destination->query_count());
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, CountStreamsDivertedTo(yet_another_destination));
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(yet_another_destination);
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(5, destination->query_count());
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, yet_another_destination->query_count());
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(yet_another_destination));
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StopMirroringTo(destination);
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(5, destination->query_count());
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, yet_another_destination->query_count());
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(yet_another_destination));
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(another_stream);
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(5, destination->query_count());
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, yet_another_destination->query_count());
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(yet_another_destination));
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KillStream(yet_another_stream);
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(5, destination->query_count());
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(destination));
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, another_destination->query_count());
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(another_destination));
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, yet_another_destination->query_count());
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, CountStreamsDivertedTo(yet_another_destination));
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectNoLongerManagingAnything();
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
555