// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/proxy/proxy_resolver_error_observer_mojo.h" #include #include #include "base/bind.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/thread.h" #include "mojo/common/common_type_converters.h" #include "net/test/event_waiter.h" #include "testing/gtest/include/gtest/gtest.h" namespace net { namespace { class ErrorObserverClient : public interfaces::ProxyResolverErrorObserver { public: enum Event { ERROR_RECEIVED, }; explicit ErrorObserverClient( mojo::InterfaceRequest request); EventWaiter& event_waiter() { return event_waiter_; } const std::vector>& errors() const { return errors_; } private: void OnPacScriptError(int32_t line_number, const mojo::String& error) override; mojo::Binding binding_; EventWaiter event_waiter_; std::vector> errors_; DISALLOW_COPY_AND_ASSIGN(ErrorObserverClient); }; ErrorObserverClient::ErrorObserverClient( mojo::InterfaceRequest request) : binding_(this, request.Pass()) { } void ErrorObserverClient::OnPacScriptError(int32_t line_number, const mojo::String& error) { errors_.push_back(std::make_pair(line_number, error.To())); event_waiter_.NotifyEvent(ERROR_RECEIVED); } } // namespace class ProxyResolverErrorObserverMojoTest : public testing::Test { public: ProxyResolverErrorObserver& error_observer() { return *error_observer_; } ErrorObserverClient& client() { return *client_; } private: void SetUp() override { interfaces::ProxyResolverErrorObserverPtr error_observer_ptr; client_.reset(new ErrorObserverClient(mojo::GetProxy(&error_observer_ptr))); error_observer_ = ProxyResolverErrorObserverMojo::Create(error_observer_ptr.Pass()); ASSERT_TRUE(error_observer_); } scoped_ptr client_; scoped_ptr error_observer_; }; TEST_F(ProxyResolverErrorObserverMojoTest, NullHandle) { EXPECT_FALSE(ProxyResolverErrorObserverMojo::Create( interfaces::ProxyResolverErrorObserverPtr())); } TEST_F(ProxyResolverErrorObserverMojoTest, ErrorReportedOnMainThread) { base::string16 error(base::ASCIIToUTF16("error message")); error_observer().OnPACScriptError(123, error); client().event_waiter().WaitForEvent(ErrorObserverClient::ERROR_RECEIVED); ASSERT_EQ(1u, client().errors().size()); EXPECT_EQ(123, client().errors()[0].first); EXPECT_EQ(error, client().errors()[0].second); } TEST_F(ProxyResolverErrorObserverMojoTest, ErrorReportedOnAnotherThread) { base::Thread other_thread("error reporting thread"); base::string16 error(base::ASCIIToUTF16("error message")); other_thread.Start(); other_thread.message_loop()->PostTask( FROM_HERE, base::Bind(&ProxyResolverErrorObserver::OnPACScriptError, base::Unretained(&error_observer()), 123, error)); client().event_waiter().WaitForEvent(ErrorObserverClient::ERROR_RECEIVED); ASSERT_EQ(1u, client().errors().size()); EXPECT_EQ(123, client().errors()[0].first); EXPECT_EQ(error, client().errors()[0].second); } } // namespace net