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