1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_TEST_BASE_CHROME_PROCESS_UTIL_H_ 6#define CHROME_TEST_BASE_CHROME_PROCESS_UTIL_H_ 7 8#include <vector> 9 10#include "base/memory/scoped_ptr.h" 11#include "base/process/process_handle.h" 12#include "base/process/process_metrics.h" 13 14typedef std::vector<base::ProcessId> ChromeProcessList; 15 16// Returns a vector of PIDs of all chrome processes (main and renderers etc) 17// based on |browser_pid|, the PID of the main browser process. 18ChromeProcessList GetRunningChromeProcesses(base::ProcessId browser_pid); 19 20// Attempts to terminate all chrome processes in |process_list|. 21void TerminateAllChromeProcesses(const ChromeProcessList& process_list); 22 23// A wrapper class for tests to use in fetching process metrics. 24// Delegates everything we need to base::ProcessMetrics, except 25// memory stats on Mac (which have to parse ps output due to privilege 26// restrictions, behavior we don't want in base). Long-term, if 27// the production base::ProcessMetrics gets updated to return 28// acceptable metrics on Mac, this class should disappear. 29class ChromeTestProcessMetrics { 30 public: 31 static ChromeTestProcessMetrics* CreateProcessMetrics( 32 base::ProcessHandle process) { 33 return new ChromeTestProcessMetrics(process); 34 } 35 36 size_t GetPagefileUsage(); 37 38 size_t GetWorkingSetSize(); 39 40 size_t GetPeakPagefileUsage() { 41 return process_metrics_->GetPeakPagefileUsage(); 42 } 43 44 size_t GetPeakWorkingSetSize() { 45 return process_metrics_->GetPeakWorkingSetSize(); 46 } 47 48 bool GetIOCounters(base::IoCounters* io_counters) { 49 return process_metrics_->GetIOCounters(io_counters); 50 } 51 52 base::ProcessHandle process_handle_; 53 54 ~ChromeTestProcessMetrics(); 55 56 private: 57 explicit ChromeTestProcessMetrics(base::ProcessHandle process); 58 59 scoped_ptr<base::ProcessMetrics> process_metrics_; 60 61 DISALLOW_COPY_AND_ASSIGN(ChromeTestProcessMetrics); 62}; 63 64#if defined(OS_MACOSX) 65 66// These types and API are here to fetch the information about a set of running 67// processes by ID on the Mac. There are also APIs in base, but fetching the 68// information for another process requires privileges that a normal executable 69// does not have. This API fetches the data by spawning ps (which is setuid so 70// it has the needed privileges) and processing its output. The API is provided 71// here because we don't want code spawning processes like this in base, where 72// someone writing cross platform code might use it without realizing that it's 73// a heavyweight call on the Mac. 74 75struct MacChromeProcessInfo { 76 base::ProcessId pid; 77 int rsz_in_kb; 78 int vsz_in_kb; 79}; 80 81typedef std::vector<MacChromeProcessInfo> MacChromeProcessInfoList; 82 83// Any ProcessId that info can't be found for will be left out. 84MacChromeProcessInfoList GetRunningMacProcessInfo( 85 const ChromeProcessList& process_list); 86 87#endif // defined(OS_MACOSX) 88 89#endif // CHROME_TEST_BASE_CHROME_PROCESS_UTIL_H_ 90