mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #7216 from mikaleppanen/gt_async_dns
Asynchronous DNS greentea testspull/7271/head
commit
7b7dfc634b
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS()
|
||||||
|
{
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts, 1, &result_ok, &result_no_mem, &result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
TEST_ASSERT(result_ok == 1);
|
||||||
|
TEST_ASSERT(result_no_mem == 0);
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int ticker_us = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_dns_query_ticker(void)
|
||||||
|
{
|
||||||
|
ticker_us += 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_CACHE()
|
||||||
|
{
|
||||||
|
rtos::Semaphore semaphore;
|
||||||
|
dns_application_data data;
|
||||||
|
data.semaphore = &semaphore;
|
||||||
|
|
||||||
|
Ticker ticker;
|
||||||
|
ticker.attach_us(&test_dns_query_ticker, 100);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < 5; i++) {
|
||||||
|
int started_us = ticker_us;
|
||||||
|
|
||||||
|
nsapi_error_t err = get_interface()->gethostbyname_async(dns_test_hosts[0],
|
||||||
|
mbed::Callback<void(nsapi_error_t, SocketAddress *)>(hostbyname_cb, (void *) &data));
|
||||||
|
TEST_ASSERT(err >= 0);
|
||||||
|
|
||||||
|
semaphore.wait();
|
||||||
|
|
||||||
|
TEST_ASSERT(data.result == NSAPI_ERROR_OK);
|
||||||
|
TEST_ASSERT(strlen(data.addr.get_ip_address()) > 1);
|
||||||
|
|
||||||
|
int delay_ms = (ticker_us - started_us) / 1000;
|
||||||
|
|
||||||
|
static int delay_first = delay_ms / 2;
|
||||||
|
// Check that cached accesses are at least twice as fast as the first one
|
||||||
|
TEST_ASSERT_FALSE(i != 0 && delay_ms > delay_first);
|
||||||
|
|
||||||
|
printf("DNS: query \"%s\" => \"%s\", time %i ms\n",
|
||||||
|
dns_test_hosts[0], data.addr.get_ip_address(), delay_ms);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_CANCEL()
|
||||||
|
{
|
||||||
|
rtos::Semaphore semaphore;
|
||||||
|
dns_application_data *data = new dns_application_data[MBED_CONF_APP_DNS_TEST_HOSTS_NUM];
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < MBED_CONF_APP_DNS_TEST_HOSTS_NUM; i++) {
|
||||||
|
data[i].value_set = false;
|
||||||
|
data[i].semaphore = &semaphore;
|
||||||
|
data[i].req_result = get_interface()->gethostbyname_async(dns_test_hosts[i],
|
||||||
|
mbed::Callback<void(nsapi_error_t, SocketAddress *)>(hostbyname_cb, (void *) &data[i]));
|
||||||
|
TEST_ASSERT(data[i].req_result >= 0 || data[i].req_result == NSAPI_ERROR_NO_MEMORY);
|
||||||
|
|
||||||
|
if (data[i].req_result >= 0) {
|
||||||
|
// Callback will be called
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
// No memory to initiate DNS query, callback will not be called
|
||||||
|
data[i].result = NSAPI_ERROR_NO_MEMORY;
|
||||||
|
data[i].value_set = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < MBED_CONF_APP_DNS_TEST_HOSTS_NUM; i++) {
|
||||||
|
if (data[i].req_result > 0) {
|
||||||
|
if (get_interface()->gethostbyname_async_cancel(data[i].req_result) == NSAPI_ERROR_OK) {
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for callback(s) to complete
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
semaphore.wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < MBED_CONF_APP_DNS_TEST_HOSTS_NUM; i++) {
|
||||||
|
if (!data[i].value_set) {
|
||||||
|
printf("DNS: query \"%s\" => cancel\n", dns_test_hosts[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TEST_ASSERT(data[i].result == NSAPI_ERROR_OK || data[i].result == NSAPI_ERROR_NO_MEMORY || data[i].result == NSAPI_ERROR_DNS_FAILURE || data[i].result == NSAPI_ERROR_TIMEOUT);
|
||||||
|
if (data[i].result == NSAPI_ERROR_OK) {
|
||||||
|
printf("DNS: query \"%s\" => \"%s\"\n",
|
||||||
|
dns_test_hosts[i], data[i].addr.get_ip_address());
|
||||||
|
} else if (data[i].result == NSAPI_ERROR_DNS_FAILURE) {
|
||||||
|
printf("DNS: query \"%s\" => DNS failure\n", dns_test_hosts[i]);
|
||||||
|
} else if (data[i].result == NSAPI_ERROR_TIMEOUT) {
|
||||||
|
printf("DNS: query \"%s\" => timeout\n", dns_test_hosts[i]);
|
||||||
|
} else if (data[i].result == NSAPI_ERROR_NO_MEMORY) {
|
||||||
|
printf("DNS: query \"%s\" => no memory\n", dns_test_hosts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] data;
|
||||||
|
|
||||||
|
wait(5.0);
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
#include "nsapi_dns.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
|
||||||
|
const int EXTERNAL_THREAD_SIZE = 2048;
|
||||||
|
const int EVENT_QUEUE_SIZE = 10;
|
||||||
|
|
||||||
|
events::EventQueue *event_queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsapi_error_t event_queue_call(int delay, mbed::Callback<void()> func)
|
||||||
|
{
|
||||||
|
if (delay) {
|
||||||
|
if (event_queue->call_in(delay, func) == 0) {
|
||||||
|
return NSAPI_ERROR_NO_MEMORY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (event_queue->call(func) == 0) {
|
||||||
|
return NSAPI_ERROR_NO_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NSAPI_ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_EXTERNAL_EVENT_QUEUE()
|
||||||
|
{
|
||||||
|
// Ensures that cache does not contain entries
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts, MBED_CONF_NSAPI_DNS_CACHE_SIZE, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
TEST_ASSERT(result_ok == MBED_CONF_NSAPI_DNS_CACHE_SIZE);
|
||||||
|
TEST_ASSERT(result_no_mem == 0);
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
|
||||||
|
// Dispatch event queue
|
||||||
|
Thread eventThread(osPriorityNormal, EXTERNAL_THREAD_SIZE);
|
||||||
|
EventQueue queue(EVENT_QUEUE_SIZE * EVENTS_EVENT_SIZE);
|
||||||
|
eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
|
||||||
|
event_queue = &queue;
|
||||||
|
|
||||||
|
nsapi_dns_call_in_set(event_queue_call);
|
||||||
|
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts_second, MBED_CONF_APP_DNS_SIMULT_QUERIES + 1, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
TEST_ASSERT(result_ok == MBED_CONF_APP_DNS_SIMULT_QUERIES);
|
||||||
|
TEST_ASSERT(result_no_mem == 1); // last query fails for no memory as expected
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
|
||||||
|
// Give event queue time to finalise before destructors
|
||||||
|
wait(2.0);
|
||||||
|
|
||||||
|
nsapi_dns_call_in_set(0);
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_INVALID_HOST()
|
||||||
|
{
|
||||||
|
// Ensures that cache does not contain entries
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts_second, MBED_CONF_NSAPI_DNS_CACHE_SIZE, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
char dns_test_hosts_new[MBED_CONF_APP_DNS_TEST_HOSTS_NUM][DNS_TEST_HOST_LEN];
|
||||||
|
memcpy(dns_test_hosts_new, dns_test_hosts, sizeof(dns_test_hosts_new));
|
||||||
|
|
||||||
|
int exp_dns_failure = 0;
|
||||||
|
int exp_ok = 0;
|
||||||
|
|
||||||
|
// Invalidate 1st and 3th etc. entries
|
||||||
|
for (unsigned int i = 0; i < MBED_CONF_APP_DNS_SIMULT_QUERIES + 1; i++) {
|
||||||
|
if ((i % 2) == 0) {
|
||||||
|
// Last query fails to no memory so do not increase
|
||||||
|
if (i != MBED_CONF_APP_DNS_SIMULT_QUERIES) {
|
||||||
|
exp_dns_failure++;
|
||||||
|
}
|
||||||
|
strcat(&(dns_test_hosts_new[i][0]), "_invalid");
|
||||||
|
} else {
|
||||||
|
// Last query fails to no memory so do not increase
|
||||||
|
if (i != MBED_CONF_APP_DNS_SIMULT_QUERIES) {
|
||||||
|
exp_ok++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts_new, MBED_CONF_APP_DNS_SIMULT_QUERIES + 1, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
TEST_ASSERT(result_ok == exp_ok);
|
||||||
|
TEST_ASSERT(result_no_mem == 1); // last query fails for no memory as expected
|
||||||
|
TEST_ASSERT(result_dns_failure == exp_dns_failure || result_dns_failure == exp_dns_failure + 1);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_NON_ASYNC_AND_ASYNC()
|
||||||
|
{
|
||||||
|
rtos::Semaphore semaphore;
|
||||||
|
dns_application_data data;
|
||||||
|
data.semaphore = &semaphore;
|
||||||
|
|
||||||
|
// Initiate
|
||||||
|
nsapi_error_t err = get_interface()->gethostbyname_async(dns_test_hosts_second[0],
|
||||||
|
mbed::Callback<void(nsapi_error_t, SocketAddress *)>(hostbyname_cb, (void *) &data));
|
||||||
|
TEST_ASSERT(err >= 0);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < MBED_CONF_APP_DNS_TEST_HOSTS_NUM; i++) {
|
||||||
|
SocketAddress addr;
|
||||||
|
int err = get_interface()->gethostbyname(dns_test_hosts[i], &addr);
|
||||||
|
printf("DNS: query \"%s\" => \"%s\"\n",
|
||||||
|
dns_test_hosts[i], addr.get_ip_address());
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL(0, err);
|
||||||
|
TEST_ASSERT((bool)addr);
|
||||||
|
TEST_ASSERT(strlen(addr.get_ip_address()) > 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
semaphore.wait();
|
||||||
|
|
||||||
|
TEST_ASSERT(data.result == NSAPI_ERROR_OK);
|
||||||
|
|
||||||
|
printf("DNS: query \"%s\" => \"%s\"\n",
|
||||||
|
dns_test_hosts_second[0], data.addr.get_ip_address());
|
||||||
|
|
||||||
|
TEST_ASSERT(strlen(data.addr.get_ip_address()) > 1);
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_SIMULTANEOUS()
|
||||||
|
{
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts_second, MBED_CONF_APP_DNS_SIMULT_QUERIES + 1, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
TEST_ASSERT(result_ok == MBED_CONF_APP_DNS_SIMULT_QUERIES);
|
||||||
|
TEST_ASSERT(result_no_mem == 1); // last query fails for no memory as expected
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_SIMULTANEOUS_CACHE()
|
||||||
|
{
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts_second, MBED_CONF_APP_DNS_SIMULT_QUERIES + 1, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
// Addresses were cached on last step, OK for all
|
||||||
|
TEST_ASSERT(result_ok == MBED_CONF_APP_DNS_SIMULT_QUERIES + 1);
|
||||||
|
TEST_ASSERT(result_no_mem == 0);
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_SIMULTANEOUS_REPEAT()
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts, MBED_CONF_APP_DNS_SIMULT_QUERIES + 1, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
// For 1st round can fail to no memory, on other rounds some of the addresses are found from cache
|
||||||
|
TEST_ASSERT(result_ok == MBED_CONF_APP_DNS_SIMULT_QUERIES || result_ok == MBED_CONF_APP_DNS_SIMULT_QUERIES + 1);
|
||||||
|
TEST_ASSERT(result_no_mem == 1 || result_no_mem == 0); // last query fails for 1st round to no memory as expected
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
#include "nsapi_dns.h"
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int result_ok;
|
||||||
|
int result_no_mem;
|
||||||
|
int result_dns_failure;
|
||||||
|
int result_exp_timeout;
|
||||||
|
|
||||||
|
const int EXTERNAL_THREAD_SIZE = 2048;
|
||||||
|
const int EVENT_QUEUE_SIZE = 10;
|
||||||
|
|
||||||
|
events::EventQueue *event_queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsapi_error_t event_queue_call(int delay, mbed::Callback<void()> func)
|
||||||
|
{
|
||||||
|
// Run event queue without delays
|
||||||
|
if (event_queue->call(func) == 0) {
|
||||||
|
return NSAPI_ERROR_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NSAPI_ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASYNCHRONOUS_DNS_TIMEOUTS()
|
||||||
|
{
|
||||||
|
// Ensures that cache does not contain entries
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts, MBED_CONF_NSAPI_DNS_CACHE_SIZE, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
TEST_ASSERT(result_ok == MBED_CONF_NSAPI_DNS_CACHE_SIZE);
|
||||||
|
TEST_ASSERT(result_no_mem == 0);
|
||||||
|
TEST_ASSERT(result_dns_failure == 0);
|
||||||
|
TEST_ASSERT(result_exp_timeout == 0);
|
||||||
|
|
||||||
|
// Dispatch event queue
|
||||||
|
Thread eventThread(osPriorityNormal, EXTERNAL_THREAD_SIZE);
|
||||||
|
EventQueue queue(EVENT_QUEUE_SIZE * EVENTS_EVENT_SIZE);
|
||||||
|
eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
|
||||||
|
event_queue = &queue;
|
||||||
|
|
||||||
|
// Set event queue callback to test specific one
|
||||||
|
nsapi_dns_call_in_set(event_queue_call);
|
||||||
|
|
||||||
|
do_asynchronous_gethostbyname(dns_test_hosts_second, MBED_CONF_APP_DNS_SIMULT_QUERIES + 1, &result_ok, &result_no_mem,
|
||||||
|
&result_dns_failure, &result_exp_timeout);
|
||||||
|
|
||||||
|
// Depends on timing, but at least one operation shall fail to timeout
|
||||||
|
TEST_ASSERT(result_exp_timeout > 0);
|
||||||
|
|
||||||
|
// Give event queue time to finalise before destructors
|
||||||
|
wait(2.0);
|
||||||
|
|
||||||
|
nsapi_dns_call_in_set(0);
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DNS_TESTS_H
|
||||||
|
#define DNS_TESTS_H
|
||||||
|
|
||||||
|
#ifndef MBED_CONF_APP_DNS_SIMULT_QUERIES
|
||||||
|
#define MBED_CONF_APP_DNS_SIMULT_QUERIES 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MBED_CONF_NSAPI_DNS_CACHE_SIZE
|
||||||
|
#define MBED_CONF_NSAPI_DNS_CACHE_SIZE 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Hostnames for testing against
|
||||||
|
// Both lists must have A and AAAA records
|
||||||
|
#ifndef MBED_CONF_APP_DNS_TEST_HOSTS
|
||||||
|
#define MBED_CONF_APP_DNS_TEST_HOSTS {"google.com", "youtube.com", "facebook.com", "wikipedia.org", "yahoo.com", "instagram.com"}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MBED_CONF_APP_DNS_TEST_HOSTS_SECOND
|
||||||
|
#define MBED_CONF_APP_DNS_TEST_HOSTS_SECOND {"ipv6ready.org", "wireshark.org", "bbc.co.uk", "cnn.com", "www.flickr.com", "www.mozilla.org"}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MBED_CONF_APP_DNS_TEST_HOSTS_NUM
|
||||||
|
#define MBED_CONF_APP_DNS_TEST_HOSTS_NUM 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DNS_TEST_HOST_LEN 40
|
||||||
|
|
||||||
|
struct dns_application_data {
|
||||||
|
rtos::Semaphore *semaphore;
|
||||||
|
nsapi_error_t result;
|
||||||
|
SocketAddress addr;
|
||||||
|
nsapi_error_t req_result;
|
||||||
|
bool value_set;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const char dns_test_hosts[MBED_CONF_APP_DNS_TEST_HOSTS_NUM][DNS_TEST_HOST_LEN];
|
||||||
|
extern const char dns_test_hosts_second[MBED_CONF_APP_DNS_TEST_HOSTS_NUM][DNS_TEST_HOST_LEN];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Utility functions
|
||||||
|
*/
|
||||||
|
NetworkInterface *get_interface();
|
||||||
|
void hostbyname_cb(void *data, nsapi_error_t result, SocketAddress *address);
|
||||||
|
void do_asynchronous_gethostbyname(const char hosts[][DNS_TEST_HOST_LEN], unsigned int op_count, int *exp_ok, int *exp_no_mem, int *exp_dns_failure, int *exp_timeout);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test cases
|
||||||
|
*/
|
||||||
|
void ASYNCHRONOUS_DNS();
|
||||||
|
void ASYNCHRONOUS_DNS_SIMULTANEOUS();
|
||||||
|
void ASYNCHRONOUS_DNS_SIMULTANEOUS_CACHE();
|
||||||
|
void ASYNCHRONOUS_DNS_CACHE();
|
||||||
|
void ASYNCHRONOUS_DNS_NON_ASYNC_AND_ASYNC();
|
||||||
|
void ASYNCHRONOUS_DNS_CANCEL();
|
||||||
|
void ASYNCHRONOUS_DNS_EXTERNAL_EVENT_QUEUE();
|
||||||
|
void ASYNCHRONOUS_DNS_INVALID_HOST();
|
||||||
|
void ASYNCHRONOUS_DNS_TIMEOUTS();
|
||||||
|
void ASYNCHRONOUS_DNS_SIMULTANEOUS_REPEAT();
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,153 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited, All Rights Reserved
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MBED_CONF_APP_CONNECT_STATEMENT
|
||||||
|
#error [NOT_SUPPORTED] No network configuration found for this target.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "greentea-client/test_env.h"
|
||||||
|
#include "unity.h"
|
||||||
|
#include "utest.h"
|
||||||
|
#include "nsapi_dns.h"
|
||||||
|
#include "EventQueue.h"
|
||||||
|
#include "dns_tests.h"
|
||||||
|
|
||||||
|
#include MBED_CONF_APP_HEADER_FILE
|
||||||
|
|
||||||
|
using namespace utest::v1;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
NetworkInterface *net;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char dns_test_hosts[MBED_CONF_APP_DNS_TEST_HOSTS_NUM][DNS_TEST_HOST_LEN] = MBED_CONF_APP_DNS_TEST_HOSTS;
|
||||||
|
const char dns_test_hosts_second[MBED_CONF_APP_DNS_TEST_HOSTS_NUM][DNS_TEST_HOST_LEN] = MBED_CONF_APP_DNS_TEST_HOSTS_SECOND;
|
||||||
|
|
||||||
|
// Callback used for asynchronous DNS result
|
||||||
|
void hostbyname_cb(void *data, nsapi_error_t result, SocketAddress *address)
|
||||||
|
{
|
||||||
|
dns_application_data *app_data = static_cast<dns_application_data *>(data);
|
||||||
|
app_data->result = result;
|
||||||
|
if (address) {
|
||||||
|
app_data->addr = *address;
|
||||||
|
}
|
||||||
|
app_data->semaphore->release();
|
||||||
|
app_data->value_set = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// General function to do asynchronous DNS host name resolution
|
||||||
|
void do_asynchronous_gethostbyname(const char hosts[][DNS_TEST_HOST_LEN], unsigned int op_count, int *exp_ok, int *exp_no_mem, int *exp_dns_failure, int *exp_timeout)
|
||||||
|
{
|
||||||
|
// Verify that there is enough hosts in the host list
|
||||||
|
TEST_ASSERT(op_count <= MBED_CONF_APP_DNS_TEST_HOSTS_NUM)
|
||||||
|
|
||||||
|
// Reset counters
|
||||||
|
(*exp_ok) = 0;
|
||||||
|
(*exp_no_mem) = 0;
|
||||||
|
(*exp_dns_failure) = 0;
|
||||||
|
(*exp_timeout) = 0;
|
||||||
|
|
||||||
|
// Create callback semaphore and data
|
||||||
|
rtos::Semaphore semaphore;
|
||||||
|
dns_application_data *data = new dns_application_data[op_count];
|
||||||
|
|
||||||
|
unsigned int count = 0;
|
||||||
|
for (unsigned int i = 0; i < op_count; i++) {
|
||||||
|
data[i].semaphore = &semaphore;
|
||||||
|
nsapi_error_t err = net->gethostbyname_async(hosts[i], mbed::Callback<void(nsapi_error_t, SocketAddress *)>(hostbyname_cb, (void *) &data[i]));
|
||||||
|
TEST_ASSERT(err >= 0 || err == NSAPI_ERROR_NO_MEMORY);
|
||||||
|
if (err >= 0) {
|
||||||
|
// Callback will be called
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
// No memory to initiate DNS query, callback will not be called
|
||||||
|
data[i].result = NSAPI_ERROR_NO_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for callback(s) to complete
|
||||||
|
for (unsigned int i = 0; i < count; i++) {
|
||||||
|
semaphore.wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print result
|
||||||
|
for (unsigned int i = 0; i < op_count; i++) {
|
||||||
|
TEST_ASSERT(data[i].result == NSAPI_ERROR_OK || data[i].result == NSAPI_ERROR_NO_MEMORY || data[i].result == NSAPI_ERROR_DNS_FAILURE || data[i].result == NSAPI_ERROR_TIMEOUT);
|
||||||
|
if (data[i].result == NSAPI_ERROR_OK) {
|
||||||
|
(*exp_ok)++;
|
||||||
|
printf("DNS: query \"%s\" => \"%s\"\n",
|
||||||
|
hosts[i], data[i].addr.get_ip_address());
|
||||||
|
} else if (data[i].result == NSAPI_ERROR_DNS_FAILURE) {
|
||||||
|
(*exp_dns_failure)++;
|
||||||
|
printf("DNS: query \"%s\" => DNS failure\n", hosts[i]);
|
||||||
|
} else if (data[i].result == NSAPI_ERROR_TIMEOUT) {
|
||||||
|
(*exp_timeout)++;
|
||||||
|
printf("DNS: query \"%s\" => timeout\n", hosts[i]);
|
||||||
|
} else if (data[i].result == NSAPI_ERROR_NO_MEMORY) {
|
||||||
|
(*exp_no_mem)++;
|
||||||
|
printf("DNS: query \"%s\" => no memory\n", hosts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] data;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkInterface *get_interface()
|
||||||
|
{
|
||||||
|
return net;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void net_bringup()
|
||||||
|
{
|
||||||
|
MBED_ASSERT(MBED_CONF_APP_DNS_TEST_HOSTS_NUM >= MBED_CONF_NSAPI_DNS_CACHE_SIZE && MBED_CONF_APP_DNS_TEST_HOSTS_NUM >= MBED_CONF_APP_DNS_SIMULT_QUERIES + 1);
|
||||||
|
|
||||||
|
net = MBED_CONF_APP_OBJECT_CONSTRUCTION;
|
||||||
|
int err = MBED_CONF_APP_CONNECT_STATEMENT;
|
||||||
|
TEST_ASSERT_EQUAL(0, err);
|
||||||
|
|
||||||
|
printf("MBED: Connected to network\n");
|
||||||
|
printf("MBED: IP Address: %s\n", net->get_ip_address());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test setup
|
||||||
|
utest::v1::status_t test_setup(const size_t number_of_cases)
|
||||||
|
{
|
||||||
|
GREENTEA_SETUP(120, "default_auto");
|
||||||
|
net_bringup();
|
||||||
|
return verbose_test_setup_handler(number_of_cases);
|
||||||
|
}
|
||||||
|
|
||||||
|
Case cases[] = {
|
||||||
|
Case("ASYNCHRONOUS_DNS", ASYNCHRONOUS_DNS),
|
||||||
|
Case("ASYNCHRONOUS_DNS_SIMULTANEOUS", ASYNCHRONOUS_DNS_SIMULTANEOUS),
|
||||||
|
Case("ASYNCHRONOUS_DNS_SIMULTANEOUS_CACHE", ASYNCHRONOUS_DNS_SIMULTANEOUS_CACHE),
|
||||||
|
Case("ASYNCHRONOUS_DNS_CACHE", ASYNCHRONOUS_DNS_CACHE),
|
||||||
|
Case("ASYNCHRONOUS_DNS_NON_ASYNC_AND_ASYNC", ASYNCHRONOUS_DNS_NON_ASYNC_AND_ASYNC),
|
||||||
|
Case("ASYNCHRONOUS_DNS_CANCEL", ASYNCHRONOUS_DNS_CANCEL),
|
||||||
|
Case("ASYNCHRONOUS_DNS_EXTERNAL_EVENT_QUEUE", ASYNCHRONOUS_DNS_EXTERNAL_EVENT_QUEUE),
|
||||||
|
Case("ASYNCHRONOUS_DNS_INVALID_HOST", ASYNCHRONOUS_DNS_INVALID_HOST),
|
||||||
|
Case("ASYNCHRONOUS_DNS_TIMEOUTS", ASYNCHRONOUS_DNS_TIMEOUTS),
|
||||||
|
Case("ASYNCHRONOUS_DNS_SIMULTANEOUS_REPEAT", ASYNCHRONOUS_DNS_SIMULTANEOUS_REPEAT),
|
||||||
|
};
|
||||||
|
|
||||||
|
Specification specification(test_setup, cases);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return !Harness::run(specification);
|
||||||
|
}
|
Loading…
Reference in New Issue