android_sms_app_installing_status_observer_unittest.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. // Copyright 2018 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/services/multidevice_setup/android_sms_app_installing_status_observer.h"
  5. #include <string>
  6. #include "ash/components/multidevice/remote_device_test_util.h"
  7. #include "ash/services/multidevice_setup/fake_feature_state_manager.h"
  8. #include "ash/services/multidevice_setup/fake_host_status_provider.h"
  9. #include "ash/services/multidevice_setup/public/cpp/fake_android_sms_app_helper_delegate.h"
  10. #include "ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
  11. #include "components/sync_preferences/testing_pref_service_syncable.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. namespace ash {
  14. namespace multidevice_setup {
  15. namespace {
  16. const char kFakePhoneKey[] = "fake-phone-key";
  17. const char kFakePhoneName[] = "Phony Phone";
  18. const char kShouldAttemptReenable[] = "android_sms.should_attempt_reenable";
  19. } // namespace
  20. class MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest
  21. : public testing::Test {
  22. public:
  23. MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest(
  24. const MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest&) =
  25. delete;
  26. MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest& operator=(
  27. const MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest&) =
  28. delete;
  29. protected:
  30. MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest() = default;
  31. ~MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest() override =
  32. default;
  33. void SetUp() override {
  34. fake_android_sms_app_helper_delegate_ =
  35. std::make_unique<FakeAndroidSmsAppHelperDelegate>();
  36. fake_host_status_provider_ = std::make_unique<FakeHostStatusProvider>();
  37. fake_feature_state_manager_ = std::make_unique<FakeFeatureStateManager>();
  38. test_pref_service_ =
  39. std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
  40. AndroidSmsAppInstallingStatusObserver::RegisterPrefs(
  41. test_pref_service_->registry());
  42. android_sms_app_installing_status_observer_ =
  43. AndroidSmsAppInstallingStatusObserver::Factory::Create(
  44. fake_host_status_provider_.get(), fake_feature_state_manager_.get(),
  45. fake_android_sms_app_helper_delegate_.get(),
  46. test_pref_service_.get());
  47. }
  48. void Initialize() {
  49. fake_android_sms_app_helper_delegate_->set_is_app_registry_ready(true);
  50. SetMessagesFeatureState(mojom::FeatureState::kEnabledByUser);
  51. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  52. fake_app_helper_delegate()->Reset();
  53. }
  54. void SetHostWithStatus(
  55. mojom::HostStatus host_status,
  56. const absl::optional<multidevice::RemoteDeviceRef>& host_device) {
  57. fake_host_status_provider_->SetHostWithStatus(host_status, host_device);
  58. }
  59. FakeAndroidSmsAppHelperDelegate* fake_app_helper_delegate() {
  60. return fake_android_sms_app_helper_delegate_.get();
  61. }
  62. multidevice::RemoteDeviceRef GetFakePhone() {
  63. return multidevice::RemoteDeviceRefBuilder()
  64. .SetPublicKey(kFakePhoneKey)
  65. .SetName(kFakePhoneName)
  66. .Build();
  67. }
  68. void SetMessagesFeatureState(mojom::FeatureState feature_state) {
  69. fake_feature_state_manager_->SetFeatureState(mojom::Feature::kMessages,
  70. feature_state);
  71. }
  72. mojom::FeatureState GetMessagesFeatureState() {
  73. return fake_feature_state_manager_->GetFeatureState(
  74. mojom::Feature::kMessages);
  75. }
  76. FakeAndroidSmsAppHelperDelegate* fake_android_sms_app_helper_delegate() {
  77. return fake_android_sms_app_helper_delegate_.get();
  78. }
  79. sync_preferences::TestingPrefServiceSyncable* test_pref_service() {
  80. return test_pref_service_.get();
  81. }
  82. private:
  83. std::unique_ptr<FakeHostStatusProvider> fake_host_status_provider_;
  84. std::unique_ptr<FakeFeatureStateManager> fake_feature_state_manager_;
  85. std::unique_ptr<FakeAndroidSmsAppHelperDelegate>
  86. fake_android_sms_app_helper_delegate_;
  87. std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
  88. test_pref_service_;
  89. std::unique_ptr<AndroidSmsAppInstallingStatusObserver>
  90. android_sms_app_installing_status_observer_;
  91. };
  92. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  93. InstallsAfterHostPending) {
  94. Initialize();
  95. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  96. SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
  97. absl::nullopt /* host_device */);
  98. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  99. SetHostWithStatus(
  100. mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
  101. GetFakePhone());
  102. EXPECT_TRUE(fake_app_helper_delegate()->has_installed_app());
  103. }
  104. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  105. InstallsAfterHostVerified) {
  106. Initialize();
  107. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  108. absl::nullopt /* host_device */);
  109. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  110. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  111. EXPECT_TRUE(fake_app_helper_delegate()->has_installed_app());
  112. }
  113. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  114. DoesNotInstallsAfterHostVerifiedIfNotAllowed) {
  115. Initialize();
  116. SetMessagesFeatureState(mojom::FeatureState::kProhibitedByPolicy);
  117. fake_app_helper_delegate()->Reset();
  118. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  119. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  120. absl::nullopt /* host_device */);
  121. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  122. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  123. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  124. }
  125. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  126. DoesNotInstallAfterHostVerifiedIfUninstalledByUser) {
  127. Initialize();
  128. fake_app_helper_delegate()->Reset();
  129. fake_app_helper_delegate()->set_has_app_been_manually_uninstalled(true);
  130. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  131. absl::nullopt /* host_device */);
  132. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  133. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  134. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  135. }
  136. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  137. DoesNotDisableFeatureIfAppRegistryNotReady) {
  138. Initialize();
  139. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  140. absl::nullopt /* host_device */);
  141. fake_app_helper_delegate()->Reset();
  142. fake_app_helper_delegate()->set_has_app_been_manually_uninstalled(true);
  143. fake_app_helper_delegate()->set_is_app_registry_ready(false);
  144. SetMessagesFeatureState(mojom::FeatureState::kEnabledByUser);
  145. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  146. EXPECT_EQ(GetMessagesFeatureState(), mojom::FeatureState::kEnabledByUser);
  147. }
  148. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  149. DoesNotInstallsAfterHostVerifiedIfNotSupportedByPhone) {
  150. Initialize();
  151. SetMessagesFeatureState(mojom::FeatureState::kNotSupportedByPhone);
  152. fake_app_helper_delegate()->Reset();
  153. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  154. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  155. absl::nullopt /* host_device */);
  156. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  157. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  158. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  159. }
  160. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  161. DoesNotInstallsAfterHostVerifiedIfNotSupportedByChromebook) {
  162. SetMessagesFeatureState(mojom::FeatureState::kNotSupportedByChromebook);
  163. fake_app_helper_delegate()->Reset();
  164. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  165. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  166. absl::nullopt /* host_device */);
  167. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  168. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  169. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  170. }
  171. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  172. InstallsWhenFeatureBecomesEnabled) {
  173. Initialize();
  174. SetMessagesFeatureState(mojom::FeatureState::kNotSupportedByChromebook);
  175. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  176. SetMessagesFeatureState(mojom::FeatureState::kEnabledByUser);
  177. EXPECT_TRUE(fake_app_helper_delegate()->has_installed_app());
  178. }
  179. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  180. CleansUpPwaInstallationWhenDisabled) {
  181. Initialize();
  182. SetMessagesFeatureState(mojom::FeatureState::kNotSupportedByChromebook);
  183. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  184. SetMessagesFeatureState(mojom::FeatureState::kEnabledByUser);
  185. EXPECT_TRUE(fake_app_helper_delegate()->has_installed_app());
  186. EXPECT_TRUE(fake_app_helper_delegate()->is_default_to_persist_cookie_set());
  187. SetMessagesFeatureState(mojom::FeatureState::kDisabledByUser);
  188. EXPECT_TRUE(fake_app_helper_delegate()->has_installed_app());
  189. EXPECT_FALSE(fake_app_helper_delegate()->is_default_to_persist_cookie_set());
  190. }
  191. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  192. DoesNotInstallWhenFeatureIsDisabledByUser) {
  193. Initialize();
  194. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  195. SetMessagesFeatureState(mojom::FeatureState::kDisabledByUser);
  196. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  197. }
  198. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  199. DoesNotInstallWhenSuiteIsDisabledByUser) {
  200. Initialize();
  201. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  202. SetMessagesFeatureState(mojom::FeatureState::kUnavailableSuiteDisabled);
  203. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  204. }
  205. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  206. DoesNotInstallIfNotVerified) {
  207. Initialize();
  208. SetHostWithStatus(mojom::HostStatus::kNoEligibleHosts,
  209. absl::nullopt /* host_device */);
  210. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  211. SetMessagesFeatureState(
  212. mojom::FeatureState::kUnavailableNoVerifiedHost_NoEligibleHosts);
  213. EXPECT_FALSE(fake_app_helper_delegate()->has_installed_app());
  214. }
  215. // This test covers the temporary fix to re-enable users who were affected by
  216. // crbug.com/1131140 which caused Messages to become disabled during login due
  217. // to the app being incorrectly considered uninstalled.
  218. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  219. ReenablesMessages_WhenDisabledByBug) {
  220. // Don't call Initialize(), instead simulate the class starting disabled.
  221. SetMessagesFeatureState(mojom::FeatureState::kDisabledByUser);
  222. fake_app_helper_delegate()->set_has_installed_app(true);
  223. fake_android_sms_app_helper_delegate()->set_is_app_registry_ready(true);
  224. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  225. EXPECT_EQ(mojom::FeatureState::kEnabledByUser, GetMessagesFeatureState());
  226. EXPECT_FALSE(test_pref_service()->GetBoolean(kShouldAttemptReenable));
  227. }
  228. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  229. DoesntReenableMessages_WhenNoHostSet) {
  230. // Don't call Initialize(), instead simulate the class starting disabled.
  231. SetMessagesFeatureState(mojom::FeatureState::kDisabledByUser);
  232. fake_app_helper_delegate()->set_has_installed_app(true);
  233. fake_android_sms_app_helper_delegate()->set_is_app_registry_ready(true);
  234. SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
  235. absl::nullopt /* host_device */);
  236. EXPECT_EQ(mojom::FeatureState::kDisabledByUser, GetMessagesFeatureState());
  237. EXPECT_FALSE(test_pref_service()->GetBoolean(kShouldAttemptReenable));
  238. }
  239. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  240. DoesntReenableMessages_WhenAppNotInstalled) {
  241. // Don't call Initialize(), instead simulate the class starting disabled.
  242. SetMessagesFeatureState(mojom::FeatureState::kDisabledByUser);
  243. fake_app_helper_delegate()->set_has_installed_app(false);
  244. fake_android_sms_app_helper_delegate()->set_is_app_registry_ready(true);
  245. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  246. EXPECT_EQ(mojom::FeatureState::kDisabledByUser, GetMessagesFeatureState());
  247. EXPECT_FALSE(test_pref_service()->GetBoolean(kShouldAttemptReenable));
  248. }
  249. TEST_F(MultiDeviceSetupAndroidSmsAppInstallingStatusObserverTest,
  250. DoesntTryReenableMessages_WhenRegistryNotReady) {
  251. // Don't call Initialize(), instead simulate the class starting disabled.
  252. SetMessagesFeatureState(mojom::FeatureState::kDisabledByUser);
  253. fake_app_helper_delegate()->set_has_installed_app(true);
  254. SetHostWithStatus(mojom::HostStatus::kHostVerified, GetFakePhone());
  255. EXPECT_EQ(mojom::FeatureState::kDisabledByUser, GetMessagesFeatureState());
  256. EXPECT_TRUE(test_pref_service()->GetBoolean(kShouldAttemptReenable));
  257. }
  258. } // namespace multidevice_setup
  259. } // namespace ash