128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/*
228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle
35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2013 Google Inc.
428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     this list of conditions and the following disclaimer.
1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     and/or other materials provided with the distribution.
1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     derived from this software without specific prior written permission.
1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */
2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/localaudiosource.h"
2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <string>
3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <vector>
3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h"
3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h"
3528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakevideorenderer.h"
36a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h"
3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::LocalAudioSource;
3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaConstraintsInterface;
4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaSourceInterface;
4197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgusing webrtc::PeerConnectionFactoryInterface;
4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST(LocalAudioSourceTest, SetValidOptions) {
4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::FakeConstraints constraints;
4570c7fe14ac322a3abac2726d29ae3264b956e3daTommi  constraints.AddMandatory(
4670c7fe14ac322a3abac2726d29ae3264b956e3daTommi      MediaConstraintsInterface::kGoogEchoCancellation, false);
4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddOptional(
48441f6347311bcf2079435c3888d67e1fb321f9f8Henrik Lundin      MediaConstraintsInterface::kExtendedFilterEchoCancellation, true);
491ba344a07060bf57db649299835ec4f093d58d40Bjorn Volcker  constraints.AddOptional(MediaConstraintsInterface::kDAEchoCancellation, true);
5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddOptional(MediaConstraintsInterface::kAutoGainControl, true);
5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddOptional(
5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      MediaConstraintsInterface::kExperimentalAutoGainControl, true);
5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddMandatory(MediaConstraintsInterface::kNoiseSuppression, false);
5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddOptional(MediaConstraintsInterface::kHighpassFilter, true);
551ba344a07060bf57db649299835ec4f093d58d40Bjorn Volcker  constraints.AddOptional(MediaConstraintsInterface::kAecDump, true);
5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
57d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<LocalAudioSource> source =
5897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
5997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                               &constraints);
6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
61be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(false), source->options().echo_cancellation);
62be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(true), source->options().extended_filter_aec);
63be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(true), source->options().delay_agnostic_aec);
64be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(true), source->options().auto_gain_control);
65be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(true), source->options().experimental_agc);
66be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(false), source->options().noise_suppression);
67be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(true), source->options().highpass_filter);
68be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(true), source->options().aec_dump);
6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST(LocalAudioSourceTest, OptionNotSet) {
7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::FakeConstraints constraints;
73d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<LocalAudioSource> source =
7497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
7597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                               &constraints);
76be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(), source->options().highpass_filter);
7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST(LocalAudioSourceTest, MandatoryOverridesOptional) {
8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::FakeConstraints constraints;
8170c7fe14ac322a3abac2726d29ae3264b956e3daTommi  constraints.AddMandatory(
8270c7fe14ac322a3abac2726d29ae3264b956e3daTommi      MediaConstraintsInterface::kGoogEchoCancellation, false);
8370c7fe14ac322a3abac2726d29ae3264b956e3daTommi  constraints.AddOptional(
8470c7fe14ac322a3abac2726d29ae3264b956e3daTommi      MediaConstraintsInterface::kGoogEchoCancellation, true);
8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
86d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<LocalAudioSource> source =
8797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
8897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                               &constraints);
8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
90be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(false), source->options().echo_cancellation);
9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST(LocalAudioSourceTest, InvalidOptional) {
9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::FakeConstraints constraints;
9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddOptional(MediaConstraintsInterface::kHighpassFilter, false);
9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddOptional("invalidKey", false);
9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
98d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<LocalAudioSource> source =
9997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
10097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                               &constraints);
10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(MediaSourceInterface::kLive, source->state());
103be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(false), source->options().highpass_filter);
10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST(LocalAudioSourceTest, InvalidMandatory) {
10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::FakeConstraints constraints;
10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddMandatory(MediaConstraintsInterface::kHighpassFilter, false);
10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  constraints.AddMandatory("invalidKey", false);
11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
111d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<LocalAudioSource> source =
11297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
11397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                               &constraints);
11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
11538d88816e395dfc32b355769f67a6f39c18bd511xians@webrtc.org  EXPECT_EQ(MediaSourceInterface::kLive, source->state());
116be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg  EXPECT_EQ(rtc::Optional<bool>(false), source->options().highpass_filter);
11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
118