blob: 75e11d273dabe6bb1da892b442066b1f6eb93eca [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/macros.h"
#include "device/serial/serial_io_handler_posix.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace device {
class SerialIoHandlerPosixTest : public testing::Test {
public:
SerialIoHandlerPosixTest() {}
void SetUp() override {
serial_io_handler_posix_ = new SerialIoHandlerPosix(nullptr, nullptr);
}
void Initialize(bool parity_check_enabled,
const char* chars_stashed,
int num_chars_stashed) {
serial_io_handler_posix_->error_detect_state_ = ErrorDetectState::NO_ERROR;
serial_io_handler_posix_->parity_check_enabled_ = parity_check_enabled;
serial_io_handler_posix_->num_chars_stashed_ = num_chars_stashed;
for (int i = 0; i < num_chars_stashed; ++i) {
serial_io_handler_posix_->chars_stashed_[i] = chars_stashed[i];
}
}
void TestHelper(char* buffer,
int buffer_len,
int bytes_read,
ErrorDetectState error_detect_state_expected,
const char* chars_stashed_expected,
int num_chars_stashed_expected,
const char* buffer_expected,
int new_bytes_read_expected,
bool break_detected_expected,
bool parity_error_detected_expected) {
bool break_detected = false;
bool parity_error_detected = false;
int new_bytes_read = serial_io_handler_posix_->CheckReceiveError(
buffer, buffer_len, bytes_read, break_detected, parity_error_detected);
EXPECT_EQ(error_detect_state_expected,
serial_io_handler_posix_->error_detect_state_);
EXPECT_EQ(num_chars_stashed_expected,
serial_io_handler_posix_->num_chars_stashed_);
for (int i = 0; i < num_chars_stashed_expected; ++i) {
EXPECT_EQ(chars_stashed_expected[i],
serial_io_handler_posix_->chars_stashed_[i]);
}
EXPECT_EQ(new_bytes_read_expected, new_bytes_read);
for (int i = 0; i < new_bytes_read_expected; ++i) {
EXPECT_EQ(buffer_expected[i], buffer[i]);
}
EXPECT_EQ(break_detected_expected, break_detected);
EXPECT_EQ(parity_error_detected_expected, parity_error_detected);
}
protected:
scoped_refptr<SerialIoHandlerPosix> serial_io_handler_posix_;
private:
DISALLOW_COPY_AND_ASSIGN(SerialIoHandlerPosixTest);
};
// 'a' 'b' 'c'
TEST_F(SerialIoHandlerPosixTest, NoErrorReadOnce) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'a', 'b', 'c'};
int bytes_read = 3;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "abc", 3, false, false);
}
}
// 'a' 'b'
// 'c'
TEST_F(SerialIoHandlerPosixTest, NoErrorReadTwiceBytesReadTwoAndOne) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a', 'b'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "ab", 2, false, false);
char buffer_2[30] = {'c'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "c", 1, false, false);
}
}
// 'a'
// 'b' c'
TEST_F(SerialIoHandlerPosixTest, NoErrorReadTwiceBytesReadOneAndTwo) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "a", 1, false, false);
char buffer_2[30] = {'b', 'c'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "bc", 2, false, false);
}
}
// 'a'
// 'b'
// 'c'
TEST_F(SerialIoHandlerPosixTest, NoErrorReadThreeTimes) {
for (int buffer_len = 1; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "a", 1, false, false);
char buffer_2[30] = {'b'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "b", 1, false, false);
char buffer_3[30] = {'c'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "c", 1, false, false);
}
}
// '\377' '\0' '\0'
TEST_F(SerialIoHandlerPosixTest, BreakReadOnce) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'\377', '\0', '\0'};
int bytes_read = 3;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, true, false);
}
}
// 'a' 'b' '\377' '\0' '\0' 'c' 'd' 'e'
TEST_F(SerialIoHandlerPosixTest, BreakReadOnceHasBytesBeforeAndAfterBreak) {
for (int buffer_len = 8; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'a', 'b', '\377', '\0', '\0', 'c', 'd', 'e'};
int bytes_read = 8;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "abcde", 5, true, false);
}
}
// '\377' '\0'
// '\0'
TEST_F(SerialIoHandlerPosixTest, BreakReadTwiceBytesReadTwoAndOne) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377', '\0'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, true, false);
}
}
// 'a' 'b' 'c' '\377' '\0'
// '\0' 'd' 'e'
TEST_F(SerialIoHandlerPosixTest,
BreakReadTwiceBytesReadTwoAndOneHasBytesBeforeAndAfterBreak) {
for (int buffer_len = 5; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a', 'b', 'c', '\377', '\0'};
int bytes_read = 5;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "abc", 3, false, false);
char buffer_2[30] = {'\0', 'd', 'e'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "de", 2, true, false);
}
}
// '\377'
// '\0' '\0'
TEST_F(SerialIoHandlerPosixTest, BreakReadTwiceBytesReadOneAndTwo) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0', '\0'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, true, false);
}
}
// 'a' 'b' '\377'
// '\0' '\0' 'c'
TEST_F(SerialIoHandlerPosixTest,
BreakReadTwiceBytesReadOneAndTwoHasBytesBeforeAndAfterBreak) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a', 'b', '\377'};
int bytes_read = 3;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "ab", 2, false,
false);
char buffer_2[30] = {'\0', '\0', 'c'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "c", 1, true, false);
}
}
// '\377'
// '\0'
// '\0'
TEST_F(SerialIoHandlerPosixTest, BreakReadThreeTimes) {
for (int buffer_len = 1; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, true, false);
}
}
// 'a' '\377'
// '\0'
// '\0' 'b'
TEST_F(SerialIoHandlerPosixTest,
BreakReadThreeTimesHasBytesBeforeAndAfterBreak) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "a", 1, false,
false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'\0', 'b'};
bytes_read = 2;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "b", 1, true, false);
}
}
// '\377' '\0' 'a'
TEST_F(SerialIoHandlerPosixTest, ParityErrorReadOnce) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'\377', '\0', 'a'};
int bytes_read = 3;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, false, true);
}
}
// 'b' 'c' '\377' '\0' 'a' 'd'
TEST_F(SerialIoHandlerPosixTest,
ParityErrorReadOnceHasBytesBeforeAndAfterParityError) {
for (int buffer_len = 6; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'b', 'c', '\377', '\0', 'a', 'd'};
int bytes_read = 6;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "bcd", 3, false, true);
}
}
// '\377' '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest, ParityErrorReadTwiceBytesReadTwoAndOne) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377', '\0'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_2[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, false, true);
}
}
// 'b' '\377' '\0'
// 'a' 'c' 'd'
TEST_F(
SerialIoHandlerPosixTest,
ParityErrorReadTwiceBytesReadTwoAndOneHasBytesBeforeAndAfterParityError) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'b', '\377', '\0'};
int bytes_read = 3;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "b", 1, false, false);
char buffer_2[30] = {'a', 'c', 'd'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "cd", 2, false, true);
}
}
// '\377'
// '\0' 'a'
TEST_F(SerialIoHandlerPosixTest, ParityErrorReadTwiceBytesReadOneAndTwo) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0', 'a'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, false, true);
}
}
// 'b' 'c' '\377'
// '\0' 'a' 'd'
TEST_F(
SerialIoHandlerPosixTest,
ParityErrorReadTwiceBytesReadOneAndTwoHasBytesBeforeAndAfterParityError) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'b', 'c', '\377'};
int bytes_read = 3;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "bc", 2, false,
false);
char buffer_2[30] = {'\0', 'a', 'd'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "d", 1, false, true);
}
}
// '\377'
// '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest, ParityErrorReadThreeTimes) {
for (int buffer_len = 1; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, false, true);
}
}
// 'b' '\377'
// '\0'
// 'a' 'c'
TEST_F(SerialIoHandlerPosixTest,
ParityErrorReadThreeTimesHasBytesBeforeAndAfterParityError) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'b', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "b", 1, false,
false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a', 'c'};
bytes_read = 2;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "c", 1, false, true);
}
}
// '\377' '\377'
TEST_F(SerialIoHandlerPosixTest, TwoEOFsReadOnce) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'\377', '\377'};
int bytes_read = 2;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377", 1, false, false);
}
}
// 'a' '\377' '\377' 'b' 'c'
TEST_F(SerialIoHandlerPosixTest, TwoEOFsReadOnceHasBytesBeforeAndAfterEOF) {
for (int buffer_len = 5; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'a', '\377', '\377', 'b', 'c'};
int bytes_read = 5;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "a\377bc", 4, false, false);
}
}
// '\377'
// '\377'
TEST_F(SerialIoHandlerPosixTest, TwoEOFsReadTwice) {
for (int buffer_len = 1; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\377'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377", 1, false, false);
}
}
// 'a' '\377'
// '\377' 'b'
TEST_F(SerialIoHandlerPosixTest, TwoEOFsReadTwiceHasBytesBeforeAndAfterEOF) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'a', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "a", 1, false,
false);
char buffer_2[30] = {'\377', 'b'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377b", 2, false, false);
}
}
// '\377' '\0' 'a'
TEST_F(SerialIoHandlerPosixTest, ParityCheckDisabledReadOnce) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer[30] = {'\377', '\0', 'a'};
int bytes_read = 3;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0a", 3, false, false);
}
}
// 'b' '\377' '\0' 'a' 'c'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadOnceHasBytesBeforeAndAfter) {
for (int buffer_len = 5; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer[30] = {'b', '\377', '\0', 'a', 'c'};
int bytes_read = 5;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "b\377\0ac", 5, false, false);
}
}
// '\377' '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadTwoAndOne) {
int buffer_len = 2;
Initialize(false, "", 0);
char buffer_1[30] = {'\377', '\0'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_2[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "a",
1, "\377\0", 2, false, false);
}
// '\377' '\0'
// 'a' 'b'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadTwoAndOneHasBytesAfter) {
int buffer_len = 2;
Initialize(false, "", 0);
char buffer_1[30] = {'\377', '\0'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_2[30] = {'a', 'b'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "ab",
2, "\377\0", 2, false, false);
}
// '\377' '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadTwoAndOneLargerBufferLen) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer_1[30] = {'\377', '\0'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_2[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0a", 3, false, false);
}
}
// 'b' '\377' '\0'
// 'a' 'c'
TEST_F(
SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadTwoAndOneBufferLenThreeHasBytesBeforeAndAfter) {
int buffer_len = 3;
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377', '\0'};
int bytes_read = 3;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "b", 1, false, false);
char buffer_2[30] = {'a', 'c'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "c",
1, "\377\0a", 3, false, false);
}
// 'b' '\377' '\0'
// 'a' 'c'
TEST_F(
SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadTwoAndOneLargerBufferLenHasBytesBeforeAndAfter) {
for (int buffer_len = 4; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377', '\0'};
int bytes_read = 3;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "b", 1, false, false);
char buffer_2[30] = {'a', 'c'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0ac", 4, false, false);
}
}
// '\377'
// '\0' 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadOneAndTwo) {
int buffer_len = 2;
Initialize(false, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0', 'a'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "a",
1, "\377\0", 2, false, false);
char buffer_3[30];
bytes_read = 0;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "a", 1, false, false);
}
// 'b' '\377'
// '\0' 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadOneAndTwoHasBytesBefore) {
int buffer_len = 2;
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "b", 1, false, false);
char buffer_2[30] = {'\0', 'a'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "a",
1, "\377\0", 2, false, false);
char buffer_3[30];
bytes_read = 0;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "a", 1, false, false);
}
// '\377'
// '\0' 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadOneAndTwoLargerBufferLen) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0', 'a'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0a", 3, false, false);
}
}
// 'b' '\377'
// '\0' 'a' 'c'
TEST_F(
SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadOneAndTwoBufferLenThreeHasBytesBeforeAndAfter) {
int buffer_len = 3;
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "b", 1, false, false);
char buffer_2[30] = {'\0', 'a', 'c'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "c",
1, "\377\0a", 3, false, false);
}
// 'b' '\377'
// '\0' 'a' 'c'
TEST_F(
SerialIoHandlerPosixTest,
ParityCheckDisabledReadTwiceBytesReadOneAndTwoLargerBufferLenHasBytesBeforeAndAfter) {
for (int buffer_len = 4; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "b", 1, false,
false);
char buffer_2[30] = {'\0', 'a', 'c'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0ac", 4, false, false);
}
}
// '\377'
// '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadThreeTimesBufferLenOne) {
int buffer_len = 1;
Initialize(false, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR,
"\0a", 2, "\377", 1, false, false);
}
// '\377'
// '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadThreeTimesBufferLenTwo) {
int buffer_len = 2;
Initialize(false, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "a",
1, "\377\0", 2, false, false);
}
// '\377'
// '\0'
// 'a'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadThreeTimesLargerBufferLen) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0a", 3, false, false);
}
}
// 'b' '\377'
// '\0'
// 'a' 'c'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadThreeTimesBufferLenThreeByteBeforeAndAfter) {
int buffer_len = 3;
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "b", 1, false, false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a', 'c'};
bytes_read = 2;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "c",
1, "\377\0a", 3, false, false);
}
// 'b' '\377'
// '\0'
// 'a' 'c'
TEST_F(SerialIoHandlerPosixTest,
ParityCheckDisabledReadThreeTimesLargerBufferLenHasBytesBeforeAndAfter) {
for (int buffer_len = 4; buffer_len <= 20; ++buffer_len) {
Initialize(false, "", 0);
char buffer_1[30] = {'b', '\377'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "b", 1, false,
false);
char buffer_2[30] = {'\0'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "", 0, false, false);
char buffer_3[30] = {'a', 'c'};
bytes_read = 2;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377\0ac", 4, false, false);
}
}
TEST_F(SerialIoHandlerPosixTest, BytesReadZero) {
for (int buffer_len = 1; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30];
int bytes_read = 0;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "", 0, false, false);
}
}
// '\377' 'a' 'b'
TEST_F(SerialIoHandlerPosixTest, InvalidSequenceReadOnce) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer[30] = {'\377', 'a', 'b'};
int bytes_read = 3;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377ab", 3, false, false);
}
}
// '\377' 'a'
// 'b'
TEST_F(SerialIoHandlerPosixTest, InvalidSequenceReadTwiceBytesReadTwoAndOne) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377', 'a'};
int bytes_read = 2;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377a", 2, false, false);
char buffer_2[30] = {'b'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "b", 1, false, false);
}
}
// '\377'
// 'a' 'b'
TEST_F(SerialIoHandlerPosixTest, InvalidSequenceReadTwiceBytesReadOneAndTwo) {
int buffer_len = 2;
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "", 0, false, false);
char buffer_2[30] = {'a', 'b'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "b",
1, "\377a", 2, false, false);
}
// '\377'
// 'a' 'b'
TEST_F(SerialIoHandlerPosixTest,
InvalidSequenceReadTwiceBytesReadOneAndTwoLargerBufferLen) {
for (int buffer_len = 3; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'a', 'b'};
bytes_read = 2;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377ab", 3, false, false);
}
}
// '\377'
// 'a'
// 'b'
TEST_F(SerialIoHandlerPosixTest, InvalidSequenceReadThreeTimes) {
int buffer_len = 1;
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"\377", 1, "", 0, false, false);
char buffer_2[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "a",
1, "\377", 1, false, false);
char buffer_3[30] = {'b'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "b",
1, "a", 1, false, false);
}
// '\377'
// 'a'
// 'b'
TEST_F(SerialIoHandlerPosixTest, InvalidSequenceReadThreeTimesLargerBufferLen) {
for (int buffer_len = 2; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'\377'};
int bytes_read = 1;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "", 0, false, false);
char buffer_2[30] = {'a'};
bytes_read = 1;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "\377a", 2, false, false);
char buffer_3[30] = {'b'};
bytes_read = 1;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "b", 1, false, false);
}
}
// 'a' 'b' 'c' '\377'
TEST_F(SerialIoHandlerPosixTest, CharsStashedPreset) {
int buffer_len = 2;
Initialize(true, "ab", 2);
char buffer[30] = {'c', '\377'};
int bytes_read = 2;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::MARK_377_SEEN,
"c\377", 2, "ab", 2, false, false);
}
// 'b' 'c' '\377' '\0' '\0' '\377' '\377' '\377' '\0' 'a' 'd' 'e'
TEST_F(SerialIoHandlerPosixTest, BreakAndEOFAndParityError) {
int buffer_len = 12;
Initialize(true, "", 0);
char buffer[30] = {'b', 'c', '\377', '\0', '\0', '\377',
'\377', '\377', '\0', 'a', 'd', 'e'};
int bytes_read = 12;
TestHelper(buffer, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "", 0,
"bc\377de", 5, true, true);
}
// 'b' 'c' '\377' '\0' '\0' '\377'
// '\377' '\377' '\0'
// 'a' 'd' 'e'
TEST_F(SerialIoHandlerPosixTest, BreakAndEOFAndParityErrorReadThreeTimes) {
for (int buffer_len = 6; buffer_len <= 20; ++buffer_len) {
Initialize(true, "", 0);
char buffer_1[30] = {'b', 'c', '\377', '\0', '\0', '\377'};
int bytes_read = 6;
TestHelper(buffer_1, buffer_len, bytes_read,
ErrorDetectState::MARK_377_SEEN, "\377", 1, "bc", 2, true,
false);
char buffer_2[30] = {'\377', '\377', '\0'};
bytes_read = 3;
TestHelper(buffer_2, buffer_len, bytes_read, ErrorDetectState::MARK_0_SEEN,
"\377\0", 2, "\377", 1, false, false);
char buffer_3[30] = {'a', 'd', 'e'};
bytes_read = 3;
TestHelper(buffer_3, buffer_len, bytes_read, ErrorDetectState::NO_ERROR, "",
0, "de", 2, false, true);
}
}
} // namespace device