11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <algorithm>
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector>
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/command_line.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/profile_sync_components_factory_impl.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/profile_sync_service.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/profile_sync_service_android.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_profile.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/signin/core/browser/profile_oauth2_token_service.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/sync_driver/data_type_controller.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_thread_bundle.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "sync/internal_api/public/base/model_type.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint NumberOfSetBits(jlong bitmask) {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num = 0;
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (bitmask > 0) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    num += (bitmask & 1);
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bitmask >>= 1;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return num;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ProfileSyncServiceAndroidTest : public testing::Test {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProfileSyncServiceAndroidTest()
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : command_line_(base::CommandLine::NO_PROGRAM) {}
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ProfileSyncServiceAndroidTest() {}
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUp() OVERRIDE {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ProfileOAuth2TokenService* token_service =
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ProfileOAuth2TokenServiceFactory::GetForProfile(&profile_);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ProfileSyncComponentsFactory* factory =
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ProfileSyncComponentsFactoryImpl(
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            &profile_,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            &command_line_,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            GURL(),
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            token_service,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            profile_.GetRequestContext());
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sync_service_.reset(new ProfileSyncService(
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        make_scoped_ptr(factory),
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &profile_,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        scoped_ptr<SupervisedUserSigninManagerWrapper>(),
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        token_service,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser_sync::MANUAL_START));
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    factory->RegisterDataTypes(sync_service_.get());
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  syncer::ModelTypeSet GetRegisteredDataTypes() {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sync_driver::DataTypeController::StateMap controller_states;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sync_service_->GetDataTypeControllerStates(&controller_states);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    syncer::ModelTypeSet model_types;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (sync_driver::DataTypeController::StateMap::const_iterator it =
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             controller_states.begin();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         it != controller_states.end(); ++it) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      model_types.Put(it->first);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return model_types;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::CommandLine command_line_;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserThreadBundle thread_bundle_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestingProfile profile_;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ProfileSyncService> sync_service_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ProfileSyncServiceAndroidTest, ModelTypesToInvalidationNames) {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  syncer::ModelTypeSet model_types = GetRegisteredDataTypes();
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  jlong model_type_selection =
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProfileSyncServiceAndroid::ModelTypeSetToSelection(model_types);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The number of set bits in the model type bitmask should be equal to the
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // number of model types.
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(static_cast<int>(model_types.Size()),
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            NumberOfSetBits(model_type_selection));
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> invalidation_names;
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (syncer::ModelTypeSet::Iterator it = model_types.First(); it.Good();
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it.Inc()) {
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string notification_type;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (syncer::RealModelTypeToNotificationType(it.Get(), &notification_type))
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      invalidation_names.push_back(notification_type);
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::sort(invalidation_names.begin(), invalidation_names.end());
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(JoinString(invalidation_names, ", "),
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ProfileSyncServiceAndroid::ModelTypeSelectionToStringForTest(
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                model_type_selection));
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
104