Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4719)

Unified Diff: chrome/installer/setup/setup_util_unittest.cc

Issue 16023027: Lower the I/O priority of the installer when resonable. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cpu comments Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/installer/setup/setup_util_unittest.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/installer/setup/setup_util_unittest.cc
diff --git a/chrome/installer/setup/setup_util_unittest.cc b/chrome/installer/setup/setup_util_unittest.cc
index 6fccc2c9ec3adfd5ef11d220533170caa2050977..c699b1b0d0b7efb1915fb144217a2d01a7c4baf1 100644
--- a/chrome/installer/setup/setup_util_unittest.cc
+++ b/chrome/installer/setup/setup_util_unittest.cc
@@ -2,17 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "chrome/installer/setup/setup_util_unittest.h"
+
#include <windows.h>
#include <string>
+#include "base/command_line.h"
#include "base/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/scoped_ptr.h"
#include "base/path_service.h"
+#include "base/process_util.h"
#include "base/threading/platform_thread.h"
#include "base/time.h"
#include "base/win/scoped_handle.h"
+#include "base/win/windows_version.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/installer/setup/setup_util.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -189,3 +194,86 @@ TEST(SetupUtilTest, ScopedTokenPrivilegeAlreadyEnabled) {
ASSERT_FALSE(CurrentProcessHasPrivilege(kTestedPrivilege));
}
+
+const char kAdjustProcessPriority[] = "adjust-process-priority";
+
+PriorityClassChangeResult DoProcessPriorityAdjustment() {
+ return installer::AdjustProcessPriority() ? PCCR_CHANGED : PCCR_UNCHANGED;
+}
+
+namespace {
+
+// A scoper that sets/resets the current process's priority class.
+class ScopedPriorityClass {
+ public:
+ // Applies |priority_class|, returning an instance if a change was made.
+ // Otherwise, returns an empty scoped_ptr.
+ static scoped_ptr<ScopedPriorityClass> Create(DWORD priority_class);
+ ~ScopedPriorityClass();
+
+ private:
+ explicit ScopedPriorityClass(DWORD original_priority_class);
+ DWORD original_priority_class_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedPriorityClass);
+};
+
+scoped_ptr<ScopedPriorityClass> ScopedPriorityClass::Create(
+ DWORD priority_class) {
+ HANDLE this_process = ::GetCurrentProcess();
+ DWORD original_priority_class = ::GetPriorityClass(this_process);
+ EXPECT_NE(0U, original_priority_class);
+ if (original_priority_class && original_priority_class != priority_class) {
+ BOOL result = ::SetPriorityClass(this_process, priority_class);
+ EXPECT_NE(FALSE, result);
+ if (result) {
+ return scoped_ptr<ScopedPriorityClass>(
+ new ScopedPriorityClass(original_priority_class));
+ }
+ }
+ return scoped_ptr<ScopedPriorityClass>();
+}
+
+ScopedPriorityClass::ScopedPriorityClass(DWORD original_priority_class)
+ : original_priority_class_(original_priority_class) {}
+
+ScopedPriorityClass::~ScopedPriorityClass() {
+ BOOL result = ::SetPriorityClass(::GetCurrentProcess(),
+ original_priority_class_);
+ EXPECT_NE(FALSE, result);
+}
+
+PriorityClassChangeResult RelaunchAndDoProcessPriorityAdjustment() {
+ CommandLine cmd_line(*CommandLine::ForCurrentProcess());
+ cmd_line.AppendSwitch(kAdjustProcessPriority);
+ base::ProcessHandle process_handle = NULL;
+ int exit_code = 0;
+ if (!base::LaunchProcess(cmd_line, base::LaunchOptions(),
+ &process_handle)) {
+ ADD_FAILURE() << " to launch subprocess.";
+ } else if (!base::WaitForExitCode(process_handle, &exit_code)) {
+ ADD_FAILURE() << " to wait for subprocess to exit.";
+ } else {
+ return static_cast<PriorityClassChangeResult>(exit_code);
+ }
+ return PCCR_UNKNOWN;
+}
+
+} // namespace
+
+// Launching a subprocess at normal priority class is a noop.
+TEST(SetupUtilTest, AdjustFromNormalPriority) {
+ ASSERT_EQ(NORMAL_PRIORITY_CLASS, ::GetPriorityClass(::GetCurrentProcess()));
+ EXPECT_EQ(PCCR_UNCHANGED, RelaunchAndDoProcessPriorityAdjustment());
+}
+
+// Launching a subprocess below normal priority class drops it to bg mode for
+// sufficiently recent operating systems.
+TEST(SetupUtilTest, AdjustFromBelowNormalPriority) {
+ scoped_ptr<ScopedPriorityClass> below_normal =
+ ScopedPriorityClass::Create(BELOW_NORMAL_PRIORITY_CLASS);
+ ASSERT_TRUE(below_normal);
+ if (base::win::GetVersion() > base::win::VERSION_SERVER_2003)
+ EXPECT_EQ(PCCR_CHANGED, RelaunchAndDoProcessPriorityAdjustment());
+ else
+ EXPECT_EQ(PCCR_UNCHANGED, RelaunchAndDoProcessPriorityAdjustment());
+}
« no previous file with comments | « chrome/installer/setup/setup_util_unittest.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698