feature_setup_response_processor_unittest.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. // Copyright 2022 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/components/phonehub/feature_setup_response_processor.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "ash/components/multidevice/logging/logging.h"
  8. #include "ash/components/phonehub/combined_access_setup_operation.h"
  9. #include "ash/components/phonehub/fake_message_receiver.h"
  10. #include "ash/components/phonehub/fake_multidevice_feature_access_manager.h"
  11. #include "ash/components/phonehub/proto/phonehub_api.pb.h"
  12. #include "ash/constants/ash_features.h"
  13. #include "base/test/scoped_feature_list.h"
  14. #include "base/test/task_environment.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. namespace ash {
  17. namespace phonehub {
  18. namespace {
  19. class FakeCombinedAccessSetupOperationDelegate
  20. : public CombinedAccessSetupOperation::Delegate {
  21. public:
  22. FakeCombinedAccessSetupOperationDelegate() = default;
  23. ~FakeCombinedAccessSetupOperationDelegate() override = default;
  24. CombinedAccessSetupOperation::Status status() const { return status_; }
  25. // CombinedAccessSetupOperation::Delegate:
  26. void OnCombinedStatusChange(
  27. CombinedAccessSetupOperation::Status new_status) override {
  28. status_ = new_status;
  29. }
  30. private:
  31. CombinedAccessSetupOperation::Status status_ =
  32. CombinedAccessSetupOperation::Status::kConnecting;
  33. };
  34. } // namespace
  35. class FeatureSetupResponseProcessorTest : public testing::Test {
  36. protected:
  37. FeatureSetupResponseProcessorTest() = default;
  38. FeatureSetupResponseProcessorTest(const FeatureSetupResponseProcessorTest&) =
  39. delete;
  40. FeatureSetupResponseProcessorTest& operator=(
  41. const FeatureSetupResponseProcessorTest&) = delete;
  42. ~FeatureSetupResponseProcessorTest() override = default;
  43. void SetUp() override {
  44. fake_message_receiver_ = std::make_unique<FakeMessageReceiver>();
  45. fake_multidevice_feature_access_manager_ =
  46. std::make_unique<FakeMultideviceFeatureAccessManager>();
  47. fake_multidevice_feature_access_manager_
  48. ->SetFeatureSetupRequestSupportedInternal(true);
  49. scoped_feature_list_.InitWithFeatures(
  50. /*enabled_features=*/{features::kEcheSWA, features::kPhoneHubCameraRoll,
  51. features::kPhoneHubFeatureSetupErrorHandling},
  52. /*disabled_features=*/{});
  53. }
  54. void CreateFeatureSetupResponseProcessor() {
  55. feature_setup_response_processor_ =
  56. std::make_unique<FeatureSetupResponseProcessor>(
  57. fake_message_receiver_.get(),
  58. fake_multidevice_feature_access_manager_.get());
  59. }
  60. CombinedAccessSetupOperation::Status GetCombinedSetupOperationStatus() {
  61. return fake_combined_delegate_.status();
  62. }
  63. base::test::ScopedFeatureList scoped_feature_list_;
  64. std::unique_ptr<FakeMessageReceiver> fake_message_receiver_;
  65. std::unique_ptr<FakeMultideviceFeatureAccessManager>
  66. fake_multidevice_feature_access_manager_;
  67. std::unique_ptr<FeatureSetupResponseProcessor>
  68. feature_setup_response_processor_;
  69. FakeCombinedAccessSetupOperationDelegate fake_combined_delegate_;
  70. };
  71. TEST_F(FeatureSetupResponseProcessorTest, ResponseReceived_All_Access_Granted) {
  72. auto operation =
  73. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  74. true, true, &fake_combined_delegate_);
  75. EXPECT_TRUE(operation);
  76. CreateFeatureSetupResponseProcessor();
  77. proto::FeatureSetupResponse setupResponse;
  78. setupResponse.set_camera_roll_setup_result(
  79. proto::FeatureSetupResult::RESULT_PERMISSION_GRANTED);
  80. setupResponse.set_notification_setup_result(
  81. proto::FeatureSetupResult::RESULT_PERMISSION_GRANTED);
  82. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  83. // Success cases should not be handled by this processor
  84. EXPECT_EQ(CombinedAccessSetupOperation::Status::kConnecting,
  85. GetCombinedSetupOperationStatus());
  86. EXPECT_TRUE(fake_multidevice_feature_access_manager_
  87. ->IsCombinedSetupOperationInProgress());
  88. }
  89. TEST_F(FeatureSetupResponseProcessorTest,
  90. ResponseReceived_All_Access_Declined) {
  91. auto operation =
  92. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  93. true, true, &fake_combined_delegate_);
  94. EXPECT_TRUE(operation);
  95. CreateFeatureSetupResponseProcessor();
  96. proto::FeatureSetupResponse setupResponse;
  97. setupResponse.set_camera_roll_setup_result(
  98. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  99. setupResponse.set_notification_setup_result(
  100. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  101. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  102. EXPECT_EQ(
  103. CombinedAccessSetupOperation::Status::kCompletedUserRejectedAllAccess,
  104. GetCombinedSetupOperationStatus());
  105. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  106. ->IsCombinedSetupOperationInProgress());
  107. }
  108. TEST_F(FeatureSetupResponseProcessorTest,
  109. ResponseReceived_All_Requested_Notification_Access_Decliend) {
  110. auto operation =
  111. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  112. true, true, &fake_combined_delegate_);
  113. EXPECT_TRUE(operation);
  114. CreateFeatureSetupResponseProcessor();
  115. proto::FeatureSetupResponse setupResponse;
  116. setupResponse.set_camera_roll_setup_result(
  117. proto::FeatureSetupResult::RESULT_PERMISSION_GRANTED);
  118. setupResponse.set_notification_setup_result(
  119. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  120. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  121. EXPECT_EQ(CombinedAccessSetupOperation::Status::
  122. kCameraRollGrantedNotificationRejected,
  123. GetCombinedSetupOperationStatus());
  124. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  125. ->IsCombinedSetupOperationInProgress());
  126. }
  127. TEST_F(FeatureSetupResponseProcessorTest,
  128. ResponseReceived_All_Requested_CameraRoll_Access_Decliend) {
  129. auto operation =
  130. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  131. true, true, &fake_combined_delegate_);
  132. EXPECT_TRUE(operation);
  133. CreateFeatureSetupResponseProcessor();
  134. proto::FeatureSetupResponse setupResponse;
  135. setupResponse.set_camera_roll_setup_result(
  136. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  137. setupResponse.set_notification_setup_result(
  138. proto::FeatureSetupResult::RESULT_PERMISSION_GRANTED);
  139. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  140. EXPECT_EQ(CombinedAccessSetupOperation::Status::
  141. kCameraRollRejectedNotificationGranted,
  142. GetCombinedSetupOperationStatus());
  143. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  144. ->IsCombinedSetupOperationInProgress());
  145. }
  146. TEST_F(FeatureSetupResponseProcessorTest,
  147. ResponseReceived_CameraRoll_Requested_Access_Decliend) {
  148. auto operation =
  149. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  150. true, false, &fake_combined_delegate_);
  151. EXPECT_TRUE(operation);
  152. CreateFeatureSetupResponseProcessor();
  153. proto::FeatureSetupResponse setupResponse;
  154. setupResponse.set_camera_roll_setup_result(
  155. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  156. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  157. EXPECT_EQ(
  158. CombinedAccessSetupOperation::Status::kCompletedUserRejectedAllAccess,
  159. GetCombinedSetupOperationStatus());
  160. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  161. ->IsCombinedSetupOperationInProgress());
  162. }
  163. TEST_F(FeatureSetupResponseProcessorTest,
  164. ResponseReceived_Notification_Requested_Access_Decliend) {
  165. auto operation =
  166. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  167. false, true, &fake_combined_delegate_);
  168. EXPECT_TRUE(operation);
  169. CreateFeatureSetupResponseProcessor();
  170. proto::FeatureSetupResponse setupResponse;
  171. setupResponse.set_notification_setup_result(
  172. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  173. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  174. EXPECT_EQ(
  175. CombinedAccessSetupOperation::Status::kCompletedUserRejectedAllAccess,
  176. GetCombinedSetupOperationStatus());
  177. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  178. ->IsCombinedSetupOperationInProgress());
  179. }
  180. TEST_F(FeatureSetupResponseProcessorTest,
  181. ResponseReceived_All_Requested_CameraRoll_Setup_Interrupted) {
  182. auto operation =
  183. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  184. true, true, &fake_combined_delegate_);
  185. EXPECT_TRUE(operation);
  186. CreateFeatureSetupResponseProcessor();
  187. proto::FeatureSetupResponse setupResponse;
  188. setupResponse.set_camera_roll_setup_result(
  189. proto::FeatureSetupResult::RESULT_ERROR_ACTION_CANCELED);
  190. setupResponse.set_notification_setup_result(
  191. proto::FeatureSetupResult::RESULT_ERROR_ACTION_CANCELED);
  192. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  193. EXPECT_EQ(CombinedAccessSetupOperation::Status::kOperationFailedOrCancelled,
  194. GetCombinedSetupOperationStatus());
  195. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  196. ->IsCombinedSetupOperationInProgress());
  197. }
  198. TEST_F(FeatureSetupResponseProcessorTest,
  199. ResponseReceived_All_Requested_Notification_Setup_Interrupted) {
  200. auto operation =
  201. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  202. true, true, &fake_combined_delegate_);
  203. EXPECT_TRUE(operation);
  204. CreateFeatureSetupResponseProcessor();
  205. proto::FeatureSetupResponse setupResponse;
  206. setupResponse.set_camera_roll_setup_result(
  207. proto::FeatureSetupResult::RESULT_PERMISSION_GRANTED);
  208. setupResponse.set_notification_setup_result(
  209. proto::FeatureSetupResult::RESULT_ERROR_ACTION_CANCELED);
  210. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  211. EXPECT_EQ(CombinedAccessSetupOperation::Status::kOperationFailedOrCancelled,
  212. GetCombinedSetupOperationStatus());
  213. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  214. ->IsCombinedSetupOperationInProgress());
  215. }
  216. TEST_F(FeatureSetupResponseProcessorTest,
  217. ResponseReceived_All_Requested_Notification_Setup_Timeout) {
  218. auto operation =
  219. fake_multidevice_feature_access_manager_->AttemptCombinedFeatureSetup(
  220. true, true, &fake_combined_delegate_);
  221. EXPECT_TRUE(operation);
  222. CreateFeatureSetupResponseProcessor();
  223. proto::FeatureSetupResponse setupResponse;
  224. setupResponse.set_camera_roll_setup_result(
  225. proto::FeatureSetupResult::RESULT_ERROR_USER_REJECT);
  226. setupResponse.set_notification_setup_result(
  227. proto::FeatureSetupResult::RESULT_ERROR_ACTION_TIMEOUT);
  228. fake_message_receiver_->NotifyFeatureSetupResponseReceived(setupResponse);
  229. EXPECT_EQ(CombinedAccessSetupOperation::Status::kOperationFailedOrCancelled,
  230. GetCombinedSetupOperationStatus());
  231. EXPECT_FALSE(fake_multidevice_feature_access_manager_
  232. ->IsCombinedSetupOperationInProgress());
  233. }
  234. } // namespace phonehub
  235. } // namespace ash