| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "base/stl_util-inl.h" | 9 #include "base/stl_util-inl.h" |
| 10 #include "base/string_piece.h" | 10 #include "base/string_piece.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 service_->RegisterDataTypeController( | 88 service_->RegisterDataTypeController( |
| 89 new PreferenceDataTypeController(&factory_, | 89 new PreferenceDataTypeController(&factory_, |
| 90 service_.get())); | 90 service_.get())); |
| 91 profile_->GetTokenService()->IssueAuthTokenForTest( | 91 profile_->GetTokenService()->IssueAuthTokenForTest( |
| 92 GaiaConstants::kSyncService, "token"); | 92 GaiaConstants::kSyncService, "token"); |
| 93 service_->Initialize(); | 93 service_->Initialize(); |
| 94 MessageLoop::current()->Run(); | 94 MessageLoop::current()->Run(); |
| 95 return true; | 95 return true; |
| 96 } | 96 } |
| 97 | 97 |
| 98 SyncBackendHost* backend() { return service_->backend_.get(); } | |
| 99 | |
| 100 const Value& GetPreferenceValue(const std::string& name) { | 98 const Value& GetPreferenceValue(const std::string& name) { |
| 101 const PrefService::Preference* preference = | 99 const PrefService::Preference* preference = |
| 102 prefs_->FindPreference(name.c_str()); | 100 prefs_->FindPreference(name.c_str()); |
| 103 return *preference->GetValue(); | 101 return *preference->GetValue(); |
| 104 } | 102 } |
| 105 | 103 |
| 106 // Caller gets ownership of the returned value. | 104 // Caller gets ownership of the returned value. |
| 107 const Value* GetSyncedValue(const std::string& name) { | 105 const Value* GetSyncedValue(const std::string& name) { |
| 108 sync_api::ReadTransaction trans(service_->backend()->GetUserShareHandle()); | 106 sync_api::ReadTransaction trans(service_->GetUserShare()); |
| 109 sync_api::ReadNode node(&trans); | 107 sync_api::ReadNode node(&trans); |
| 110 | 108 |
| 111 int64 node_id = model_associator_->GetSyncIdFromChromeId(name); | 109 int64 node_id = model_associator_->GetSyncIdFromChromeId(name); |
| 112 if (node_id == sync_api::kInvalidId) | 110 if (node_id == sync_api::kInvalidId) |
| 113 return NULL; | 111 return NULL; |
| 114 if (!node.InitByIdLookup(node_id)) | 112 if (!node.InitByIdLookup(node_id)) |
| 115 return NULL; | 113 return NULL; |
| 116 | 114 |
| 117 const sync_pb::PreferenceSpecifics& specifics( | 115 const sync_pb::PreferenceSpecifics& specifics( |
| 118 node.GetPreferenceSpecifics()); | 116 node.GetPreferenceSpecifics()); |
| 119 | 117 |
| 120 JSONReader reader; | 118 JSONReader reader; |
| 121 return reader.JsonToValue(specifics.value(), false, false); | 119 return reader.JsonToValue(specifics.value(), false, false); |
| 122 } | 120 } |
| 123 | 121 |
| 124 int64 WriteSyncedValue(sync_api::WriteNode& node, | 122 int64 WriteSyncedValue(sync_api::WriteNode& node, |
| 125 const std::string& name, | 123 const std::string& name, |
| 126 const Value& value) { | 124 const Value& value) { |
| 127 if (!PreferenceModelAssociator::WritePreferenceToNode(name, value, &node)) | 125 if (!PreferenceModelAssociator::WritePreferenceToNode(name, value, &node)) |
| 128 return sync_api::kInvalidId; | 126 return sync_api::kInvalidId; |
| 129 return node.GetId(); | 127 return node.GetId(); |
| 130 } | 128 } |
| 131 | 129 |
| 132 int64 SetSyncedValue(const std::string& name, const Value& value) { | 130 int64 SetSyncedValue(const std::string& name, const Value& value) { |
| 133 sync_api::WriteTransaction trans(backend()->GetUserShareHandle()); | 131 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 134 sync_api::ReadNode root(&trans); | 132 sync_api::ReadNode root(&trans); |
| 135 if (!root.InitByTagLookup(browser_sync::kPreferencesTag)) | 133 if (!root.InitByTagLookup(browser_sync::kPreferencesTag)) |
| 136 return sync_api::kInvalidId; | 134 return sync_api::kInvalidId; |
| 137 | 135 |
| 138 sync_api::WriteNode tag_node(&trans); | 136 sync_api::WriteNode tag_node(&trans); |
| 139 sync_api::WriteNode node(&trans); | 137 sync_api::WriteNode node(&trans); |
| 140 | 138 |
| 141 int64 node_id = model_associator_->GetSyncIdFromChromeId(name); | 139 int64 node_id = model_associator_->GetSyncIdFromChromeId(name); |
| 142 if (node_id == sync_api::kInvalidId) { | 140 if (node_id == sync_api::kInvalidId) { |
| 143 if (tag_node.InitByClientTagLookup(syncable::PREFERENCES, name)) | 141 if (tag_node.InitByClientTagLookup(syncable::PREFERENCES, name)) |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 }; | 210 }; |
| 213 | 211 |
| 214 TEST_F(ProfileSyncServicePreferenceTest, WritePreferenceToNode) { | 212 TEST_F(ProfileSyncServicePreferenceTest, WritePreferenceToNode) { |
| 215 prefs_->SetString(prefs::kHomePage, example_url0_); | 213 prefs_->SetString(prefs::kHomePage, example_url0_); |
| 216 CreateRootTask task(this, syncable::PREFERENCES); | 214 CreateRootTask task(this, syncable::PREFERENCES); |
| 217 ASSERT_TRUE(StartSyncService(&task, false)); | 215 ASSERT_TRUE(StartSyncService(&task, false)); |
| 218 ASSERT_TRUE(task.success()); | 216 ASSERT_TRUE(task.success()); |
| 219 | 217 |
| 220 const PrefService::Preference* pref = | 218 const PrefService::Preference* pref = |
| 221 prefs_->FindPreference(prefs::kHomePage); | 219 prefs_->FindPreference(prefs::kHomePage); |
| 222 sync_api::WriteTransaction trans(service_->backend()->GetUserShareHandle()); | 220 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 223 sync_api::WriteNode node(&trans); | 221 sync_api::WriteNode node(&trans); |
| 224 EXPECT_TRUE(node.InitByClientTagLookup(syncable::PREFERENCES, | 222 EXPECT_TRUE(node.InitByClientTagLookup(syncable::PREFERENCES, |
| 225 prefs::kHomePage)); | 223 prefs::kHomePage)); |
| 226 | 224 |
| 227 EXPECT_TRUE(PreferenceModelAssociator::WritePreferenceToNode( | 225 EXPECT_TRUE(PreferenceModelAssociator::WritePreferenceToNode( |
| 228 pref->name(), *pref->GetValue(), &node)); | 226 pref->name(), *pref->GetValue(), &node)); |
| 229 EXPECT_EQ(UTF8ToWide(prefs::kHomePage), node.GetTitle()); | 227 EXPECT_EQ(UTF8ToWide(prefs::kHomePage), node.GetTitle()); |
| 230 const sync_pb::PreferenceSpecifics& specifics(node.GetPreferenceSpecifics()); | 228 const sync_pb::PreferenceSpecifics& specifics(node.GetPreferenceSpecifics()); |
| 231 EXPECT_EQ(std::string(prefs::kHomePage), specifics.name()); | 229 EXPECT_EQ(std::string(prefs::kHomePage), specifics.name()); |
| 232 | 230 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 ASSERT_TRUE(StartSyncService(&task, false)); | 353 ASSERT_TRUE(StartSyncService(&task, false)); |
| 356 ASSERT_TRUE(task.success()); | 354 ASSERT_TRUE(task.success()); |
| 357 | 355 |
| 358 scoped_ptr<Value> expected(Value::CreateStringValue(example_url1_)); | 356 scoped_ptr<Value> expected(Value::CreateStringValue(example_url1_)); |
| 359 ASSERT_NE(SetSyncedValue(prefs::kHomePage, *expected), sync_api::kInvalidId); | 357 ASSERT_NE(SetSyncedValue(prefs::kHomePage, *expected), sync_api::kInvalidId); |
| 360 int64 node_id = model_associator_->GetSyncIdFromChromeId(prefs::kHomePage); | 358 int64 node_id = model_associator_->GetSyncIdFromChromeId(prefs::kHomePage); |
| 361 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); | 359 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); |
| 362 record->action = SyncManager::ChangeRecord::ACTION_UPDATE; | 360 record->action = SyncManager::ChangeRecord::ACTION_UPDATE; |
| 363 record->id = node_id; | 361 record->id = node_id; |
| 364 { | 362 { |
| 365 sync_api::WriteTransaction trans(backend()->GetUserShareHandle()); | 363 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 366 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); | 364 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); |
| 367 } | 365 } |
| 368 | 366 |
| 369 const Value& actual = GetPreferenceValue(prefs::kHomePage); | 367 const Value& actual = GetPreferenceValue(prefs::kHomePage); |
| 370 EXPECT_TRUE(expected->Equals(&actual)); | 368 EXPECT_TRUE(expected->Equals(&actual)); |
| 371 } | 369 } |
| 372 | 370 |
| 373 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeActionAdd) { | 371 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeActionAdd) { |
| 374 CreateRootTask task(this, syncable::PREFERENCES); | 372 CreateRootTask task(this, syncable::PREFERENCES); |
| 375 ASSERT_TRUE(StartSyncService(&task, false)); | 373 ASSERT_TRUE(StartSyncService(&task, false)); |
| 376 ASSERT_TRUE(task.success()); | 374 ASSERT_TRUE(task.success()); |
| 377 | 375 |
| 378 scoped_ptr<Value> expected(Value::CreateStringValue(example_url0_)); | 376 scoped_ptr<Value> expected(Value::CreateStringValue(example_url0_)); |
| 379 int64 node_id = SetSyncedValue(prefs::kHomePage, *expected); | 377 int64 node_id = SetSyncedValue(prefs::kHomePage, *expected); |
| 380 ASSERT_NE(node_id, sync_api::kInvalidId); | 378 ASSERT_NE(node_id, sync_api::kInvalidId); |
| 381 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); | 379 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); |
| 382 record->action = SyncManager::ChangeRecord::ACTION_ADD; | 380 record->action = SyncManager::ChangeRecord::ACTION_ADD; |
| 383 record->id = node_id; | 381 record->id = node_id; |
| 384 { | 382 { |
| 385 sync_api::WriteTransaction trans(backend()->GetUserShareHandle()); | 383 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 386 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); | 384 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); |
| 387 } | 385 } |
| 388 | 386 |
| 389 const Value& actual = GetPreferenceValue(prefs::kHomePage); | 387 const Value& actual = GetPreferenceValue(prefs::kHomePage); |
| 390 EXPECT_TRUE(expected->Equals(&actual)); | 388 EXPECT_TRUE(expected->Equals(&actual)); |
| 391 EXPECT_EQ(node_id, | 389 EXPECT_EQ(node_id, |
| 392 model_associator_->GetSyncIdFromChromeId(prefs::kHomePage)); | 390 model_associator_->GetSyncIdFromChromeId(prefs::kHomePage)); |
| 393 } | 391 } |
| 394 | 392 |
| 395 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeUnknownPreference) { | 393 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeUnknownPreference) { |
| 396 CreateRootTask task(this, syncable::PREFERENCES); | 394 CreateRootTask task(this, syncable::PREFERENCES); |
| 397 ASSERT_TRUE(StartSyncService(&task, false)); | 395 ASSERT_TRUE(StartSyncService(&task, false)); |
| 398 ASSERT_TRUE(task.success()); | 396 ASSERT_TRUE(task.success()); |
| 399 | 397 |
| 400 scoped_ptr<Value> expected(Value::CreateStringValue(example_url0_)); | 398 scoped_ptr<Value> expected(Value::CreateStringValue(example_url0_)); |
| 401 int64 node_id = SetSyncedValue("unknown preference", *expected); | 399 int64 node_id = SetSyncedValue("unknown preference", *expected); |
| 402 ASSERT_NE(node_id, sync_api::kInvalidId); | 400 ASSERT_NE(node_id, sync_api::kInvalidId); |
| 403 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); | 401 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); |
| 404 record->action = SyncManager::ChangeRecord::ACTION_ADD; | 402 record->action = SyncManager::ChangeRecord::ACTION_ADD; |
| 405 record->id = node_id; | 403 record->id = node_id; |
| 406 { | 404 { |
| 407 sync_api::WriteTransaction trans(backend()->GetUserShareHandle()); | 405 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 408 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); | 406 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); |
| 409 } | 407 } |
| 410 | 408 |
| 411 // Nothing interesting happens on the client when it gets an update | 409 // Nothing interesting happens on the client when it gets an update |
| 412 // of an unknown preference. We just should not crash. | 410 // of an unknown preference. We just should not crash. |
| 413 } | 411 } |
| 414 | 412 |
| 415 TEST_F(ProfileSyncServicePreferenceTest, ManagedPreferences) { | 413 TEST_F(ProfileSyncServicePreferenceTest, ManagedPreferences) { |
| 416 // Make the homepage preference managed. | 414 // Make the homepage preference managed. |
| 417 scoped_ptr<Value> managed_value( | 415 scoped_ptr<Value> managed_value( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 430 | 428 |
| 431 // An incoming sync transaction shouldn't change the user value. | 429 // An incoming sync transaction shouldn't change the user value. |
| 432 scoped_ptr<Value> sync_value( | 430 scoped_ptr<Value> sync_value( |
| 433 Value::CreateStringValue("http://crbug.com")); | 431 Value::CreateStringValue("http://crbug.com")); |
| 434 int64 node_id = SetSyncedValue(prefs::kHomePage, *sync_value); | 432 int64 node_id = SetSyncedValue(prefs::kHomePage, *sync_value); |
| 435 ASSERT_NE(node_id, sync_api::kInvalidId); | 433 ASSERT_NE(node_id, sync_api::kInvalidId); |
| 436 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); | 434 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); |
| 437 record->action = SyncManager::ChangeRecord::ACTION_UPDATE; | 435 record->action = SyncManager::ChangeRecord::ACTION_UPDATE; |
| 438 record->id = node_id; | 436 record->id = node_id; |
| 439 { | 437 { |
| 440 sync_api::WriteTransaction trans(backend()->GetUserShareHandle()); | 438 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 441 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); | 439 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); |
| 442 } | 440 } |
| 443 EXPECT_TRUE(managed_value->Equals( | 441 EXPECT_TRUE(managed_value->Equals( |
| 444 prefs_->GetManagedPref(prefs::kHomePage))); | 442 prefs_->GetManagedPref(prefs::kHomePage))); |
| 445 EXPECT_TRUE(user_value->Equals( | 443 EXPECT_TRUE(user_value->Equals( |
| 446 prefs_->GetUserPref(prefs::kHomePage))); | 444 prefs_->GetUserPref(prefs::kHomePage))); |
| 447 } | 445 } |
| 448 | 446 |
| 449 TEST_F(ProfileSyncServicePreferenceTest, DynamicManagedPreferences) { | 447 TEST_F(ProfileSyncServicePreferenceTest, DynamicManagedPreferences) { |
| 450 CreateRootTask task(this, syncable::PREFERENCES); | 448 CreateRootTask task(this, syncable::PREFERENCES); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 469 | 467 |
| 470 // Change the sync value. | 468 // Change the sync value. |
| 471 scoped_ptr<Value> sync_value( | 469 scoped_ptr<Value> sync_value( |
| 472 Value::CreateStringValue("http://example.com/sync")); | 470 Value::CreateStringValue("http://example.com/sync")); |
| 473 int64 node_id = SetSyncedValue(prefs::kHomePage, *sync_value); | 471 int64 node_id = SetSyncedValue(prefs::kHomePage, *sync_value); |
| 474 ASSERT_NE(node_id, sync_api::kInvalidId); | 472 ASSERT_NE(node_id, sync_api::kInvalidId); |
| 475 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); | 473 scoped_ptr<SyncManager::ChangeRecord> record(new SyncManager::ChangeRecord); |
| 476 record->action = SyncManager::ChangeRecord::ACTION_ADD; | 474 record->action = SyncManager::ChangeRecord::ACTION_ADD; |
| 477 record->id = node_id; | 475 record->id = node_id; |
| 478 { | 476 { |
| 479 sync_api::WriteTransaction trans(backend()->GetUserShareHandle()); | 477 sync_api::WriteTransaction trans(service_->GetUserShare()); |
| 480 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); | 478 change_processor_->ApplyChangesFromSyncModel(&trans, record.get(), 1); |
| 481 } | 479 } |
| 482 | 480 |
| 483 // The pref value should still be the one dictated by policy. | 481 // The pref value should still be the one dictated by policy. |
| 484 EXPECT_TRUE(managed_value->Equals(&GetPreferenceValue(prefs::kHomePage))); | 482 EXPECT_TRUE(managed_value->Equals(&GetPreferenceValue(prefs::kHomePage))); |
| 485 | 483 |
| 486 // Switch kHomePage back to unmanaged. | 484 // Switch kHomePage back to unmanaged. |
| 487 profile_->GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); | 485 profile_->GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); |
| 488 | 486 |
| 489 // Sync value should be picked up. | 487 // Sync value should be picked up. |
| 490 EXPECT_TRUE(sync_value->Equals(&GetPreferenceValue(prefs::kHomePage))); | 488 EXPECT_TRUE(sync_value->Equals(&GetPreferenceValue(prefs::kHomePage))); |
| 491 } | 489 } |
| OLD | NEW |