| // Copyright 2017 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "components/browser_watcher/stability_paths.h" | 
 |  | 
 | #include "base/files/file_enumerator.h" | 
 | #include "base/files/file_path.h" | 
 | #include "base/files/file_util.h" | 
 | #include "base/files/scoped_file.h" | 
 | #include "base/files/scoped_temp_dir.h" | 
 | #include "base/process/process.h" | 
 | #include "base/test/multiprocess_test.h" | 
 | #include "testing/gmock/include/gmock/gmock.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 | #include "testing/multiprocess_func_list.h" | 
 |  | 
 | namespace browser_watcher { | 
 |  | 
 | class StabilityPathsMultiProcTest : public base::MultiProcessTest {}; | 
 |  | 
 | MULTIPROCESS_TEST_MAIN(DummyProcess) { | 
 |   return 0; | 
 | } | 
 |  | 
 | TEST_F(StabilityPathsMultiProcTest, GetStabilityFileForProcessTest) { | 
 |   const base::FilePath empty_path; | 
 |  | 
 |   // Get the path for the current process. | 
 |   base::FilePath stability_path; | 
 |   ASSERT_TRUE(GetStabilityFileForProcess(base::Process::Current(), empty_path, | 
 |                                          &stability_path)); | 
 |  | 
 |   // Ensure requesting a second time produces the same. | 
 |   base::FilePath stability_path_two; | 
 |   ASSERT_TRUE(GetStabilityFileForProcess(base::Process::Current(), empty_path, | 
 |                                          &stability_path_two)); | 
 |   EXPECT_EQ(stability_path, stability_path_two); | 
 |  | 
 |   // Ensure a different process has a different stability path. | 
 |   base::Process process = SpawnChild("DummyProcess"); | 
 |   base::FilePath stability_path_other; | 
 |   ASSERT_TRUE( | 
 |       GetStabilityFileForProcess(process, empty_path, &stability_path_other)); | 
 |   EXPECT_NE(stability_path, stability_path_other); | 
 | } | 
 |  | 
 | TEST(StabilityPathsTest, | 
 |      GetStabilityFilePatternMatchesGetStabilityFileForProcessResult) { | 
 |   // GetStabilityFileForProcess file names must match GetStabilityFilePattern | 
 |   // according to | 
 |   // FileEnumerator's algorithm. We test this by writing out some files and | 
 |   // validating what is matched. | 
 |  | 
 |   base::ScopedTempDir temp_dir; | 
 |   ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 
 |   base::FilePath user_data_dir = temp_dir.GetPath(); | 
 |  | 
 |   // Create the stability directory. | 
 |   base::FilePath stability_dir = GetStabilityDir(user_data_dir); | 
 |   ASSERT_TRUE(base::CreateDirectory(stability_dir)); | 
 |  | 
 |   // Write a stability file. | 
 |   base::FilePath stability_file; | 
 |   ASSERT_TRUE(GetStabilityFileForProcess(base::Process::Current(), | 
 |                                          user_data_dir, &stability_file)); | 
 |   { | 
 |     base::ScopedFILE file(base::OpenFile(stability_file, "w")); | 
 |     ASSERT_TRUE(file.get()); | 
 |   } | 
 |  | 
 |   // Write a file that shouldn't match. | 
 |   base::FilePath non_matching_file = | 
 |       stability_dir.AppendASCII("non_matching.foo"); | 
 |   { | 
 |     base::ScopedFILE file(base::OpenFile(non_matching_file, "w")); | 
 |     ASSERT_TRUE(file.get()); | 
 |   } | 
 |  | 
 |   // Validate only the stability file matches. | 
 |   base::FileEnumerator enumerator(stability_dir, false /* recursive */, | 
 |                                   base::FileEnumerator::FILES, | 
 |                                   GetStabilityFilePattern()); | 
 |   ASSERT_EQ(stability_file, enumerator.Next()); | 
 |   ASSERT_TRUE(enumerator.Next().empty()); | 
 | } | 
 |  | 
 | TEST(StabilityPathsTest, GetStabilityFiles) { | 
 |   base::ScopedTempDir temp_dir; | 
 |   ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 
 |  | 
 |   // Create files. | 
 |   std::vector<base::FilePath> expected_paths; | 
 |   std::set<base::FilePath> excluded_paths; | 
 |   { | 
 |     // Matches the pattern. | 
 |     base::FilePath path = temp_dir.GetPath().AppendASCII("foo1.pma"); | 
 |     base::ScopedFILE file(base::OpenFile(path, "w")); | 
 |     ASSERT_NE(file.get(), nullptr); | 
 |     expected_paths.push_back(path); | 
 |  | 
 |     // Matches the pattern, but is excluded. | 
 |     path = temp_dir.GetPath().AppendASCII("foo2.pma"); | 
 |     file.reset(base::OpenFile(path, "w")); | 
 |     ASSERT_NE(file.get(), nullptr); | 
 |     ASSERT_TRUE(excluded_paths.insert(path).second); | 
 |  | 
 |     // Matches the pattern. | 
 |     path = temp_dir.GetPath().AppendASCII("foo3.pma"); | 
 |     file.reset(base::OpenFile(path, "w")); | 
 |     ASSERT_NE(file.get(), nullptr); | 
 |     expected_paths.push_back(path); | 
 |  | 
 |     // Does not match the pattern. | 
 |     path = temp_dir.GetPath().AppendASCII("bar.baz"); | 
 |     file.reset(base::OpenFile(path, "w")); | 
 |     ASSERT_NE(file.get(), nullptr); | 
 |   } | 
 |  | 
 |   EXPECT_THAT(GetStabilityFiles(temp_dir.GetPath(), | 
 |                                 FILE_PATH_LITERAL("foo*.pma"), excluded_paths), | 
 |               testing::UnorderedElementsAreArray(expected_paths)); | 
 | } | 
 |  | 
 | }  // namespace browser_watcher |