1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <Windows.h>
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <algorithm>
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <vector>
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback_helpers.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/install_verification/win/module_verification_test.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(LoadedModulesSnapshotTest, TestCase) {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<HMODULE> snapshot;
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot));
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t original_snapshot_size = snapshot.size();
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_GT(original_snapshot_size, 0u);
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  snapshot.clear();
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Load in a new module. Pick msvidc32.dll as it is present from WinXP to
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Win8 and yet rarely used.
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(NULL, ::GetModuleHandle(L"msvidc32.dll"));
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  HMODULE new_dll = ::LoadLibrary(L"msvidc32.dll");
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_NE(static_cast<HMODULE>(NULL), new_dll);
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::ScopedClosureRunner release_new_dll(
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(base::IgnoreResult(&::FreeLibrary), new_dll));
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot));
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_GT(snapshot.size(), original_snapshot_size);
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_NE(snapshot.end(),
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            std::find(snapshot.begin(), snapshot.end(), new_dll));
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
38