Moving scripts to download and build apprtc/collider.

We are starting to move code to setup our tests from [1].
We are moving only scripts to download and build apprtc, collider and node
(scripts that work on firefox have not been copied by this CL).

[1] - https://chromium.googlesource.com/chromium/deps/webrtc/webrtc.DEPS/

BUG=webrtc:7602
NOTRY=True

Review-Url: https://codereview.webrtc.org/2861653005
Cr-Commit-Position: refs/heads/master@{#18060}
diff --git a/webrtc/tools/testing/utils.py b/webrtc/tools/testing/utils.py
new file mode 100755
index 0000000..7e38b42
--- /dev/null
+++ b/webrtc/tools/testing/utils.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+#
+# Use of this source code is governed by a BSD-style license
+# that can be found in the LICENSE file in the root of the source
+# tree. An additional intellectual property rights grant can be found
+# in the file PATENTS.  All contributing project authors may
+# be found in the AUTHORS file in the root of the source tree.
+
+"""Utilities for all our deps-management stuff."""
+
+import hashlib
+import os
+import shutil
+import sys
+import subprocess
+import tarfile
+import time
+import zipfile
+
+
+def RunSubprocessWithRetry(cmd):
+  """Invokes the subprocess and backs off exponentially on fail."""
+  for i in range(5):
+    try:
+      subprocess.check_call(cmd)
+      return
+    except subprocess.CalledProcessError as exception:
+      backoff = pow(2, i)
+      print 'Got %s, retrying in %d seconds...' % (exception, backoff)
+      time.sleep(backoff)
+
+  print 'Giving up.'
+  raise exception
+
+
+def DownloadFilesFromGoogleStorage(path):
+  print 'Downloading files in %s...' % path
+
+  extension = 'bat' if 'win32' in sys.platform else 'py'
+  cmd = ['download_from_google_storage.%s' % extension,
+         '--bucket=chromium-webrtc-resources',
+         '--auto_platform',
+         '--recursive',
+         '--directory', path]
+  subprocess.check_call(cmd)
+
+
+def ComputeSHA1(path):
+  if not os.path.exists(path):
+    return 0
+
+  sha1 = hashlib.sha1()
+  file_to_hash = open(path, 'rb')
+  try:
+    sha1.update(file_to_hash.read())
+  finally:
+    file_to_hash.close()
+
+  return sha1.hexdigest()
+
+
+# Code partially copied from
+# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
+def RemoveDirectory(*path):
+  """Recursively removes a directory, even if it's marked read-only.
+
+  Remove the directory located at *path, if it exists.
+
+  shutil.rmtree() doesn't work on Windows if any of the files or directories
+  are read-only, which svn repositories and some .svn files are.  We need to
+  be able to force the files to be writable (i.e., deletable) as we traverse
+  the tree.
+
+  Even with all this, Windows still sometimes fails to delete a file, citing
+  a permission error (maybe something to do with antivirus scans or disk
+  indexing).  The best suggestion any of the user forums had was to wait a
+  bit and try again, so we do that too.  It's hand-waving, but sometimes it
+  works. :/
+  """
+  file_path = os.path.join(*path)
+  print 'Deleting `{}`.'.format(file_path)
+  if not os.path.exists(file_path):
+    print '`{}` does not exist.'.format(file_path)
+    return
+
+  if sys.platform == 'win32':
+    # Give up and use cmd.exe's rd command.
+    file_path = os.path.normcase(file_path)
+    for _ in xrange(3):
+      print 'RemoveDirectory running %s' % (' '.join(
+          ['cmd.exe', '/c', 'rd', '/q', '/s', file_path]))
+      if not subprocess.call(['cmd.exe', '/c', 'rd', '/q', '/s', file_path]):
+        break
+      print '  Failed'
+      time.sleep(3)
+    return
+  else:
+    shutil.rmtree(file_path, ignore_errors=True)
+
+
+def UnpackArchiveTo(archive_path, output_dir):
+  extension = os.path.splitext(archive_path)[1]
+  if extension == '.zip':
+    _UnzipArchiveTo(archive_path, output_dir)
+  else:
+    _UntarArchiveTo(archive_path, output_dir)
+
+
+def _UnzipArchiveTo(archive_path, output_dir):
+  print 'Unzipping {} in {}.'.format(archive_path, output_dir)
+  zip_file = zipfile.ZipFile(archive_path)
+  try:
+    zip_file.extractall(output_dir)
+  finally:
+    zip_file.close()
+
+
+def _UntarArchiveTo(archive_path, output_dir):
+  print 'Untarring {} in {}.'.format(archive_path, output_dir)
+  tar_file = tarfile.open(archive_path, 'r:gz')
+  try:
+    tar_file.extractall(output_dir)
+  finally:
+    tar_file.close()
+
+
+def GetPlatform():
+  if sys.platform.startswith('win'):
+    return 'win'
+  if sys.platform.startswith('linux'):
+    return 'linux'
+  if sys.platform.startswith('darwin'):
+    return 'mac'
+  raise Exception("Can't run on platform %s." % sys.platform)