| // Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Unit tests for CryptohomeEventSource. |
| |
| #include "vault_keyset.h" |
| |
| #include <base/logging.h> |
| #include <chromeos/utility.h> |
| #include <gtest/gtest.h> |
| |
| #include "cryptohome_event_source.h" |
| |
| namespace cryptohome { |
| using std::string; |
| |
| class CryptohomeEventSourceTest : public ::testing::Test { |
| public: |
| CryptohomeEventSourceTest() { } |
| virtual ~CryptohomeEventSourceTest() { } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(CryptohomeEventSourceTest); |
| }; |
| |
| class EventDestructorWatcher { |
| public: |
| virtual void NotifyDestroy(CryptohomeEventBase* event) = 0; |
| }; |
| |
| class MyEvent : public CryptohomeEventBase { |
| public: |
| MyEvent() |
| : destructor_watcher_(NULL), |
| id_(-1) { } |
| |
| virtual ~MyEvent() { |
| if (destructor_watcher_) { |
| destructor_watcher_->NotifyDestroy(this); |
| } |
| } |
| |
| void set_destructor_watcher(EventDestructorWatcher* watcher) { |
| destructor_watcher_ = watcher; |
| } |
| |
| void set_id(int id) { |
| id_ = id; |
| } |
| |
| int get_id() { |
| return id_; |
| } |
| |
| virtual const char* GetEventName() { |
| return "MyEvent"; |
| } |
| |
| private: |
| EventDestructorWatcher* destructor_watcher_; |
| int id_; |
| }; |
| |
| class EventSink : public CryptohomeEventSourceSink, |
| public EventDestructorWatcher { |
| public: |
| EventSink() |
| : completed_events_() { } |
| |
| virtual ~EventSink() { } |
| |
| virtual void NotifyEvent(CryptohomeEventBase* event) { |
| completed_events_.push_back(static_cast<MyEvent*>(event)->get_id()); |
| } |
| |
| virtual void NotifyDestroy(CryptohomeEventBase* event) { |
| destroyed_events_.push_back(static_cast<MyEvent*>(event)->get_id()); |
| } |
| |
| std::vector<int> completed_events_; |
| std::vector<int> destroyed_events_; |
| }; |
| |
| TEST_F(CryptohomeEventSourceTest, TestEventSink) { |
| EventSink event_sink; |
| CryptohomeEventSource event_source; |
| event_source.Reset(&event_sink, NULL); |
| |
| static const int kEventCount = 4096; |
| for (int i = 0; i < kEventCount; i++) { |
| MyEvent* event = new MyEvent(); |
| event->set_id(i); |
| event->set_destructor_watcher(&event_sink); |
| event_source.AddEvent(event); |
| } |
| |
| EXPECT_TRUE(event_source.EventsPending()); |
| event_source.HandleDispatch(); |
| EXPECT_FALSE(event_source.EventsPending()); |
| EXPECT_EQ(kEventCount, event_sink.completed_events_.size()); |
| EXPECT_EQ(kEventCount, event_sink.destroyed_events_.size()); |
| } |
| |
| TEST_F(CryptohomeEventSourceTest, TestEventSinkNoClear) { |
| EventSink event_sink; |
| |
| static const int kEventCount = 4096; |
| // Scope the event source |
| { |
| CryptohomeEventSource event_source; |
| event_source.Reset(&event_sink, NULL); |
| |
| for (int i = 0; i < kEventCount; i++) { |
| MyEvent* event = new MyEvent(); |
| event->set_id(i); |
| event->set_destructor_watcher(&event_sink); |
| event_source.AddEvent(event); |
| } |
| |
| EXPECT_TRUE(event_source.EventsPending()); |
| } |
| |
| EXPECT_EQ(0, event_sink.completed_events_.size()); |
| EXPECT_EQ(kEventCount, event_sink.destroyed_events_.size()); |
| } |
| |
| } // namespace cryptohome |