| Index: chrome/browser/sync/js/js_mutation_event_observer_unittest.cc
|
| diff --git a/chrome/browser/sync/js/js_mutation_event_observer_unittest.cc b/chrome/browser/sync/js/js_mutation_event_observer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4a211f3dadeeed4986e5145a757b2d8104acfd93
|
| --- /dev/null
|
| +++ b/chrome/browser/sync/js/js_mutation_event_observer_unittest.cc
|
| @@ -0,0 +1,127 @@
|
| +// Copyright (c) 2011 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 "chrome/browser/sync/js/js_mutation_event_observer.h"
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/sync/js/js_event_details.h"
|
| +#include "chrome/browser/sync/js/js_test_util.h"
|
| +#include "chrome/browser/sync/syncable/model_type.h"
|
| +#include "chrome/browser/sync/util/weak_handle.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace browser_sync {
|
| +namespace {
|
| +
|
| +using ::testing::InSequence;
|
| +using ::testing::StrictMock;
|
| +
|
| +class JsMutationEventObserverTest : public testing::Test {
|
| + protected:
|
| + JsMutationEventObserverTest() {
|
| + js_mutation_event_observer_.SetJsEventHandler(
|
| + mock_js_event_handler_.AsWeakHandle());
|
| + }
|
| +
|
| + private:
|
| + // This must be destroyed after the member variables below in order
|
| + // for WeakHandles to be destroyed properly.
|
| + MessageLoop message_loop_;
|
| +
|
| + protected:
|
| + StrictMock<MockJsEventHandler> mock_js_event_handler_;
|
| + JsMutationEventObserver js_mutation_event_observer_;
|
| +
|
| + void PumpLoop() {
|
| + message_loop_.RunAllPending();
|
| + }
|
| +};
|
| +
|
| +TEST_F(JsMutationEventObserverTest, OnChangesApplied) {
|
| + InSequence dummy;
|
| +
|
| + // We don't test with passwords as that requires additional setup.
|
| +
|
| + // Build a list of example ChangeRecords.
|
| + sync_api::ChangeRecord changes[syncable::MODEL_TYPE_COUNT];
|
| + for (int i = syncable::AUTOFILL_PROFILE;
|
| + i < syncable::MODEL_TYPE_COUNT; ++i) {
|
| + changes[i].id = i;
|
| + switch (i % 3) {
|
| + case 0:
|
| + changes[i].action =
|
| + sync_api::ChangeRecord::ACTION_ADD;
|
| + break;
|
| + case 1:
|
| + changes[i].action =
|
| + sync_api::ChangeRecord::ACTION_UPDATE;
|
| + break;
|
| + default:
|
| + changes[i].action =
|
| + sync_api::ChangeRecord::ACTION_DELETE;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // For each i, we call OnChangesApplied() with the first arg equal
|
| + // to i cast to ModelType and the second argument with the changes
|
| + // starting from changes[i].
|
| +
|
| + // Set expectations for each data type.
|
| + for (int i = syncable::AUTOFILL_PROFILE;
|
| + i < syncable::MODEL_TYPE_COUNT; ++i) {
|
| + const std::string& model_type_str =
|
| + syncable::ModelTypeToString(syncable::ModelTypeFromInt(i));
|
| + DictionaryValue expected_details;
|
| + expected_details.SetString("modelType", model_type_str);
|
| + expected_details.SetString("writeTransactionId", "0");
|
| + ListValue* expected_changes = new ListValue();
|
| + expected_details.Set("changes", expected_changes);
|
| + for (int j = i; j < syncable::MODEL_TYPE_COUNT; ++j) {
|
| + expected_changes->Append(changes[j].ToValue());
|
| + }
|
| + EXPECT_CALL(mock_js_event_handler_,
|
| + HandleJsEvent("onChangesApplied",
|
| + HasDetailsAsDictionary(expected_details)));
|
| + }
|
| +
|
| + // Fire OnChangesApplied() for each data type.
|
| + for (int i = syncable::AUTOFILL_PROFILE;
|
| + i < syncable::MODEL_TYPE_COUNT; ++i) {
|
| + sync_api::ChangeRecordList
|
| + local_changes(changes + i, changes + arraysize(changes));
|
| + js_mutation_event_observer_.OnChangesApplied(
|
| + syncable::ModelTypeFromInt(i),
|
| + 0, sync_api::ImmutableChangeRecordList(&local_changes));
|
| + }
|
| +
|
| + PumpLoop();
|
| +}
|
| +
|
| +TEST_F(JsMutationEventObserverTest, OnChangesComplete) {
|
| + InSequence dummy;
|
| +
|
| + for (int i = syncable::FIRST_REAL_MODEL_TYPE;
|
| + i < syncable::MODEL_TYPE_COUNT; ++i) {
|
| + DictionaryValue expected_details;
|
| + expected_details.SetString(
|
| + "modelType",
|
| + syncable::ModelTypeToString(syncable::ModelTypeFromInt(i)));
|
| + EXPECT_CALL(mock_js_event_handler_,
|
| + HandleJsEvent("onChangesComplete",
|
| + HasDetailsAsDictionary(expected_details)));
|
| + }
|
| +
|
| + for (int i = syncable::FIRST_REAL_MODEL_TYPE;
|
| + i < syncable::MODEL_TYPE_COUNT; ++i) {
|
| + js_mutation_event_observer_.OnChangesComplete(
|
| + syncable::ModelTypeFromInt(i));
|
| + }
|
| + PumpLoop();
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace browser_sync
|
|
|