blob: 6498a7f62b7487bbbbcb9d5e4822156aa1d74e58 [file] [log] [blame]
// Copyright 2018 The Chromium OS 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 "shill/cellular/cellular_pco.h"
#include <tuple>
#include <gtest/gtest.h>
using std::tuple;
using std::vector;
namespace shill {
class CellularPcoInvalidRawDataTest
: public testing::TestWithParam<std::vector<uint8_t>> {};
TEST_P(CellularPcoInvalidRawDataTest, CreateFromRawData) {
const auto& raw_data = GetParam();
EXPECT_EQ(nullptr, CellularPco::CreateFromRawData(raw_data));
}
INSTANTIATE_TEST_SUITE_P(
CellularPcoInvalidRawDataTest,
CellularPcoInvalidRawDataTest,
testing::Values(
// Less than 3 octets:
vector<uint8_t>({}),
vector<uint8_t>({0x27}),
vector<uint8_t>({0x27, 0x00}),
// Invalid PCO content length:
vector<uint8_t>({0x27, 0x00, 0x00}),
vector<uint8_t>({0x27, 0x02, 0x00}),
// Invalid PCO IEI:
vector<uint8_t>({0x26, 0x01, 0x00}),
// More than 253 octets:
vector<uint8_t>({
// clang-format off
0x27, 0xFC, 0x00, 0xFF, 0x00, 0xF8, 0x00, 0x01,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11,
0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21,
0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31,
0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41,
0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61,
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91,
0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1,
0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9,
0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1,
0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1,
0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1,
0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1,
0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1,
0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7
// clang-format on
}),
// Incomplete element
vector<uint8_t>({0x26, 0x01, 0x00, 0xFF}),
vector<uint8_t>({0x26, 0x01, 0x00, 0xFF, 0x00}),
vector<uint8_t>({0x26, 0x01, 0x00, 0xFF, 0x00, 0x01}),
vector<uint8_t>({0x26, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00})));
using CellularPcoValidRawDataTestParams =
std::tuple<std::vector<uint8_t>, // raw data
std::vector<CellularPco::Element>>; // expected elements
class CellularPcoValidRawDataTest
: public testing::TestWithParam<CellularPcoValidRawDataTestParams> {};
TEST_P(CellularPcoValidRawDataTest, FindElement) {
const auto& raw_data = std::get<0>(GetParam());
const auto& expected_elements = std::get<1>(GetParam());
auto pco = CellularPco::CreateFromRawData(raw_data);
ASSERT_NE(nullptr, pco);
for (const auto& expected_element : expected_elements) {
const CellularPco::Element* element = pco->FindElement(expected_element.id);
ASSERT_NE(nullptr, element);
EXPECT_EQ(expected_element.id, element->id);
EXPECT_EQ(expected_element.data, element->data);
}
}
INSTANTIATE_TEST_SUITE_P(
CellularPcoValidRawDataTest,
CellularPcoValidRawDataTest,
testing::Values(
// No element
make_tuple(vector<uint8_t>({0x27, 0x01, 0x00}),
vector<CellularPco::Element>()),
// Element with no content
make_tuple(vector<uint8_t>({0x27, 0x04, 0x00, 0xAA, 0xBB, 0x00}),
vector<CellularPco::Element>({CellularPco::Element(0xAABB,
{})})),
// Element with content of 1 octet
make_tuple(vector<uint8_t>({0x27, 0x05, 0x00, 0xAA, 0xBB, 0x01, 0x22}),
vector<CellularPco::Element>(
{CellularPco::Element(0xAABB, {0x22})})),
// Multiple elements
make_tuple(vector<uint8_t>({
// clang-format off
0x27, 0x0D, 0x00, 0xAA, 0xBB, 0x01, 0x22, 0xCC,
0xDD, 0x00, 0xEE, 0xFF, 0x02, 0x33, 0x44
// clang-format on
}),
vector<CellularPco::Element>({
CellularPco::Element(0xAABB, {0x22}),
CellularPco::Element(0xCCDD, {}),
CellularPco::Element(0xEEFF, {0x33, 0x44}),
})),
// Element with content of the maximum length
make_tuple(
vector<uint8_t>({
// clang-format off
0x27, 0xFB, 0x00, 0xFF, 0x00, 0xF7, 0x00, 0x01,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11,
0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21,
0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31,
0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41,
0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61,
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91,
0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1,
0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9,
0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1,
0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1,
0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1,
0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1,
0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1,
0xF2, 0xF3, 0xF4, 0xF5, 0xF6
// clang-format on
}),
vector<CellularPco::Element>({CellularPco::Element(
0xFF00,
{
// clang-format off
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6,
// clang-format on
})}))));
TEST(CellularPcoTest, FindNotExistentElement) {
vector<uint8_t> raw_data = {
// clang-format off
0x27, 0x0D, 0x00, 0xAA, 0xBB, 0x01, 0x22, 0xCC,
0xDD, 0x00, 0xEE, 0xFF, 0x02, 0x33, 0x44
// clang-format on
};
auto pco = CellularPco::CreateFromRawData(raw_data);
ASSERT_NE(nullptr, pco);
EXPECT_EQ(nullptr, pco->FindElement(0xFF00));
}
} // namespace shill