/* * libjingle * Copyright 2012 Google Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // This file contains mock implementations of observers used in PeerConnection. #ifndef TALK_APP_WEBRTC_TEST_MOCKPEERCONNECTIONOBSERVERS_H_ #define TALK_APP_WEBRTC_TEST_MOCKPEERCONNECTIONOBSERVERS_H_ #include #include "talk/app/webrtc/datachannelinterface.h" namespace webrtc { class MockCreateSessionDescriptionObserver : public webrtc::CreateSessionDescriptionObserver { public: MockCreateSessionDescriptionObserver() : called_(false), result_(false) {} virtual ~MockCreateSessionDescriptionObserver() {} virtual void OnSuccess(SessionDescriptionInterface* desc) { called_ = true; result_ = true; desc_.reset(desc); } virtual void OnFailure(const std::string& error) { called_ = true; result_ = false; } bool called() const { return called_; } bool result() const { return result_; } SessionDescriptionInterface* release_desc() { return desc_.release(); } private: bool called_; bool result_; rtc::scoped_ptr desc_; }; class MockSetSessionDescriptionObserver : public webrtc::SetSessionDescriptionObserver { public: MockSetSessionDescriptionObserver() : called_(false), result_(false) {} virtual ~MockSetSessionDescriptionObserver() {} virtual void OnSuccess() { called_ = true; result_ = true; } virtual void OnFailure(const std::string& error) { called_ = true; result_ = false; } bool called() const { return called_; } bool result() const { return result_; } private: bool called_; bool result_; }; class MockDataChannelObserver : public webrtc::DataChannelObserver { public: explicit MockDataChannelObserver(webrtc::DataChannelInterface* channel) : channel_(channel), received_message_count_(0) { channel_->RegisterObserver(this); state_ = channel_->state(); } virtual ~MockDataChannelObserver() { channel_->UnregisterObserver(); } virtual void OnStateChange() { state_ = channel_->state(); } virtual void OnMessage(const DataBuffer& buffer) { last_message_.assign(buffer.data.data(), buffer.data.length()); ++received_message_count_; } bool IsOpen() const { return state_ == DataChannelInterface::kOpen; } const std::string& last_message() const { return last_message_; } size_t received_message_count() const { return received_message_count_; } private: rtc::scoped_refptr channel_; DataChannelInterface::DataState state_; std::string last_message_; size_t received_message_count_; }; class MockStatsObserver : public webrtc::StatsObserver { public: MockStatsObserver() : called_(false), stats_() {} virtual ~MockStatsObserver() {} virtual void OnComplete(const StatsReports& reports) { ASSERT(!called_); called_ = true; memset(&stats_, sizeof(stats_), 0); stats_.number_of_reports = reports.size(); for (const auto* r : reports) { if (r->type == StatsReport::kStatsReportTypeSsrc) { GetIntValue(r, StatsReport::kStatsValueNameAudioOutputLevel, &stats_.audio_output_level); GetIntValue(r, StatsReport::kStatsValueNameAudioInputLevel, &stats_.audio_input_level); GetIntValue(r, StatsReport::kStatsValueNameBytesReceived, &stats_.bytes_received); GetIntValue(r, StatsReport::kStatsValueNameBytesSent, &stats_.bytes_sent); } else if (r->type == StatsReport::kStatsReportTypeBwe) { GetIntValue(r, StatsReport::kStatsValueNameAvailableReceiveBandwidth, &stats_.available_receive_bandwidth); } } } bool called() const { return called_; } size_t number_of_reports() const { return stats_.number_of_reports; } int AudioOutputLevel() const { ASSERT(called_); return stats_.audio_output_level; } int AudioInputLevel() const { ASSERT(called_); return stats_.audio_input_level; } int BytesReceived() const { ASSERT(called_); return stats_.bytes_received; } int BytesSent() const { ASSERT(called_); return stats_.bytes_sent; } int AvailableReceiveBandwidth() const { ASSERT(called_); return stats_.available_receive_bandwidth; } private: bool GetIntValue(const StatsReport* report, StatsReport::StatsValueName name, int* value) { for (const auto& v : report->values()) { if (v->name == name) { *value = rtc::FromString(v->value); return true; } } return false; } bool called_; struct { size_t number_of_reports; int audio_output_level; int audio_input_level; int bytes_received; int bytes_sent; int available_receive_bandwidth; } stats_; }; } // namespace webrtc #endif // TALK_APP_WEBRTC_TEST_MOCKPEERCONNECTIONOBSERVERS_H_