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

#include <gtest/gtest.h>

#include <chromeos/dbus/service_constants.h>

#include "wimax_manager/proto_bindings/eap_parameters.pb.h"

using base::DictionaryValue;
using std::string;

namespace wimax_manager {

namespace {

const char kTestEAPAnonymousIdentity[] = "anon";
const char kTestEAPAnonymousIdentityWithRealmTag[] = "anon@${realm}";
const char kTestEAPAnonymousIdentityWithRealmTagReplaced[] = "anon@test";
const char kTestEAPUserIdentity[] = "user@test";
const char kTestEAPUserPassword[] = "testpass";

}  // namespace

class GdmDeviceTest : public testing::Test {
 protected:
  void ExpectEAPParameters(const GCT_API_EAP_PARAM &eap_parameters,
                           GCT_API_EAP_TYPE eap_type,
                           const char *anonymous_identity,
                           const char *user_identity,
                           const char *user_password,
                           int device_certificate_null,
                           int ca_certificate_null) {
    EXPECT_EQ(eap_type, eap_parameters.type);
    EXPECT_STREQ(anonymous_identity,
                 reinterpret_cast<const char *>(eap_parameters.anonymousId));
    EXPECT_STREQ(user_identity,
                 reinterpret_cast<const char *>(eap_parameters.userId));
    EXPECT_STREQ(user_password,
                 reinterpret_cast<const char *>(eap_parameters.userIdPwd));
    EXPECT_EQ(device_certificate_null, eap_parameters.devCertNULL);
    EXPECT_EQ(ca_certificate_null, eap_parameters.caCertNULL);
  }
};

TEST_F(GdmDeviceTest, ConstructEAPParametersUsingConnectParameters) {
  DictionaryValue connect_parameters;
  connect_parameters.SetString(kEAPAnonymousIdentity,
                               kTestEAPAnonymousIdentity);
  connect_parameters.SetString(kEAPUserIdentity, kTestEAPUserIdentity);
  connect_parameters.SetString(kEAPUserPassword, kTestEAPUserPassword);

  EAPParameters operator_eap_parameters;
  {
    // No network operator info provided.
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        kTestEAPAnonymousIdentity,
                        kTestEAPUserIdentity,
                        kTestEAPUserPassword,
                        0, 0);
  }
  {
    // Network operator has an anonymous identity, user identity, and user
    // password specified.
    operator_eap_parameters.set_anonymous_identity("1");
    operator_eap_parameters.set_user_identity("2");
    operator_eap_parameters.set_user_password("3");
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        kTestEAPAnonymousIdentity,
                        kTestEAPUserIdentity,
                        kTestEAPUserPassword,
                        0, 0);
  }
}

TEST_F(GdmDeviceTest, ConstructEAPParametersUsingOperatorEAPParameters) {
  // No parameter is specified through Connect().
  DictionaryValue connect_parameters;

  {
    // Default network operator EAP parameters.
    EAPParameters operator_eap_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP, "", "", "", 0, 0);
  }
  {
    // Network operator's EAP type is NONE.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_type(EAP_TYPE_NONE);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP, "", "", "", 0, 0);
  }
  {
    // Network operator's EAP type is TLS.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_type(EAP_TYPE_TLS);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_EAP_TLS, "", "", "", 0, 0);
  }
  {
    // Network operator's EAP type is TTLS/MD5.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_type(EAP_TYPE_TTLS_MD5);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters,
                        GCT_WIMAX_EAP_TTLS_MD5, "", "", "", 0, 0);
  }
  {
    // Network operator's EAP type is TTLS/MSCHAPv2.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_type(EAP_TYPE_TTLS_MSCHAPV2);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters,
                        GCT_WIMAX_EAP_TTLS_MSCHAPV2, "", "", "", 0, 0);
  }
  {
    // Network operator's EAP type is TTLS/CHAP.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_type(EAP_TYPE_TTLS_CHAP);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters,
                        GCT_WIMAX_EAP_TTLS_CHAP, "", "", "", 0, 0);
  }
  {
    // Network operator's EAP type is AKA.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_type(EAP_TYPE_AKA);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters,
                        GCT_WIMAX_EAP_AKA, "", "", "", 0, 0);
  }
  {
    // Network operator has an anonymous identity specified.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_anonymous_identity(kTestEAPAnonymousIdentity);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        kTestEAPAnonymousIdentity, "", "", 0, 0);
  }
  {
    // Network operator has a user identity specified.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_user_identity(kTestEAPUserIdentity);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        "", kTestEAPUserIdentity, "", 0, 0);
  }
  {
    // Network operator has a user password specified.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_user_password(kTestEAPUserPassword);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        "", "", kTestEAPUserPassword, 0, 0);
  }
  {
    // Network operator bypasses any device certificate.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_bypass_device_certificate(true);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP, "", "", "", 1, 0);
  }
  {
    // Network operator bypasses any CA certificate.
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_bypass_ca_certificate(true);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP, "", "", "", 0, 1);
  }
}

