mirror of https://github.com/ARMmbed/mbed-os.git
368 lines
11 KiB
C++
368 lines
11 KiB
C++
/*
|
|
* Copyright (c) 2018, Arm Limited and affiliates.
|
|
* 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 "CppUTest/TestHarness.h"
|
|
#include "test_at_cellularstack.h"
|
|
#include <string.h>
|
|
#include "AT_CellularNetwork.h"
|
|
#include "EventQueue.h"
|
|
#include "ATHandler.h"
|
|
#include "AT_CellularStack.h"
|
|
#include "FileHandle_stub.h"
|
|
#include "CellularLog.h"
|
|
#include "ATHandler_stub.h"
|
|
#include "SocketAddress.h"
|
|
|
|
using namespace mbed;
|
|
using namespace events;
|
|
|
|
class MyStack : public AT_CellularStack {
|
|
public:
|
|
bool bool_value;
|
|
bool max_sock_value;
|
|
nsapi_error_t create_error;
|
|
CellularSocket socket;
|
|
|
|
MyStack(ATHandler &atr, int cid, nsapi_ip_stack_t typ) : AT_CellularStack(atr, cid, typ)
|
|
{
|
|
bool_value = false;
|
|
max_sock_value = 0;
|
|
create_error = NSAPI_ERROR_OK;
|
|
}
|
|
|
|
virtual int get_max_socket_count()
|
|
{
|
|
return max_sock_value;
|
|
}
|
|
|
|
virtual bool is_protocol_supported(nsapi_protocol_t protocol)
|
|
{
|
|
return bool_value;
|
|
}
|
|
|
|
virtual nsapi_error_t socket_close_impl(int sock_id)
|
|
{
|
|
return NSAPI_ERROR_OK;
|
|
}
|
|
|
|
virtual nsapi_error_t create_socket_impl(CellularSocket *socket)
|
|
{
|
|
return create_error;
|
|
}
|
|
|
|
virtual nsapi_size_or_error_t socket_sendto_impl(CellularSocket *socket, const SocketAddress &address,
|
|
const void *data, nsapi_size_t size)
|
|
{
|
|
return NSAPI_ERROR_OK;
|
|
}
|
|
|
|
virtual nsapi_size_or_error_t socket_recvfrom_impl(CellularSocket *socket, SocketAddress *address,
|
|
void *buffer, nsapi_size_t size)
|
|
{
|
|
return NSAPI_ERROR_OK;
|
|
}
|
|
|
|
virtual nsapi_error_t socket_open(nsapi_socket_t *handle, nsapi_protocol_t proto)
|
|
{
|
|
return AT_CellularStack::socket_open(handle, proto);
|
|
}
|
|
|
|
virtual nsapi_error_t socket_close(nsapi_socket_t handle)
|
|
{
|
|
return AT_CellularStack::socket_close(handle);
|
|
}
|
|
|
|
virtual nsapi_error_t socket_bind(nsapi_socket_t handle, const SocketAddress &address)
|
|
{
|
|
return AT_CellularStack::socket_bind(handle, address);
|
|
}
|
|
|
|
virtual nsapi_error_t socket_listen(nsapi_socket_t handle, int backlog)
|
|
{
|
|
return AT_CellularStack::socket_listen(handle, backlog);
|
|
}
|
|
|
|
virtual nsapi_error_t socket_connect(nsapi_socket_t handle, const SocketAddress &address)
|
|
{
|
|
return AT_CellularStack::socket_connect(handle, address);
|
|
}
|
|
|
|
virtual nsapi_error_t socket_accept(nsapi_socket_t server,
|
|
nsapi_socket_t *handle, SocketAddress *address = 0)
|
|
{
|
|
return AT_CellularStack::socket_accept(server, handle, address);
|
|
}
|
|
|
|
virtual nsapi_size_or_error_t socket_send(nsapi_socket_t handle,
|
|
const void *data, nsapi_size_t size)
|
|
{
|
|
return AT_CellularStack::socket_send(handle, data, size);
|
|
}
|
|
|
|
virtual nsapi_size_or_error_t socket_recv(nsapi_socket_t handle,
|
|
void *data, nsapi_size_t size)
|
|
{
|
|
return AT_CellularStack::socket_recv(handle, data, size);
|
|
}
|
|
|
|
virtual nsapi_size_or_error_t socket_sendto(nsapi_socket_t handle, const SocketAddress &address,
|
|
const void *data, nsapi_size_t size)
|
|
{
|
|
return AT_CellularStack::socket_sendto(handle, address, data, size);
|
|
}
|
|
|
|
virtual nsapi_size_or_error_t socket_recvfrom(nsapi_socket_t handle, SocketAddress *address,
|
|
void *buffer, nsapi_size_t size)
|
|
{
|
|
return AT_CellularStack::socket_recvfrom(handle, address, buffer, size);
|
|
}
|
|
|
|
virtual void socket_attach(nsapi_socket_t handle, void (*callback)(void *), void *data)
|
|
{
|
|
return AT_CellularStack::socket_attach(handle, callback, data);
|
|
}
|
|
};
|
|
|
|
Test_AT_CellularStack::Test_AT_CellularStack()
|
|
{
|
|
ATHandler_stub::ssize_value = 0;
|
|
ATHandler_stub::bool_value = false;
|
|
ATHandler_stub::read_string_value = NULL;
|
|
}
|
|
|
|
Test_AT_CellularStack::~Test_AT_CellularStack()
|
|
{
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_constructor()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack *st = new MyStack(at, 0, IPV4_STACK);
|
|
|
|
delete st;
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_get_ip_address()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
CHECK(0 == strlen(st.get_ip_address()));
|
|
|
|
char table[] = "1.2.3.4.5.65.7.8.9.10.11\0";
|
|
ATHandler_stub::ssize_value = -1;
|
|
ATHandler_stub::bool_value = true;
|
|
ATHandler_stub::read_string_value = table;
|
|
CHECK(NULL == st.get_ip_address());
|
|
|
|
ATHandler_stub::ssize_value = strlen(table);
|
|
ATHandler_stub::bool_value = true;
|
|
ATHandler_stub::read_string_value = table;
|
|
CHECK(st.get_ip_address());
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_open()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
st.bool_value = false;
|
|
CHECK(NSAPI_ERROR_UNSUPPORTED == st.socket_open(NULL, NSAPI_TCP));
|
|
|
|
st.bool_value = true;
|
|
st.max_sock_value = 0;
|
|
nsapi_socket_t sock = &st.socket;
|
|
CHECK(NSAPI_ERROR_NO_SOCKET == st.socket_open(&sock, NSAPI_TCP));
|
|
|
|
MyStack st2(at, 0, IPV6_STACK);
|
|
st2.bool_value = true;
|
|
st2.max_sock_value = 1;
|
|
sock = &st2.socket;
|
|
CHECK(NSAPI_ERROR_OK == st2.socket_open(&sock, NSAPI_TCP));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_close()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_close(&st.socket));
|
|
|
|
nsapi_socket_t sock = &st.socket;
|
|
st.bool_value = true;
|
|
st.max_sock_value = 1;
|
|
CHECK(NSAPI_ERROR_OK == st.socket_open(&sock, NSAPI_TCP));
|
|
st.max_sock_value = 0;
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_close(sock));
|
|
|
|
MyStack st2(at, 0, IPV6_STACK);
|
|
st2.max_sock_value = 1;
|
|
st2.bool_value = true;
|
|
sock = &st2.socket;
|
|
CHECK(NSAPI_ERROR_OK == st2.socket_open(&sock, NSAPI_TCP));
|
|
CHECK(NSAPI_ERROR_OK == st2.socket_close(sock));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_bind()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
SocketAddress addr;
|
|
ATHandler_stub::nsapi_error_value = NSAPI_ERROR_ALREADY;
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_bind(NULL, addr));
|
|
|
|
CHECK(NSAPI_ERROR_ALREADY == st.socket_bind(&st.socket, addr));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_listen()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
CHECK(NSAPI_ERROR_UNSUPPORTED == st.socket_listen(&st.socket, 4));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_connect()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
SocketAddress addr;
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_connect(NULL, addr));
|
|
|
|
CHECK(NSAPI_ERROR_OK == st.socket_connect(&st.socket, addr));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_accept()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
nsapi_socket_t sock = &st.socket;
|
|
CHECK(NSAPI_ERROR_UNSUPPORTED == st.socket_accept(NULL, &sock));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_send()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_send(NULL, "addr", 4));
|
|
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_send(&st.socket, "addr", 4));
|
|
|
|
SocketAddress addr;
|
|
st.max_sock_value = 1;
|
|
st.bool_value = true;
|
|
nsapi_socket_t sock = &st.socket;
|
|
st.socket_open(&sock, NSAPI_TCP);
|
|
st.socket_connect(sock, addr);
|
|
CHECK(NSAPI_ERROR_OK == st.socket_send(sock, "addr", 4));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_sendto()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
|
|
SocketAddress addr;
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_sendto(NULL, addr, "addr", 4));
|
|
|
|
st.max_sock_value = 1;
|
|
st.bool_value = true;
|
|
nsapi_socket_t sock = &st.socket;
|
|
st.socket_open(&sock, NSAPI_TCP);
|
|
st.socket_connect(sock, addr);
|
|
st.create_error = NSAPI_ERROR_CONNECTION_LOST;
|
|
CHECK(NSAPI_ERROR_CONNECTION_LOST == st.socket_sendto(sock, addr, "addr", 4));
|
|
|
|
st.create_error = NSAPI_ERROR_OK;
|
|
CHECK(NSAPI_ERROR_OK == st.socket_sendto(sock, addr, "addr", 4));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_recv()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
char table[4];
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_recv(NULL, table, 4));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_recvfrom()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
char table[4];
|
|
CHECK(NSAPI_ERROR_DEVICE_ERROR == st.socket_recvfrom(NULL, NULL, table, 4));
|
|
|
|
SocketAddress addr;
|
|
st.max_sock_value = 1;
|
|
st.bool_value = true;
|
|
nsapi_socket_t sock = &st.socket;
|
|
st.socket_open(&sock, NSAPI_TCP);
|
|
st.socket_connect(sock, addr);
|
|
st.create_error = NSAPI_ERROR_CONNECTION_LOST;
|
|
CHECK(NSAPI_ERROR_CONNECTION_LOST == st.socket_recvfrom(sock, &addr, table, 4));
|
|
|
|
st.create_error = NSAPI_ERROR_OK;
|
|
CHECK(NSAPI_ERROR_OK == st.socket_recvfrom(sock, &addr, table, 4));
|
|
}
|
|
|
|
void Test_AT_CellularStack::test_AT_CellularStack_socket_attach()
|
|
{
|
|
EventQueue que;
|
|
FileHandle_stub fh1;
|
|
ATHandler at(&fh1, que, 0, ",");
|
|
|
|
MyStack st(at, 0, IPV6_STACK);
|
|
|
|
st.socket_attach(NULL, NULL, NULL);
|
|
st.max_sock_value = 1;
|
|
st.bool_value = true;
|
|
nsapi_socket_t sock = &st.socket;
|
|
st.socket_open(&sock, NSAPI_TCP);
|
|
st.socket_attach(sock, NULL, NULL);
|
|
}
|