+
+TEST(StackPayload, CloneByteString)
+{
+ uint8_t bytes[] = { 0, 1, 2, 3 };
+ OCByteString byteString;
+ byteString.bytes = bytes;
+ byteString.len = sizeof(bytes);
+
+ OCRepPayload *original = OCRepPayloadCreate();
+ ASSERT_TRUE(original != NULL);
+ EXPECT_TRUE(OCRepPayloadSetPropByteString(original, "name", byteString));
+
+ OCRepPayload *clone = OCRepPayloadClone(original);
+ ASSERT_TRUE(clone != NULL);
+
+ OCRepPayloadDestroy(original);
+
+ OCByteString cloneByteString;
+ EXPECT_TRUE(OCRepPayloadGetPropByteString(clone, "name", &cloneByteString));
+ ASSERT_TRUE(cloneByteString.bytes != NULL);
+ EXPECT_EQ(sizeof(bytes), cloneByteString.len);
+ EXPECT_TRUE(0 == memcmp(bytes, cloneByteString.bytes, sizeof(bytes)));
+ OICFree(cloneByteString.bytes);
+
+ OCRepPayloadDestroy(clone);
+}
+
+TEST(StackUri, Rfc6874_Noop_1)
+{
+ char validIPv6Address[] = "FF01:0:0:0:0:0:0:FB";
+ char bytes[100] = {0};
+ strncpy(bytes, validIPv6Address, sizeof(bytes));
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), validIPv6Address);
+
+ // No % sign, should do nothing
+ EXPECT_STREQ(bytes, validIPv6Address);
+ EXPECT_EQ(OC_STACK_OK, result);
+}
+
+TEST(StackUri, Rfc6874_Noop_2)
+{
+ char validIPv6Address[] = "3812:a61::4:1";
+ char bytes[100] = {0};
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), validIPv6Address);
+
+ // No % sign, should do nothing
+ EXPECT_STREQ(bytes, validIPv6Address);
+ EXPECT_EQ(OC_STACK_OK, result);
+}
+
+TEST(StackUri, Rfc6874_WithEncoding)
+{
+ char validIPv6Address[] = "fe80::dafe:e3ff:fe00:ebfa%wlan0";
+ char validIPv6AddressEncoded[] = "fe80::dafe:e3ff:fe00:ebfa%25wlan0";
+ char bytes[100] = "";
+ strncpy(bytes, validIPv6Address, sizeof(bytes));
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), validIPv6Address);
+
+ // Encoding should have occured
+ EXPECT_STREQ(bytes, validIPv6AddressEncoded);
+ EXPECT_EQ(OC_STACK_OK, result);
+}
+
+TEST(StackUri, Rfc6874_WithEncoding_ExtraPercent)
+{
+ char validIPv6Address[] = "fe80::dafe:e3ff:fe00:ebfa%%wlan0";
+ char bytes[100] = {0};
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), validIPv6Address);
+
+ // Encoding should have failed due to extra '%' character
+ EXPECT_STREQ(bytes, "");
+ EXPECT_EQ(OC_STACK_ERROR, result);
+}
+
+TEST(StackUri, Rfc6874_AlreadyEncoded)
+{
+ char validIPv6AddressEncoded[] = "fe80::dafe:e3ff:fe00:ebfa%25wlan0";
+ char bytes[100] = {0};
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), validIPv6AddressEncoded);
+
+ // Encoding should have failed due to extra '%' character
+ EXPECT_STREQ(bytes, "");
+ EXPECT_EQ(OC_STACK_ERROR, result);
+}
+
+TEST(StackUri, Rfc6874_NoOverflow)
+{
+ char validIPv6Address[] = "fe80::dafe:e3ff:fe00:ebfa%wlan0";
+ char addrBuffer[100];
+ char bytes[100] = {0};
+ memset(addrBuffer, sizeof(addrBuffer), '_');
+
+ // Just enough room to encode
+ addrBuffer[sizeof(addrBuffer) - sizeof(validIPv6Address) - 3] = '\0';
+ strcat(addrBuffer, validIPv6Address);
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), addrBuffer);
+
+ // Encoding should have succeeded
+ EXPECT_EQ(OC_STACK_OK, result);
+}
+
+TEST(StackUri, Rfc6874_NoOverflow_2)
+{
+ char validIPv6Address[] = "fe80::dafe:e3ff:fe00:ebfa%wlan0";
+ char addrBuffer[100];
+ char bytes[100] = {0};
+ memset(addrBuffer, sizeof(addrBuffer), '_');
+
+ // Not enough room to encode
+ addrBuffer[sizeof(addrBuffer) - sizeof(validIPv6Address) - 1] = '\0';
+ strcat(addrBuffer, validIPv6Address);
+
+ OCStackResult result = OCEncodeAddressForRFC6874(bytes, sizeof(bytes), addrBuffer);
+
+ // Encoding should have failed due to output size limitations
+ EXPECT_STREQ(bytes, "");
+ EXPECT_EQ(OC_STACK_ERROR, result);
+}
+
+TEST(StackHeaderOption, setHeaderOption)
+{
+ uint8_t optionValue1[MAX_HEADER_OPTION_DATA_LENGTH] =
+ { 1 };
+ OCHeaderOption options[MAX_HEADER_OPTIONS] =
+ {
+ { OC_COAP_ID, 6, 8, optionValue1 }, };
+ uint8_t optionData = 255;
+ size_t optionDataSize = sizeof(optionData);
+ size_t numOptions = 1;
+ uint16_t optionID = 2048;
+ EXPECT_EQ(OC_STACK_OK, OCSetHeaderOption(options,
+ &numOptions,
+ optionID,
+ &optionData,
+ optionDataSize));
+ EXPECT_EQ(options[1].optionID, optionID);
+ EXPECT_EQ(options[1].optionData[0], 255);
+}
+
+TEST(StackHeaderOption, getHeaderOption)
+{
+ uint8_t optionValue1[MAX_HEADER_OPTION_DATA_LENGTH] =
+ { 1 };
+ uint8_t optionValue2[MAX_HEADER_OPTION_DATA_LENGTH] =
+ { 255 };
+ OCHeaderOption options[MAX_HEADER_OPTIONS] =
+ {
+ { OC_COAP_ID, 6, 8, optionValue1 },
+ { OC_COAP_ID, 2048, 16, optionValue2 }, };
+ uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
+ size_t optionDataSize = sizeof(optionData);
+ size_t numOptions = 2;
+ uint16_t optionID = 6;
+ uint16_t actualDataSize = 0;
+ EXPECT_EQ(OC_STACK_OK, OCGetHeaderOption(options,
+ numOptions,
+ optionID,
+ optionData,
+ optionDataSize,
+ &actualDataSize));
+ EXPECT_EQ(optionData[0], 1);
+ EXPECT_EQ(actualDataSize, 8);
+}
+
+static OCStackApplicationResult DiscoverBaslineResource(void *ctx, OCDoHandle handle,
+ OCClientResponse *response)
+{
+ OC_UNUSED(ctx);
+ OC_UNUSED(handle);
+ EXPECT_EQ(OC_STACK_OK, response->result);
+ EXPECT_TRUE(NULL != response->payload);
+ if (NULL != response->payload)
+ {
+ EXPECT_EQ(PAYLOAD_TYPE_DISCOVERY, response->payload->type);
+
+ OCDiscoveryPayload *payload = (OCDiscoveryPayload *)response->payload;
+ EXPECT_TRUE(NULL != payload->sid);
+ if (payload->name)
+ {
+ EXPECT_STREQ("StackTest", payload->name);
+ }
+ EXPECT_STREQ(OC_RSRVD_RESOURCE_TYPE_RES, payload->type->value);
+ EXPECT_STREQ(OC_RSRVD_INTERFACE_LL, payload->iface->value);
+ EXPECT_STREQ(OC_RSRVD_INTERFACE_DEFAULT, payload->iface->next->value);
+
+ for (OCResourcePayload *resource = payload->resources; resource; resource = resource->next)
+ {
+ if (0 == strcmp("/a/light", resource->uri))
+ {
+ EXPECT_STREQ("/a/light", resource->uri);
+ EXPECT_STREQ("core.light", resource->types->value);
+ EXPECT_EQ(NULL, resource->types->next);
+ EXPECT_STREQ("oic.if.baseline", resource->interfaces->value);
+ EXPECT_EQ(NULL, resource->interfaces->next);
+ EXPECT_TRUE(resource->bitmap & OC_DISCOVERABLE);
+ EXPECT_TRUE(resource->bitmap & OC_OBSERVABLE);
+ EXPECT_FALSE(resource->secure);
+ EXPECT_EQ(0, resource->port);
+ EXPECT_EQ(NULL, resource->next);
+ }
+ }
+ }
+
+ return OC_STACK_DELETE_TRANSACTION;
+}
+
+static OCStackApplicationResult DiscoverLinkedListResource(void *ctx, OCDoHandle handle,
+ OCClientResponse *response)
+{
+ OC_UNUSED(ctx);
+ OC_UNUSED(handle);
+ EXPECT_EQ(OC_STACK_OK, response->result);
+ EXPECT_TRUE(NULL != response->payload);
+ if (NULL != response->payload)
+ {
+ EXPECT_EQ(PAYLOAD_TYPE_DISCOVERY, response->payload->type);
+
+ OCDiscoveryPayload *payload = (OCDiscoveryPayload *)response->payload;
+ EXPECT_NE((char *)NULL, payload->sid);
+ EXPECT_EQ(NULL, payload->name);
+ EXPECT_EQ(NULL, payload->type);
+ EXPECT_EQ(NULL, payload->iface);
+
+ for (OCResourcePayload *resource = payload->resources; resource; resource = resource->next)
+ {
+ if (0 == strcmp("/a/light", resource->uri))
+ {
+ EXPECT_STREQ("/a/light", resource->uri);
+ EXPECT_STREQ("core.light", resource->types->value);
+ EXPECT_EQ(NULL, resource->types->next);
+ EXPECT_STREQ("oic.if.baseline", resource->interfaces->value);
+ EXPECT_EQ(NULL, resource->interfaces->next);
+ EXPECT_TRUE(resource->bitmap & OC_DISCOVERABLE);
+ EXPECT_TRUE(resource->bitmap & OC_OBSERVABLE);
+ EXPECT_FALSE(resource->secure);
+ EXPECT_EQ(0, resource->port);
+ EXPECT_EQ(NULL, resource->next);
+ }
+ }
+ }
+ return OC_STACK_DELETE_TRANSACTION;
+}
+
+
+static OCStackApplicationResult DiscoverResourceTypeResponse(void *ctx, OCDoHandle handle,
+ OCClientResponse *response)
+{
+ OC_UNUSED(ctx);
+ OC_UNUSED(handle);
+ EXPECT_EQ(OC_STACK_OK, response->result);
+ EXPECT_TRUE(NULL != response->payload);
+ if (NULL != response->payload)
+ {
+ EXPECT_EQ(PAYLOAD_TYPE_DISCOVERY, response->payload->type);
+
+ OCDiscoveryPayload *payload = (OCDiscoveryPayload *)response->payload;
+ EXPECT_NE((char *)NULL, payload->sid);
+ EXPECT_EQ(NULL, payload->name);
+ EXPECT_EQ(NULL, payload->type);
+ EXPECT_EQ(NULL, payload->iface);
+ EXPECT_TRUE(NULL != payload->resources);
+
+ OCResourcePayload *resource = payload->resources;
+
+ if (0 == strcmp("/a/light", resource->uri))
+ {
+ EXPECT_STREQ("/a/light", resource->uri);
+ EXPECT_STREQ("core.light", resource->types->value);
+ EXPECT_EQ(NULL, resource->types->next);
+ EXPECT_STREQ("oic.if.baseline", resource->interfaces->value);
+ EXPECT_EQ(NULL, resource->interfaces->next);
+ EXPECT_TRUE(resource->bitmap & OC_DISCOVERABLE);
+ EXPECT_TRUE(resource->bitmap & OC_OBSERVABLE);
+ EXPECT_FALSE(resource->secure);
+ EXPECT_EQ(0, resource->port);
+ EXPECT_EQ(NULL, resource->next);
+ }
+ }
+
+ return OC_STACK_DELETE_TRANSACTION;
+}
+
+static OCStackApplicationResult DiscoverNoResource(void *ctx, OCDoHandle handle,
+ OCClientResponse *response)
+{
+ OC_UNUSED(ctx);
+ OC_UNUSED(handle);
+ EXPECT_EQ(OC_STACK_OK, response->result);
+ EXPECT_TRUE(NULL != response->payload);
+ if (NULL != response->payload)
+ {
+ EXPECT_EQ(PAYLOAD_TYPE_DISCOVERY, response->payload->type);
+
+ OCDiscoveryPayload *payload = (OCDiscoveryPayload *)response->payload;
+ EXPECT_EQ(NULL, payload->sid);
+ EXPECT_EQ(NULL, payload->name);
+ EXPECT_EQ(NULL, payload->type);
+ EXPECT_EQ(NULL, payload->iface);
+
+ bool resourceFound = false;
+ for (OCResourcePayload *resource = payload->resources; resource; resource = resource->next)
+ {
+ if (0 == strcmp("/a/light", resource->uri))
+ {
+ resourceFound = true;
+ }
+ }
+
+ EXPECT_FALSE(resourceFound);
+ }
+ return OC_STACK_DELETE_TRANSACTION;
+}
+
+static OCStackApplicationResult DiscoverUnicastErrorResponse(void *ctx, OCDoHandle handle,
+ OCClientResponse *response)
+{
+ OC_UNUSED(ctx);
+ OC_UNUSED(handle);
+ EXPECT_NE(OC_STACK_OK, response->result);
+ EXPECT_TRUE(NULL == response->payload);
+
+ return OC_STACK_DELETE_TRANSACTION;
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithInterfaceBaselineQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, OC_RSRVD_DEVICE_NAME, "StackTest");
+ Callback discoverCB(&DiscoverBaslineResource);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?if=oic.if.baseline", NULL,
+ 0, CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(100);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithoutAnyQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverLinkedListResource);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res", NULL, 0, CT_DEFAULT,
+ OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(100);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithInterfaceLinkedListQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverLinkedListResource);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?if=oic.if.ll", NULL, 0,
+ CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(100);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithResourceTypeQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverResourceTypeResponse);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?rt=core.light", NULL, 0,
+ CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(100);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithInvalidInterfaceQuery_Unicast)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverUnicastErrorResponse);
+ char targetUri[MAX_URI_LENGTH * 2] ={ 0, };
+ snprintf(targetUri, MAX_URI_LENGTH * 2, "127.0.0.1/oic/res?if=invalid");
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, targetUri, NULL, 0,
+ CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(100);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithoutInterfaceQuery_Unicast)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverUnicastErrorResponse);
+ char targetUri[MAX_URI_LENGTH * 2] ={ 0, };
+ snprintf(targetUri, MAX_URI_LENGTH * 2, "127.0.0.1/oic/res?if=");
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, targetUri, NULL, 0, CT_DEFAULT,
+ OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(10);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithInvalidResourceTypeQuery_Unicast)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverUnicastErrorResponse);
+ char targetUri[MAX_URI_LENGTH * 2] ={ 0, };
+ snprintf(targetUri, MAX_URI_LENGTH * 2, "127.0.0.1/oic/res?rt=invalid");
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, targetUri, NULL, 0,
+ CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(10);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithoutResourceTypeQuery_Unicast)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverUnicastErrorResponse);
+ char targetUri[MAX_URI_LENGTH * 2] ={ 0, };
+ snprintf(targetUri, MAX_URI_LENGTH * 2, "127.0.0.1/oic/res?rt=");
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, targetUri, NULL, 0, CT_DEFAULT,
+ OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(10);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithInvalidResourceTypeQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverUnicastErrorResponse);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?rt=invalid", NULL, 0,
+ CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(5);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithoutResourceTypeQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverUnicastErrorResponse);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?rt=", NULL, 0, CT_DEFAULT,
+ OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(5);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithInvalidInterfaceQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverNoResource);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?if=invalid", NULL, 0,
+ CT_DEFAULT, OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(5);
+}
+
+TEST_F(OCDiscoverTests, DiscoverResourceWithoutInterfaceQuery)
+{
+ itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT);
+
+ OCResourceHandle handles;
+ EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handles, "core.light", "oic.if.baseline", "/a/light",
+ entityHandler, NULL, (OC_DISCOVERABLE | OC_OBSERVABLE)));
+ OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", "StackTest");
+ Callback discoverCB(&DiscoverNoResource);
+ EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res?if=", NULL, 0, CT_DEFAULT,
+ OC_HIGH_QOS, discoverCB, NULL, 0));
+ discoverCB.Wait(5);
+}