|  | // Copyright 2018 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 "base/metrics/persistent_histogram_storage.h" | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/files/file_util.h" | 
|  | #include "base/files/scoped_temp_dir.h" | 
|  | #include "base/metrics/histogram_macros.h" | 
|  | #include "base/time/time.h" | 
|  | #include "build_config.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // Name of the allocator for storing histograms. | 
|  | constexpr char kTestHistogramAllocatorName[] = "TestMetrics"; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | class PersistentHistogramStorageTest : public testing::Test { | 
|  | protected: | 
|  | PersistentHistogramStorageTest() = default; | 
|  | ~PersistentHistogramStorageTest() override = default; | 
|  |  | 
|  | // Creates a unique temporary directory, and sets the test storage directory. | 
|  | void SetUp() override { | 
|  | ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 
|  | test_storage_dir_ = | 
|  | temp_dir_path().AppendASCII(kTestHistogramAllocatorName); | 
|  | } | 
|  |  | 
|  | // Gets the path to the temporary directory. | 
|  | const FilePath& temp_dir_path() { return temp_dir_.GetPath(); } | 
|  |  | 
|  | const FilePath& test_storage_dir() { return test_storage_dir_; } | 
|  |  | 
|  | private: | 
|  | // A temporary directory where all file IO operations take place. | 
|  | ScopedTempDir temp_dir_; | 
|  |  | 
|  | // The directory into which metrics files are written. | 
|  | FilePath test_storage_dir_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PersistentHistogramStorageTest); | 
|  | }; | 
|  |  | 
|  | // TODO(chengx): Re-enable the test on OS_IOS after issue 836789 is fixed. | 
|  | // PersistentHistogramStorage is only used on OS_WIN now, so disabling this | 
|  | // test on OS_IOS is fine. | 
|  | #if !defined(OS_NACL) && !defined(OS_IOS) | 
|  | TEST_F(PersistentHistogramStorageTest, HistogramWriteTest) { | 
|  | auto persistent_histogram_storage = | 
|  | std::make_unique<PersistentHistogramStorage>( | 
|  | kTestHistogramAllocatorName, | 
|  | PersistentHistogramStorage::StorageDirManagement::kCreate); | 
|  |  | 
|  | persistent_histogram_storage->set_storage_base_dir(temp_dir_path()); | 
|  |  | 
|  | // Log some random data. | 
|  | UMA_HISTOGRAM_BOOLEAN("Some.Test.Metric", true); | 
|  |  | 
|  | // Deleting the object causes the data to be written to the disk. | 
|  | persistent_histogram_storage.reset(); | 
|  |  | 
|  | // The storage directory and the histogram file are created during the | 
|  | // destruction of the PersistentHistogramStorage instance. | 
|  | EXPECT_TRUE(DirectoryExists(test_storage_dir())); | 
|  | EXPECT_FALSE(IsDirectoryEmpty(test_storage_dir())); | 
|  | } | 
|  | #endif  // !defined(OS_NACL) && !defined(OS_IOS) | 
|  |  | 
|  | }  // namespace base |