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

CoverageLines executed / instrumented / missingexe / inst / missLanguageGroup
93.3%70750.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    :        : 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    :    LinkedEventTest()
  68    :        : linked_event1_(scoped_ptr<EventInterface>(new TestEvent())),
  69    :          linked_event2_(scoped_ptr<EventInterface>(new TestEvent())),
  70    :          linked_event3_(scoped_ptr<EventInterface>(new TestEvent())),
  71    :          runner1_(&linked_event1_, empty_backdrop_),
  72    :          runner2_(&linked_event2_, empty_backdrop_),
  73  E :          runner3_(&linked_event3_, empty_backdrop_) {}
  74    :  
  75    :   protected:
  76    :    void* empty_backdrop_;
  77    :  
  78    :    LinkedEvent linked_event1_;
  79    :    LinkedEvent linked_event2_;
  80    :    LinkedEvent linked_event3_;
  81    :  
  82    :    TestRunner runner1_;
  83    :    TestRunner runner2_;
  84    :    TestRunner runner3_;
  85    :  };
  86    :  
  87    :  }  // namespace
  88    :  
  89  E :  TEST_F(LinkedEventTest, TestOneLink) {
  90  E :    base::DelegateSimpleThread thread1(&runner1_, "First Thread");
  91  E :    base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
  92    :  
  93  E :    linked_event2_.AddDep(&linked_event1_);
  94    :  
  95  E :    thread2.Start();
  96    :  
  97    :    EXPECT_FALSE(
  98  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
  99    :    EXPECT_FALSE(
 100  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 101    :  
 102  E :    thread1.Start();
 103  E :    thread1.Join();
 104    :  
 105  E :    thread2.Join();
 106    :  
 107    :    EXPECT_TRUE(
 108  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 109    :    EXPECT_TRUE(
 110  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 111  E :  }
 112    :  
 113  E :  TEST_F(LinkedEventTest, TestChainLink) {
 114  E :    base::DelegateSimpleThread thread1(&runner1_, "First Thread");
 115  E :    base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
 116  E :    base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
 117    :  
 118  E :    linked_event2_.AddDep(&linked_event1_);
 119  E :    linked_event3_.AddDep(&linked_event2_);
 120    :  
 121  E :    thread3.Start();
 122    :  
 123    :    EXPECT_FALSE(
 124  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 125    :    EXPECT_FALSE(
 126  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 127    :    EXPECT_FALSE(
 128  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 129    :  
 130  E :    thread2.Start();
 131    :  
 132    :    EXPECT_FALSE(
 133  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 134    :    EXPECT_FALSE(
 135  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 136    :    EXPECT_FALSE(
 137  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 138    :  
 139  E :    thread1.Start();
 140  E :    thread1.Join();
 141  E :    thread2.Join();
 142  E :    thread3.Join();
 143    :  
 144    :    EXPECT_TRUE(
 145  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 146    :    EXPECT_TRUE(
 147  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 148    :    EXPECT_TRUE(
 149  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 150  E :  }
 151    :  
 152  E :  TEST_F(LinkedEventTest, TestMultipleDependency) {
 153  E :    base::DelegateSimpleThread thread1(&runner1_, "First Thread");
 154  E :    base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
 155  E :    base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
 156    :  
 157  E :    linked_event3_.AddDep(&linked_event1_);
 158  E :    linked_event3_.AddDep(&linked_event2_);
 159    :  
 160  E :    thread3.Start();
 161    :  
 162    :    EXPECT_FALSE(
 163  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 164    :    EXPECT_FALSE(
 165  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 166    :    EXPECT_FALSE(
 167  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 168    :  
 169  E :    thread2.Start();
 170    :  
 171    :    EXPECT_FALSE(
 172  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 173    :    EXPECT_TRUE(
 174  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 175    :    EXPECT_FALSE(
 176  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 177    :  
 178  E :    thread1.Start();
 179  E :    thread1.Join();
 180  E :    thread2.Join();
 181  E :    thread3.Join();
 182    :  
 183    :    EXPECT_TRUE(
 184  E :        reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
 185    :    EXPECT_TRUE(
 186  E :        reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
 187    :    EXPECT_TRUE(
 188  E :        reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
 189  E :  }
 190    :  
 191    :  }  // namespace events
 192    :  }  // namespace bard

Coverage information generated Thu Jan 14 17:40:38 2016.