aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/messagebus/test/ut/sync_client_ut.cpp
blob: 7a7189dbec7e3dd20d5acebde23e3528cb64c1d9 (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); 
            } 
        }

    }
}