MessageBusTest.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. #include "src/core/SkMessageBus.h"
  8. #include "tests/Test.h"
  9. namespace {
  10. struct TestMessage {
  11. TestMessage(int i, float f) : x(i), y(f) {}
  12. int x;
  13. float y;
  14. };
  15. static inline bool SkShouldPostMessageToBus(const TestMessage&, uint32_t) {
  16. return true;
  17. }
  18. }
  19. DECLARE_SKMESSAGEBUS_MESSAGE(TestMessage)
  20. DEF_TEST(MessageBus, r) {
  21. // Register two inboxes to receive all TestMessages.
  22. SkMessageBus<TestMessage>::Inbox inbox1, inbox2;
  23. // Send two messages.
  24. const TestMessage m1 = { 5, 4.2f };
  25. const TestMessage m2 = { 6, 4.3f };
  26. SkMessageBus<TestMessage>::Post(m1);
  27. SkMessageBus<TestMessage>::Post(m2);
  28. // Make sure we got two.
  29. SkTArray<TestMessage> messages;
  30. inbox1.poll(&messages);
  31. REPORTER_ASSERT(r, 2 == messages.count());
  32. REPORTER_ASSERT(r, 5 == messages[0].x);
  33. REPORTER_ASSERT(r, 6 == messages[1].x);
  34. // Send another; check we get just that one.
  35. const TestMessage m3 = { 1, 0.3f };
  36. SkMessageBus<TestMessage>::Post(m3);
  37. inbox1.poll(&messages);
  38. REPORTER_ASSERT(r, 1 == messages.count());
  39. REPORTER_ASSERT(r, 1 == messages[0].x);
  40. // Nothing was sent since the last read.
  41. inbox1.poll(&messages);
  42. REPORTER_ASSERT(r, 0 == messages.count());
  43. // Over all this time, inbox2 should have piled up 3 messages.
  44. inbox2.poll(&messages);
  45. REPORTER_ASSERT(r, 3 == messages.count());
  46. REPORTER_ASSERT(r, 5 == messages[0].x);
  47. REPORTER_ASSERT(r, 6 == messages[1].x);
  48. REPORTER_ASSERT(r, 1 == messages[2].x);
  49. }
  50. namespace {
  51. struct AddressedMessage {
  52. uint32_t fInboxID;
  53. };
  54. static inline bool SkShouldPostMessageToBus(const AddressedMessage& msg, uint32_t msgBusUniqueID) {
  55. SkASSERT(msgBusUniqueID);
  56. if (!msg.fInboxID) {
  57. return true;
  58. }
  59. return msgBusUniqueID == msg.fInboxID;
  60. }
  61. }
  62. DECLARE_SKMESSAGEBUS_MESSAGE(AddressedMessage)
  63. DEF_TEST(MessageBus_SkShouldPostMessageToBus, r) {
  64. SkMessageBus<AddressedMessage>::Inbox inbox1(1), inbox2(2);
  65. SkMessageBus<AddressedMessage>::Post({0}); // Should go to both
  66. SkMessageBus<AddressedMessage>::Post({1}); // Should go to inbox1
  67. SkMessageBus<AddressedMessage>::Post({2}); // Should go to inbox2
  68. SkMessageBus<AddressedMessage>::Post({3}); // Should go nowhere
  69. SkTArray<AddressedMessage> messages;
  70. inbox1.poll(&messages);
  71. REPORTER_ASSERT(r, messages.count() == 2);
  72. if (messages.count() == 2) {
  73. REPORTER_ASSERT(r, messages[0].fInboxID == 0);
  74. REPORTER_ASSERT(r, messages[1].fInboxID == 1);
  75. }
  76. inbox2.poll(&messages);
  77. REPORTER_ASSERT(r, messages.count() == 2);
  78. if (messages.count() == 2) {
  79. REPORTER_ASSERT(r, messages[0].fInboxID == 0);
  80. REPORTER_ASSERT(r, messages[1].fInboxID == 2);
  81. }
  82. }
  83. // Multithreaded tests tbd.