15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import os
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.core import util
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# TODO(dtu): Move these functions from core.util to here.
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetBaseDir = util.GetBaseDir
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetTelemetryDir = util.GetTelemetryDir
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetUnittestDataDir = util.GetUnittestDataDir
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetChromiumSrcDir = util.GetChromiumSrcDir
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AddDirToPythonPath = util.AddDirToPythonPath
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetBuildDirectories = util.GetBuildDirectories
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def IsExecutable(path):
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return os.path.isfile(path) and os.access(path, os.X_OK)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def FindInstalledWindowsApplication(application_path):
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """Search common Windows installation directories for an application.
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Args:
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    application_path: Path to application relative from installation location.
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Returns:
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    A string representing the full path, or None if not found.
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  search_paths = [os.getenv('PROGRAMFILES(X86)'),
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  os.getenv('PROGRAMFILES'),
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  os.getenv('LOCALAPPDATA')]
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  search_paths += os.getenv('PATH', '').split(os.pathsep)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for search_path in search_paths:
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if not search_path:
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      continue
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    path = os.path.join(search_path, application_path)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if IsExecutable(path):
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return path
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return None
44