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(), &notification_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