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