// 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.MobileEquipment.IncorrectPassword";

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

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

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(kErrorGprsNotSubscribedMM, kErrorMessage),
      &shill_error);
  EXPECT_EQ(Error::kOperationFailed, 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

