1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/feedback/feedback_uploader.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <set> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/stl_util.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/feedback/feedback_uploader_chrome.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/feedback/feedback_uploader_factory.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/user_prefs/user_prefs.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/test/test_browser_context.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kReportOne[] = "one"; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kReportTwo[] = "two"; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kReportThree[] = "three"; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kReportFour[] = "four"; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kReportFive[] = "five"; 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::TimeDelta kRetryDelayForTest = 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta::FromMilliseconds(100); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* CreateFeedbackUploaderService(content::BrowserContext* context) { 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return new feedback::FeedbackUploaderChrome(context); 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace feedback { 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FeedbackUploaderTest : public testing::Test { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FeedbackUploaderTest() 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : ui_thread_(content::BrowserThread::UI, &message_loop_), 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context_(new content::TestBrowserContext()), 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prefs_(new TestingPrefServiceSimple()), 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatched_reports_count_(0), 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_reports_(0) { 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) user_prefs::UserPrefs::Set(context_.get(), prefs_.get()); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FeedbackUploaderFactory::GetInstance()->SetTestingFactory( 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context_.get(), &CreateFeedbackUploaderService); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uploader_ = FeedbackUploaderFactory::GetForBrowserContext(context_.get()); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uploader_->setup_for_test( 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&FeedbackUploaderTest::MockDispatchReport, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this)), 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kRetryDelayForTest); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~FeedbackUploaderTest() { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FeedbackUploaderFactory::GetInstance()->SetTestingFactory( 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context_.get(), NULL); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void QueueReport(const std::string& data) { 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uploader_->QueueReport(data); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ReportFailure(const std::string& data) { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uploader_->RetryReport(data); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void MockDispatchReport(const std::string& report_data) { 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ContainsKey(dispatched_reports_, report_data)) { 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatched_reports_[report_data]++; 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatched_reports_[report_data] = 1; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatched_reports_count_++; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dispatch will always update the timer, whether successful or not, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // simulate the same behavior. 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uploader_->UpdateUploadTimer(); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ProcessingComplete()) { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (run_loop_.get()) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop_->Quit(); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ProcessingComplete() { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (dispatched_reports_count_ >= expected_reports_); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RunMessageLoop() { 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ProcessingComplete()) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop_.reset(new base::RunLoop()); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop_->Run(); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop message_loop_; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> run_loop_; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::TestBrowserThread ui_thread_; 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<content::TestBrowserContext> context_; 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<PrefService> prefs_; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FeedbackUploader* uploader_; 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<std::string, unsigned int> dispatched_reports_; 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t dispatched_reports_count_; 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t expected_reports_; 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_LINUX) || defined(OS_MACOSX) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_QueueMultiple QueueMultiple 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// crbug.com/330547 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_QueueMultiple DISABLED_QueueMultiple 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(FeedbackUploaderTest, MAYBE_QueueMultiple) { 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatched_reports_.clear(); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportOne); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportTwo); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportThree); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportFour); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_.size(), 4u); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportOne], 1u); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportTwo], 1u); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportThree], 1u); 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportFour], 1u); 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_ANDROID) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// crbug.com/330547 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_QueueMultipleWithFailures DISABLED_QueueMultipleWithFailures 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MAYBE_QueueMultipleWithFailures QueueMultipleWithFailures 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(FeedbackUploaderTest, MAYBE_QueueMultipleWithFailures) { 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatched_reports_.clear(); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportOne); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportTwo); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportThree); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportFour); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReportFailure(kReportThree); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReportFailure(kReportTwo); 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QueueReport(kReportFive); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_reports_ = 7; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunMessageLoop(); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_.size(), 5u); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportOne], 1u); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportTwo], 2u); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportThree], 2u); 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportFour], 1u); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dispatched_reports_[kReportFive], 1u); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace feedback 165