blob: d28bd059678c0c898929d44b3f13901e3671cf7d [file] [log] [blame]
// 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 <utility>
#include <vector>
#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<interfaces::ProxyResolverErrorObserver> request);
EventWaiter<Event>& event_waiter() { return event_waiter_; }
const std::vector<std::pair<int, base::string16>>& errors() const {
return errors_;
}
private:
void OnPacScriptError(int32_t line_number,
const mojo::String& error) override;
mojo::Binding<interfaces::ProxyResolverErrorObserver> binding_;
EventWaiter<Event> event_waiter_;
std::vector<std::pair<int, base::string16>> errors_;
DISALLOW_COPY_AND_ASSIGN(ErrorObserverClient);
};
ErrorObserverClient::ErrorObserverClient(
mojo::InterfaceRequest<interfaces::ProxyResolverErrorObserver> 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<base::string16>()));
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<ErrorObserverClient> client_;
scoped_ptr<ProxyResolverErrorObserver> 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