15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 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 <algorithm> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_android.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/signin/core/browser/profile_oauth2_token_service.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/sync_driver/data_type_controller.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int NumberOfSetBits(jlong bitmask) { 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int num = 0; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while (bitmask > 0) { 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num += (bitmask & 1); 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bitmask >>= 1; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return num; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceAndroidTest : public testing::Test { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncServiceAndroidTest() 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : command_line_(base::CommandLine::NO_PROGRAM) {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProfileSyncServiceAndroidTest() {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileOAuth2TokenService* token_service = 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(&profile_); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncComponentsFactory* factory = 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ProfileSyncComponentsFactoryImpl( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &profile_, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &command_line_, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) token_service, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile_.GetRequestContext()); 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sync_service_.reset(new ProfileSyncService( 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) make_scoped_ptr(factory), 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &profile_, 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<SupervisedUserSigninManagerWrapper>(), 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token_service, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_sync::MANUAL_START)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory->RegisterDataTypes(sync_service_.get()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet GetRegisteredDataTypes() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_driver::DataTypeController::StateMap controller_states; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_service_->GetDataTypeControllerStates(&controller_states); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) syncer::ModelTypeSet model_types; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (sync_driver::DataTypeController::StateMap::const_iterator it = 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_states.begin(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != controller_states.end(); ++it) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_types.Put(it->first); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return model_types; 72 } 73 74 private: 75 base::CommandLine command_line_; 76 content::TestBrowserThreadBundle thread_bundle_; 77 TestingProfile profile_; 78 scoped_ptr<ProfileSyncService> sync_service_; 79}; 80 81TEST_F(ProfileSyncServiceAndroidTest, ModelTypesToInvalidationNames) { 82 syncer::ModelTypeSet model_types = GetRegisteredDataTypes(); 83 84 jlong model_type_selection = 85 ProfileSyncServiceAndroid::ModelTypeSetToSelection(model_types); 86 // The number of set bits in the model type bitmask should be equal to the 87 // number of model types. 88 EXPECT_EQ(static_cast<int>(model_types.Size()), 89 NumberOfSetBits(model_type_selection)); 90 91 std::vector<std::string> invalidation_names; 92 for (syncer::ModelTypeSet::Iterator it = model_types.First(); it.Good(); 93 it.Inc()) { 94 std::string notification_type; 95 if (syncer::RealModelTypeToNotificationType(it.Get(), ¬ification_type)) 96 invalidation_names.push_back(notification_type); 97 } 98 99 std::sort(invalidation_names.begin(), invalidation_names.end()); 100 EXPECT_EQ(JoinString(invalidation_names, ", "), 101 ProfileSyncServiceAndroid::ModelTypeSelectionToStringForTest( 102 model_type_selection)); 103} 104