// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/signaling/signaling_id_util.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace remoting {

TEST(SignalingIdUtilTest, NormalizeSignalingId) {
  EXPECT_EQ(NormalizeSignalingId("USER@DOMAIN.com"), "user@domain.com");
  EXPECT_EQ(NormalizeSignalingId("user@domain.com"), "user@domain.com");
  EXPECT_EQ(NormalizeSignalingId("USER@DOMAIN.com/RESOURCE"),
            "user@domain.com/RESOURCE");
  EXPECT_EQ(NormalizeSignalingId("USER@DOMAIN.com/"), "user@domain.com/");

  // Jabber ID normalization
  EXPECT_EQ(NormalizeSignalingId("User.Mixed.Case@GOOGLEMAIL.com/RESOURCE"),
            "user.mixed.case@googlemail.com/RESOURCE");

  // FTL ID normalization
  EXPECT_EQ(NormalizeSignalingId("USER@DOMAIN.com/chromoting_ftl_abc123"),
            "user@domain.com/chromoting_ftl_abc123");
  EXPECT_EQ(NormalizeSignalingId("  USER@DOMAIN.com/chromoting_ftl_abc123"),
            "user@domain.com/chromoting_ftl_abc123");
  EXPECT_EQ(
      NormalizeSignalingId("User.Mixed.Case@GMAIL.com/chromoting_ftl_abc123"),
      "usermixedcase@gmail.com/chromoting_ftl_abc123");
  EXPECT_EQ(NormalizeSignalingId(
                "User.Mixed.Case@GOOGLEMAIL.com/chromoting_ftl_abc123"),
            "usermixedcase@gmail.com/chromoting_ftl_abc123");
  EXPECT_EQ(
      NormalizeSignalingId("User.Mixed.Case@DOMAIN.com/chromoting_ftl_abc123"),
      "user.mixed.case@domain.com/chromoting_ftl_abc123");
  EXPECT_EQ(NormalizeSignalingId("  Invalid.User/chromoting_ftl_abc123"),
            "invalid.user/chromoting_ftl_abc123");
  EXPECT_EQ(NormalizeSignalingId("  Invalid.User@/chromoting_ftl_abc123"),
            "invalid.user@/chromoting_ftl_abc123");
  EXPECT_EQ(NormalizeSignalingId("@googlemail.com/chromoting_ftl_abc123"),
            "@gmail.com/chromoting_ftl_abc123");

  // Corp ID normalization.
  EXPECT_EQ(NormalizeSignalingId("USER@corp.google.com/some-uuid"),
            "user@corp.google.com/some-uuid");
  EXPECT_EQ(NormalizeSignalingId("uuid@TYPE.corp.google.com"),
            "uuid@type.corp.google.com");
  EXPECT_EQ(NormalizeSignalingId("uuid@TYPE.corp.google.com/resource"),
            "uuid@type.corp.google.com/resource");
}

TEST(SignalingIdUtilTest, SplitSignalingIdResource) {
  std::string email;
  std::string resource_suffix;

  EXPECT_TRUE(
      SplitSignalingIdResource("user@domain/resource", nullptr, nullptr));
  EXPECT_TRUE(SplitSignalingIdResource("user@domain/resource", &email,
                                       &resource_suffix));
  EXPECT_EQ(email, "user@domain");
  EXPECT_EQ(resource_suffix, "resource");

  EXPECT_FALSE(SplitSignalingIdResource("user@domain", nullptr, nullptr));
  EXPECT_FALSE(
      SplitSignalingIdResource("user@domain", &email, &resource_suffix));
  EXPECT_EQ(email, "user@domain");
  EXPECT_EQ(resource_suffix, "");
}

TEST(SignalingIdUtilTest, GetCanonicalEmail) {
  EXPECT_EQ(GetCanonicalEmail("USER@GMAIL.COM"), "user@gmail.com");
  EXPECT_EQ(GetCanonicalEmail("user.name@googlemail.com"),
            "username@gmail.com");
  EXPECT_EQ(GetCanonicalEmail("  user@DOMAIN.com  "), "user@domain.com");
  EXPECT_EQ(GetCanonicalEmail("no_at_symbol"), "no_at_symbol");
}

TEST(SignalingIdUtilTest, IsValidFtlSignalingId) {
  EXPECT_TRUE(IsValidFtlSignalingId(
      "user@gmail.com/chromoting_ftl_f6b43f10-566e-11e9-8647-d663bd873d93"));
  EXPECT_FALSE(IsValidFtlSignalingId("user@gmail.com"));
  EXPECT_FALSE(IsValidFtlSignalingId("user@gmail.com/not_ftl_resource"));
  EXPECT_FALSE(
      IsValidFtlSignalingId("user@gmail.com/chromoting_ftl_invalid_uuid"));
}

}  // namespace remoting
