Fix issue where crosperf can't find local cros_scratch.

Crosperf was assuming the user always has an NFS home directory,
and was looking for the cros_scratch directory there.  This makes
crosperf use the user's home directory, whether it's NFS or local.

Also change --share_users, which also assumed NFS home directories,
to --share_cache, which requires specification of the cache path(s)
to use.

BUG=None
TEST=Tested this with my new local homedir.

Change-Id: I28d15467dfbd25b8b237cefa2979d3fd9464a7a7
Reviewed-on: https://chrome-internal-review.googlesource.com/179978
Reviewed-by: Yunlian Jiang <yunlian@google.com>
Commit-Queue: Caroline Tice <cmtice@google.com>
Tested-by: Caroline Tice <cmtice@google.com>
diff --git a/crosperf/benchmark_run.py b/crosperf/benchmark_run.py
index f35b692..0632dde 100644
--- a/crosperf/benchmark_run.py
+++ b/crosperf/benchmark_run.py
@@ -37,7 +37,7 @@
                machine_manager,
                logger_to_use,
                log_level,
-               share_users):
+               share_cache):
     threading.Thread.__init__(self)
     self.name = name
     self._logger = logger_to_use
@@ -62,7 +62,7 @@
                                                    log_level=self.log_level)
     self.timeline = timeline.Timeline()
     self.timeline.Record(STATUS_PENDING)
-    self.share_users = share_users
+    self.share_cache = share_cache
 
   def ReadCache(self):
     # Just use the first machine for running the cached version,
@@ -80,7 +80,7 @@
                     self._logger,
                     self.log_level,
                     self.label,
-                    self.share_users,
+                    self.share_cache,
                     self.benchmark.suite,
                     self.benchmark.show_all_results
                    )
@@ -245,7 +245,7 @@
                     self._logger,
                     self.log_level,
                     self.label,
-                    self.share_users,
+                    self.share_cache,
                     self.benchmark.suite,
                     self.benchmark.show_all_results
                    )
diff --git a/crosperf/benchmark_run_unittest.py b/crosperf/benchmark_run_unittest.py
index d13806e..8bb0a3b 100755
--- a/crosperf/benchmark_run_unittest.py
+++ b/crosperf/benchmark_run_unittest.py
@@ -85,7 +85,7 @@
     # since the last time this test was updated:
     args_list = ['self', 'name', 'benchmark', 'label', 'iteration',
                  'cache_conditions', 'machine_manager', 'logger_to_use',
-                 'log_level', 'share_users']
+                 'log_level', 'share_cache']
     arg_spec = inspect.getargspec(benchmark_run.BenchmarkRun.__init__)
     self.assertEqual(len(arg_spec.args), len(args_list))
     self.assertEqual (arg_spec.args, args_list)
diff --git a/crosperf/experiment.py b/crosperf/experiment.py
index c637131..d56603a 100644
--- a/crosperf/experiment.py
+++ b/crosperf/experiment.py
@@ -24,7 +24,7 @@
   def __init__(self, name, remote, working_directory,
                chromeos_root, cache_conditions, labels, benchmarks,
                experiment_file, email_to, acquire_timeout, log_dir,
-               log_level, share_users, results_directory):
+               log_level, share_cache, results_directory):
     self.name = name
     self.working_directory = working_directory
     self.remote = remote
@@ -43,7 +43,7 @@
     self.benchmarks = benchmarks
     self.num_complete = 0
     self.num_run_complete = 0
-    self.share_users = share_users
+    self.share_cache = share_cache
 
     # We need one chromeos_root to run the benchmarks in, but it doesn't
     # matter where it is, unless the ABIs are different.
@@ -93,7 +93,7 @@
                                        self.machine_manager,
                                        logger_to_use,
                                        self.log_level,
-                                       self.share_users)
+                                       self.share_cache)
 
           benchmark_runs.append(benchmark_run)
     return benchmark_runs
diff --git a/crosperf/experiment_factory.py b/crosperf/experiment_factory.py
index 86bf19c..1fd5188 100644
--- a/crosperf/experiment_factory.py
+++ b/crosperf/experiment_factory.py
@@ -106,7 +106,7 @@
     cache_dir = global_settings.GetField("cache_dir")
     cache_only = global_settings.GetField("cache_only")
     config.AddConfig("no_email", global_settings.GetField("no_email"))
-    share_users = global_settings.GetField("share_users")
+    share_cache = global_settings.GetField("share_cache")
     results_dir = global_settings.GetField("results_dir")
     chrome_src = global_settings.GetField("chrome_src")
     show_all_results = global_settings.GetField("show_all_results")
