Index: chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_device_manager_unittest.cc |
diff --git a/chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_device_manager_unittest.cc b/chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_device_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cace8e624420bfb02ba2753f3fa793bddb449320 |
--- /dev/null |
+++ b/chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_device_manager_unittest.cc |
@@ -0,0 +1,367 @@ |
+// Copyright 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/stringprintf.h" |
+#include "chrome/common/cloud_print/test_cloud_print_utils.h" |
+#include "chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_device_manager.h" |
+#include "chrome/browser/chrome_to_mobile/receive/testing_chrome_to_mobile_receive.h" |
+ |
+using namespace chrome_to_mobile_receive; |
+using namespace cloud_print; |
+ |
+namespace { |
+ |
+const std::string kTestValidListResponseData = std::string( |
+ "{" |
+ " \"success\": true," |
+ " \"printers\": [{" |
+ " \"id\": \"5249\"," |
+ " \"name\": \"iPhone Sim\"," |
+ " \"description\": \"iPhone Sim\"," |
+ " \"proxy\": \"Chr918A-1302D05D3\"," |
+ " \"status\": \"\"," |
+ " \"capsHash\": \"07d2d8f876156f15adbb98076\"," |
+ " \"createTime\": \"134175880454\"," |
+ " \"updateTime\": \"13175880454\"," |
+ " \"accessTime\": \"114175880454\"," |
+ " \"numberOfDocuments\": \"0\"," |
+ " \"numberOfPages\": \"0\"," |
+ " \"tags\": [" |
+ " \"__apns__device_token=7266850dc29a5b65d55e\"," |
+ " \"__apns__package=test.test.test\"," |
+ " \"__apns__tagshash=b23d5ccd911d14d273c57f8d2a24\"," |
+ " \"^own\"" |
+ " ]" |
+ " }]" |
+ "}" |
+); |
+ |
+const std::string kTestValidListMultResponseData = std::string( |
+ "{" |
+ " \"success\": true," |
+ " \"printers\": [" |
+ " {" |
+ " \"id\": \"5249\"," |
+ " \"name\": \"iPhone Sim\"," |
+ " \"description\": \"iPhone Sim\"," |
+ " \"proxy\": \"Chr918A-1302D05D3\"," |
+ " \"status\": \"\"," |
+ " \"capsHash\": \"07d2d8f876156f15adbb98076\"," |
+ " \"createTime\": \"134175880454\"," |
+ " \"updateTime\": \"13175880454\"," |
+ " \"accessTime\": \"114175880454\"," |
+ " \"numberOfDocuments\": \"0\"," |
+ " \"numberOfPages\": \"0\"," |
+ " \"tags\": [" |
+ " \"__apns__device_token=7266850dc29a5b65d55e\"," |
+ " \"__apns__package=test.test.test\"," |
+ " \"__apns__tagshash=b23d5ccd911d14d273c57f8d2a24\"," |
+ " \"^own\"" |
+ " ]" |
+ " }, " |
+ " {" |
+ " \"id\": \"58888888249\"," |
+ " \"name\": \"iPhone Sim\"," |
+ " \"description\": \"iPhone Sim\"," |
+ " \"proxy\": \"Chr918A-1302D05D3\"," |
+ " \"status\": \"\"," |
+ " \"capsHash\": \"07d2d8f876156f15adbb98076\"," |
+ " \"createTime\": \"134175880454\"," |
+ " \"updateTime\": \"13175880454\"," |
+ " \"accessTime\": \"114175880454\"," |
+ " \"numberOfDocuments\": \"0\"," |
+ " \"numberOfPages\": \"0\"," |
+ " \"tags\": [" |
+ " \"__apns__device_token=7266850dc29a5b65d55e\"," |
+ " \"__apns__package=test.test.test\"," |
+ " \"__apns__tagshash=b23d5ccd911d14d273c57f8d2a24\"," |
+ " \"^own\"" |
+ " ]" |
+ " }" |
+ "]" |
+ "}" |
+); |
+ |
+class MockDeviceManagerDelegate |
+ : public ChromeToMobileReceiveDeviceManager::Delegate { |
+ public: |
+ MockDeviceManagerDelegate(); |
+ virtual ~MockDeviceManagerDelegate(); |
+ virtual void OnStartDeviceComplete( |
+ ChromeToMobileReceiveDeviceManager* source) OVERRIDE; |
+ |
+ bool IsSuccess() const; |
+ std::string GetPrinterId() const; |
+ bool HasCompleted() const; |
+ |
+ private: |
+ bool success_; |
+ std::string printer_id_; |
+ bool has_completed_; |
+}; |
+ |
+MockDeviceManagerDelegate::MockDeviceManagerDelegate() |
+ : success_(false), printer_id_(std::string()), has_completed_(false) { |
+} |
+ |
+MockDeviceManagerDelegate::~MockDeviceManagerDelegate() { |
+} |
+ |
+void MockDeviceManagerDelegate::OnStartDeviceComplete( |
+ ChromeToMobileReceiveDeviceManager* source) { |
+ success_ = source->IsSuccess(); |
+ printer_id_ = source->GetStartedPrinterId(); |
+ has_completed_ = true; |
+} |
+ |
+bool MockDeviceManagerDelegate::IsSuccess() const { |
+ return success_; |
+} |
+ |
+std::string MockDeviceManagerDelegate::GetPrinterId() const { |
+ return printer_id_; |
+} |
+ |
+bool MockDeviceManagerDelegate::HasCompleted() const { |
+ return has_completed_; |
+} |
+ |
+} // namespace |
+ |
+class ChromeToMobileReceiveDeviceManagerTest : |
+ public ChromeToMobileReceiveTest { |
+ public: |
+ ChromeToMobileReceiveDeviceManagerTest(); |
+ virtual ~ChromeToMobileReceiveDeviceManagerTest(); |
+ |
+ virtual void SetUp() OVERRIDE; |
+ void ResetManagerAndStart(const std::string& existing_printer_id); |
+ |
+ scoped_ptr<ChromeToMobileReceiveDeviceManager> manager_; |
+ scoped_ptr<MockDeviceManagerDelegate> delegate_; |
+}; |
+ |
+ChromeToMobileReceiveDeviceManagerTest |
+ ::ChromeToMobileReceiveDeviceManagerTest() { |
+} |
+ |
+ChromeToMobileReceiveDeviceManagerTest |
+ ::~ChromeToMobileReceiveDeviceManagerTest() { |
+} |
+ |
+void ChromeToMobileReceiveDeviceManagerTest::SetUp() { |
+ ChromeToMobileReceiveTest::SetUp(); |
+ delegate_.reset(new MockDeviceManagerDelegate()); |
+} |
+ |
+void ChromeToMobileReceiveDeviceManagerTest::ResetManagerAndStart( |
+ const std::string& existing_printer_id) { |
+ std::map<std::string, std::string> test_printer_tags; |
+ test_printer_tags[std::string("tag1")] = std::string("value of tag1"); |
+ test_printer_tags[std::string("tag2")] = std::string("value of tag2"); |
+ manager_.reset(ChromeToMobileReceiveDeviceManager::CreateAndStart( |
+ cloud_print_server_url_, |
+ existing_printer_id, |
+ test_printer_tags, |
+ settings_, |
+ delegate_.get())); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ NoExistingPrinterNoSuccessfulPrintRegisteration) { |
+ ResetManagerAndStart(std::string()); |
+ EXPECT_TRUE( |
+ factory_.GetPendingRequests().size() == 1 && |
+ factory_.GetPendingRequestsAtPath("/list").size() == 1) |
+ << "The first request should list all the relevant printers."; |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, true); |
+ EXPECT_TRUE( |
+ factory_.GetPendingRequests().size() == 1 && |
+ factory_.GetPendingRequestsAtPath("/register").size() == 1) |
+ << "A new printer should be registered as there is no existing one."; |
+ |
+ // An empty registration response. |
+ factory_.CompleteRequestAtPath("/register", 0, true); |
+ |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_FALSE(delegate_->IsSuccess()); |
+ EXPECT_TRUE(delegate_->GetPrinterId().empty()); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ InvalidExistingPrinterNoSuccessfulPrinterRegisteration) { |
+ ResetManagerAndStart(std::string("printer id")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, true); |
+ EXPECT_TRUE(factory_.GetPendingRequests().size() == 2); |
+ EXPECT_EQ(1U, factory_.GetPendingRequestsAtPath("/delete").size()) |
+ << "The existing printer should be deleted."; |
+ EXPECT_EQ( |
+ 1U, factory_.GetPendingRequestsAtPath("/register").size()) |
+ << "A new printer should be registered."; |
+ |
+ factory_.CompleteRequestAtPath("/register", 0, true); |
+ factory_.CompleteRequestAtPath("/delete", 0, true); |
+ |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_FALSE(delegate_->IsSuccess()); |
+ EXPECT_TRUE(delegate_->GetPrinterId().empty()); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ InvalidExistingPrinterSuccessfulPrinterRegisteration) { |
+ ResetManagerAndStart(std::string("printer id")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, true); |
+ EXPECT_TRUE(factory_.GetPendingRequests().size() == 2); |
+ EXPECT_EQ(1U, factory_.GetPendingRequestsAtPath("/delete").size()) |
+ << "The existing printer should be deleted."; |
+ EXPECT_EQ( |
+ 1U, factory_.GetPendingRequestsAtPath("/register").size()) |
+ << "A new printer should be registered."; |
+ |
+ factory_.CompleteRequestAtPath("/register", 0, |
+ GenerateRegistrationResponse(true, "51249"), std::string(), true, false, |
+ false); |
+ factory_.CompleteRequestAtPath("/delete", 0, true); |
+ |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_TRUE(delegate_->IsSuccess()); |
+ EXPECT_TRUE(delegate_->GetPrinterId().compare("51249") == 0); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ ValidExistingPrinterSuccessfulPrinterUpdate) { |
+ ResetManagerAndStart(std::string("5249")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, |
+ kTestValidListResponseData, std::string(), true, false, false); |
+ EXPECT_TRUE( |
+ factory_.GetPendingRequests().size() == 1 && |
+ factory_.GetPendingRequestsAtPath("/update").size() == 1) |
+ << "The existing printer is valid and should be updated"; |
+ |
+ factory_.CompleteRequestAtPath("/update", 0, true); |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_TRUE(delegate_->IsSuccess()); |
+ EXPECT_TRUE(delegate_->GetPrinterId().compare("5249") == 0); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ ValidExistingPrinterFailToUpdateSuccessfulRegistration) { |
+ ResetManagerAndStart(std::string("5249")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, |
+ kTestValidListResponseData, std::string(), true, false, false); |
+ EXPECT_TRUE( |
+ factory_.GetPendingRequests().size() == 1 && |
+ factory_.GetPendingRequestsAtPath("/update").size() == 1) |
+ << "The existing printer is valid and should be updated"; |
+ |
+ factory_.CompleteRequestAtPath("/update", 0, false); |
+ EXPECT_EQ(2U, factory_.GetPendingRequests().size()); |
+ EXPECT_EQ(1U, factory_.GetPendingRequestsAtPath("/delete").size()) |
+ << "Fail to update the existing printer and it should be deleted."; |
+ EXPECT_EQ(1U, |
+ factory_.GetPendingRequestsAtPath("/register").size()) |
+ << "A new printer should be registered as there exists no valid one."; |
+ EXPECT_FALSE(delegate_->HasCompleted()); |
+ |
+ factory_.CompleteRequestAtPath("/register", 0, |
+ GenerateRegistrationResponse(true, "51249"), std::string(), true, false, |
+ false); |
+ factory_.CompleteRequestAtPath("/delete", 0, false); |
+ |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_TRUE(delegate_->IsSuccess()); |
+ EXPECT_TRUE(delegate_->GetPrinterId().compare("51249") == 0); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ ValidExistingPrinterFailToUpdateFailToRegistration) { |
+ ResetManagerAndStart(std::string("5249")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, |
+ kTestValidListResponseData, std::string(), true, false, false); |
+ EXPECT_TRUE( |
+ factory_.GetPendingRequests().size() == 1 && |
+ factory_.GetPendingRequestsAtPath("/update").size() == 1) |
+ << "The existing printer is valid and should be updated"; |
+ |
+ factory_.CompleteRequestAtPath("/update", 0, false); |
+ EXPECT_TRUE(factory_.GetPendingRequests().size() == 2); |
+ EXPECT_EQ(1U, factory_.GetPendingRequestsAtPath("/delete").size()) |
+ << "Fail to update the existing one; it should be deleted"; |
+ EXPECT_EQ( |
+ 1U, factory_.GetPendingRequestsAtPath("/register").size()) |
+ << "A new printer should be registered due to update failure."; |
+ EXPECT_FALSE(delegate_->HasCompleted()); |
+ |
+ factory_.CompleteRequestAtPath("/register", 0, false); |
+ factory_.CompleteRequestAtPath("/delete", 0, false); |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_FALSE(delegate_->IsSuccess()); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, |
+ ValidExistingPrinterMulitpleListPrintersUpdateFailure) { |
+ ResetManagerAndStart(std::string("5249")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, |
+ kTestValidListMultResponseData, std::string(), true, false, false); |
+ EXPECT_EQ(2U, factory_.GetPendingRequests().size()); |
+ EXPECT_EQ(1U, factory_.GetPendingRequestsAtPath("/update").size()) |
+ << "The existing printer is valid and should be updated"; |
+ EXPECT_EQ(1U, factory_.GetPendingRequestsAtPath("/delete").size()) |
+ << "The unexpected printer should be deleted"; |
+ |
+ factory_.CompleteRequestAtPath("/update", 0, false); |
+ EXPECT_TRUE(factory_.GetPendingRequests().size() == 3); |
+ EXPECT_EQ(2U, factory_.GetPendingRequestsAtPath("/delete").size()) |
+ << "Fail to update the existing one; it should be deleted"; |
+ EXPECT_EQ( |
+ 1U, factory_.GetPendingRequestsAtPath("/register").size()) |
+ << "A new printer should be registered due to update failure."; |
+ EXPECT_FALSE(delegate_->HasCompleted()); |
+ |
+ factory_.CompleteRequestAtPath("/register", 0, false); |
+ factory_.CompleteRequestAtPath("/delete", 0, true); |
+ EXPECT_FALSE(delegate_->HasCompleted()) |
+ << "Needs to wait for all deletion to complete"; |
+ factory_.CompleteRequestAtPath("/delete", 0, true); |
+ |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_FALSE(delegate_->IsSuccess()); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, AuthFail) { |
+ ResetManagerAndStart(std::string("5249")); |
+ |
+ factory_.CompleteRequestAtPath("/list", 0, |
+ kTestValidListResponseData, std::string(), true, false, true); |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_FALSE(delegate_->IsSuccess()); |
+} |
+ |
+TEST_F(ChromeToMobileReceiveDeviceManagerTest, DeletedWhenStarting) { |
+ ResetManagerAndStart(std::string("5249")); |
+ factory_.CompleteRequestAtPath("/list", 0, |
+ kTestValidListMultResponseData, std::string(), true, false, false); |
+ factory_.CompleteRequestAtPath("/update", 0, false); |
+ |
+ manager_.reset(); |
+ EXPECT_EQ(0U, factory_.GetPendingRequests().size()); |
+ EXPECT_TRUE(delegate_->HasCompleted()); |
+ EXPECT_FALSE(delegate_->IsSuccess()); |
+} |