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