1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 #include "rd_client.h"
24 #include "rd_server.h"
27 #include "oic_malloc.h"
30 #include "gtest/gtest.h"
31 #include <sys/types.h>
38 //-----------------------------------------------------------------------------
40 //-----------------------------------------------------------------------------
47 #include "gtest_helper.h"
51 namespace itst = iotivity::test;
53 #define DEFAULT_CONTEXT_VALUE 0x99
55 //-----------------------------------------------------------------------------
57 //-----------------------------------------------------------------------------
58 static const char TAG[] = "RDTests";
60 std::chrono::seconds const SHORT_TEST_TIMEOUT = std::chrono::seconds(5);
62 //-----------------------------------------------------------------------------
64 //-----------------------------------------------------------------------------
65 #if (defined(RD_SERVER) && defined(RD_CLIENT))
66 static OCStackApplicationResult handleDiscoveryCB(__attribute__((unused))void *ctx,
67 __attribute__((unused)) OCDoHandle handle,
68 __attribute__((unused))
69 OCClientResponse *clientResponse)
71 OIC_LOG(DEBUG, TAG, "Successfully found RD.");
73 return OC_STACK_DELETE_TRANSACTION;
78 static OCStackApplicationResult handlePublishCB(__attribute__((unused))void *ctx,
79 __attribute__((unused)) OCDoHandle handle,
80 __attribute__((unused))
81 OCClientResponse *clientResponse)
83 OIC_LOG(DEBUG, TAG, "Successfully published resources.");
85 return OC_STACK_DELETE_TRANSACTION;
88 static OCStackApplicationResult handleDeleteCB(__attribute__((unused))void *ctx,
89 __attribute__((unused)) OCDoHandle handle,
90 __attribute__((unused))
91 OCClientResponse *clientResponse)
93 OIC_LOG(DEBUG, TAG, "Successfully delete resources.");
95 return OC_STACK_DELETE_TRANSACTION;
99 //-----------------------------------------------------------------------------
101 //-----------------------------------------------------------------------------
102 OCEntityHandlerResult rdEntityHandler(OCEntityHandlerFlag /*flag*/,
103 OCEntityHandlerRequest * /*entityHandlerRequest*/,
104 void* /*callbackParam*/)
106 OIC_LOG(INFO, TAG, "Entering entityHandler");
111 //-----------------------------------------------------------------------------
113 //-----------------------------------------------------------------------------
114 class RDTests : public testing::Test {
118 OCInit("127.0.0.1", 5683, OC_CLIENT_SERVER);
121 virtual void TearDown()
127 #if (defined(RD_SERVER) && defined(RD_CLIENT))
128 TEST_F(RDTests, CreateRDResource)
130 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
131 EXPECT_EQ(OC_STACK_OK, OCRDStart());
133 OCCallbackData cbData;
134 cbData.cb = &handleDiscoveryCB;;
136 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
137 EXPECT_EQ(OC_STACK_OK, OCRDDiscover(NULL, CT_ADAPTER_IP, &cbData, OC_LOW_QOS));
139 EXPECT_EQ(OC_STACK_OK, OCRDStop());
144 // TEST_F(RDTests, CreateRDPayload)
146 // itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
148 // OCResourceHandle handle;
149 // EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light",
150 // "oic.if.baseline", "/a/light", rdEntityHandler,
151 // NULL, OC_DISCOVERABLE | OC_OBSERVABLE));
153 // // Create RD Publish Payload.
154 // // OCRDPayload *rdPayload = (OCRDPayload *) OCRDPublishPayloadCreate(&handle, 1, 86400);
155 // // EXPECT_TRUE(rdPayload != NULL);
158 // // OCPayloadDestroy(rdPayload);
161 // TEST_F(RDTests, ConvertParseRDPayload)
163 // itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
165 // OCResourceHandle handle;
166 // EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light",
167 // "oic.if.baseline", "/a/light", rdEntityHandler,
168 // NULL, OC_DISCOVERABLE | OC_OBSERVABLE));
170 // // Create RD Publish Payload.
171 // OCRDPayload *rdPayload = (OCRDPayload *) OCRDPublishPayloadCreate(&handle, 1, 86400);
172 // EXPECT_TRUE(rdPayload != NULL);
176 // // Convert RD Publish Payload to CBOR.
177 // size_t curSize = 255;
178 // uint8_t *outPayload = (uint8_t *)OICCalloc(1, curSize);
179 // OCRDPayloadToCbor(rdPayload, outPayload, &curSize);
181 // // Parse CBOR back to RD Publish Payload.
182 // CborParser parser;
183 // CborValue rootValue;
184 // cbor_parser_init(outPayload, curSize, 0, &parser, &rootValue);
186 // OCRDPayload *rdPayload = NULL;
187 // EXPECT_EQ(OC_STACK_OK, OCRDCborToPayload(&rootValue, (OCPayload**) &rdPayload));
190 // OICFree(outPayload);
192 // OCRDPayloadDestroy(rdPayload);
195 TEST_F(RDTests, RDPublishResourceNullAddr)
197 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
198 EXPECT_EQ(OC_STACK_INVALID_IP, OCRDPublish(NULL, 0, CT_ADAPTER_IP, nullptr, 0, 0, OC_LOW_QOS));
201 TEST_F(RDTests, RDPublishResourceNullCB)
203 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
204 EXPECT_EQ(OC_STACK_INVALID_CALLBACK, OCRDPublish(NULL, "127.0.0.1", CT_ADAPTER_IP, nullptr,
208 TEST_F(RDTests, RDPublishResource)
210 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
212 OCCallbackData cbData;
213 cbData.cb = &handlePublishCB;
215 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
217 OCResourceHandle handle;
219 EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light",
220 "oic.if.baseline", "/a/light", rdEntityHandler,
221 NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
223 EXPECT_EQ(OC_STACK_OK, OCRDPublish(NULL, "127.0.0.1", CT_ADAPTER_IP, &handle,
224 1, &cbData, OC_LOW_QOS));
227 TEST_F(RDTests, RDPublishMultipleResources)
229 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
231 OCCallbackData cbData;
232 cbData.cb = &handlePublishCB;
234 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
236 OCResourceHandle handles[2];
237 EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles[0], "core.light",
238 "oic.if.baseline", "/a/light", rdEntityHandler,
239 NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
241 EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles[1], "core.light",
242 "oic.if.baseline", "/a/light2", rdEntityHandler,
243 NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
245 EXPECT_EQ(OC_STACK_OK, OCRDPublish(NULL, "127.0.0.1", CT_ADAPTER_IP, handles,
246 2, &cbData, OC_LOW_QOS));
249 TEST_F(RDTests, RDDeleteResourceNullAddr)
251 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
252 EXPECT_EQ(OC_STACK_INVALID_IP, OCRDDelete(NULL, 0, CT_ADAPTER_IP, nullptr, 0, 0, OC_LOW_QOS));
255 TEST_F(RDTests, RDDeleteResourceNullCB)
257 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
258 EXPECT_EQ(OC_STACK_INVALID_CALLBACK, OCRDDelete(NULL, "127.0.0.1", CT_ADAPTER_IP, nullptr,
262 TEST_F(RDTests, RDDeleteAllResource)
264 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
266 OCCallbackData cbData;
267 cbData.cb = &handleDeleteCB;
269 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
271 EXPECT_EQ(OC_STACK_OK, OCRDDelete(NULL, "127.0.0.1", CT_ADAPTER_IP, nullptr, 0, &cbData,
275 TEST_F(RDTests, RDDeleteSpecificResource)
277 itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
279 OCCallbackData cbData;
280 cbData.cb = &handleDeleteCB;
282 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
284 OCResourceHandle handle;
286 EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light",
287 "oic.if.baseline", "/a/light", rdEntityHandler,
288 NULL, OC_DISCOVERABLE | OC_OBSERVABLE));
290 EXPECT_EQ(OC_STACK_OK, OCRDDelete(NULL, "127.0.0.1", CT_ADAPTER_IP, &handle,
291 1, &cbData, OC_LOW_QOS));