// Copyright (c) 2013 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_error.h"

#include <dbus-c++/error.h>
#include <gtest/gtest.h>

namespace shill {

class CellularErrorTest : public testing::Test {
};

namespace {

const char kErrorIncorrectPasswordMM[] =
    "org.freedesktop.ModemManager.Modem.Gsm.IncorrectPassword";

const char kErrorSimPinRequiredMM[] =
    "org.freedesktop.ModemManager.Modem.Gsm.SimPinRequired";

const char kErrorSimPukRequiredMM[] =
    "org.freedesktop.ModemManager.Modem.Gsm.SimPukRequired";

const char kErrorGprsNotSubscribedMM[] =
    "org.freedesktop.ModemManager.Modem.Gsm.GprsNotSubscribed";

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.";

}  // namespace

TEST_F(CellularErrorTest, FromDBusError) {
  Error shill_error;

  CellularError::FromDBusError(DBus::Error(), NULL);
  EXPECT_TRUE(shill_error.IsSuccess());

  CellularError::FromDBusError(DBus::Error(), &shill_error);
  EXPECT_TRUE(shill_error.IsSuccess());

  CellularError::FromDBusError(
      DBus::Error(kErrorIncorrectPasswordMM, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kIncorrectPin, shill_error.type());

  CellularError::FromDBusError(
      DBus::Error(kErrorSimPinRequiredMM, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kPinRequired, shill_error.type());

  CellularError::FromDBusError(
      DBus::Error(kErrorSimPukRequiredMM, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kPinBlocked, shill_error.type());

  CellularError::FromDBusError(
      DBus::Error(kErrorGprsNotSubscribedMM, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kInvalidApn, shill_error.type());

  CellularError::FromDBusError(
      DBus::Error(kErrorIncorrectPasswordMM1, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kOperationFailed, shill_error.type());

  CellularError::FromDBusError(
      DBus::Error("Some random error name.", kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kOperationFailed, shill_error.type());
}

TEST_F(CellularErrorTest, FromMM1DBusError) {
  Error shill_error;

  CellularError::FromDBusError(DBus::Error(), NULL);
  EXPECT_TRUE(shill_error.IsSuccess());

  CellularError::FromMM1DBusError(DBus::Error(), &shill_error);
  EXPECT_TRUE(shill_error.IsSuccess());

  CellularError::FromMM1DBusError(
      DBus::Error(kErrorIncorrectPasswordMM1, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kIncorrectPin, shill_error.type());

  CellularError::FromMM1DBusError(
      DBus::Error(kErrorSimPinMM1, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kPinRequired, shill_error.type());

  CellularError::FromMM1DBusError(
      DBus::Error(kErrorSimPukMM1, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kPinBlocked, shill_error.type());

  CellularError::FromMM1DBusError(
      DBus::Error(kErrorGprsNotSubscribedMM1, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kInvalidApn, shill_error.type());

  CellularError::FromMM1DBusError(
      DBus::Error(kErrorWrongStateMM1, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kWrongState, shill_error.type());

  CellularError::FromMM1DBusError(
      DBus::Error(kErrorIncorrectPasswordMM, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kOperationFailed, shill_error.type());

  CellularError::FromMM1DBusError(
      DBus::Error("Some random error name.", kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kOperationFailed, shill_error.type());
}

}  // namespace shill

