brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.5 KiB · 32a223c Raw
359 lines · cpp
1#include "OmptAliases.h"2#include "OmptAsserter.h"3#include <omp-tools.h>4#include <sstream>5 6#include "gtest/gtest.h"7 8using namespace omptest;9using OAE = omptest::OmptAssertEvent;10using OS = omptest::ObserveState;11 12/// SequencedAsserter test-fixture class to avoid code duplication among tests.13class OmptSequencedAsserterTest : public testing::Test {14protected:15  OmptSequencedAsserterTest() {16    // Construct default sequenced asserter17    SeqAsserter = std::make_unique<omptest::OmptSequencedAsserter>();18 19    // Silence all potential log prints20    SeqAsserter->getLog()->setLoggingLevel(logging::Level::Critical);21  }22 23  std::unique_ptr<omptest::OmptSequencedAsserter> SeqAsserter;24};25 26TEST_F(OmptSequencedAsserterTest, DefaultState) {27  // Assertion should neither start as 'deactivated' nor 'suspended'28  ASSERT_EQ(SeqAsserter->isActive(), true);29  ASSERT_EQ(SeqAsserter->AssertionSuspended, false);30 31  // Assertion should begin with event ID zero32  ASSERT_EQ(SeqAsserter->NextEvent, 0);33 34  // Assertion should begin without previous notifications or assertions35  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);36  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);37 38  // There should be no expected events39  ASSERT_EQ(SeqAsserter->Events.empty(), true);40  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 0);41 42  // Default mode should be Strict43  ASSERT_NE(SeqAsserter->getOperationMode(), AssertMode::Relaxed);44  ASSERT_EQ(SeqAsserter->getOperationMode(), AssertMode::Strict);45 46  // Default state should be passing47  ASSERT_NE(SeqAsserter->getState(), AssertState::Fail);48  ASSERT_EQ(SeqAsserter->getState(), AssertState::Pass);49  ASSERT_NE(SeqAsserter->checkState(), AssertState::Fail);50  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);51}52 53TEST_F(OmptSequencedAsserterTest, IgnoreNotificationsWhenEmpty) {54  // ParallelBegin events are suppressed by default55  auto SuppressedEvent = OAE::ParallelBegin(56      /*Name=*/"ParBegin", /*Group=*/"", /*Expected=*/OS::Always,57      /*NumThreads=*/3);58 59  // DeviceFinalize events are not ignored by default60  auto IgnoredEvent = OAE::DeviceFinalize(61      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,62      /*DeviceNum=*/7);63 64  // Situation: There is nothing to assert.65  // Result: All notifications are ignored.66  // Hence, check that the perceived count of notifications remains unchanged67  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);68 69  SeqAsserter->notify(std::move(SuppressedEvent));70 71  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);72  SeqAsserter->notify(std::move(IgnoredEvent));73  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);74  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);75  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);76}77 78TEST_F(OmptSequencedAsserterTest, IgnoreNotificationsWhileDeactivated) {79  auto ExpectedEvent = OAE::DeviceUnload(80      /*Name=*/"DevUnload", /*Group=*/"", /*Expected=*/OS::Always);81  SeqAsserter->insert(std::move(ExpectedEvent));82  ASSERT_EQ(SeqAsserter->Events.empty(), false);83 84  // Deactivate asserter, effectively ignoring notifications85  SeqAsserter->setActive(false);86  ASSERT_EQ(SeqAsserter->isActive(), false);87  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);88 89  // DeviceFinalize events are not ignored by default90  auto IgnoredEvent = OAE::DeviceFinalize(91      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,92      /*DeviceNum=*/7);93  SeqAsserter->notify(std::move(IgnoredEvent));94 95  // Assertion was deactivated: No change96  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);97  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);98 99  SeqAsserter->setActive(true);100  ASSERT_EQ(SeqAsserter->isActive(), true);101 102  auto ObservedEvent = OAE::DeviceUnload(103      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always);104  SeqAsserter->notify(std::move(ObservedEvent));105 106  // Assertion was activated, one notification expected107  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);108  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 1);109  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);110}111 112TEST_F(OmptSequencedAsserterTest, AddEvent) {113  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 0);114  auto ExpectedEvent = OAE::DeviceFinalize(115      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,116      /*DeviceNum=*/7);117  SeqAsserter->insert(std::move(ExpectedEvent));118  // Sanity check: Notifications should not be triggered119  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);120  // Adding an expected event must change the event count but not the state121  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 1);122  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);123  ASSERT_EQ(SeqAsserter->getState(), AssertState::Pass);124}125 126TEST_F(OmptSequencedAsserterTest, AddEventIgnoreSuppressed) {127  auto ExpectedEvent = OAE::DeviceFinalize(128      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,129      /*DeviceNum=*/7);130  SeqAsserter->insert(std::move(ExpectedEvent));131  // ParallelBegin events are suppressed by default132  auto SuppressedEvent = OAE::ParallelBegin(133      /*Name=*/"ParBegin", /*Group=*/"", /*Expected=*/OS::Always,134      /*NumThreads=*/3);135  // Situation: There is one expected event and ParallelBegins are suppressed.136  // Notification count remains unchanged for suppressed events137  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);138  SeqAsserter->notify(std::move(SuppressedEvent));139  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);140  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);141  ASSERT_EQ(SeqAsserter->getState(), AssertState::Pass);142}143 144TEST_F(OmptSequencedAsserterTest, AddEventObservePass) {145  auto ExpectedEvent = OAE::DeviceFinalize(146      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,147      /*DeviceNum=*/7);148  SeqAsserter->insert(std::move(ExpectedEvent));149  // DeviceFinalize events are not ignored by default150  auto ObservedEvent = OAE::DeviceFinalize(151      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,152      /*DeviceNum=*/7);153  SeqAsserter->notify(std::move(ObservedEvent));154  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);155  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 1);156  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);157}158 159TEST_F(OmptSequencedAsserterTest, AddEventObserveFail) {160  auto ExpectedEvent = OAE::DeviceFinalize(161      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,162      /*DeviceNum=*/7);163  SeqAsserter->insert(std::move(ExpectedEvent));164  // DeviceFinalize events are not ignored by default165  // Provide wrong DeviceNum166  auto ObservedEvent = OAE::DeviceFinalize(167      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,168      /*DeviceNum=*/23);169 170  SeqAsserter->notify(std::move(ObservedEvent));171  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);172  // Observed and expected event do not match: Fail173  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);174  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Fail);175}176 177TEST_F(OmptSequencedAsserterTest, AddEventObserveDifferentType) {178  auto ExpectedEvent = OAE::DeviceUnload(179      /*Name=*/"DevUnload", /*Group=*/"", /*Expected=*/OS::Always);180  SeqAsserter->insert(std::move(ExpectedEvent));181  // DeviceFinalize events are not ignored by default182  auto ObservedEvent = OAE::DeviceFinalize(183      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,184      /*DeviceNum=*/7);185 186  SeqAsserter->notify(std::move(ObservedEvent));187  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);188  // Observed and expected event do not match: Fail189  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);190  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Fail);191}192 193TEST_F(OmptSequencedAsserterTest, CheckTargetGroupNoEffect) {194  // Situation: Groups are designed to be used as an indicator -WITHIN- target195  // regions. Hence, comparing two target regions w.r.t. their groups has no196  // effect on pass or fail.197 198  auto ExpectedEvent = OAE::Target(199      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,200      /*Kind=*/TARGET, /*Endpoint=*/BEGIN,201      /*DeviceNum=*/7, /*TaskData=*/nullptr, /*TargetId=*/23,202      /*CodeptrRA=*/nullptr);203  SeqAsserter->insert(std::move(ExpectedEvent));204  ASSERT_EQ(SeqAsserter->Events.empty(), false);205 206  // Deactivate asserter, effectively ignoring notifications207  SeqAsserter->setActive(false);208  ASSERT_EQ(SeqAsserter->isActive(), false);209  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);210 211  // Target events are not ignored by default212  auto ObservedEvent = OAE::Target(213      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,214      /*Kind=*/TARGET, /*Endpoint=*/BEGIN, /*DeviceNum=*/7,215      /*TaskData=*/nullptr, /*TargetId=*/23, /*CodeptrRA=*/nullptr);216  SeqAsserter->notify(std::move(ObservedEvent));217 218  // Assertion was deactivated: No change219  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);220  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);221  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 1);222 223  // Re-activate asserter224  SeqAsserter->setActive(true);225  ASSERT_EQ(SeqAsserter->isActive(), true);226  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);227 228  // Actually observe a target event from "AnotherGroup"229  auto AnotherObservedEvent = OAE::Target(230      /*Name=*/"Target", /*Group=*/"AnotherGroup", /*Expected=*/OS::Always,231      /*Kind=*/TARGET, /*Endpoint=*/BEGIN, /*DeviceNum=*/7,232      /*TaskData=*/nullptr, /*TargetId=*/23, /*CodeptrRA=*/nullptr);233  SeqAsserter->notify(std::move(AnotherObservedEvent));234 235  // Observed all expected events; groups of target regions do not affect pass236  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);237  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 1);238  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 0);239 240  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);241}242 243TEST_F(OmptSequencedAsserterTest, CheckSyncPoint) {244  auto ExpectedEvent = OAE::Target(245      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,246      /*Kind=*/TARGET, /*Endpoint=*/BEGIN,247      /*DeviceNum=*/7, /*TaskData=*/nullptr, /*TargetId=*/23,248      /*CodeptrRA=*/nullptr);249  SeqAsserter->insert(std::move(ExpectedEvent));250  ASSERT_EQ(SeqAsserter->Events.empty(), false);251  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 1);252 253  // Target events are not ignored by default254  auto ObservedEvent = OAE::Target(255      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,256      /*Kind=*/TARGET, /*Endpoint=*/BEGIN, /*DeviceNum=*/7,257      /*TaskData=*/nullptr, /*TargetId=*/23, /*CodeptrRA=*/nullptr);258  SeqAsserter->notify(std::move(ObservedEvent));259  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);260 261  SeqAsserter->notify(OAE::AssertionSyncPoint(262      /*Name=*/"", /*Group=*/"", /*Expected=*/OS::Always,263      /*SyncPointName=*/"SyncPoint 1"));264  ASSERT_EQ(SeqAsserter->getNotificationCount(), 2);265  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 1);266 267  // All events processed: SyncPoint "passes"268  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);269 270  auto AnotherExpectedEvent = OAE::Target(271      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,272      /*Kind=*/TARGET, /*Endpoint=*/BEGIN,273      /*DeviceNum=*/7, /*TaskData=*/nullptr, /*TargetId=*/23,274      /*CodeptrRA=*/nullptr);275 276  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 0);277  SeqAsserter->insert(std::move(AnotherExpectedEvent));278  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 1);279 280  // Remaining events present: SyncPoint "fails"281  SeqAsserter->notify(OAE::AssertionSyncPoint(282      /*Name=*/"", /*Group=*/"", /*Expected=*/OS::Always,283      /*SyncPointName=*/"SyncPoint 2"));284  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Fail);285}286 287TEST_F(OmptSequencedAsserterTest, CheckExcessNotify) {288  auto ExpectedEvent = OAE::Target(289      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,290      /*Kind=*/TARGET, /*Endpoint=*/BEGIN,291      /*DeviceNum=*/7, /*TaskData=*/nullptr, /*TargetId=*/23,292      /*CodeptrRA=*/nullptr);293  SeqAsserter->insert(std::move(ExpectedEvent));294  ASSERT_EQ(SeqAsserter->Events.empty(), false);295  ASSERT_EQ(SeqAsserter->getRemainingEventCount(), 1);296 297  // Target events are not ignored by default298  auto ObservedEvent = OAE::Target(299      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,300      /*Kind=*/TARGET, /*Endpoint=*/BEGIN, /*DeviceNum=*/7,301      /*TaskData=*/nullptr, /*TargetId=*/23, /*CodeptrRA=*/nullptr);302  SeqAsserter->notify(std::move(ObservedEvent));303  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);304 305  // All events processed: pass306  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);307 308  // Target events are not ignored by default309  auto AnotherObservedEvent = OAE::Target(310      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,311      /*Kind=*/TARGET, /*Endpoint=*/BEGIN, /*DeviceNum=*/7,312      /*TaskData=*/nullptr, /*TargetId=*/23, /*CodeptrRA=*/nullptr);313 314  // No more events expected: notify "fails"315  SeqAsserter->notify(std::move(AnotherObservedEvent));316  ASSERT_EQ(SeqAsserter->getNotificationCount(), 2);317  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Fail);318}319 320TEST_F(OmptSequencedAsserterTest, CheckSuspend) {321  SeqAsserter->insert(OAE::AssertionSuspend(322      /*Name=*/"", /*Group=*/"", /*Expected=*/OS::Never));323  ASSERT_EQ(SeqAsserter->Events.empty(), false);324 325  // Being notified while the next expected event is a "suspend" should change326  // the asserter's state327  ASSERT_EQ(SeqAsserter->getNotificationCount(), 0);328  ASSERT_EQ(SeqAsserter->AssertionSuspended, false);329  SeqAsserter->notify(OAE::DeviceFinalize(330      /*Name=*/"DevFini", /*Group=*/"", /*Expected=*/OS::Always,331      /*DeviceNum=*/7));332  ASSERT_EQ(SeqAsserter->AssertionSuspended, true);333  ASSERT_EQ(SeqAsserter->getNotificationCount(), 1);334 335  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 0);336  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);337 338  auto ExpectedEvent = OAE::Target(339      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,340      /*Kind=*/TARGET, /*Endpoint=*/BEGIN,341      /*DeviceNum=*/7, /*TaskData=*/nullptr, /*TargetId=*/23,342      /*CodeptrRA=*/nullptr);343  SeqAsserter->insert(std::move(ExpectedEvent));344 345  // Being notified with an observed event, which matches the next expected346  // event, resumes assertion (suspended = false)347  ASSERT_EQ(SeqAsserter->AssertionSuspended, true);348  SeqAsserter->notify(OAE::Target(349      /*Name=*/"Target", /*Group=*/"MyTargetGroup", /*Expected=*/OS::Always,350      /*Kind=*/TARGET, /*Endpoint=*/BEGIN,351      /*DeviceNum=*/7, /*TaskData=*/nullptr, /*TargetId=*/23,352      /*CodeptrRA=*/nullptr));353  ASSERT_EQ(SeqAsserter->AssertionSuspended, false);354 355  ASSERT_EQ(SeqAsserter->getNotificationCount(), 2);356  ASSERT_EQ(SeqAsserter->getSuccessfulAssertionCount(), 1);357  ASSERT_EQ(SeqAsserter->checkState(), AssertState::Pass);358}359