~aleteoryx/muditaos

muditaos/module-apps/tests/test-CallbackStorage.cpp -rw-r--r-- 3.9 KiB
a405cad6Aleteoryx trim readme 6 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md

#include <catch2/catch.hpp>

#include "CallbackStorage.hpp"

#include <functional>

using namespace app;

class TestCallbacksDeleter : public AsyncCallbacksDeleter
{
  public:
    explicit TestCallbacksDeleter(CallbackStorage &storage) : storage{storage}
    {}

    void cancelCallbacks(AsyncCallbackReceiver *receiver) override
    {
        storage.removeAll(receiver);
    }

  private:
    CallbackStorage &storage;
};

class TestReceiver : public AsyncCallbackReceiver
{
  public:
    TestReceiver(TestCallbacksDeleter *deleter = nullptr) : AsyncCallbackReceiver(deleter)
    {}
};

TEST_CASE("CallbackStorageTests")
{
    CallbackStorage storage;

    SECTION("Get callback ")
    {
        constexpr auto MessageId = 1;
        sys::ResponseMessage response{};
        response.uniID = MessageId;
        TestReceiver receiver;

        SECTION("Registration")
        {
            storage.registerCallback(MessageId, &receiver);
            REQUIRE(storage.getCallbackEntryFor(&response));

            [[maybe_unused]] auto callback = storage.getCallback(&response);
            REQUIRE(!storage.getCallbackEntryFor(&response));
        }

        SECTION("NullCallback Type")
        {
            SECTION("no callback function")
            {
                storage.registerCallback(MessageId, &receiver, std::nullopt);
                auto callback = storage.getCallback(&response);
                REQUIRE(typeid(*callback) == typeid(NullCallback));
            }
            SECTION("no callback entry")
            {
                auto callback = storage.getCallback(&response);
                REQUIRE(typeid(*callback) == typeid(NullCallback));
            }
        }

        SECTION("AsyncResponseCallback Type")
        {
            storage.registerCallback(MessageId, &receiver, [](sys::ResponseMessage *) { return false; });
            auto callback = storage.getCallback(&response);
            REQUIRE(typeid(*callback) == typeid(AsyncResponseCallback));
        }

        SECTION("QueryCallback Type")
        {
            db::QueryResponse response{nullptr};
            response.uniID = MessageId;
            storage.registerCallback(MessageId, &receiver, [](sys::ResponseMessage *) { return false; });
            auto callback = storage.getCallback(&response);
            REQUIRE(typeid(*callback) == typeid(QueryCallback));
        }

        SECTION("ReceiverBehavior")
        {
            SECTION("None - default")
            {
                storage.registerCallback(MessageId, &receiver, [](sys::ResponseMessage *) { return false; });
                REQUIRE_FALSE(storage.checkBlockingCloseRequests());
                auto callback = storage.getCallback(&response);
            }

            SECTION("WaitForResponseToClose")
            {
                storage.registerCallback(
                    MessageId,
                    &receiver,
                    [](sys::ResponseMessage *) { return false; },
                    app::ReceiverBehavior::WaitForResponseToClose);
                REQUIRE(storage.checkBlockingCloseRequests());
                auto callback = storage.getCallback(&response);
                REQUIRE_FALSE(storage.checkBlockingCloseRequests());
            }
        }
    }

    SECTION("Remove receiver")
    {
        constexpr auto MessageId = 2;
        sys::ResponseMessage response{};
        response.uniID = MessageId;

        {
            TestCallbacksDeleter deleter{storage};
            TestReceiver receiver{&deleter};

            storage.registerCallback(MessageId, &receiver);
            REQUIRE(storage.getCallbackEntryFor(&response));
        }

        REQUIRE(!storage.getCallbackEntryFor(&response));
        [[maybe_unused]] auto callback = storage.getCallback(&response);
        REQUIRE(callback->execute() == false);
    }
}