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

#include <base/logging.h>
#include <dbus-c++/glib-integration.h>
#include <gtest/gtest.h>
#include <mm/mm-modem.h>

#include "cromo_server.h"

TEST(Carrier, Find) {
  DBus::Glib::BusDispatcher dispatcher;
  DBus::default_dispatcher = &dispatcher;
  dispatcher.attach(NULL);

  DBus::Connection conn = DBus::Connection::SystemBus();

  std::string service_name =
      std::string(CromoServer::kServiceName) + ".UnitTest";
  ASSERT_TRUE(conn.acquire_name(service_name.c_str()))
      << "Failed to acquire D-Bus name " << service_name;

  static const char kTestName[] = "test_carrier";

  CromoServer *server = new CromoServer(conn);

  Carrier *not_found = server->FindCarrierByName(kTestName);
  EXPECT_EQ(NULL, not_found);
  not_found = server->FindCarrierByCarrierId(38747);
  EXPECT_EQ(NULL, not_found);

  Carrier *test_carrier = new Carrier(
      kTestName, "dir", 17, MM_MODEM_TYPE_CDMA, Carrier::kNone, "activation");

  server->AddCarrier(test_carrier);

  Carrier *by_id = server->FindCarrierByCarrierId(17);
  EXPECT_EQ(test_carrier, by_id);

  Carrier *by_name = server->FindCarrierByName(kTestName);
  EXPECT_EQ(test_carrier, by_name);

  // Testing carrier ctor, accessors
  EXPECT_STREQ(kTestName, by_name->name());
  EXPECT_STREQ("dir", by_name->firmware_directory());
  EXPECT_EQ(MM_MODEM_TYPE_CDMA, by_name->carrier_type());
  EXPECT_EQ(Carrier::kNone, by_name->activation_method());
  EXPECT_STREQ("activation", by_name->activation_code());
}


int main(int argc, char *argv[]) {
  testing::InitGoogleTest(&argc, argv);

  return RUN_ALL_TESTS();
}
