1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/sound/automaticallychosensoundsystem.h"
12
13 #include "webrtc/base/arraysize.h"
14 #include "webrtc/base/gunit.h"
15 #include "webrtc/sound/nullsoundsystem.h"
16
17 namespace rtc {
18
19 class NeverFailsToFailSoundSystem : public NullSoundSystem {
20 public:
21 // Overrides superclass.
Init()22 virtual bool Init() {
23 return false;
24 }
25
Create()26 static SoundSystemInterface *Create() {
27 return new NeverFailsToFailSoundSystem();
28 }
29 };
30
31 class InitCheckingSoundSystem1 : public NullSoundSystem {
32 public:
33 // Overrides superclass.
Init()34 virtual bool Init() {
35 created_ = true;
36 return true;
37 }
38
Create()39 static SoundSystemInterface *Create() {
40 return new InitCheckingSoundSystem1();
41 }
42
43 static bool created_;
44 };
45
46 bool InitCheckingSoundSystem1::created_ = false;
47
48 class InitCheckingSoundSystem2 : public NullSoundSystem {
49 public:
50 // Overrides superclass.
Init()51 virtual bool Init() {
52 created_ = true;
53 return true;
54 }
55
Create()56 static SoundSystemInterface *Create() {
57 return new InitCheckingSoundSystem2();
58 }
59
60 static bool created_;
61 };
62
63 bool InitCheckingSoundSystem2::created_ = false;
64
65 class DeletionCheckingSoundSystem1 : public NeverFailsToFailSoundSystem {
66 public:
~DeletionCheckingSoundSystem1()67 virtual ~DeletionCheckingSoundSystem1() {
68 deleted_ = true;
69 }
70
Create()71 static SoundSystemInterface *Create() {
72 return new DeletionCheckingSoundSystem1();
73 }
74
75 static bool deleted_;
76 };
77
78 bool DeletionCheckingSoundSystem1::deleted_ = false;
79
80 class DeletionCheckingSoundSystem2 : public NeverFailsToFailSoundSystem {
81 public:
~DeletionCheckingSoundSystem2()82 virtual ~DeletionCheckingSoundSystem2() {
83 deleted_ = true;
84 }
85
Create()86 static SoundSystemInterface *Create() {
87 return new DeletionCheckingSoundSystem2();
88 }
89
90 static bool deleted_;
91 };
92
93 bool DeletionCheckingSoundSystem2::deleted_ = false;
94
95 class DeletionCheckingSoundSystem3 : public NullSoundSystem {
96 public:
~DeletionCheckingSoundSystem3()97 virtual ~DeletionCheckingSoundSystem3() {
98 deleted_ = true;
99 }
100
Create()101 static SoundSystemInterface *Create() {
102 return new DeletionCheckingSoundSystem3();
103 }
104
105 static bool deleted_;
106 };
107
108 bool DeletionCheckingSoundSystem3::deleted_ = false;
109
110 extern const SoundSystemCreator kSingleSystemFailingCreators[] = {
111 &NeverFailsToFailSoundSystem::Create,
112 };
113
TEST(AutomaticallyChosenSoundSystem,SingleSystemFailing)114 TEST(AutomaticallyChosenSoundSystem, SingleSystemFailing) {
115 AutomaticallyChosenSoundSystem<
116 kSingleSystemFailingCreators,
117 arraysize(kSingleSystemFailingCreators)> sound_system;
118 EXPECT_FALSE(sound_system.Init());
119 }
120
121 extern const SoundSystemCreator kSingleSystemSucceedingCreators[] = {
122 &NullSoundSystem::Create,
123 };
124
TEST(AutomaticallyChosenSoundSystem,SingleSystemSucceeding)125 TEST(AutomaticallyChosenSoundSystem, SingleSystemSucceeding) {
126 AutomaticallyChosenSoundSystem<
127 kSingleSystemSucceedingCreators,
128 arraysize(kSingleSystemSucceedingCreators)> sound_system;
129 EXPECT_TRUE(sound_system.Init());
130 }
131
132 extern const SoundSystemCreator
133 kFailedFirstSystemResultsInUsingSecondCreators[] = {
134 &NeverFailsToFailSoundSystem::Create,
135 &NullSoundSystem::Create,
136 };
137
TEST(AutomaticallyChosenSoundSystem,FailedFirstSystemResultsInUsingSecond)138 TEST(AutomaticallyChosenSoundSystem, FailedFirstSystemResultsInUsingSecond) {
139 AutomaticallyChosenSoundSystem<
140 kFailedFirstSystemResultsInUsingSecondCreators,
141 arraysize(kFailedFirstSystemResultsInUsingSecondCreators)> sound_system;
142 EXPECT_TRUE(sound_system.Init());
143 }
144
145 extern const SoundSystemCreator kEarlierEntriesHavePriorityCreators[] = {
146 &InitCheckingSoundSystem1::Create,
147 &InitCheckingSoundSystem2::Create,
148 };
149
TEST(AutomaticallyChosenSoundSystem,EarlierEntriesHavePriority)150 TEST(AutomaticallyChosenSoundSystem, EarlierEntriesHavePriority) {
151 AutomaticallyChosenSoundSystem<
152 kEarlierEntriesHavePriorityCreators,
153 arraysize(kEarlierEntriesHavePriorityCreators)> sound_system;
154 InitCheckingSoundSystem1::created_ = false;
155 InitCheckingSoundSystem2::created_ = false;
156 EXPECT_TRUE(sound_system.Init());
157 EXPECT_TRUE(InitCheckingSoundSystem1::created_);
158 EXPECT_FALSE(InitCheckingSoundSystem2::created_);
159 }
160
161 extern const SoundSystemCreator kManySoundSystemsCreators[] = {
162 &NullSoundSystem::Create,
163 &NullSoundSystem::Create,
164 &NullSoundSystem::Create,
165 &NullSoundSystem::Create,
166 &NullSoundSystem::Create,
167 &NullSoundSystem::Create,
168 &NullSoundSystem::Create,
169 };
170
TEST(AutomaticallyChosenSoundSystem,ManySoundSystems)171 TEST(AutomaticallyChosenSoundSystem, ManySoundSystems) {
172 AutomaticallyChosenSoundSystem<
173 kManySoundSystemsCreators,
174 arraysize(kManySoundSystemsCreators)> sound_system;
175 EXPECT_TRUE(sound_system.Init());
176 }
177
178 extern const SoundSystemCreator kDeletesAllCreatedSoundSystemsCreators[] = {
179 &DeletionCheckingSoundSystem1::Create,
180 &DeletionCheckingSoundSystem2::Create,
181 &DeletionCheckingSoundSystem3::Create,
182 };
183
TEST(AutomaticallyChosenSoundSystem,DeletesAllCreatedSoundSystems)184 TEST(AutomaticallyChosenSoundSystem, DeletesAllCreatedSoundSystems) {
185 typedef AutomaticallyChosenSoundSystem<
186 kDeletesAllCreatedSoundSystemsCreators,
187 arraysize(kDeletesAllCreatedSoundSystemsCreators)> TestSoundSystem;
188 TestSoundSystem *sound_system = new TestSoundSystem();
189 DeletionCheckingSoundSystem1::deleted_ = false;
190 DeletionCheckingSoundSystem2::deleted_ = false;
191 DeletionCheckingSoundSystem3::deleted_ = false;
192 EXPECT_TRUE(sound_system->Init());
193 delete sound_system;
194 EXPECT_TRUE(DeletionCheckingSoundSystem1::deleted_);
195 EXPECT_TRUE(DeletionCheckingSoundSystem2::deleted_);
196 EXPECT_TRUE(DeletionCheckingSoundSystem3::deleted_);
197 }
198
199 } // namespace rtc
200