third_party_auth_config_unittest.cc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/host/third_party_auth_config.h"
  5. #include <sstream>
  6. #include "base/values.h"
  7. #include "build/build_config.h"
  8. #include "components/policy/policy_constants.h"
  9. #include "testing/gmock/include/gmock/gmock.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace remoting {
  12. namespace key = ::policy::key;
  13. TEST(ThirdPartyAuthConfig, ParseEmpty) {
  14. ThirdPartyAuthConfig third_party_auth_config;
  15. EXPECT_TRUE(
  16. ThirdPartyAuthConfig::ParseStrings("", "", "", &third_party_auth_config));
  17. EXPECT_TRUE(third_party_auth_config.is_null());
  18. }
  19. TEST(ThirdPartyAuthConfig, ParseValidAll) {
  20. ThirdPartyAuthConfig third_party_auth_config;
  21. EXPECT_TRUE(ThirdPartyAuthConfig::ParseStrings(
  22. "https://token.com/", "https://validation.com/", "certificate subject",
  23. &third_party_auth_config));
  24. EXPECT_FALSE(third_party_auth_config.is_null());
  25. EXPECT_EQ("https://token.com/", third_party_auth_config.token_url.spec());
  26. EXPECT_EQ("https://validation.com/",
  27. third_party_auth_config.token_validation_url.spec());
  28. EXPECT_EQ("certificate subject",
  29. third_party_auth_config.token_validation_cert_issuer);
  30. }
  31. TEST(ThirdPartyAuthConfig, ParseValidNoCert) {
  32. ThirdPartyAuthConfig third_party_auth_config;
  33. EXPECT_TRUE(ThirdPartyAuthConfig::ParseStrings("https://token.com/",
  34. "https://validation.com/", "",
  35. &third_party_auth_config));
  36. EXPECT_FALSE(third_party_auth_config.is_null());
  37. EXPECT_EQ("https://token.com/", third_party_auth_config.token_url.spec());
  38. EXPECT_EQ("https://validation.com/",
  39. third_party_auth_config.token_validation_url.spec());
  40. EXPECT_EQ("", third_party_auth_config.token_validation_cert_issuer);
  41. }
  42. // We validate https-vs-http only on Release builds to help with manual testing.
  43. #if !defined(NDEBUG)
  44. TEST(ThirdPartyAuthConfig, ParseHttp) {
  45. ThirdPartyAuthConfig third_party_auth_config;
  46. EXPECT_TRUE(ThirdPartyAuthConfig::ParseStrings("http://token.com/",
  47. "http://validation.com/", "",
  48. &third_party_auth_config));
  49. EXPECT_FALSE(third_party_auth_config.is_null());
  50. EXPECT_EQ("http://token.com/", third_party_auth_config.token_url.spec());
  51. EXPECT_EQ("http://validation.com/",
  52. third_party_auth_config.token_validation_url.spec());
  53. }
  54. #endif
  55. namespace {
  56. const std::string valid_url("https://valid.com");
  57. const std::string valid_cert("certificate subject");
  58. } // namespace
  59. class InvalidUrlTest : public ::testing::TestWithParam<const char*> {};
  60. TEST_P(InvalidUrlTest, ParseInvalidUrl) {
  61. const std::string& invalid_url(GetParam());
  62. // Populate |config| with some known data - we will use this for validating
  63. // that |config| doesn't get modified by ParseStrings during subsequent
  64. // parsing
  65. // failure tests.
  66. ThirdPartyAuthConfig config;
  67. EXPECT_TRUE(ThirdPartyAuthConfig::ParseStrings(
  68. "https://token.com/", "https://validation.com/", "certificate subject",
  69. &config));
  70. // Test for parsing failure.
  71. EXPECT_FALSE(ThirdPartyAuthConfig::ParseStrings(invalid_url, valid_url,
  72. valid_cert, &config));
  73. EXPECT_FALSE(ThirdPartyAuthConfig::ParseStrings(valid_url, invalid_url,
  74. valid_cert, &config));
  75. EXPECT_FALSE(
  76. ThirdPartyAuthConfig::ParseStrings(invalid_url, "", "", &config));
  77. EXPECT_FALSE(
  78. ThirdPartyAuthConfig::ParseStrings("", invalid_url, "", &config));
  79. // Validate that ParseStrings doesn't modify its output upon parsing failure.
  80. EXPECT_EQ("https://token.com/", config.token_url.spec());
  81. EXPECT_EQ("https://validation.com/", config.token_validation_url.spec());
  82. EXPECT_EQ("certificate subject", config.token_validation_cert_issuer);
  83. }
  84. // We validate https-vs-http only on Release builds to help with manual testing.
  85. #if defined(NDEBUG)
  86. INSTANTIATE_TEST_SUITE_P(ThirdPartyAuthConfig,
  87. InvalidUrlTest,
  88. ::testing::Values("http://insecure.com",
  89. "I am not a URL"));
  90. #else
  91. INSTANTIATE_TEST_SUITE_P(ThirdPartyAuthConfig,
  92. InvalidUrlTest,
  93. ::testing::Values("I am not a URL"));
  94. #endif
  95. TEST(ThirdPartyAuthConfig, ParseInvalidCombination) {
  96. // Populate |config| with some known data - we will use this for validating
  97. // that |config| doesn't get modified by ParseStrings during subsequent
  98. // parsing
  99. // failure tests.
  100. ThirdPartyAuthConfig config;
  101. EXPECT_TRUE(ThirdPartyAuthConfig::ParseStrings(
  102. "https://token.com/", "https://validation.com/", "certificate subject",
  103. &config));
  104. // Only one of TokenUrl and TokenValidationUrl
  105. EXPECT_FALSE(
  106. ThirdPartyAuthConfig::ParseStrings("", valid_url, valid_cert, &config));
  107. EXPECT_FALSE(
  108. ThirdPartyAuthConfig::ParseStrings(valid_url, "", valid_cert, &config));
  109. // CertSubject when no TokenUrl and TokenValidationUrl
  110. EXPECT_FALSE(ThirdPartyAuthConfig::ParseStrings("", "", valid_cert, &config));
  111. // Validate that ParseStrings doesn't modify its output upon parsing failure.
  112. EXPECT_EQ("https://token.com/", config.token_url.spec());
  113. EXPECT_EQ("https://validation.com/", config.token_validation_url.spec());
  114. EXPECT_EQ("certificate subject", config.token_validation_cert_issuer);
  115. }
  116. TEST(ThirdPartyAuthConfig, ExtractEmpty) {
  117. base::DictionaryValue dict;
  118. std::string url1, url2, cert;
  119. EXPECT_FALSE(ThirdPartyAuthConfig::ExtractStrings(dict, &url1, &url2, &cert));
  120. }
  121. TEST(ThirdPartyAuthConfig, ExtractUnknown) {
  122. base::DictionaryValue dict;
  123. dict.SetString("unknownName", "someValue");
  124. std::string url1, url2, cert;
  125. EXPECT_FALSE(ThirdPartyAuthConfig::ExtractStrings(dict, &url1, &url2, &cert));
  126. }
  127. #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_IOS)
  128. TEST(ThirdPartyAuthConfig, ExtractAll) {
  129. base::DictionaryValue dict;
  130. dict.SetString(key::kRemoteAccessHostTokenUrl, "test1");
  131. dict.SetString(key::kRemoteAccessHostTokenValidationUrl, "test2");
  132. dict.SetString(key::kRemoteAccessHostTokenValidationCertificateIssuer, "t3");
  133. std::string url1, url2, cert;
  134. EXPECT_TRUE(ThirdPartyAuthConfig::ExtractStrings(dict, &url1, &url2, &cert));
  135. EXPECT_EQ("test1", url1);
  136. EXPECT_EQ("test2", url2);
  137. EXPECT_EQ("t3", cert);
  138. }
  139. TEST(ThirdPartyAuthConfig, ExtractPartial) {
  140. base::DictionaryValue dict;
  141. dict.SetString(key::kRemoteAccessHostTokenValidationUrl, "test2");
  142. std::string url1, url2, cert;
  143. EXPECT_TRUE(ThirdPartyAuthConfig::ExtractStrings(dict, &url1, &url2, &cert));
  144. EXPECT_EQ("", url1);
  145. EXPECT_EQ("test2", url2);
  146. EXPECT_EQ("", cert);
  147. }
  148. #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) &&
  149. // !BUILDFLAG(IS_IOS)
  150. TEST(ThirdPartyAuthConfig, Output) {
  151. ThirdPartyAuthConfig third_party_auth_config;
  152. third_party_auth_config.token_url = GURL("https://token.com");
  153. third_party_auth_config.token_validation_url = GURL("https://validation.com");
  154. third_party_auth_config.token_validation_cert_issuer = "certificate subject";
  155. std::ostringstream str;
  156. str << third_party_auth_config;
  157. EXPECT_THAT(str.str(), testing::HasSubstr("token"));
  158. EXPECT_THAT(str.str(), testing::HasSubstr("validation"));
  159. EXPECT_THAT(str.str(), testing::HasSubstr("certificate subject"));
  160. }
  161. } // namespace remoting