@@ -213,7 +213,7 @@
                             cache_conditions, labels, benchmarks,
                             experiment_file.Canonicalize(),
                             email, acquire_timeout, log_dir, log_level,
-                            share_users,
+                            share_cache,
                             results_dir)
 
     return experiment
diff --git a/crosperf/results_cache.py b/crosperf/results_cache.py
index efdb405..de6e572 100644
--- a/crosperf/results_cache.py
+++ b/crosperf/results_cache.py
@@ -21,8 +21,7 @@
 
 from image_checksummer import ImageChecksummer
 
-SCRATCH_BASE = "/home/%s/cros_scratch"
-SCRATCH_DIR = SCRATCH_BASE % getpass.getuser()
+SCRATCH_DIR = os.path.expanduser("~/cros_scratch")
 RESULTS_FILE = "results.txt"
 MACHINE_FILE = "machine.txt"
 AUTOTEST_TARBALL = "autotest.tbz2"
@@ -471,7 +470,7 @@
 
   def Init(self, chromeos_image, chromeos_root, test_name, iteration,
            test_args, profiler_args, machine_manager, board, cache_conditions,
-           logger_to_use, log_level, label, share_users, suite,
+           logger_to_use, log_level, label, share_cache, suite,
            show_all_results):
     self.chromeos_image = chromeos_image
     self.chromeos_root = chromeos_root
@@ -486,7 +485,7 @@
     self._ce = command_executer.GetCommandExecuter(self._logger,
                                                    log_level=log_level)
     self.label = label
-    self.share_users = share_users
+    self.share_cache = share_cache
     self.suite = suite
     self.log_level = log_level
     self.show_all = show_all_results
@@ -514,10 +513,12 @@
     else:
       cache_path = [os.path.join(SCRATCH_DIR, cache_dir)]
 
-    if len(self.share_users):
-      for i in [x.strip() for x in self.share_users.split(",")]:
-        path = SCRATCH_BASE % i
-        cache_path.append(os.path.join(path, cache_dir))
+    if len(self.share_cache):
+      for path in [x.strip() for x in self.share_cache.split(",")]:
+        if os.path.exists(path):
+          cache_path.append(os.path.join(path, cache_dir))
+        else:
+          self._logger.LogFatal("Unable to find shared cache: %s" % path)
 
     return cache_path
 
diff --git a/crosperf/results_cache_unittest.py b/crosperf/results_cache_unittest.py
index dff51b3..0195968 100755
--- a/crosperf/results_cache_unittest.py
+++ b/crosperf/results_cache_unittest.py
@@ -792,7 +792,7 @@
                             self.mock_logger,
                             'average',
                             self.mock_label,
-                            '',         # benchmark_run.share_users
+                            '',         # benchmark_run.share_cache
                             'telemetry_Crosperf',
                             True)       # benchmark_run.show_all_results
 
diff --git a/crosperf/settings_factory.py b/crosperf/settings_factory.py
index 78abbc8..d86dc2b 100644
--- a/crosperf/settings_factory.py
+++ b/crosperf/settings_factory.py
@@ -127,9 +127,10 @@
                                description="When running Telemetry tests, "
                                "whether to all the results, instead of just "
                                "the default (summary) results."))
-    self.AddField(TextField("share_users", default="",
-                            description="Who's cache data you want to "
-                            "use. It accepts multiple users seperated by \",\""))
+    self.AddField(TextField("share_cache", default="",
+                            description="Path to alternat cache whose data "
+                            "you want to use. It accepts multiples directories"
+                            " se[arated bu a \",\""))
     self.AddField(TextField("results_dir", default="",
                             description="The results dir"))
     self.AddField(TextField("chrome_src",
diff --git a/crosperf/settings_factory_unittest.py b/crosperf/settings_factory_unittest.py
index f3376db..6c0d907 100644
--- a/crosperf/settings_factory_unittest.py
+++ b/crosperf/settings_factory_unittest.py
@@ -64,7 +64,7 @@
     self.assertEqual(res.GetField('cache_only'), False)
     self.assertEqual(res.GetField('no_email'), False)
     self.assertEqual(res.GetField('show_all_results'), False)
-    self.assertEqual(res.GetField('share_users'), '')
+    self.assertEqual(res.GetField('share_cache'), '')
     self.assertEqual(res.GetField('results_dir'), '')
     self.assertEqual(res.GetField('chrome_src'), '')