1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/task_dependency_manager.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_path.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define FPL(path) FILE_PATH_LITERAL(path) 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace sync_file_system { 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace drive_backend { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::FilePath MakePath(const base::FilePath::StringType& path) { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return base::FilePath(path).NormalizePathSeparators(); 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool InsertPath(TaskDependencyManager* manager, 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& app_id, 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath::StringType& path) { 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskBlocker blocker; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.app_id = app_id; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.paths.push_back(MakePath(path)); 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return manager->Insert(&blocker); 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ErasePath(TaskDependencyManager* manager, 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& app_id, 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath::StringType& path) { 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskBlocker blocker; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.app_id = app_id; 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.paths.push_back(MakePath(path)); 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return manager->Erase(&blocker); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool InsertExclusiveTask(TaskDependencyManager* manager) { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskBlocker blocker; 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blocker.exclusive = true; 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return manager->Insert(&blocker); 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid EraseExclusiveTask(TaskDependencyManager* manager) { 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskBlocker blocker; 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blocker.exclusive = true; 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch manager->Erase(&blocker); 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(TaskDependencyManagerTest, BasicTest) { 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TaskDependencyManager manager; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskBlocker blocker; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.app_id = "app_id"; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.paths.push_back(MakePath(FPL("/folder/file"))); 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.file_ids.push_back("file_id"); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blocker.tracker_ids.push_back(100); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(manager.Insert(&blocker)); 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(manager.Insert(&blocker)); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch manager.Erase(&blocker); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(manager.Insert(&blocker)); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch manager.Erase(&blocker); 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(TaskDependencyManagerTest, BlocksAncestorAndDescendant) { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TaskDependencyManager manager; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(InsertPath( 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &manager, "app_id", FPL("/ancestor/parent/self/child/descendant"))); 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(InsertPath(&manager, "app_id", FPL("/ancestor"))); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(InsertPath(&manager, "app_id", FPL("/ancestor/parent"))); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(InsertPath(&manager, "app_id", FPL("/ancestor/parent/self"))); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(InsertPath( 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &manager, "app_id", FPL("/ancestor/parent/self/child"))); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(InsertPath( 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &manager, "app_id", FPL("/ancestor/parent/self/child/descendant"))); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(InsertPath( 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &manager, "another_app_id", FPL("/ancestor/parent/self"))); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ErasePath(&manager, "another_app_id", FPL("/ancestor/parent/self")); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(InsertPath(&manager, "app_id", FPL("/file"))); 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ErasePath(&manager, "app_id", FPL("/file")); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ErasePath(&manager, "app_id", FPL("/ancestor/parent/self/child/descendant")); 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 94effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST(TaskDependencyManagerTest, ExclusiveTask) { 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TaskDependencyManager manager; 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(InsertPath(&manager, "app_id", FPL("/foo/bar"))); 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(InsertExclusiveTask(&manager)); 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ErasePath(&manager, "app_id", FPL("/foo/bar")); 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(InsertExclusiveTask(&manager)); 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(InsertPath(&manager, "app_id", FPL("/foo/bar"))); 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EraseExclusiveTask(&manager); 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(InsertPath(&manager, "app_id", FPL("/foo/bar"))); 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ErasePath(&manager, "app_id", FPL("/foo/bar")); 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 109a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(TaskDependencyManagerTest, PermissiveTask) { 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TaskDependencyManager manager; 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(manager.Insert(NULL)); 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(InsertPath(&manager, "app_id", FPL("/foo/bar"))); 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(InsertExclusiveTask(&manager)); 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ErasePath(&manager, "app_id", FPL("/foo/bar")); 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(InsertExclusiveTask(&manager)); 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch manager.Erase(NULL); 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(InsertExclusiveTask(&manager)); 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(manager.Insert(NULL)); 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EraseExclusiveTask(&manager); 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace drive_backend 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace sync_file_system 128