15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/js_mutation_event_observer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/weak_handle.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_event_details.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_test_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JsMutationEventObserverTest : public testing::Test { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JsMutationEventObserverTest() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_mutation_event_observer_.SetJsEventHandler( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_js_event_handler_.AsWeakHandle()); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be destroyed after the member variables below in order 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for WeakHandles to be destroyed properly. 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop message_loop_; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockJsEventHandler> mock_js_event_handler_; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JsMutationEventObserver js_mutation_event_observer_; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PumpLoop() { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JsMutationEventObserverTest, OnChangesApplied) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence dummy; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't test with passwords as that requires additional setup. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build a list of example ChangeRecords. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeRecord changes[MODEL_TYPE_COUNT]; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = AUTOFILL_PROFILE; i < MODEL_TYPE_COUNT; ++i) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes[i].id = i; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (i % 3) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes[i].action = ChangeRecord::ACTION_ADD; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes[i].action = ChangeRecord::ACTION_UPDATE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes[i].action = ChangeRecord::ACTION_DELETE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For each i, we call OnChangesApplied() with the first arg equal 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to i cast to ModelType and the second argument with the changes 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting from changes[i]. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set expectations for each data type. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = AUTOFILL_PROFILE; i < MODEL_TYPE_COUNT; ++i) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& model_type_str = 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeToString(ModelTypeFromInt(i)); 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue expected_details; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_details.SetString("modelType", model_type_str); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_details.SetString("writeTransactionId", "0"); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ListValue* expected_changes = new base::ListValue(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_details.Set("changes", expected_changes); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = i; j < MODEL_TYPE_COUNT; ++j) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_changes->Append(changes[j].ToValue()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_js_event_handler_, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleJsEvent("onChangesApplied", 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasDetailsAsDictionary(expected_details))); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire OnChangesApplied() for each data type. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = AUTOFILL_PROFILE; i < MODEL_TYPE_COUNT; ++i) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeRecordList local_changes(changes + i, changes + arraysize(changes)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_mutation_event_observer_.OnChangesApplied( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeFromInt(i), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, ImmutableChangeRecordList(&local_changes)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JsMutationEventObserverTest, OnChangesComplete) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence dummy; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue expected_details; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_details.SetString( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "modelType", 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeToString(ModelTypeFromInt(i))); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_js_event_handler_, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleJsEvent("onChangesComplete", 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasDetailsAsDictionary(expected_details))); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) js_mutation_event_observer_.OnChangesComplete( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeFromInt(i)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 119