mirror of https://github.com/ARMmbed/mbed-os.git
410 lines
9.9 KiB
C++
410 lines
9.9 KiB
C++
/*
|
|
* Copyright (c) 2019, 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 "gtest/gtest.h"
|
|
#include "ATCmdParser.h"
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include "FileHandle_stub.h"
|
|
#include "mbed_poll_stub.h"
|
|
#include "Timer_stub.h"
|
|
|
|
using namespace mbed;
|
|
|
|
static bool expected_oob_callback = false;
|
|
|
|
void urc_callback()
|
|
{
|
|
EXPECT_TRUE(expected_oob_callback);
|
|
}
|
|
|
|
|
|
// AStyle ignored as the definition is not clear due to preprocessor usage
|
|
// *INDENT-OFF*
|
|
class test_ATCmdParser : public testing::Test {
|
|
protected:
|
|
|
|
void SetUp()
|
|
{
|
|
filehandle_stub_short_value_counter = 0;
|
|
}
|
|
|
|
void TearDown()
|
|
{
|
|
}
|
|
};
|
|
// *INDENT-ON*
|
|
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_create)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser *at = new ATCmdParser(&fh1, ",");
|
|
at->set_delimiter("\r");
|
|
at->set_timeout(5000);
|
|
at->debug_on(1);
|
|
|
|
delete at;
|
|
|
|
at = new ATCmdParser(&fh1, "\r");
|
|
|
|
EXPECT_TRUE(at != NULL);
|
|
delete at;
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_set_timeout)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
at.set_timeout(8);
|
|
at.set_timeout(80);
|
|
}
|
|
|
|
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_process_oob)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1);
|
|
at.set_timeout(10);
|
|
|
|
at.process_oob();
|
|
|
|
filehandle_stub_short_value_counter = 1;
|
|
fh1.short_value = POLLIN;
|
|
at.oob("s", &urc_callback);
|
|
at.process_oob();
|
|
|
|
filehandle_stub_short_value_counter = 2;
|
|
at.process_oob();
|
|
|
|
char buf[5] = {0};
|
|
char table[] = "ssssssssssssssssssssssssssssssss\0";
|
|
filehandle_stub_table = table;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
at.read(buf, 5);
|
|
|
|
filehandle_stub_short_value_counter = 2;
|
|
expected_oob_callback = true;
|
|
at.process_oob();
|
|
expected_oob_callback = false;
|
|
|
|
timer_stub_value = 0;
|
|
filehandle_stub_table_pos = 0;
|
|
at.read(buf, 5);
|
|
|
|
filehandle_stub_short_value_counter = 1;
|
|
expected_oob_callback = true;
|
|
at.process_oob();
|
|
expected_oob_callback = false;
|
|
|
|
char table2[5];
|
|
table2[0] = '\r';
|
|
table2[1] = '\r';
|
|
table2[2] = '\n';
|
|
table2[3] = '\n';
|
|
table2[4] = 0;
|
|
filehandle_stub_table = table2;
|
|
|
|
timer_stub_value = 0;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
at.read(buf, 1);
|
|
|
|
filehandle_stub_short_value_counter = 1;
|
|
at.process_oob();
|
|
|
|
filehandle_stub_table = table;
|
|
|
|
filehandle_stub_short_value_counter = 0;
|
|
filehandle_stub_table_pos = 0;
|
|
filehandle_stub_table = NULL;
|
|
}
|
|
|
|
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_flush)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
filehandle_stub_short_value_counter = 1;
|
|
fh1.short_value = POLLIN;
|
|
at.flush();
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_write)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
fh1.size_value = -1;
|
|
EXPECT_TRUE(-1 == at.write("help", 4));
|
|
|
|
mbed_poll_stub::revents_value = POLLOUT;
|
|
mbed_poll_stub::int_value = 1;
|
|
fh1.size_value = -1;
|
|
EXPECT_TRUE(-1 == at.write("help", 4));
|
|
|
|
mbed_poll_stub::revents_value = POLLOUT;
|
|
mbed_poll_stub::int_value = 1;
|
|
fh1.size_value = 7;
|
|
EXPECT_EQ(4, at.write("help", 4));
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_set_delimiter)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
at.set_delimiter("+");
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_read)
|
|
{
|
|
FileHandle_stub fh1;
|
|
filehandle_stub_table = NULL;
|
|
filehandle_stub_table_pos = 0;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
char buf[8] = {0};
|
|
|
|
|
|
// TEST EMPTY BUFFER
|
|
// Shouldn't read any byte since buffer is empty
|
|
EXPECT_TRUE(-1 == at.read(buf, 1));
|
|
// Return error due to error set to at handler by the above call on empty buffer
|
|
EXPECT_TRUE(-1 == at.read(buf, 1));
|
|
|
|
// TEST DATA IN BUFFER
|
|
char table1[] = "1234512345678OK\r\n\0";
|
|
filehandle_stub_table = table1;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
|
|
// Read 5 bytes
|
|
EXPECT_EQ(5, at.read(buf, 5));
|
|
EXPECT_TRUE(!memcmp(buf, table1, 5));
|
|
// get_char triggered above should have filled in the whole reading buffer
|
|
EXPECT_EQ(filehandle_stub_table_pos, (strlen(buf)));
|
|
// Read another 8 bytes
|
|
EXPECT_TRUE(8 == at.read(buf, 8) && !memcmp(buf, table1 + 5, 8));
|
|
// Reading more than the 4 bytes left -> ERROR
|
|
EXPECT_EQ(-1, at.read(buf, 5));
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_debug_on)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
at.debug_on(true);
|
|
at.debug_on(false);
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_abort)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1, ",");
|
|
at.abort();
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_printf)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1);
|
|
at.flush();
|
|
at.debug_on(true);
|
|
|
|
const char * format = "TEST %d %s %x %c TEST \r\r\n\n";
|
|
mbed_poll_stub::revents_value = POLLOUT;
|
|
mbed_poll_stub::int_value = 1;
|
|
fh1.size_value = 64;
|
|
|
|
EXPECT_EQ(22, at.printf(format, 5, "t", 0x5, 't'));
|
|
|
|
fh1.size_value = -1;
|
|
EXPECT_EQ(-1, at.printf(format, 5, "t", 0x5, 't'));
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_send)
|
|
{
|
|
FileHandle_stub fh1;
|
|
|
|
ATCmdParser at(&fh1);
|
|
at.flush();
|
|
at.debug_on(true);
|
|
|
|
const char * format = "TEST %d %s %x %c TEST \r\r\n\n";
|
|
mbed_poll_stub::revents_value = POLLOUT;
|
|
mbed_poll_stub::int_value = 1;
|
|
fh1.size_value = 64;
|
|
|
|
//VALID printf
|
|
EXPECT_TRUE(at.send(format, 5, "t", 0x5, 't'));
|
|
EXPECT_TRUE(at.send(""));
|
|
|
|
fh1.size_value = -1;
|
|
EXPECT_FALSE(at.send(format, 5, "t", 0x5, 't'));
|
|
EXPECT_FALSE(at.send(""));
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_recv)
|
|
{
|
|
FileHandle_stub fh1;
|
|
ATCmdParser at(&fh1, "\r", 8);
|
|
|
|
//parse valid char
|
|
char table1[] = "s";
|
|
at.flush();
|
|
filehandle_stub_table = table1;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
char c;
|
|
EXPECT_TRUE(at.recv("%c", &c));
|
|
EXPECT_EQ(c, 's');
|
|
|
|
//too large response
|
|
char table2[] = "1234567890\n";
|
|
at.flush();
|
|
filehandle_stub_table = table2;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_FALSE(at.recv("123456789%c\n", &c));
|
|
|
|
//back to normal buffer
|
|
ATCmdParser at1(&fh1);
|
|
at1.flush();
|
|
filehandle_stub_table = table2;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_TRUE(at1.recv("123456789%c\n", &c));
|
|
|
|
char table3[] = "s\r\n\0";
|
|
at1.flush();
|
|
filehandle_stub_table = table3;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_TRUE(at.recv("%c", &c));
|
|
EXPECT_EQ(c, 's');
|
|
|
|
char table4[] = "s 1 E test\r\n";
|
|
char text[5];
|
|
int hexval;
|
|
int intval;
|
|
at1.flush();
|
|
filehandle_stub_table = table4;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_TRUE(at1.recv("%c %d %x %s", &c, &intval, &hexval, &text));
|
|
EXPECT_EQ(c, 's');
|
|
EXPECT_EQ(intval, 1);
|
|
EXPECT_EQ(hexval, 0xE);
|
|
EXPECT_EQ(!memcmp(text, "test", 4), 0);
|
|
|
|
char table5[] = "s 1 E test\r\nt 2 F tes2\r\n";
|
|
char c1;
|
|
char text1[5];
|
|
int hexval1;
|
|
int intval1;
|
|
at1.flush();
|
|
filehandle_stub_table = table5;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
|
|
expected_oob_callback = true;
|
|
at1.oob("s", &urc_callback);
|
|
EXPECT_TRUE(at1.recv("%c %d %x %s\r\n%c %d %x %s\r\n", &c, &intval, &hexval, &text, &c, &intval, &hexval, &text));
|
|
expected_oob_callback = false;
|
|
EXPECT_EQ(c, 't');
|
|
EXPECT_EQ(intval, 2);
|
|
EXPECT_EQ(hexval, 0xF);
|
|
EXPECT_EQ(memcmp(text, "tes2", 4), 0);
|
|
|
|
}
|
|
|
|
TEST_F(test_ATCmdParser, test_ATCmdParser_scanf)
|
|
{
|
|
FileHandle_stub fh1;
|
|
ATCmdParser at(&fh1, "\r");
|
|
|
|
//parse valid char
|
|
char table1[] = "s";
|
|
at.flush();
|
|
filehandle_stub_table = table1;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
char c;
|
|
EXPECT_TRUE(at.scanf("%c", &c));
|
|
EXPECT_EQ(c, 's');
|
|
|
|
//back to normal buffer
|
|
char table2[] = "1234567890\n";
|
|
at.flush();
|
|
filehandle_stub_table = table2;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_TRUE(at.scanf("123456789%c\n", &c));
|
|
|
|
char table3[] = "s\r\n\0";
|
|
at.flush();
|
|
filehandle_stub_table = table3;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_TRUE(at.scanf("%c", &c));
|
|
EXPECT_EQ(c, 's');
|
|
|
|
char table4[] = "s 1 E test\r\n";
|
|
char text[5];
|
|
memset(text, 0, 5);
|
|
int hexval;
|
|
int intval;
|
|
at.flush();
|
|
filehandle_stub_table = table4;
|
|
filehandle_stub_table_pos = 0;
|
|
mbed_poll_stub::revents_value = POLLIN;
|
|
mbed_poll_stub::int_value = 1;
|
|
EXPECT_TRUE(at.scanf("%c %d %x %s", &c, &intval, &hexval, &text));
|
|
EXPECT_EQ(c, 's');
|
|
EXPECT_EQ(intval, 1);
|
|
EXPECT_EQ(hexval, 0xE);
|
|
EXPECT_EQ(!memcmp(text, "test", 4), 0);
|
|
|
|
}
|
|
|
|
|