// 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/verizon_subscription_state.h"

#include <memory>
#include <tuple>
#include <vector>

#include <gtest/gtest.h>

using std::make_tuple;
using std::vector;

namespace shill {

class VerizonSubscriptionStateInvalidPcoTest
    : public testing::TestWithParam<std::vector<uint8_t>> {};

TEST_P(VerizonSubscriptionStateInvalidPcoTest,
       FindVerizonSubscriptionStateFromPco) {
  const auto& raw_data = GetParam();
  std::unique_ptr<CellularPco> pco = CellularPco::CreateFromRawData(raw_data);
  ASSERT_NE(nullptr, pco);
  SubscriptionState subscription_state = SubscriptionState::kUnknown;
  EXPECT_FALSE(FindVerizonSubscriptionStateFromPco(*pco, &subscription_state));
  EXPECT_EQ(SubscriptionState::kUnknown, subscription_state);
}

INSTANTIATE_TEST_SUITE_P(
    VerizonSubscriptionStateInvalidPcoTest,
    VerizonSubscriptionStateInvalidPcoTest,
    testing::Values(
        // Verizon-specific PCO not found
        vector<uint8_t>({0x27, 0x04, 0x00, 0xAA, 0xBB, 0x00}),
        // Malformed Verizon-specific PCO
        vector<uint8_t>({0x27, 0x04, 0x00, 0xFF, 0x00, 0x00}),
        vector<uint8_t>({0x27, 0x07, 0x00, 0xFF, 0x00, 0x03, 0x13, 0x01, 0x84}),
        vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00, 0x04, 0xEE, 0x01, 0x84,
                         0x00}),
        vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00, 0x04, 0x13, 0xEE, 0x84,
                         0x00}),
        vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00, 0x04, 0x13, 0x01, 0xEE,
                         0x00}),
        vector<uint8_t>({
            // clang-format off
            0x27, 0x09, 0x00, 0xFF, 0x00, 0x05, 0x13, 0x01, 0xEE, 0x00, 0x00
            // clang-format on
        })));

using VerizonSubscriptionStateTestParams =
    std::tuple<std::vector<uint8_t>,  // raw data
               SubscriptionState>;    // expected subscription state

class VerizonSubscriptionStateTest
    : public testing::TestWithParam<VerizonSubscriptionStateTestParams> {};

TEST_P(VerizonSubscriptionStateTest, FindVerizonSubscriptionStateFromPco) {
  const auto& raw_data = std::get<0>(GetParam());
  SubscriptionState expected_subscription_state = std::get<1>(GetParam());
  std::unique_ptr<CellularPco> pco = CellularPco::CreateFromRawData(raw_data);
  ASSERT_NE(nullptr, pco);
  SubscriptionState subscription_state = SubscriptionState::kUnknown;
  EXPECT_TRUE(FindVerizonSubscriptionStateFromPco(*pco, &subscription_state));
  EXPECT_EQ(expected_subscription_state, subscription_state);
}

INSTANTIATE_TEST_SUITE_P(
    VerizonSubscriptionStateTest,
    VerizonSubscriptionStateTest,
    testing::Values(make_tuple(vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00,
                                                0x04, 0x13, 0x01, 0x84, 0x00}),
                               SubscriptionState::kProvisioned),
                    make_tuple(vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00,
                                                0x04, 0x13, 0x01, 0x84, 0x03}),
                               SubscriptionState::kOutOfCredits),
                    make_tuple(vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00,
                                                0x04, 0x13, 0x01, 0x84, 0x05}),
                               SubscriptionState::kUnprovisioned),
                    make_tuple(vector<uint8_t>({0x27, 0x08, 0x00, 0xFF, 0x00,
                                                0x04, 0x13, 0x01, 0x84, 0xFF}),
                               SubscriptionState::kUnknown)));

}  // namespace shill
