Coverage for /Syzygy/bard/events/linked_event_unittest.cc

CoverageLines executed / instrumented / missingexe / inst / missLanguageGroup
95.2%991040.C++test

Line-by-line coverage:

   1    :  // Copyright 2015 Google Inc. All Rights Reserved.
   2    :  //
   3    :  // Licensed under the Apache License, Version 2.0 (the "License");
   4    :  // you may not use this file except in compliance with the License.
   5    :  // You may obtain a copy of the License at
   6    :  //
   7    :  //     http://www.apache.org/licenses/LICENSE-2.0
   8    :  //
   9    :  // Unless required by applicable law or agreed to in writing, software
  10    :  // distributed under the License is distributed on an "AS IS" BASIS,
  11    :  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12    :  // See the License for the specific language governing permissions and
  13    :  // limitations under the License.
  14    :  
  15    :  #include "syzygy/bard/events/linked_event.h"
  16    :  
  17    :  #include "base/synchronization/lock.h"
  18    :  #include "base/threading/simple_thread.h"
  19    :  #include "gtest/gtest.h"
  20    :  
  21    :  namespace bard {
  22    :  namespace events {
  23    :  
  24    :  namespace {
  25    :  
  26    :  class TestEvent : public EventInterface {
  27    :   public:
  28  E :    TestEvent() : played_(false) {}
  29    :  
  30  i :    EventType type() const override { return static_cast<EventType>(0); }
  31    :  
  32  E :    bool Play(void* backdrop) override {
  33  E :      base::AutoLock auto_lock(lock_);
  34  E :      played_ = true;
  35  E :      return true;
  36  E :    }
  37    :  
  38  i :    bool Equals(const EventInterface* rhs) const override {
  39  i :      NOTREACHED();
  40  i :      return false;
  41  i :    }
  42    :  
  43  E :    bool played() const {
  44  E :      base::AutoLock auto_lock(const_cast<base::Lock&>(lock_));
  45  E :      return played_;
  46  E :    }
  47    :  
  48    :   protected:
  49    :    base::Lock lock_;
  50    :    bool played_;
  51    :  };
  52    :  
  53    :  class TestRunner : public base::DelegateSimpleThread::Delegate {
  54    :   public:
  55  E :    TestRunner(LinkedEvent* event, void* backdrop)
  56  E :        : test_event_(event), test_backdrop_(backdrop) {}
  57    :  
  58  E :    void Run() override { test_event_->Play(test_backdrop_); }
  59    :  
  60    :   protected:
  61    :    LinkedEvent* test_event_;
  62    :    void* test_backdrop_;
  63    :  };
  64    :  
  65    :  class LinkedEventTest : public testing::Test {
  66    :   public:
  67    :    // The backdrop isn't used, but can't be null. Simply generate a dummy
  68    :    // address.
  69    :    LinkedEventTest()
  70  E :        : empty_backdrop_(reinterpret_cast<void*>(0xBAADF00D)),
  71  E :          linked_event1_(std::unique_ptr<EventInterface>(new TestEvent())),
  72  E :          linked_event2_(std::unique_ptr<EventInterface>(new TestEvent())),
  73  E :          linked_event3_(std::unique_ptr<EventInterface>(new TestEvent())),
  74  E :          runner1_(&linked_event1_, empty_backdrop_),
  75  E :          runner2_(&linked_event2_, empty_backdrop_),
  76  E :          runner3_(&linked_event3_, empty_backdrop_) {}
  77    :  
  78    :   protected:
  79    :    void* empty_backdrop_;
  80    :  
  81    :    LinkedEvent linked_event1_;
  82    :    LinkedEvent linked_event2_;
  83    :    LinkedEvent linked_event3_;
  84    :  
  85    :    TestRunner runner1_;
  86    :    TestRunner runner2_;
  87    :    TestRunner runner3_;
  88    :  };
  89    :  
  90    :  }  // namespace
  91    :  
  92  E :  TEST_F(LinkedEventTest, TestOneLink) {
  93  E :    base::DelegateSimpleThread thread1(&runner1_, "First Thread");
  94  E :    base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
  95    :  
  96  E :    linked_event2_.AddDep(&linked_event1_);
  97    :  
  98  E :    thread2.Start();
  99    :  
 100  E :    EXPECT_FALSE(
 101  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 102  E :    EXPECT_FALSE(
 103  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 104    :  
 105  E :    thread1.Start();
 106  E :    thread1.Join();
 107    :  
 108  E :    thread2.Join();
 109    :  
 110  E :    EXPECT_TRUE(
 111  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 112  E :    EXPECT_TRUE(
 113  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 114  E :  }
 115    :  
 116  E :  TEST_F(LinkedEventTest, TestChainLink) {
 117  E :    base::DelegateSimpleThread thread1(&runner1_, "First Thread");
 118  E :    base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
 119  E :    base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
 120    :  
 121  E :    linked_event2_.AddDep(&linked_event1_);
 122  E :    linked_event3_.AddDep(&linked_event2_);
 123    :  
 124  E :    thread3.Start();
 125    :  
 126  E :    EXPECT_FALSE(
 127  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 128  E :    EXPECT_FALSE(
 129  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 130  E :    EXPECT_FALSE(
 131  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 132    :  
 133  E :    thread2.Start();
 134    :  
 135  E :    EXPECT_FALSE(
 136  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 137  E :    EXPECT_FALSE(
 138  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 139  E :    EXPECT_FALSE(
 140  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 141    :  
 142  E :    thread1.Start();
 143  E :    thread1.Join();
 144  E :    thread2.Join();
 145  E :    thread3.Join();
 146    :  
 147  E :    EXPECT_TRUE(
 148  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 149  E :    EXPECT_TRUE(
 150  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 151  E :    EXPECT_TRUE(
 152  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 153  E :  }
 154    :  
 155  E :  TEST_F(LinkedEventTest, TestMultipleDependency) {
 156  E :    base::DelegateSimpleThread thread1(&runner1_, "First Thread");
 157  E :    base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
 158  E :    base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
 159    :  
 160  E :    linked_event3_.AddDep(&linked_event1_);
 161  E :    linked_event3_.AddDep(&linked_event2_);
 162    :  
 163  E :    thread3.Start();
 164    :  
 165  E :    EXPECT_FALSE(
 166  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 167  E :    EXPECT_FALSE(
 168  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 169  E :    EXPECT_FALSE(
 170  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 171    :  
 172  E :    thread2.Start();
 173    :  
 174  E :    EXPECT_FALSE(
 175  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 176  E :    EXPECT_TRUE(
 177  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 178  E :    EXPECT_FALSE(
 179  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 180    :  
 181  E :    thread1.Start();
 182  E :    thread1.Join();
 183  E :    thread2.Join();
 184  E :    thread3.Join();
 185    :  
 186  E :    EXPECT_TRUE(
 187  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 188  E :    EXPECT_TRUE(
 189  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 190  E :    EXPECT_TRUE(
 191  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 192  E :  }
 193    :  
 194    :  }  // namespace events
 195    :  }  // namespace bard

Coverage information generated Fri Jul 29 11:00:21 2016.