1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkMessageBus.h" 9 #include "Test.h" 10 11 namespace { 12 13 struct TestMessage { 14 TestMessage(int i, float f) : x(i), y(f) {} 15 16 int x; 17 float y; 18 }; 19 20 static inline bool SkShouldPostMessageToBus(const TestMessage&, uint32_t) { 21 return true; 22 } 23 24 } 25 DECLARE_SKMESSAGEBUS_MESSAGE(TestMessage) 26 27 DEF_TEST(MessageBus, r) { 28 // Register two inboxes to receive all TestMessages. 29 SkMessageBus<TestMessage>::Inbox inbox1, inbox2; 30 31 // Send two messages. 32 const TestMessage m1 = { 5, 4.2f }; 33 const TestMessage m2 = { 6, 4.3f }; 34 SkMessageBus<TestMessage>::Post(m1); 35 SkMessageBus<TestMessage>::Post(m2); 36 37 // Make sure we got two. 38 SkTArray<TestMessage> messages; 39 inbox1.poll(&messages); 40 REPORTER_ASSERT(r, 2 == messages.count()); 41 REPORTER_ASSERT(r, 5 == messages[0].x); 42 REPORTER_ASSERT(r, 6 == messages[1].x); 43 44 // Send another; check we get just that one. 45 const TestMessage m3 = { 1, 0.3f }; 46 SkMessageBus<TestMessage>::Post(m3); 47 inbox1.poll(&messages); 48 REPORTER_ASSERT(r, 1 == messages.count()); 49 REPORTER_ASSERT(r, 1 == messages[0].x); 50 51 // Nothing was sent since the last read. 52 inbox1.poll(&messages); 53 REPORTER_ASSERT(r, 0 == messages.count()); 54 55 // Over all this time, inbox2 should have piled up 3 messages. 56 inbox2.poll(&messages); 57 REPORTER_ASSERT(r, 3 == messages.count()); 58 REPORTER_ASSERT(r, 5 == messages[0].x); 59 REPORTER_ASSERT(r, 6 == messages[1].x); 60 REPORTER_ASSERT(r, 1 == messages[2].x); 61 } 62 63 namespace { 64 65 struct AddressedMessage { 66 uint32_t fInboxID; 67 }; 68 69 static inline bool SkShouldPostMessageToBus(const AddressedMessage& msg, uint32_t msgBusUniqueID) { 70 SkASSERT(msgBusUniqueID); 71 if (!msg.fInboxID) { 72 return true; 73 } 74 return msgBusUniqueID == msg.fInboxID; 75 } 76 77 } 78 79 DECLARE_SKMESSAGEBUS_MESSAGE(AddressedMessage) 80 81 DEF_TEST(MessageBus_SkShouldPostMessageToBus, r) { 82 SkMessageBus<AddressedMessage>::Inbox inbox1(1), inbox2(2); 83 84 SkMessageBus<AddressedMessage>::Post({0}); // Should go to both 85 SkMessageBus<AddressedMessage>::Post({1}); // Should go to inbox1 86 SkMessageBus<AddressedMessage>::Post({2}); // Should go to inbox2 87 SkMessageBus<AddressedMessage>::Post({3}); // Should go nowhere 88 89 SkTArray<AddressedMessage> messages; 90 inbox1.poll(&messages); 91 REPORTER_ASSERT(r, messages.count() == 2); 92 if (messages.count() == 2) { 93 REPORTER_ASSERT(r, messages[0].fInboxID == 0); 94 REPORTER_ASSERT(r, messages[1].fInboxID == 1); 95 } 96 inbox2.poll(&messages); 97 REPORTER_ASSERT(r, messages.count() == 2); 98 if (messages.count() == 2) { 99 REPORTER_ASSERT(r, messages[0].fInboxID == 0); 100 REPORTER_ASSERT(r, messages[1].fInboxID == 2); 101 } 102 } 103 104 // Multithreaded tests tbd. 105