TEST_F(GdmDeviceTest, ConstructEAPParametersWithInvalidEAPParameters) {
  EAPParameters operator_eap_parameters;
  {
    // Non-string anonymous identity.
    DictionaryValue connect_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    connect_parameters.SetInteger(kEAPAnonymousIdentity, 1);
    connect_parameters.SetString(kEAPUserIdentity, kTestEAPUserIdentity);
    connect_parameters.SetString(kEAPUserPassword, kTestEAPUserPassword);
    EXPECT_FALSE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
  }
  {
    // Non-string user identity.
    DictionaryValue connect_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    connect_parameters.SetString(kEAPAnonymousIdentity,
                                 kTestEAPAnonymousIdentity);
    connect_parameters.SetInteger(kEAPUserIdentity, 1);
    connect_parameters.SetString(kEAPUserPassword, kTestEAPUserPassword);
    EXPECT_FALSE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
  }
  {
    // Non-string user password.
    DictionaryValue connect_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    connect_parameters.SetString(kEAPAnonymousIdentity,
                                 kTestEAPAnonymousIdentity);
    connect_parameters.SetString(kEAPUserIdentity, kTestEAPUserIdentity);
    connect_parameters.SetInteger(kEAPUserPassword, 1);
    EXPECT_FALSE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
  }
  {
    // Anonymous identity too long.
    DictionaryValue connect_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    connect_parameters.SetString(
        kEAPAnonymousIdentity, string(sizeof(eap_parameters.anonymousId), 'a'));
    connect_parameters.SetString(kEAPUserIdentity, kTestEAPUserIdentity);
    connect_parameters.SetString(kEAPUserPassword, kTestEAPUserPassword);
    EXPECT_FALSE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
  }
  {
    // User identity too long.
    DictionaryValue connect_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    connect_parameters.SetString(kEAPAnonymousIdentity,
                                 kTestEAPAnonymousIdentity);
    connect_parameters.SetString(
        kEAPUserIdentity, string(sizeof(eap_parameters.userId), 'a'));
    connect_parameters.SetString(kEAPUserPassword, kTestEAPUserPassword);
    EXPECT_FALSE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
  }
  {
    // User password too long.
    DictionaryValue connect_parameters;
    GCT_API_EAP_PARAM eap_parameters;
    connect_parameters.SetString(kEAPAnonymousIdentity,
                                 kTestEAPAnonymousIdentity);
    connect_parameters.SetString(kEAPUserIdentity, kTestEAPUserIdentity);
    connect_parameters.SetString(
        kEAPUserPassword, string(sizeof(eap_parameters.userIdPwd), 'a'));
    EXPECT_FALSE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
  }
}

TEST_F(GdmDeviceTest, ConstructEAPParametersWithAnonymousIdentityUpdated) {
  DictionaryValue connect_parameters;
  connect_parameters.SetString(kEAPUserIdentity, kTestEAPUserIdentity);

  {
    EAPParameters operator_eap_parameters;
    operator_eap_parameters.set_anonymous_identity(
        kTestEAPAnonymousIdentityWithRealmTag);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        kTestEAPAnonymousIdentityWithRealmTagReplaced,
                        kTestEAPUserIdentity, "", 0, 0);
  }
  {
    EAPParameters operator_eap_parameters;
    connect_parameters.SetString(kEAPAnonymousIdentity,
                                 kTestEAPAnonymousIdentityWithRealmTag);
    GCT_API_EAP_PARAM eap_parameters;
    EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
        connect_parameters, operator_eap_parameters, &eap_parameters));
    ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP,
                        kTestEAPAnonymousIdentityWithRealmTagReplaced,
                        kTestEAPUserIdentity, "", 0, 0);
  }
}

TEST_F(GdmDeviceTest, ConstructEAPParametersWithoutEAPParameters) {
  DictionaryValue connect_parameters;
  EAPParameters operator_eap_parameters;
  GCT_API_EAP_PARAM eap_parameters;
  EXPECT_TRUE(GdmDevice::ConstructEAPParameters(
      connect_parameters, operator_eap_parameters, &eap_parameters));
  ExpectEAPParameters(eap_parameters, GCT_WIMAX_NO_EAP, "", "", "", 0, 0);
}

}  // namespace wimax_manager
