Home | History | Annotate | Download | only in sound
      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.
     22   virtual bool Init() {
     23     return false;
     24   }
     25 
     26   static SoundSystemInterface *Create() {
     27     return new NeverFailsToFailSoundSystem();
     28   }
     29 };
     30 
     31 class InitCheckingSoundSystem1 : public NullSoundSystem {
     32  public:
     33   // Overrides superclass.
     34   virtual bool Init() {
     35     created_ = true;
     36     return true;
     37   }
     38 
     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.
     51   virtual bool Init() {
     52     created_ = true;
     53     return true;
     54   }
     55 
     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:
     67   virtual ~DeletionCheckingSoundSystem1() {
     68     deleted_ = true;
     69   }
     70 
     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:
     82   virtual ~DeletionCheckingSoundSystem2() {
     83     deleted_ = true;
     84   }
     85 
     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:
     97   virtual ~DeletionCheckingSoundSystem3() {
     98     deleted_ = true;
     99   }
    100 
    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 
    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 
    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 
    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 
    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 
    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 
    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