vpn_list_unittest.cc 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Copyright 2016 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 "ash/system/network/vpn_list.h"
  5. #include <algorithm>
  6. #include <vector>
  7. #include "ash/system/network/tray_network_state_model.h"
  8. #include "ash/test/ash_test_base.h"
  9. #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. using chromeos::network_config::mojom::VpnProvider;
  12. using chromeos::network_config::mojom::VpnProviderPtr;
  13. using chromeos::network_config::mojom::VpnType;
  14. namespace ash {
  15. namespace {
  16. class TestVpnListObserver : public VpnList::Observer {
  17. public:
  18. TestVpnListObserver() = default;
  19. ~TestVpnListObserver() override = default;
  20. // VpnList::Observer:
  21. void OnVpnProvidersChanged() override { change_count_++; }
  22. int change_count_ = 0;
  23. };
  24. std::vector<VpnProviderPtr> CopyProviders(
  25. const std::vector<VpnProviderPtr>& providers) {
  26. std::vector<VpnProviderPtr> result;
  27. for (const VpnProviderPtr& provider : providers)
  28. result.push_back(provider.Clone());
  29. return result;
  30. }
  31. } // namespace
  32. class VpnListTest : public AshTestBase {
  33. public:
  34. VpnListTest() = default;
  35. VpnListTest(const VpnListTest&) = delete;
  36. VpnListTest& operator=(const VpnListTest&) = delete;
  37. ~VpnListTest() override = default;
  38. void SetUp() override {
  39. AshTestBase::SetUp();
  40. network_state_model_ = std::make_unique<TrayNetworkStateModel>();
  41. }
  42. void TearDown() override {
  43. network_state_model_.reset();
  44. AshTestBase::TearDown();
  45. }
  46. VpnList& GetVpnList() { return *network_state_model_->vpn_list(); }
  47. private:
  48. std::unique_ptr<TrayNetworkStateModel> network_state_model_;
  49. std::unique_ptr<VpnList> vpn_list_;
  50. };
  51. TEST_F(VpnListTest, BuiltInProvider) {
  52. VpnList& vpn_list = GetVpnList();
  53. // The VPN list should only contain the built-in provider.
  54. ASSERT_EQ(1u, vpn_list.extension_vpn_providers().size());
  55. const VpnProviderPtr& provider = vpn_list.extension_vpn_providers()[0];
  56. EXPECT_EQ(provider->type, VpnType::kOpenVPN);
  57. EXPECT_TRUE(provider->app_id.empty());
  58. }
  59. TEST_F(VpnListTest, ThirdPartyProviders) {
  60. VpnList& vpn_list = GetVpnList();
  61. // The VpnList model doesn't sort by launch time or otherwise do anything
  62. // with the value, so we use the same value for all instances and di a single
  63. // verification that it gets set.
  64. base::Time launch_time = base::Time::Now();
  65. // The VPN list should only contain the built-in provider.
  66. EXPECT_EQ(1u, vpn_list.extension_vpn_providers().size());
  67. // Add some third party providers.
  68. VpnProviderPtr extension_provider1 =
  69. VpnProvider::New(VpnType::kExtension, "extension_id1", "name1",
  70. "extension_id1", launch_time);
  71. VpnProviderPtr extension_provider2 =
  72. VpnProvider::New(VpnType::kExtension, "extension_id2", "name2",
  73. "extension_id2", launch_time);
  74. VpnProviderPtr arc_provider1 =
  75. VpnProvider::New(VpnType::kArc, "package.name.foo1", "ArcVPNMonster1",
  76. "arc_app_id1", launch_time);
  77. std::vector<VpnProviderPtr> third_party_providers;
  78. third_party_providers.push_back(extension_provider1->Clone());
  79. third_party_providers.push_back(extension_provider2->Clone());
  80. third_party_providers.push_back(arc_provider1->Clone());
  81. vpn_list.SetVpnProvidersForTest(CopyProviders(third_party_providers));
  82. // Extension list contains the builtin provider and extension-backed
  83. // providers.
  84. {
  85. const std::vector<VpnProviderPtr>& extension_providers =
  86. vpn_list.extension_vpn_providers();
  87. ASSERT_EQ(3u, extension_providers.size());
  88. EXPECT_EQ(VpnType::kOpenVPN, extension_providers[0]->type);
  89. EXPECT_TRUE(extension_providers[1]->Equals(*extension_provider1));
  90. EXPECT_TRUE(extension_providers[2]->Equals(*extension_provider2));
  91. }
  92. // Arc list contains the Arc providers.
  93. {
  94. const std::vector<VpnProviderPtr>& arc_providers =
  95. vpn_list.arc_vpn_providers();
  96. EXPECT_EQ(1u, arc_providers.size());
  97. EXPECT_TRUE(arc_providers[0]->Equals(*arc_provider1));
  98. EXPECT_EQ(launch_time, arc_providers[0]->last_launch_time);
  99. }
  100. // A second Arc VPN gets installed.
  101. VpnProviderPtr arc_provider2 =
  102. VpnProvider::New(VpnType::kArc, "package.name.foo2", "ArcVPNMonster2",
  103. "arc_app_id2", launch_time);
  104. third_party_providers.push_back(arc_provider2->Clone());
  105. vpn_list.SetVpnProvidersForTest(CopyProviders(third_party_providers));
  106. {
  107. const std::vector<VpnProviderPtr>& arc_providers =
  108. vpn_list.arc_vpn_providers();
  109. EXPECT_EQ(2u, arc_providers.size());
  110. EXPECT_TRUE(arc_providers[0]->Equals(*arc_provider1));
  111. EXPECT_TRUE(arc_providers[1]->Equals(*arc_provider2));
  112. }
  113. // The first Arc VPN gets uninstalled.
  114. auto iter = std::find_if(
  115. third_party_providers.begin(), third_party_providers.end(),
  116. [](const auto& p) { return p->provider_id == "package.name.foo1"; });
  117. ASSERT_NE(iter, third_party_providers.end());
  118. third_party_providers.erase(iter);
  119. vpn_list.SetVpnProvidersForTest(CopyProviders(third_party_providers));
  120. {
  121. const std::vector<VpnProviderPtr>& arc_providers =
  122. vpn_list.arc_vpn_providers();
  123. EXPECT_EQ(1u, arc_providers.size());
  124. ASSERT_TRUE(arc_providers[0]);
  125. ASSERT_TRUE(arc_provider2);
  126. EXPECT_TRUE(arc_providers[0]->Equals(*arc_provider2));
  127. }
  128. // package.name.foo2 changes due to update or system language change.
  129. arc_provider2->provider_name = "ArcVPNMonster2Rename";
  130. arc_provider2->app_id = "arc_app_id2_rename";
  131. third_party_providers[2] = arc_provider2->Clone();
  132. vpn_list.SetVpnProvidersForTest(CopyProviders(third_party_providers));
  133. {
  134. const std::vector<VpnProviderPtr>& arc_providers =
  135. vpn_list.arc_vpn_providers();
  136. EXPECT_TRUE(arc_providers[0]->Equals(*arc_provider2));
  137. }
  138. }
  139. TEST_F(VpnListTest, Observers) {
  140. VpnList& vpn_list = GetVpnList();
  141. // Observers are not notified when they are added.
  142. TestVpnListObserver observer;
  143. vpn_list.AddObserver(&observer);
  144. EXPECT_EQ(0, observer.change_count_);
  145. // Add a third party (extension-backed) provider.
  146. std::vector<VpnProviderPtr> third_party_providers;
  147. VpnProviderPtr third_party1 = VpnProvider::New();
  148. third_party1->type = VpnType::kExtension;
  149. third_party1->provider_name = "name1";
  150. third_party1->provider_id = "extension_id1";
  151. third_party_providers.push_back(std::move(third_party1));
  152. vpn_list.SetVpnProvidersForTest(std::move(third_party_providers));
  153. // Observer was notified.
  154. EXPECT_EQ(1, observer.change_count_);
  155. vpn_list.RemoveObserver(&observer);
  156. }
  157. } // namespace ash