Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / ot-br-posix / repo / tests / dbus / test_dbus_server.cpp
1 /*
2  *    Copyright (c) 2019, The OpenThread Authors.
3  *    All rights reserved.
4  *
5  *    Redistribution and use in source and binary forms, with or without
6  *    modification, are permitted provided that the following conditions are met:
7  *    1. Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *    2. Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *    3. Neither the name of the copyright holder nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  *    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  *    POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "dbus/common/dbus_message_helper.hpp"
30 #include "dbus/server/dbus_object.hpp"
31
32 using otbr::DBus::DBusMessageEncodeToVariant;
33 using otbr::DBus::DBusMessageExtractFromVariant;
34 using otbr::DBus::DBusMessageToTuple;
35 using otbr::DBus::DBusObject;
36 using otbr::DBus::DBusRequest;
37 using std::placeholders::_1;
38
39 class TestObject : public DBusObject
40 {
41 public:
42     TestObject(DBusConnection *aConnection)
43         : DBusObject(aConnection, "/io/openthread/testobj")
44         , mEnded(false)
45         , mCount(0)
46     {
47         RegisterMethod("io.openthread", "Ping", std::bind(&TestObject::PingHandler, this, _1));
48         RegisterGetPropertyHandler("io.openthread", "Count", std::bind(&TestObject::CountGetHandler, this, _1));
49         RegisterSetPropertyHandler("io.openthread", "Count", std::bind(&TestObject::CountSetHandler, this, _1));
50     }
51
52     bool IsEnded(void) const { return mEnded; }
53
54 private:
55     otError CountGetHandler(DBusMessageIter &aIter)
56     {
57         DBusMessageEncodeToVariant(&aIter, mCount);
58         return OT_ERROR_NONE;
59     }
60
61     otError CountSetHandler(DBusMessageIter &aIter)
62     {
63         int32_t cnt = 0;
64
65         DBusMessageExtractFromVariant(&aIter, cnt);
66         mCount = cnt;
67
68         return OT_ERROR_NONE;
69     }
70
71     void PingHandler(DBusRequest &aRequest)
72     {
73         uint32_t    id;
74         std::string pingMessage;
75         auto        args = std::tie(id, pingMessage);
76
77         if (DBusMessageToTuple(*aRequest.GetMessage(), args) == OTBR_ERROR_NONE)
78         {
79             aRequest.Reply(std::make_tuple(id, pingMessage + "Pong"));
80         }
81         else
82         {
83             aRequest.Reply(std::make_tuple("hello"));
84             mEnded = true;
85         }
86     }
87
88     bool    mEnded;
89     int32_t mCount;
90 };
91
92 int main()
93 {
94     int       ret = EXIT_SUCCESS;
95     int       requestReply;
96     DBusError dbusErr;
97
98     dbus_error_init(&dbusErr);
99
100     DBusConnection *connection = dbus_bus_get(DBUS_BUS_SYSTEM, &dbusErr);
101     VerifyOrExit(connection != nullptr);
102     dbus_bus_register(connection, &dbusErr);
103
104     requestReply =
105         dbus_bus_request_name(connection, "io.openthread.TestServer", DBUS_NAME_FLAG_REPLACE_EXISTING, &dbusErr);
106     VerifyOrExit(requestReply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER ||
107                      requestReply == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER,
108                  ret = EXIT_FAILURE);
109
110     {
111         TestObject s(connection);
112         s.Init();
113
114         while (!s.IsEnded())
115         {
116             dbus_connection_read_write_dispatch(connection, -1);
117         }
118     }
119
120 exit:
121     dbus_error_free(&dbusErr);
122     dbus_connection_unref(connection);
123     return ret;
124 }