Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / sync / sessions / model_type_registry_unittest.cc
index a063758..375e84b 100644 (file)
@@ -4,8 +4,10 @@
 
 #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"
@@ -111,4 +113,131 @@ TEST_F(ModelTypeRegistryTest, SetEnabledDirectoryTypes_Clear) {
   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