| Index: chrome/common/deprecated/event_sys_unittest.cc
|
| diff --git a/chrome/common/deprecated/event_sys_unittest.cc b/chrome/common/deprecated/event_sys_unittest.cc
|
| deleted file mode 100644
|
| index 941543a6757bd2ba12ef26747121ac99cd93a49f..0000000000000000000000000000000000000000
|
| --- a/chrome/common/deprecated/event_sys_unittest.cc
|
| +++ /dev/null
|
| @@ -1,264 +0,0 @@
|
| -// Copyright (c) 2010 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 <iosfwd>
|
| -#include <sstream>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/port.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "build/build_config.h"
|
| -#include "chrome/common/deprecated/event_sys-inl.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace {
|
| -
|
| -class Pair;
|
| -
|
| -struct TestEvent {
|
| - Pair* source;
|
| - enum {
|
| - A_CHANGED, B_CHANGED, PAIR_BEING_DELETED,
|
| - } what_happened;
|
| - int old_value;
|
| -};
|
| -
|
| -struct TestEventTraits {
|
| - typedef TestEvent EventType;
|
| - static bool IsChannelShutdownEvent(const TestEvent& event) {
|
| - return TestEvent::PAIR_BEING_DELETED == event.what_happened;
|
| - }
|
| -};
|
| -
|
| -class Pair {
|
| - public:
|
| - typedef EventChannel<TestEventTraits> Channel;
|
| - explicit Pair(const std::string& name) : name_(name), a_(0), b_(0) {
|
| - TestEvent shutdown = { this, TestEvent::PAIR_BEING_DELETED, 0 };
|
| - event_channel_ = new Channel(shutdown);
|
| - }
|
| - ~Pair() {
|
| - delete event_channel_;
|
| - }
|
| - void set_a(int n) {
|
| - TestEvent event = { this, TestEvent::A_CHANGED, a_ };
|
| - a_ = n;
|
| - event_channel_->NotifyListeners(event);
|
| - }
|
| - void set_b(int n) {
|
| - TestEvent event = { this, TestEvent::B_CHANGED, b_ };
|
| - b_ = n;
|
| - event_channel_->NotifyListeners(event);
|
| - }
|
| - int a() const { return a_; }
|
| - int b() const { return b_; }
|
| - const std::string& name() { return name_; }
|
| - Channel* event_channel() const { return event_channel_; }
|
| -
|
| - protected:
|
| - const std::string name_;
|
| - int a_;
|
| - int b_;
|
| - Channel* event_channel_;
|
| -};
|
| -
|
| -class EventLogger {
|
| - public:
|
| - explicit EventLogger(std::ostream* out) : out_(out) { }
|
| - ~EventLogger() {
|
| - for (Hookups::iterator i = hookups_.begin(); i != hookups_.end(); ++i)
|
| - delete *i;
|
| - }
|
| -
|
| - void Hookup(const std::string name, Pair::Channel* channel) {
|
| - hookups_.push_back(NewEventListenerHookup(channel, this,
|
| - &EventLogger::HandlePairEvent,
|
| - name));
|
| - }
|
| -
|
| - void HandlePairEvent(const std::string& name, const TestEvent& event) {
|
| - const char* what_changed = NULL;
|
| - int new_value = 0;
|
| - Hookups::iterator dead;
|
| - switch (event.what_happened) {
|
| - case TestEvent::A_CHANGED:
|
| - what_changed = "A";
|
| - new_value = event.source->a();
|
| - break;
|
| - case TestEvent::B_CHANGED:
|
| - what_changed = "B";
|
| - new_value = event.source->b();
|
| - break;
|
| - case TestEvent::PAIR_BEING_DELETED:
|
| - *out_ << name << " heard " << event.source->name() << " being deleted."
|
| - << std::endl;
|
| - return;
|
| - default:
|
| - FAIL() << "Bad event.what_happened: " << event.what_happened;
|
| - break;
|
| - }
|
| - *out_ << name << " heard " << event.source->name() << "'s " << what_changed
|
| - << " change from " << event.old_value
|
| - << " to " << new_value << std::endl;
|
| - }
|
| -
|
| - typedef std::vector<EventListenerHookup*> Hookups;
|
| - Hookups hookups_;
|
| - std::ostream* out_;
|
| -};
|
| -
|
| -const char golden_result[] = "Larry heard Sally's B change from 0 to 2\n"
|
| -"Larry heard Sally's A change from 1 to 3\n"
|
| -"Lewis heard Sam's B change from 0 to 5\n"
|
| -"Larry heard Sally's A change from 3 to 6\n"
|
| -"Larry heard Sally being deleted.\n";
|
| -
|
| -TEST(EventSys, Basic) {
|
| - Pair sally("Sally"), sam("Sam");
|
| - sally.set_a(1);
|
| - std::stringstream log;
|
| - EventLogger logger(&log);
|
| - logger.Hookup("Larry", sally.event_channel());
|
| - sally.set_b(2);
|
| - sally.set_a(3);
|
| - sam.set_a(4);
|
| - logger.Hookup("Lewis", sam.event_channel());
|
| - sam.set_b(5);
|
| - sally.set_a(6);
|
| - // Test that disconnect within callback doesn't deadlock.
|
| - TestEvent event = {&sally, TestEvent::PAIR_BEING_DELETED, 0 };
|
| - sally.event_channel()->NotifyListeners(event);
|
| - sally.set_a(7);
|
| - ASSERT_EQ(log.str(), golden_result);
|
| -}
|
| -
|
| -
|
| -// This goes pretty far beyond the normal use pattern, so don't use
|
| -// ThreadTester as an example of what to do.
|
| -class ThreadTester : public EventListener<TestEvent>,
|
| - public base::PlatformThread::Delegate {
|
| - public:
|
| - explicit ThreadTester(Pair* pair)
|
| - : pair_(pair), remove_event_(&remove_event_mutex_),
|
| - remove_event_bool_(false), completed_(false) {
|
| - pair_->event_channel()->AddListener(this);
|
| - }
|
| - ~ThreadTester() {
|
| - pair_->event_channel()->RemoveListener(this);
|
| - for (size_t i = 0; i < threads_.size(); i++) {
|
| - base::PlatformThread::Join(threads_[i].thread);
|
| - }
|
| - }
|
| -
|
| - struct ThreadInfo {
|
| - base::PlatformThreadHandle thread;
|
| - };
|
| -
|
| - struct ThreadArgs {
|
| - base::ConditionVariable* thread_running_cond;
|
| - base::Lock* thread_running_mutex;
|
| - bool thread_running;
|
| - };
|
| -
|
| - void Go() {
|
| - base::Lock thread_running_mutex;
|
| - base::ConditionVariable thread_running_cond(&thread_running_mutex);
|
| - ThreadArgs args;
|
| - ThreadInfo info;
|
| - args.thread_running_cond = &(thread_running_cond);
|
| - args.thread_running_mutex = &(thread_running_mutex);
|
| - args.thread_running = false;
|
| - args_ = args;
|
| - ASSERT_TRUE(base::PlatformThread::Create(0, this, &info.thread));
|
| - thread_running_mutex.Acquire();
|
| - while ((args_.thread_running) == false) {
|
| - thread_running_cond.Wait();
|
| - }
|
| - thread_running_mutex.Release();
|
| - threads_.push_back(info);
|
| - }
|
| -
|
| - // PlatformThread::Delegate methods.
|
| - virtual void ThreadMain() {
|
| - // Make sure each thread gets a current MessageLoop in TLS.
|
| - // This test should use chrome threads for testing, but I'll leave it like
|
| - // this for the moment since it requires a big chunk of rewriting and I
|
| - // want the test passing while I checkpoint my CL. Technically speaking,
|
| - // there should be no functional difference.
|
| - MessageLoop message_loop;
|
| - args_.thread_running_mutex->Acquire();
|
| - args_.thread_running = true;
|
| - args_.thread_running_cond->Signal();
|
| - args_.thread_running_mutex->Release();
|
| -
|
| - remove_event_mutex_.Acquire();
|
| - while (remove_event_bool_ == false) {
|
| - remove_event_.Wait();
|
| - }
|
| - remove_event_mutex_.Release();
|
| -
|
| - // Normally, you'd just delete the hookup. This is very bad style, but
|
| - // necessary for the test.
|
| - pair_->event_channel()->RemoveListener(this);
|
| -
|
| - completed_mutex_.Acquire();
|
| - completed_ = true;
|
| - completed_mutex_.Release();
|
| - }
|
| -
|
| - void HandleEvent(const TestEvent& event) {
|
| - remove_event_mutex_.Acquire();
|
| - remove_event_bool_ = true;
|
| - remove_event_.Broadcast();
|
| - remove_event_mutex_.Release();
|
| -
|
| - base::PlatformThread::YieldCurrentThread();
|
| -
|
| - completed_mutex_.Acquire();
|
| - if (completed_)
|
| - FAIL() << "A test thread exited too early.";
|
| - completed_mutex_.Release();
|
| - }
|
| -
|
| - Pair* pair_;
|
| - base::ConditionVariable remove_event_;
|
| - base::Lock remove_event_mutex_;
|
| - bool remove_event_bool_;
|
| - base::Lock completed_mutex_;
|
| - bool completed_;
|
| - std::vector<ThreadInfo> threads_;
|
| - ThreadArgs args_;
|
| -};
|
| -
|
| -TEST(EventSys, Multithreaded) {
|
| - Pair sally("Sally");
|
| - ThreadTester a(&sally);
|
| - for (int i = 0; i < 3; ++i)
|
| - a.Go();
|
| - sally.set_b(99);
|
| -}
|
| -
|
| -class HookupDeleter {
|
| - public:
|
| - void HandleEvent(const TestEvent& event) {
|
| - delete hookup_;
|
| - hookup_ = NULL;
|
| - }
|
| - EventListenerHookup* hookup_;
|
| -};
|
| -
|
| -TEST(EventSys, InHandlerDeletion) {
|
| - Pair sally("Sally");
|
| - HookupDeleter deleter;
|
| - deleter.hookup_ = NewEventListenerHookup(sally.event_channel(),
|
| - &deleter,
|
| - &HookupDeleter::HandleEvent);
|
| - sally.set_a(1);
|
| - ASSERT_TRUE(NULL == deleter.hookup_);
|
| -}
|
| -
|
| -} // namespace
|
|
|