blob: e0678773c8b7b02003905b99e8fc6e482cf6de33 [file] [log] [blame]
// Copyright 2017 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 <stdio.h>
#include "base/macros.h"
#include "base/run_loop.h"
#include "build/build_config.h"
#include "chrome/browser/sync/test/integration/printers_helper.h"
#include "chrome/browser/sync/test/integration/sync_test.h"
#include "content/public/test/test_utils.h"
namespace {
using printers_helper::AddPrinter;
using printers_helper::AllProfilesContainSamePrinters;
using printers_helper::EditPrinterDescription;
using printers_helper::CreateTestPrinter;
using printers_helper::GetPrinterCount;
using printers_helper::GetPrinterStore;
using printers_helper::PrintersMatchChecker;
using printers_helper::RemovePrinter;
class TwoClientPrintersSyncTest : public SyncTest {
public:
TwoClientPrintersSyncTest() : SyncTest(TWO_CLIENT) {}
~TwoClientPrintersSyncTest() override {}
private:
DISALLOW_COPY_AND_ASSIGN(TwoClientPrintersSyncTest);
};
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, NoPrinters) {
ASSERT_TRUE(SetupSync());
ASSERT_TRUE(PrintersMatchChecker().Wait());
}
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, OnePrinter) {
ASSERT_TRUE(SetupSync());
AddPrinter(GetPrinterStore(0), CreateTestPrinter(2));
ASSERT_TRUE(PrintersMatchChecker().Wait());
}
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, SimultaneousAdd) {
ASSERT_TRUE(SetupSync());
AddPrinter(GetPrinterStore(0), CreateTestPrinter(1));
AddPrinter(GetPrinterStore(1), CreateTestPrinter(2));
// Each store is guaranteed to have 1 printer because the tests run on the UI
// thread. ApplySyncChanges happens after we wait on the checker.
ASSERT_EQ(1, GetPrinterCount(0));
ASSERT_EQ(1, GetPrinterCount(1));
ASSERT_TRUE(PrintersMatchChecker().Wait());
EXPECT_EQ(2, GetPrinterCount(0));
}
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, RemovePrinter) {
ASSERT_TRUE(SetupSync());
AddPrinter(GetPrinterStore(0), CreateTestPrinter(1));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(2));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(3));
// Verify the profiles have the same printers
ASSERT_TRUE(PrintersMatchChecker().Wait());
EXPECT_EQ(3, GetPrinterCount(0));
// Remove printer 2 from store 1
RemovePrinter(GetPrinterStore(1), 2);
ASSERT_TRUE(PrintersMatchChecker().Wait());
EXPECT_EQ(2, GetPrinterCount(0));
}
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, RemoveAndEditPrinters) {
const std::string updated_description = "Testing changes";
ASSERT_TRUE(SetupSync());
AddPrinter(GetPrinterStore(0), CreateTestPrinter(1));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(2));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(3));
// Verify the profiles have the same printers
ASSERT_TRUE(PrintersMatchChecker().Wait());
EXPECT_EQ(3, GetPrinterCount(0));
// Edit printer 1 from store 0
ASSERT_TRUE(
EditPrinterDescription(GetPrinterStore(0), 1, updated_description));
// Remove printer 2 from store 1
RemovePrinter(GetPrinterStore(1), 2);
ASSERT_TRUE(PrintersMatchChecker().Wait());
EXPECT_EQ(2, GetPrinterCount(0));
EXPECT_EQ(updated_description,
GetPrinterStore(1)->GetConfiguredPrinters()[0].description());
}
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, ConflictResolution) {
ASSERT_TRUE(SetupSync());
AddPrinter(GetPrinterStore(0), CreateTestPrinter(0));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(2));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(3));
// Store 0 and 1 have 3 printers now.
ASSERT_TRUE(PrintersMatchChecker().Wait());
std::string overwritten_message = "I should not show up";
ASSERT_TRUE(
EditPrinterDescription(GetPrinterStore(1), 0, overwritten_message));
// Wait for a non-zero period (200ms).
base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
std::string valid_message = "YAY! More recent changes win!";
ASSERT_TRUE(EditPrinterDescription(GetPrinterStore(0), 0, valid_message));
// Run all pending tasks and wait until all clients have the same
// configuration.
content::RunAllTasksUntilIdle();
ASSERT_TRUE(PrintersMatchChecker().Wait());
// The more recent update should win.
EXPECT_EQ(valid_message,
GetPrinterStore(1)->GetConfiguredPrinters()[0].description());
}
IN_PROC_BROWSER_TEST_F(TwoClientPrintersSyncTest, SimpleMerge) {
ASSERT_TRUE(SetupClients());
base::RunLoop().RunUntilIdle();
// Store 0 has the even printers
AddPrinter(GetPrinterStore(0), CreateTestPrinter(0));
AddPrinter(GetPrinterStore(0), CreateTestPrinter(2));
// Store 1 has the odd printers
AddPrinter(GetPrinterStore(1), CreateTestPrinter(1));
AddPrinter(GetPrinterStore(1), CreateTestPrinter(3));
ASSERT_TRUE(SetupSync());
// Stores should contain the same values now.
EXPECT_EQ(4, GetPrinterCount(0));
EXPECT_TRUE(AllProfilesContainSamePrinters());
}
} // namespace