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

#include <brillo/errors/error_codes.h>
#include <gtest/gtest.h>

namespace shill {
namespace {

const char kErrorIncorrectPasswordMM1[] =
    "org.freedesktop.ModemManager1.Error.MobileEquipment.IncorrectPassword";

const char kErrorSimPinMM1[] =
    "org.freedesktop.ModemManager1.Error.MobileEquipment.SimPin";

const char kErrorSimPukMM1[] =
    "org.freedesktop.ModemManager1.Error.MobileEquipment.SimPuk";

const char kErrorGprsNotSubscribedMM1[] =
    "org.freedesktop.ModemManager1.Error.MobileEquipment."
    "GprsServiceOptionNotSubscribed";

const char kErrorWrongStateMM1[] =
    "org.freedesktop.ModemManager1.Error.Core.WrongState";

const char kErrorMessage[] = "Some error message.";

struct TestParam {
  TestParam(const char* dbus_error, Error::Type error_type)
      : dbus_error(dbus_error), error_type(error_type) {}

  const char* dbus_error;
  Error::Type error_type;
};

class CellularErrorMM1Test : public testing::TestWithParam<TestParam> {};

TEST_P(CellularErrorMM1Test, FromDBusError) {
  TestParam param = GetParam();

  brillo::ErrorPtr dbus_error =
      brillo::Error::Create(FROM_HERE, brillo::errors::dbus::kDomain,
                            param.dbus_error, kErrorMessage);
  Error shill_error;
  CellularError::FromMM1ChromeosDBusError(dbus_error.get(), &shill_error);
  EXPECT_EQ(param.error_type, shill_error.type());
}

INSTANTIATE_TEST_SUITE_P(
    CellularErrorMM1Test,
    CellularErrorMM1Test,
    testing::Values(TestParam(kErrorIncorrectPasswordMM1, Error::kIncorrectPin),
                    TestParam(kErrorSimPinMM1, Error::kPinRequired),
                    TestParam(kErrorSimPukMM1, Error::kPinBlocked),
                    TestParam(kErrorGprsNotSubscribedMM1, Error::kInvalidApn),
                    TestParam(kErrorWrongStateMM1, Error::kWrongState),
                    TestParam("Some random error name.",
                              Error::kOperationFailed)));

}  // namespace
}  // namespace shill
