1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2013 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h" 9cb93a386Sopenharmony_ci#include "src/core/SkMessageBus.h" 10cb93a386Sopenharmony_ci#include "tests/Test.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_cinamespace { 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cistruct TestMessage { 15cb93a386Sopenharmony_ci TestMessage(int i, float f) : x(i), y(f) {} 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci int x; 18cb93a386Sopenharmony_ci float y; 19cb93a386Sopenharmony_ci}; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cistatic inline bool SkShouldPostMessageToBus(const TestMessage&, uint32_t) { 22cb93a386Sopenharmony_ci return true; 23cb93a386Sopenharmony_ci} 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci} // namespace 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciDECLARE_SKMESSAGEBUS_MESSAGE(TestMessage, uint32_t, true) 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciDEF_TEST(MessageBus, r) { 30cb93a386Sopenharmony_ci using TestMessageBus = SkMessageBus<TestMessage, uint32_t>; 31cb93a386Sopenharmony_ci // Register two inboxes to receive all TestMessages. 32cb93a386Sopenharmony_ci TestMessageBus::Inbox inbox1(0), inbox2(0); 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci // Send two messages. 35cb93a386Sopenharmony_ci const TestMessage m1 = { 5, 4.2f }; 36cb93a386Sopenharmony_ci const TestMessage m2 = { 6, 4.3f }; 37cb93a386Sopenharmony_ci TestMessageBus::Post(std::move(m1)); 38cb93a386Sopenharmony_ci TestMessageBus::Post(std::move(m2)); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci // Make sure we got two. 41cb93a386Sopenharmony_ci SkTArray<TestMessage> messages; 42cb93a386Sopenharmony_ci inbox1.poll(&messages); 43cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 2 == messages.count()); 44cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 5 == messages[0].x); 45cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 6 == messages[1].x); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci // Send another; check we get just that one. 48cb93a386Sopenharmony_ci const TestMessage m3 = { 1, 0.3f }; 49cb93a386Sopenharmony_ci TestMessageBus::Post(m3); 50cb93a386Sopenharmony_ci inbox1.poll(&messages); 51cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 1 == messages.count()); 52cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 1 == messages[0].x); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci // Nothing was sent since the last read. 55cb93a386Sopenharmony_ci inbox1.poll(&messages); 56cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 0 == messages.count()); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci // Over all this time, inbox2 should have piled up 3 messages. 59cb93a386Sopenharmony_ci inbox2.poll(&messages); 60cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 3 == messages.count()); 61cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 5 == messages[0].x); 62cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 6 == messages[1].x); 63cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 1 == messages[2].x); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_cinamespace { 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_cistruct TestMessageRefCnt : public SkRefCnt { 69cb93a386Sopenharmony_ci TestMessageRefCnt(int i, float f) : x(i), y(f) {} 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci int x; 72cb93a386Sopenharmony_ci float y; 73cb93a386Sopenharmony_ci}; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_cistatic inline bool SkShouldPostMessageToBus(const sk_sp<TestMessageRefCnt>&, uint32_t) { 76cb93a386Sopenharmony_ci return true; 77cb93a386Sopenharmony_ci} 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci} // namespace 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ciDECLARE_SKMESSAGEBUS_MESSAGE(sk_sp<TestMessageRefCnt>, uint32_t, false) 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ciDEF_TEST(MessageBusSp, r) { 84cb93a386Sopenharmony_ci // Register two inboxes to receive all TestMessages. 85cb93a386Sopenharmony_ci using TestMessageBus = SkMessageBus<sk_sp<TestMessageRefCnt>, uint32_t, false>; 86cb93a386Sopenharmony_ci TestMessageBus::Inbox inbox1(0); 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci // Send two messages. 89cb93a386Sopenharmony_ci auto m1 = sk_make_sp<TestMessageRefCnt>(5, 4.2f); 90cb93a386Sopenharmony_ci auto m2 = sk_make_sp<TestMessageRefCnt>(6, 4.3f); 91cb93a386Sopenharmony_ci TestMessageBus::Post(std::move(m1)); 92cb93a386Sopenharmony_ci TestMessageBus::Post(std::move(m2)); 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci // Make sure we got two. 95cb93a386Sopenharmony_ci SkTArray<sk_sp<TestMessageRefCnt>> messages; 96cb93a386Sopenharmony_ci inbox1.poll(&messages); 97cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 2 == messages.count()); 98cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages[0]->unique()); 99cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages[1]->unique()); 100cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 5 == messages[0]->x); 101cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 6 == messages[1]->x); 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci // Send another; check we get just that one. 104cb93a386Sopenharmony_ci auto m3 = sk_make_sp<TestMessageRefCnt>(1, 0.3f); 105cb93a386Sopenharmony_ci TestMessageBus::Post(std::move(m3)); 106cb93a386Sopenharmony_ci inbox1.poll(&messages); 107cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 1 == messages.count()); 108cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages[0]->unique()); 109cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 1 == messages[0]->x); 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci // Send another without std::move(), it should trigger SkASSERT(). 112cb93a386Sopenharmony_ci // auto m4 = sk_make_sp<TestMessageRefCnt>(1, 0.3f); 113cb93a386Sopenharmony_ci // TestMessageBus::Post(m4); 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci // Nothing was sent since the last read. 116cb93a386Sopenharmony_ci inbox1.poll(&messages); 117cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 0 == messages.count()); 118cb93a386Sopenharmony_ci} 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_cinamespace { 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_cistruct AddressedMessage { 123cb93a386Sopenharmony_ci GrDirectContext::DirectContextID fInboxID; 124cb93a386Sopenharmony_ci}; 125cb93a386Sopenharmony_ci 126cb93a386Sopenharmony_cistatic inline bool SkShouldPostMessageToBus(const AddressedMessage& msg, 127cb93a386Sopenharmony_ci GrDirectContext::DirectContextID msgBusUniqueID) { 128cb93a386Sopenharmony_ci SkASSERT(msgBusUniqueID.isValid()); 129cb93a386Sopenharmony_ci if (!msg.fInboxID.isValid()) { 130cb93a386Sopenharmony_ci return true; 131cb93a386Sopenharmony_ci } 132cb93a386Sopenharmony_ci return msgBusUniqueID == msg.fInboxID; 133cb93a386Sopenharmony_ci} 134cb93a386Sopenharmony_ci 135cb93a386Sopenharmony_ci} // namespace 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ciDECLARE_SKMESSAGEBUS_MESSAGE(AddressedMessage, GrDirectContext::DirectContextID, true) 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ciDEF_TEST(MessageBus_SkShouldPostMessageToBus, r) { 140cb93a386Sopenharmony_ci using ID = GrDirectContext::DirectContextID; 141cb93a386Sopenharmony_ci using AddressedMessageBus = SkMessageBus<AddressedMessage, ID>; 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci ID idInvalid; 144cb93a386Sopenharmony_ci ID id1 = ID::Next(), 145cb93a386Sopenharmony_ci id2 = ID::Next(), 146cb93a386Sopenharmony_ci id3 = ID::Next(); 147cb93a386Sopenharmony_ci 148cb93a386Sopenharmony_ci AddressedMessageBus::Inbox inbox1(id1), inbox2(id2); 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci AddressedMessageBus::Post({idInvalid}); // Should go to both 151cb93a386Sopenharmony_ci AddressedMessageBus::Post({id1}); // Should go to inbox1 152cb93a386Sopenharmony_ci AddressedMessageBus::Post({id2}); // Should go to inbox2 153cb93a386Sopenharmony_ci AddressedMessageBus::Post({id3}); // Should go nowhere 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_ci SkTArray<AddressedMessage> messages; 156cb93a386Sopenharmony_ci inbox1.poll(&messages); 157cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages.count() == 2); 158cb93a386Sopenharmony_ci if (messages.count() == 2) { 159cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !messages[0].fInboxID.isValid()); 160cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages[1].fInboxID == id1); 161cb93a386Sopenharmony_ci } 162cb93a386Sopenharmony_ci inbox2.poll(&messages); 163cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages.count() == 2); 164cb93a386Sopenharmony_ci if (messages.count() == 2) { 165cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !messages[0].fInboxID.isValid()); 166cb93a386Sopenharmony_ci REPORTER_ASSERT(r, messages[1].fInboxID == id2); 167cb93a386Sopenharmony_ci } 168cb93a386Sopenharmony_ci} 169cb93a386Sopenharmony_ci 170cb93a386Sopenharmony_ci// Multithreaded tests tbd. 171