| // 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/sampling_heap_profiler/module_cache.h" | 
 | #include "build/build_config.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 | namespace { | 
 |  | 
 | class ModuleCacheTest : public ::testing::Test {}; | 
 |  | 
 | int AFunctionForTest() { | 
 |   return 42; | 
 | } | 
 |  | 
 | // Checks that ModuleCache returns the same module instance for | 
 | // addresses within the module. | 
 | #if defined(OS_MACOSX) && !defined(OS_IOS) || defined(OS_WIN) | 
 | #define MAYBE_ModuleCache ModuleCache | 
 | #define MAYBE_ModulesList ModulesList | 
 | #else | 
 | #define MAYBE_ModuleCache DISABLED_ModuleCache | 
 | #define MAYBE_ModulesList DISABLED_ModulesList | 
 | #endif | 
 | TEST_F(ModuleCacheTest, MAYBE_ModuleCache) { | 
 |   uintptr_t ptr1 = reinterpret_cast<uintptr_t>(&AFunctionForTest); | 
 |   uintptr_t ptr2 = ptr1 + 1; | 
 |   ModuleCache cache; | 
 |   const ModuleCache::Module& module1 = cache.GetModuleForAddress(ptr1); | 
 |   const ModuleCache::Module& module2 = cache.GetModuleForAddress(ptr2); | 
 |   EXPECT_EQ(&module1, &module2); | 
 |   EXPECT_TRUE(module1.is_valid); | 
 |   EXPECT_GT(module1.size, 0u); | 
 |   EXPECT_LE(module1.base_address, ptr1); | 
 |   EXPECT_GT(module1.base_address + module1.size, ptr2); | 
 | } | 
 |  | 
 | TEST_F(ModuleCacheTest, MAYBE_ModulesList) { | 
 |   ModuleCache cache; | 
 |   uintptr_t ptr = reinterpret_cast<uintptr_t>(&AFunctionForTest); | 
 |   const ModuleCache::Module& module = cache.GetModuleForAddress(ptr); | 
 |   EXPECT_TRUE(module.is_valid); | 
 |   EXPECT_EQ(1u, cache.GetModules().size()); | 
 |   EXPECT_EQ(&module, cache.GetModules().front()); | 
 |   cache.Clear(); | 
 |   EXPECT_EQ(0u, cache.GetModules().size()); | 
 | } | 
 |  | 
 | TEST_F(ModuleCacheTest, InvalidModule) { | 
 |   ModuleCache cache; | 
 |   const ModuleCache::Module& invalid_module = cache.GetModuleForAddress(1); | 
 |   EXPECT_FALSE(invalid_module.is_valid); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace base |