aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/messagebus/test/ut/sync_client_ut.cpp
blob: 400128193f94bcbadc6c7b6504161bab6d78ed05 (plain) (blame)
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
#include <library/cpp/messagebus/test/helper/example.h>
#include <library/cpp/messagebus/test/helper/object_count_check.h>

namespace NBus {
    namespace NTest {
        using namespace std;

        ////////////////////////////////////////////////////////////////////
        /// \brief Client for sending synchronous message to local server
        struct TSyncClient {
            TNetAddr ServerAddr;

            TExampleProtocol Proto;
            TBusMessageQueuePtr Bus;
            TBusSyncClientSessionPtr Session;

            int NumReplies;
            int NumMessages;

            /// constructor creates instances of queue, protocol and session
            TSyncClient(const TNetAddr& serverAddr)
                : ServerAddr(serverAddr)
            {
                /// create or get instance of message queue, need one per application
                Bus = CreateMessageQueue();

                NumReplies = 0;
                NumMessages = 10;

                /// register source/client session
                TBusClientSessionConfig sessionConfig;
                Session = Bus->CreateSyncSource(&Proto, sessionConfig);
                Session->RegisterService("localhost");
            }

            ~TSyncClient() {
                Session->Shutdown();
            }

            /// dispatch of requests is done here
            void Work() {
                for (int i = 0; i < NumMessages; i++) {
                    THolder<TExampleRequest> mess(new TExampleRequest(&Proto.RequestCount));
                    EMessageStatus status;
                    THolder<TBusMessage> reply(Session->SendSyncMessage(mess.Get(), status, &ServerAddr));
                    if (!!reply) {
                        NumReplies++;
                    }
                }
            }
        };

        Y_UNIT_TEST_SUITE(SyncClientTest) {
            Y_UNIT_TEST(TestSync) {
                TObjectCountCheck objectCountCheck;

                TExampleServer server;
                TSyncClient client(server.GetActualListenAddr());
                client.Work();
                // assert correct number of replies
                UNIT_ASSERT_EQUAL(client.NumReplies, client.NumMessages);
                // assert that there is no message left in flight
                UNIT_ASSERT_EQUAL(server.Session->GetInFlight(), 0);
                UNIT_ASSERT_EQUAL(client.Session->GetInFlight(), 0);
            }
        }

    }
}