ssl_config_service_unittest.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright (c) 2012 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 "net/ssl/ssl_config_service.h"
  5. #include <vector>
  6. #include "testing/gmock/include/gmock/gmock.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace net {
  9. namespace {
  10. class MockSSLConfigService : public SSLConfigService {
  11. public:
  12. explicit MockSSLConfigService(const SSLContextConfig& config)
  13. : config_(config) {}
  14. ~MockSSLConfigService() override = default;
  15. // SSLConfigService implementation
  16. SSLContextConfig GetSSLContextConfig() override { return config_; }
  17. bool CanShareConnectionWithClientCerts(
  18. const std::string& hostname) const override {
  19. return false;
  20. }
  21. // Sets the SSLContextConfig to be returned by GetSSLContextConfig and
  22. // processes any updates.
  23. void SetSSLContextConfig(const SSLContextConfig& config) {
  24. SSLContextConfig old_config = config_;
  25. config_ = config;
  26. ProcessConfigUpdate(old_config, config_, /*force_notification*/ false);
  27. }
  28. using SSLConfigService::ProcessConfigUpdate;
  29. private:
  30. SSLContextConfig config_;
  31. };
  32. class MockSSLConfigServiceObserver : public SSLConfigService::Observer {
  33. public:
  34. MockSSLConfigServiceObserver() = default;
  35. ~MockSSLConfigServiceObserver() override = default;
  36. MOCK_METHOD0(OnSSLContextConfigChanged, void());
  37. };
  38. } // namespace
  39. TEST(SSLConfigServiceTest, NoChangesWontNotifyObservers) {
  40. SSLContextConfig initial_config;
  41. initial_config.version_min = SSL_PROTOCOL_VERSION_TLS1;
  42. initial_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2;
  43. MockSSLConfigService mock_service(initial_config);
  44. MockSSLConfigServiceObserver observer;
  45. mock_service.AddObserver(&observer);
  46. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(0);
  47. mock_service.SetSSLContextConfig(initial_config);
  48. mock_service.RemoveObserver(&observer);
  49. }
  50. TEST(SSLConfigServiceTest, ForceNotificationNotifiesObservers) {
  51. SSLContextConfig initial_config;
  52. initial_config.version_min = SSL_PROTOCOL_VERSION_TLS1;
  53. initial_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2;
  54. MockSSLConfigService mock_service(initial_config);
  55. MockSSLConfigServiceObserver observer;
  56. mock_service.AddObserver(&observer);
  57. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
  58. mock_service.ProcessConfigUpdate(initial_config, initial_config, true);
  59. mock_service.RemoveObserver(&observer);
  60. }
  61. TEST(SSLConfigServiceTest, ConfigUpdatesNotifyObservers) {
  62. SSLContextConfig initial_config;
  63. initial_config.version_min = SSL_PROTOCOL_VERSION_TLS1;
  64. initial_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2;
  65. MockSSLConfigService mock_service(initial_config);
  66. MockSSLConfigServiceObserver observer;
  67. mock_service.AddObserver(&observer);
  68. // Test that changing the SSL version range triggers updates.
  69. initial_config.version_min = SSL_PROTOCOL_VERSION_TLS1_1;
  70. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
  71. mock_service.SetSSLContextConfig(initial_config);
  72. initial_config.version_max = SSL_PROTOCOL_VERSION_TLS1_1;
  73. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
  74. mock_service.SetSSLContextConfig(initial_config);
  75. // Test that disabling certain cipher suites triggers an update.
  76. std::vector<uint16_t> disabled_ciphers;
  77. disabled_ciphers.push_back(0x0004u);
  78. disabled_ciphers.push_back(0xBEEFu);
  79. disabled_ciphers.push_back(0xDEADu);
  80. initial_config.disabled_cipher_suites = disabled_ciphers;
  81. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
  82. mock_service.SetSSLContextConfig(initial_config);
  83. // Ensure that changing a disabled cipher suite, while still maintaining
  84. // sorted order, triggers an update.
  85. disabled_ciphers[1] = 0xCAFEu;
  86. initial_config.disabled_cipher_suites = disabled_ciphers;
  87. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
  88. mock_service.SetSSLContextConfig(initial_config);
  89. // Ensure that removing a disabled cipher suite, while still keeping some
  90. // cipher suites disabled, triggers an update.
  91. disabled_ciphers.pop_back();
  92. initial_config.disabled_cipher_suites = disabled_ciphers;
  93. EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
  94. mock_service.SetSSLContextConfig(initial_config);
  95. mock_service.RemoveObserver(&observer);
  96. }
  97. } // namespace net