#include <vector>
+#include "base/deferred_sequenced_task_runner.h"
#include "base/message_loop/message_loop.h"
#include "sync/internal_api/public/base/model_type.h"
+#include "sync/internal_api/public/non_blocking_type_processor.h"
#include "sync/sessions/model_type_registry.h"
#include "sync/test/engine/fake_model_worker.h"
#include "sync/test/engine/test_directory_setter_upper.h"
registry()->SetEnabledDirectoryTypes(routing_info2);
}
+// Test disabling then re-enabling some directory types.
+//
+// We don't get to inspect any of the state we're modifying. This test is
+// useful only for detecting crashes or memory leaks.
+TEST_F(ModelTypeRegistryTest, SetEnabledDirectoryTypes_OffAndOn) {
+ ModelSafeRoutingInfo routing_info1;
+ routing_info1.insert(std::make_pair(NIGORI, GROUP_PASSIVE));
+ routing_info1.insert(std::make_pair(BOOKMARKS, GROUP_UI));
+ routing_info1.insert(std::make_pair(AUTOFILL, GROUP_DB));
+
+ registry()->SetEnabledDirectoryTypes(routing_info1);
+
+ ModelSafeRoutingInfo routing_info2;
+ registry()->SetEnabledDirectoryTypes(routing_info2);
+
+ registry()->SetEnabledDirectoryTypes(routing_info1);
+}
+
+TEST_F(ModelTypeRegistryTest, NonBlockingTypes) {
+ NonBlockingTypeProcessor themes_processor(syncer::THEMES);
+ NonBlockingTypeProcessor sessions_processor(syncer::SESSIONS);
+ scoped_refptr<base::DeferredSequencedTaskRunner> task_runner =
+ new base::DeferredSequencedTaskRunner(base::MessageLoopProxy::current());
+
+ EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
+
+ registry()->InitializeNonBlockingType(
+ syncer::THEMES,
+ task_runner,
+ themes_processor.AsWeakPtr());
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(
+ ModelTypeSet(syncer::THEMES)));
+
+ registry()->InitializeNonBlockingType(
+ syncer::SESSIONS,
+ task_runner,
+ sessions_processor.AsWeakPtr());
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(
+ ModelTypeSet(syncer::THEMES, syncer::SESSIONS)));
+
+ registry()->RemoveNonBlockingType(syncer::THEMES);
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(
+ ModelTypeSet(syncer::SESSIONS)));
+
+ // Allow ModelTypeRegistry destruction to delete the
+ // Sessions' NonBlockingTypeProcessorCore.
+}
+
+TEST_F(ModelTypeRegistryTest, NonBlockingTypesWithDirectoryTypes) {
+ NonBlockingTypeProcessor themes_processor(syncer::THEMES);
+ NonBlockingTypeProcessor sessions_processor(syncer::SESSIONS);
+ scoped_refptr<base::DeferredSequencedTaskRunner> task_runner =
+ new base::DeferredSequencedTaskRunner(base::MessageLoopProxy::current());
+
+ ModelSafeRoutingInfo routing_info1;
+ routing_info1.insert(std::make_pair(NIGORI, GROUP_PASSIVE));
+ routing_info1.insert(std::make_pair(BOOKMARKS, GROUP_UI));
+ routing_info1.insert(std::make_pair(AUTOFILL, GROUP_DB));
+
+ ModelTypeSet current_types;
+ EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
+
+ // Add the themes non-blocking type.
+ registry()->InitializeNonBlockingType(
+ syncer::THEMES,
+ task_runner,
+ themes_processor.AsWeakPtr());
+ current_types.Put(syncer::THEMES);
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types));
+
+ // Add some directory types.
+ registry()->SetEnabledDirectoryTypes(routing_info1);
+ current_types.PutAll(GetRoutingInfoTypes(routing_info1));
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types));
+
+ // Add sessions non-blocking type.
+ registry()->InitializeNonBlockingType(
+ syncer::SESSIONS,
+ task_runner,
+ sessions_processor.AsWeakPtr());
+ current_types.Put(syncer::SESSIONS);
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types));
+
+ // Remove themes non-blocking type.
+ registry()->RemoveNonBlockingType(syncer::THEMES);
+ current_types.Remove(syncer::THEMES);
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types));
+
+ // Clear all directory types.
+ ModelSafeRoutingInfo routing_info2;
+ registry()->SetEnabledDirectoryTypes(routing_info2);
+ current_types.RemoveAll(GetRoutingInfoTypes(routing_info1));
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types));
+}
+
+TEST_F(ModelTypeRegistryTest, DeletionOrdering) {
+ scoped_ptr<NonBlockingTypeProcessor> themes_processor(
+ new NonBlockingTypeProcessor(syncer::THEMES));
+ scoped_ptr<NonBlockingTypeProcessor> sessions_processor(
+ new NonBlockingTypeProcessor(syncer::SESSIONS));
+ scoped_refptr<base::DeferredSequencedTaskRunner> task_runner =
+ new base::DeferredSequencedTaskRunner(base::MessageLoopProxy::current());
+
+ EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
+
+ registry()->InitializeNonBlockingType(
+ syncer::THEMES,
+ task_runner,
+ themes_processor->AsWeakPtr());
+ registry()->InitializeNonBlockingType(
+ syncer::SESSIONS,
+ task_runner,
+ sessions_processor->AsWeakPtr());
+ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(
+ ModelTypeSet(syncer::THEMES, syncer::SESSIONS)));
+
+ // Tear down themes processing, starting with the ProcessorCore.
+ registry()->RemoveNonBlockingType(syncer::THEMES);
+ themes_processor.reset();
+
+ // Tear down sessions processing, starting with the Processor.
+ sessions_processor.reset();
+ registry()->RemoveNonBlockingType(syncer::SESSIONS);
+
+ EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
+}
+
} // namespace syncer