#!/usr/bin/python

# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import hashlib
import mock
import mock_instance
import os
import tempfile
import unittest

import image_checksummer
import machine_manager

from label import MockLabel
from results_cache import CacheConditions
from results_cache import Result
from results_cache import ResultsCache
from results_cache import TelemetryResult
from utils import command_executer
from utils import logger
from utils import misc

OUTPUT = """CMD (True): ./run_remote_tests.sh --remote=172.17.128.241  --board=lumpy   LibCBench
CMD (None): cd /usr/local/google/home/yunlian/gd/src/build/images/lumpy/latest/../../../../..; cros_sdk  -- ./in_chroot_cmd6X7Cxu.sh
Identity added: /tmp/run_remote_tests.PO1234567/autotest_key (/tmp/run_remote_tests.PO1234567/autotest_key)
INFO    : Using emerged autotests already installed at /build/lumpy/usr/local/autotest.

INFO    : Running the following control files 1 times:
INFO    :  * 'client/site_tests/platform_LibCBench/control'

INFO    : Running client test client/site_tests/platform_LibCBench/control
./server/autoserv -m 172.17.128.241 --ssh-port 22 -c client/site_tests/platform_LibCBench/control -r /tmp/run_remote_tests.PO1234567/platform_LibCBench --test-retry=0 --args 
ERROR:root:import statsd failed, no stats will be reported.
14:20:22 INFO | Results placed in /tmp/run_remote_tests.PO1234567/platform_LibCBench
14:20:22 INFO | Processing control file
14:20:23 INFO | Starting master ssh connection '/usr/bin/ssh -a -x -N -o ControlMaster=yes -o ControlPath=/tmp/_autotmp_VIIP67ssh-master/socket -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=30 -o ServerAliveInterval=180 -o ServerAliveCountMax=3 -o ConnectionAttempts=4 -o Protocol=2 -l root -p 22 172.17.128.241'
14:20:23 ERROR| [stderr] Warning: Permanently added '172.17.128.241' (RSA) to the list of known hosts.
14:20:23 INFO | INFO	----	----	kernel=3.8.11	localtime=May 22 14:20:23	timestamp=1369257623	
14:20:23 INFO | Installing autotest on 172.17.128.241
14:20:23 INFO | Using installation dir /usr/local/autotest
14:20:23 WARNI| No job_repo_url for <remote host: 172.17.128.241>
14:20:23 INFO | Could not install autotest using the packaging system: No repos to install an autotest client from. Trying other methods
14:20:23 INFO | Installation of autotest completed
14:20:24 WARNI| No job_repo_url for <remote host: 172.17.128.241>
14:20:24 INFO | Executing /usr/local/autotest/bin/autotest /usr/local/autotest/control phase 0
14:20:24 INFO | Entered autotestd_monitor.
14:20:24 INFO | Finished launching tail subprocesses.
14:20:24 INFO | Finished waiting on autotestd to start.
14:20:26 INFO | START	----	----	timestamp=1369257625	localtime=May 22 14:20:25	
14:20:26 INFO | 	START	platform_LibCBench	platform_LibCBench	timestamp=1369257625	localtime=May 22 14:20:25	
14:20:30 INFO | 		GOOD	platform_LibCBench	platform_LibCBench	timestamp=1369257630	localtime=May 22 14:20:30	completed successfully
14:20:30 INFO | 	END GOOD	platform_LibCBench	platform_LibCBench	timestamp=1369257630	localtime=May 22 14:20:30	
14:20:31 INFO | END GOOD	----	----	timestamp=1369257630	localtime=May 22 14:20:30	
14:20:31 INFO | Got lock of exit_code_file.
14:20:31 INFO | Released lock of exit_code_file and closed it.
OUTPUT: ==============================
OUTPUT: Current time: 2013-05-22 14:20:32.818831 Elapsed: 0:01:30 ETA: Unknown
Done: 0% [                                                  ]
OUTPUT: Thread Status:
RUNNING:  1 ('ttt: LibCBench (1)' 0:01:21)
Machine Status:
Machine                        Thread     Lock Status                    Checksum                        
172.17.128.241                 ttt: LibCBench (1) True RUNNING                   3ba9f2ecbb222f20887daea5583d86ba

OUTPUT: ==============================
14:20:33 INFO | Killing child processes.
14:20:33 INFO | Client complete
14:20:33 INFO | Finished processing control file
14:20:33 INFO | Starting master ssh connection '/usr/bin/ssh -a -x -N -o ControlMaster=yes -o ControlPath=/tmp/_autotmp_aVJUgmssh-master/socket -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=30 -o ServerAliveInterval=180 -o ServerAliveCountMax=3 -o ConnectionAttempts=4 -o Protocol=2 -l root -p 22 172.17.128.241'
14:20:33 ERROR| [stderr] Warning: Permanently added '172.17.128.241' (RSA) to the list of known hosts.

INFO    : Test results:
-------------------------------------------------------------------
platform_LibCBench                                      [  PASSED  ]
platform_LibCBench/platform_LibCBench                   [  PASSED  ]
platform_LibCBench/platform_LibCBench                     b_malloc_big1__0_                                     0.00375231466667
platform_LibCBench/platform_LibCBench                     b_malloc_big2__0_                                     0.002951359
platform_LibCBench/platform_LibCBench                     b_malloc_bubble__0_                                   0.015066374
platform_LibCBench/platform_LibCBench                     b_malloc_sparse__0_                                   0.015053784
platform_LibCBench/platform_LibCBench                     b_malloc_thread_local__0_                             0.01138439
platform_LibCBench/platform_LibCBench                     b_malloc_thread_stress__0_                            0.0367894733333
platform_LibCBench/platform_LibCBench                     b_malloc_tiny1__0_                                    0.000768474333333
platform_LibCBench/platform_LibCBench                     b_malloc_tiny2__0_                                    0.000581407333333
platform_LibCBench/platform_LibCBench                     b_pthread_create_serial1__0_                          0.0291785246667
platform_LibCBench/platform_LibCBench                     b_pthread_createjoin_serial1__0_                      0.031907936
platform_LibCBench/platform_LibCBench                     b_pthread_createjoin_serial2__0_                      0.043485347
platform_LibCBench/platform_LibCBench                     b_pthread_uselesslock__0_                             0.0294113346667
platform_LibCBench/platform_LibCBench                     b_regex_compile____a_b_c__d_b__                       0.00529833933333
platform_LibCBench/platform_LibCBench                     b_regex_search____a_b_c__d_b__                        0.00165455066667
platform_LibCBench/platform_LibCBench                     b_regex_search___a_25_b__                             0.0496191923333
platform_LibCBench/platform_LibCBench                     b_stdio_putcgetc__0_                                  0.100005711667
platform_LibCBench/platform_LibCBench                     b_stdio_putcgetc_unlocked__0_                         0.0371443833333
platform_LibCBench/platform_LibCBench                     b_string_memset__0_                                   0.00275405066667
platform_LibCBench/platform_LibCBench                     b_string_strchr__0_                                   0.00456903
platform_LibCBench/platform_LibCBench                     b_string_strlen__0_                                   0.044893587
platform_LibCBench/platform_LibCBench                     b_string_strstr___aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac__ 0.118360778
platform_LibCBench/platform_LibCBench                     b_string_strstr___aaaaaaaaaaaaaaaaaaaaaaaaac__        0.068957325
platform_LibCBench/platform_LibCBench                     b_string_strstr___aaaaaaaaaaaaaacccccccccccc__        0.0135694476667
platform_LibCBench/platform_LibCBench                     b_string_strstr___abcdefghijklmnopqrstuvwxyz__        0.0134553343333
platform_LibCBench/platform_LibCBench                     b_string_strstr___azbycxdwevfugthsirjqkplomn__        0.0133123556667
platform_LibCBench/platform_LibCBench                     b_utf8_bigbuf__0_                                     0.0473772253333
platform_LibCBench/platform_LibCBench                     b_utf8_onebyone__0_                                   0.130938538333
-------------------------------------------------------------------
Total PASS: 2/2 (100%)

INFO    : Elapsed time: 0m16s 
"""

error = """
ERROR: Identity added: /tmp/run_remote_tests.Z4Ld/autotest_key (/tmp/run_remote_tests.Z4Ld/autotest_key)
INFO    : Using emerged autotests already installed at /build/lumpy/usr/local/autotest.
INFO    : Running the following control files 1 times:
INFO    :  * 'client/site_tests/platform_LibCBench/control'
INFO    : Running client test client/site_tests/platform_LibCBench/control
INFO    : Test results:
INFO    : Elapsed time: 0m18s
"""


keyvals = {'': 'PASS', 'b_stdio_putcgetc__0_': '0.100005711667', 'b_string_strstr___azbycxdwevfugthsirjqkplomn__': '0.0133123556667', 'b_malloc_thread_local__0_': '0.01138439', 'b_string_strlen__0_': '0.044893587', 'b_malloc_sparse__0_': '0.015053784', 'b_string_memset__0_': '0.00275405066667', 'platform_LibCBench': 'PASS', 'b_pthread_uselesslock__0_': '0.0294113346667', 'b_string_strchr__0_': '0.00456903', 'b_pthread_create_serial1__0_': '0.0291785246667', 'b_string_strstr___aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac__': '0.118360778', 'b_string_strstr___aaaaaaaaaaaaaacccccccccccc__': '0.0135694476667', 'b_pthread_createjoin_serial1__0_': '0.031907936', 'b_malloc_thread_stress__0_': '0.0367894733333', 'b_regex_search____a_b_c__d_b__': '0.00165455066667', 'b_malloc_bubble__0_': '0.015066374', 'b_malloc_big2__0_': '0.002951359', 'b_stdio_putcgetc_unlocked__0_': '0.0371443833333', 'b_pthread_createjoin_serial2__0_': '0.043485347', 'b_regex_search___a_25_b__': '0.0496191923333', 'b_utf8_bigbuf__0_': '0.0473772253333', 'b_malloc_big1__0_': '0.00375231466667', 'b_regex_compile____a_b_c__d_b__': '0.00529833933333', 'b_string_strstr___aaaaaaaaaaaaaaaaaaaaaaaaac__': '0.068957325', 'b_malloc_tiny2__0_': '0.000581407333333', 'b_utf8_onebyone__0_': '0.130938538333', 'b_malloc_tiny1__0_': '0.000768474333333', 'b_string_strstr___abcdefghijklmnopqrstuvwxyz__': '0.0134553343333'}


TMP_DIR1 = '/tmp/tmpAbcXyz'

class MockResult(Result):

  def __init__(self, logger, label, logging_level):
    super(MockResult, self).__init__(logger, label, logging_level)

  def _FindFilesInResultsDir(self, find_args):
    return ''

  def _GetKeyvals(self, show_all_results):
    return keyvals


class ResultTest(unittest.TestCase):

  mock_label = MockLabel('mock_label', 'chromeos_image', '/tmp', 'lumpy',
                         'remote', 'image_args', 'cache_dir', False)
  mock_logger = mock.Mock(spec=logger.Logger)
  mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)

  def testCreateFromRun(self):
    result = MockResult.CreateFromRun(logger.GetLogger(), 'average',
                                      self.mock_label,
                                      OUTPUT, error, 0, True, 0)
    self.assertEqual(result.keyvals, keyvals)
    self.assertEqual(result.chroot_results_dir,
                     '/tmp/run_remote_tests.PO1234567/platform_LibCBench')
    self.assertEqual(result.results_dir,
        '/tmp/chroot/tmp/run_remote_tests.PO1234567/platform_LibCBench')
    self.assertEqual(result.retval, 0)



  def setUp(self):
    self.result = Result(self.mock_logger, self.mock_label, 'average',
                         self.mock_cmd_exec)

  @mock.patch.object(os.path, 'isdir')
  @mock.patch.object(command_executer.CommandExecuter, 'RunCommand')
  @mock.patch.object(command_executer.CommandExecuter, 'CopyFiles')
  def test_copy_files_to(self, mock_copyfiles, mock_runcmd, mock_isdir):

    files = ['src_file_1', 'src_file_2', 'src_file_3']
    dest_dir = '/tmp/test'
    self.mock_cmd_exec.RunCommand = mock_runcmd
    self.mock_cmd_exec.CopyFiles = mock_copyfiles

    mock_copyfiles.return_value = 0

    #test 1. dest_dir exists; CopyFiles returns 0.
    mock_isdir.return_value = True
    self.result._CopyFilesTo(dest_dir, files)
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertEqual(mock_copyfiles.call_count, 3)
    first_args = mock_copyfiles.call_args_list[0][0]
    second_args = mock_copyfiles.call_args_list[1][0]
    third_args = mock_copyfiles.call_args_list[2][0]
    self.assertEqual(first_args, ('src_file_1', '/tmp/test/src_file_1.0'))
    self.assertEqual(second_args, ('src_file_2', '/tmp/test/src_file_2.0'))
    self.assertEqual(third_args, ('src_file_3', '/tmp/test/src_file_3.0'))

    mock_runcmd.reset_mock()
    mock_copyfiles.reset_mock()
    #test 2. dest_dir does not exist; CopyFiles returns 0.
    mock_isdir.return_value = False
    self.result._CopyFilesTo(dest_dir, files)
    self.assertEqual(mock_runcmd.call_count, 3)
    self.assertEqual(mock_copyfiles.call_count, 3)
    self.assertEqual(mock_runcmd.call_args_list[0],
                     mock_runcmd.call_args_list[1])
    self.assertEqual(mock_runcmd.call_args_list[0],
                     mock_runcmd.call_args_list[2])
    self.assertEqual(mock_runcmd.call_args_list[0][0], ('mkdir -p /tmp/test',))

    #test 3. CopyFiles returns 1 (fails).
    mock_copyfiles.return_value = 1
    self.assertRaises(Exception, self.result._CopyFilesTo, dest_dir, files)


  @mock.patch.object (Result, '_CopyFilesTo')
  def test_copy_results_to(self, mock_CopyFilesTo):
    perf_data_files = ['/tmp/perf.data.0', '/tmp/perf.data.1',
                       '/tmp/perf.data.2']
    perf_report_files = ['/tmp/perf.report.0', '/tmp/perf.report.1',
                         '/tmp/perf.report.2']

    self.result.perf_data_files = perf_data_files
    self.result.perf_report_files = perf_report_files

    self.result._CopyFilesTo = mock_CopyFilesTo
    self.result.CopyResultsTo('/tmp/results/')
    self.assertEqual(mock_CopyFilesTo.call_count, 2)
    self.assertEqual(len(mock_CopyFilesTo.call_args_list), 2)
    self.assertEqual(mock_CopyFilesTo.call_args_list[0][0],
                     ('/tmp/results/', perf_data_files))
    self.assertEqual(mock_CopyFilesTo.call_args_list[1][0],
                     ('/tmp/results/', perf_report_files))


  def test_get_new_keyvals(self):
    kv_dict = {}

    def FakeGetDataMeasurementsFiles():
      filename = os.path.join(os.getcwd(), 'unittest_keyval_file.txt')
      return [filename]

    self.result._GetDataMeasurementsFiles = FakeGetDataMeasurementsFiles
    kv_dict2, udict = self.result._GetNewKeyvals(kv_dict)
    self.assertEqual(kv_dict2,
              {u'Box2D__Box2D': 4775, u'Mandreel__Mandreel': 6620,
               u'Gameboy__Gameboy': 9901, u'Crypto__Crypto': 8737,
               u'telemetry_page_measurement_results__num_errored': 0,
               u'telemetry_page_measurement_results__num_failed': 0,
               u'PdfJS__PdfJS': 6455, u'Total__Score': 7918,
               u'EarleyBoyer__EarleyBoyer': 14340,
               u'MandreelLatency__MandreelLatency': 5188,
               u'CodeLoad__CodeLoad': 6271, u'DeltaBlue__DeltaBlue': 14401,
               u'Typescript__Typescript': 9815,
               u'SplayLatency__SplayLatency': 7653, u'zlib__zlib': 16094,
               u'Richards__Richards': 10358, u'RegExp__RegExp': 1765,
               u'NavierStokes__NavierStokes': 9815, u'Splay__Splay': 4425,
               u'RayTrace__RayTrace': 16600})
    self.assertEqual(udict,
              {u'Box2D__Box2D': u'score', u'Mandreel__Mandreel': u'score',
               u'Gameboy__Gameboy': u'score', u'Crypto__Crypto': u'score',
               u'telemetry_page_measurement_results__num_errored': u'count',
               u'telemetry_page_measurement_results__num_failed': u'count',
               u'PdfJS__PdfJS': u'score', u'Total__Score': u'score',
               u'EarleyBoyer__EarleyBoyer': u'score',
               u'MandreelLatency__MandreelLatency': u'score',
               u'CodeLoad__CodeLoad': u'score',
               u'DeltaBlue__DeltaBlue': u'score',
               u'Typescript__Typescript': u'score',
               u'SplayLatency__SplayLatency': u'score', u'zlib__zlib': u'score',
               u'Richards__Richards': u'score', u'RegExp__RegExp': u'score',
               u'NavierStokes__NavierStokes': u'score',
               u'Splay__Splay': u'score', u'RayTrace__RayTrace': u'score'})


  def test_append_telemetry_units(self):
    kv_dict = {u'Box2D__Box2D': 4775, u'Mandreel__Mandreel': 6620,
               u'Gameboy__Gameboy': 9901, u'Crypto__Crypto': 8737,
               u'PdfJS__PdfJS': 6455, u'Total__Score': 7918,
               u'EarleyBoyer__EarleyBoyer': 14340,
               u'MandreelLatency__MandreelLatency': 5188,
               u'CodeLoad__CodeLoad': 6271, u'DeltaBlue__DeltaBlue': 14401,
               u'Typescript__Typescript': 9815,
               u'SplayLatency__SplayLatency': 7653, u'zlib__zlib': 16094,
               u'Richards__Richards': 10358, u'RegExp__RegExp': 1765,
               u'NavierStokes__NavierStokes': 9815, u'Splay__Splay': 4425,
               u'RayTrace__RayTrace': 16600}
    units_dict = {u'Box2D__Box2D': u'score', u'Mandreel__Mandreel': u'score',
                  u'Gameboy__Gameboy': u'score', u'Crypto__Crypto': u'score',
                  u'PdfJS__PdfJS': u'score', u'Total__Score': u'score',
                  u'EarleyBoyer__EarleyBoyer': u'score',
                  u'MandreelLatency__MandreelLatency': u'score',
                  u'CodeLoad__CodeLoad': u'score',
                  u'DeltaBlue__DeltaBlue': u'score',
                  u'Typescript__Typescript': u'score',
                  u'SplayLatency__SplayLatency': u'score',
                  u'zlib__zlib': u'score',
                  u'Richards__Richards': u'score', u'RegExp__RegExp': u'score',
                  u'NavierStokes__NavierStokes': u'score',
                  u'Splay__Splay': u'score', u'RayTrace__RayTrace': u'score'}

    results_dict = self.result._AppendTelemetryUnits(kv_dict, units_dict)
    self.assertEqual(results_dict,
                     {u'Box2D__Box2D': [4775, u'score'],
                      u'Splay__Splay': [4425, u'score'],
                      u'Gameboy__Gameboy': [9901, u'score'],
                      u'Crypto__Crypto': [8737, u'score'],
                      u'PdfJS__PdfJS': [6455, u'score'],
                      u'Total__Score': [7918, u'score'],
                      u'EarleyBoyer__EarleyBoyer': [14340, u'score'],
                      u'MandreelLatency__MandreelLatency': [5188, u'score'],
                      u'DeltaBlue__DeltaBlue': [14401, u'score'],
                      u'SplayLatency__SplayLatency': [7653, u'score'],
                      u'Mandreel__Mandreel': [6620, u'score'],
                      u'Richards__Richards': [10358, u'score'],
                      u'zlib__zlib': [16094, u'score'],
                      u'CodeLoad__CodeLoad': [6271, u'score'],
                      u'Typescript__Typescript': [9815, u'score'],
                      u'RegExp__RegExp': [1765, u'score'],
                      u'RayTrace__RayTrace': [16600, u'score'],
                      u'NavierStokes__NavierStokes': [9815, u'score']})


  @mock.patch.object (misc, 'GetInsideChrootPath')
  @mock.patch.object (tempfile, 'mkdtemp')
  @mock.patch.object (command_executer.CommandExecuter, 'RunCommand')
  @mock.patch.object (command_executer.CommandExecuter, 'ChrootRunCommand')
  def test_get_keyvals(self, mock_chrootruncmd, mock_runcmd, mock_mkdtemp,
                       mock_getpath):

    self.kv_dict = {}
    self.call_GetNewKeyvals = False

    def reset():
      self.kv_dict = {}
      self.call_GetNewKeyvals = False
      mock_chrootruncmd.reset_mock()
      mock_runcmd.reset_mock()
      mock_mkdtemp.reset_mock()
      mock_getpath.reset_mock()

    def FakeGetNewKeyvals(kv_dict):
      self.kv_dict = kv_dict
      self.call_GetNewKeyvals = True
      return_kvdict = { 'first_time' : 680, 'Total' : 10}
      return_udict = { 'first_time' : 'ms', 'Total' : 'score'}
      return return_kvdict, return_udict


    mock_mkdtemp.return_value = TMP_DIR1
    mock_chrootruncmd.return_value = ['',
                                      ('%s,PASS\n%s/telemetry_Crosperf,PASS\n')
                                      % (TMP_DIR1, TMP_DIR1),
                                       '']
    mock_getpath.return_value = TMP_DIR1
    self.result._ce.ChrootRunCommand = mock_chrootruncmd
    self.result._ce.RunCommand = mock_runcmd
    self.result._GetNewKeyvals = FakeGetNewKeyvals
    self.result.suite = 'telemetry_Crosperf'
    self.result.results_dir = '/tmp/test_that_resultsNmq'

    # Test 1. no self._temp_dir.
    res = self.result._GetKeyvals(True)
    self.assertTrue(self.call_GetNewKeyvals)
    self.assertEqual(self.kv_dict, { '': 'PASS', 'telemetry_Crosperf': 'PASS' })
    self.assertEqual(mock_runcmd.call_count, 1)
    self.assertEqual(mock_runcmd.call_args_list[0][0],
                     ('cp -r /tmp/test_that_resultsNmq/* %s' % TMP_DIR1,))
    self.assertEqual(mock_chrootruncmd.call_count, 1)
    self.assertEqual(mock_chrootruncmd.call_args_list[0][0],
                     ('/tmp',
                      ('python generate_test_report --no-color --csv %s') %
                      TMP_DIR1))
    self.assertEqual(mock_getpath.call_count, 1)
    self.assertEqual(mock_mkdtemp.call_count, 1)
    self.assertEqual(res, {'Total': [10, 'score'], 'first_time': [680, 'ms']})


    # Test 2. self._temp_dir
    reset()
    mock_chrootruncmd.return_value = ['',
                                      ('/tmp/tmpJCajRG,PASS\n/tmp/tmpJCajRG/'
                                       'telemetry_Crosperf,PASS\n'),
                                       '']
    mock_getpath.return_value = '/tmp/tmpJCajRG'
    self.result._temp_dir = '/tmp/tmpJCajRG'
    res = self.result._GetKeyvals(True)
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertEqual(mock_mkdtemp.call_count, 0)
    self.assertEqual(mock_chrootruncmd.call_count, 1)
    self.assertTrue(self.call_GetNewKeyvals)
    self.assertEqual(self.kv_dict, { '': 'PASS', 'telemetry_Crosperf': 'PASS' })
    self.assertEqual(res, {'Total': [10, 'score'], 'first_time': [680, 'ms']})

    # Test 3. suite != telemetry_Crosperf.  Normally this would be for
    # running non-Telemetry autotests, such as BootPerfServer.  In this test
    # case, the keyvals we have set up were returned from a Telemetry test run;
    # so this pass is basically testing that we don't append the units to the
    # test results (which we do for Telemetry autotest runs).
    reset()
    self.result.suite = ''
    res = self.result._GetKeyvals(True)
    self.assertEqual(res, {'Total': 10, 'first_time': 680 })


  def test_get_results_dir(self):

    self.result.out = ''
    self.assertRaises(Exception, self.result._GetResultsDir)

    self.result.out = OUTPUT
    resdir = self.result._GetResultsDir()
    self.assertEqual(resdir,
                     '/tmp/run_remote_tests.PO1234567/platform_LibCBench')


  @mock.patch.object (command_executer.CommandExecuter, 'RunCommand')
  def test_find_files_in_results_dir(self, mock_runcmd):

    self.result.results_dir = None
    res = self.result._FindFilesInResultsDir('-name perf.data')
    self.assertIsNone(res)

    self.result._ce.RunCommand = mock_runcmd
    self.result.results_dir = '/tmp/test_results'
    mock_runcmd.return_value = [0, '/tmp/test_results/perf.data', '']
    res = self.result._FindFilesInResultsDir('-name perf.data')
    self.assertEqual(mock_runcmd.call_count, 1)
    self.assertEqual(mock_runcmd.call_args_list[0][0],
                     ('find /tmp/test_results -name perf.data',))
    self.assertEqual(res, '/tmp/test_results/perf.data')

    mock_runcmd.reset_mock()
    mock_runcmd.return_value = [1, '', '']
    self.assertRaises(Exception, self.result._FindFilesInResultsDir,
                      '-name perf.data')



  @mock.patch.object (Result, '_FindFilesInResultsDir')
  def test_get_perf_data_files(self, mock_findfiles):
    self.args = None

    mock_findfiles.return_value = 'line1\nline1\n'
    self.result._FindFilesInResultsDir = mock_findfiles
    res = self.result._GetPerfDataFiles()
    self.assertEqual(res, ['line1', 'line1'])
    self.assertEqual(mock_findfiles.call_args_list[0][0], ('-name perf.data',))


  def test_get_perf_report_files(self):
    self.args = None

    def FakeFindFiles(find_args):
      self.args = find_args
      return 'line1\nline1\n'

    self.result._FindFilesInResultsDir = FakeFindFiles
    res = self.result._GetPerfReportFiles()
    self.assertEqual(res, ['line1', 'line1'])
    self.assertEqual(self.args, '-name perf.data.report')


  def test_get_data_measurement_files(self):
    self.args = None

    def FakeFindFiles(find_args):
      self.args = find_args
      return 'line1\nline1\n'

    self.result._FindFilesInResultsDir = FakeFindFiles
    res = self.result._GetDataMeasurementsFiles()
    self.assertEqual(res, ['line1', 'line1'])
    self.assertEqual(self.args, '-name perf_measurements')


  @mock.patch.object (misc, 'GetInsideChrootPath')
  @mock.patch.object (command_executer.CommandExecuter, 'ChrootRunCommand')
  def test_generate_perf_report_files(self, mock_chrootruncmd, mock_getpath):
    fake_file = '/usr/chromeos/chroot/tmp/results/fake_file'
    self.result.perf_data_files = ['/tmp/results/perf.data']
    self.result._board = 'lumpy'
    mock_getpath.return_value = fake_file
    self.result._ce.ChrootRunCommand = mock_chrootruncmd
    tmp = self.result._GeneratePerfReportFiles()
    self.assertEqual(tmp, ['/tmp/chroot%s' % fake_file])
    self.assertEqual(mock_chrootruncmd.call_args_list[0][0],
                     ('/tmp',
                      ('/tmp/perf.static report -n --symfs /build/lumpy '
                       '--vmlinux /build/lumpy/usr/lib/debug/boot/vmlinux '
                       '--kallsyms /build/lumpy/boot/System.map-* -i '
                       '%s --stdio > %s') % (fake_file, fake_file)))



  @mock.patch.object (misc, 'GetOutsideChrootPath')
  def test_populate_from_run(self, mock_getpath):

    def FakeGetResultsDir():
      self.callGetResultsDir = True
      return '/tmp/results_dir'

    def FakeGetPerfDataFiles():
      self.callGetPerfDataFiles = True
      return []

    def FakeGetPerfReportFiles():
      self.callGetPerfReportFiles = True
      return []

    def FakeProcessResults(show_results):
      self.callProcessResults = True

    mock.get_path = '/tmp/chromeos/tmp/results_dir'
    self.result._chromeos_root = '/tmp/chromeos'

    self.callGetResultsDir = False
    self.callGetPerfDataFiles = False
    self.callGetPerfReportFiles = False
    self.callProcessResults = False

    self.result._GetResultsDir = FakeGetResultsDir
    self.result._GetPerfDataFiles = FakeGetPerfDataFiles
    self.result._GeneratePerfReportFiles = FakeGetPerfReportFiles
    self.result._ProcessResults = FakeProcessResults

    self.result._PopulateFromRun(OUTPUT, '', 0, True, 'test',
                                 'telemetry_Crosperf')
    self.assertTrue(self.callGetResultsDir)
    self.assertTrue(self.callGetPerfDataFiles)
    self.assertTrue(self.callGetPerfReportFiles)
    self.assertTrue(self.callProcessResults)

  def test_process_results(self):

    def FakeGetKeyvals(show_all):
      if show_all:
        return { 'first_time' : 680, 'Total' : 10}
      else:
        return { 'Total' : 10}

    def FakeGatherPerfResults():
      self.callGatherPerfResults = True

    self.callGatherPerfResults = False

    self.result._GetKeyvals = FakeGetKeyvals
    self.result._GatherPerfResults = FakeGatherPerfResults

    self.result.retval = 0
    self.result._ProcessResults(True)
    self.assertTrue(self.callGatherPerfResults)
    self.assertEqual(len(self.result.keyvals), 3)
    self.assertEqual(self.result.keyvals,
                     { 'first_time' : 680, 'Total' : 10, 'retval' : 0 })

    self.result.retval = 1
    self.result._ProcessResults(False)
    self.assertEqual(len(self.result.keyvals), 2)
    self.assertEqual(self.result.keyvals,
                     { 'Total' : 10, 'retval' : 1 })


  @mock.patch.object (misc, 'GetInsideChrootPath')
  @mock.patch.object (command_executer.CommandExecuter, 'ChrootRunCommand')
  def test_populate_from_cache_dir(self, mock_runchrootcmd, mock_getpath):

    def FakeMkdtemp(dir=''):
      return self.tmpdir

    current_path = os.getcwd()
    cache_dir = os.path.join(current_path, 'test_cache/test_input')
    self.result._ce = command_executer.GetCommandExecuter(log_level='average')
    self.result._ce.ChrootRunCommand = mock_runchrootcmd
    mock_runchrootcmd.return_value = ['',
                                      ('%s,PASS\n%s/\telemetry_Crosperf,PASS\n')
                                      % (TMP_DIR1, TMP_DIR1),
                                      '']
    mock_getpath.return_value = TMP_DIR1
    self.tmpdir = tempfile.mkdtemp()
    save_real_mkdtemp = tempfile.mkdtemp
    tempfile.mkdtemp = FakeMkdtemp

    self.result._PopulateFromCacheDir(cache_dir, True, 'sunspider',
                                      'telemetry_Crosperf')
    self.assertEqual(self.result.keyvals,
                     {u'Total__Total': [444.0, u'ms'],
                      u'regexp-dna__regexp-dna': [16.2, u'ms'],
                      u'telemetry_page_measurement_results__num_failed':
                        [0, u'count'],
                      u'telemetry_page_measurement_results__num_errored':
                        [0, u'count'],
                      u'string-fasta__string-fasta': [23.2, u'ms'],
                      u'crypto-sha1__crypto-sha1': [11.6, u'ms'],
                      u'bitops-3bit-bits-in-byte__bitops-3bit-bits-in-byte':
                        [3.2, u'ms'],
                      u'access-nsieve__access-nsieve': [7.9, u'ms'],
                      u'bitops-nsieve-bits__bitops-nsieve-bits': [9.4, u'ms'],
                      u'string-validate-input__string-validate-input':
                        [19.3, u'ms'],
                      u'3d-raytrace__3d-raytrace': [24.7, u'ms'],
                      u'3d-cube__3d-cube': [28.0, u'ms'],
                      u'string-unpack-code__string-unpack-code': [46.7, u'ms'],
                      u'date-format-tofte__date-format-tofte': [26.3, u'ms'],
                      u'math-partial-sums__math-partial-sums': [22.0, u'ms'],
                      '\telemetry_Crosperf': ['PASS', ''],
                      u'crypto-aes__crypto-aes': [15.2, u'ms'],
                      u'bitops-bitwise-and__bitops-bitwise-and': [8.4, u'ms'],
                      u'crypto-md5__crypto-md5': [10.5, u'ms'],
                      u'string-tagcloud__string-tagcloud': [52.8, u'ms'],
                      u'access-nbody__access-nbody': [8.5, u'ms'],
                      'retval': 0,
                      u'math-spectral-norm__math-spectral-norm': [6.6, u'ms'],
                      u'math-cordic__math-cordic': [8.7, u'ms'],
                      u'access-binary-trees__access-binary-trees': [4.5, u'ms'],
                      u'controlflow-recursive__controlflow-recursive':
                        [4.4, u'ms'],
                      u'access-fannkuch__access-fannkuch': [17.8, u'ms'],
                      u'string-base64__string-base64': [16.0, u'ms'],
                      u'date-format-xparb__date-format-xparb': [20.9, u'ms'],
                      u'3d-morph__3d-morph': [22.1, u'ms'],
                      u'bitops-bits-in-byte__bitops-bits-in-byte': [9.1, u'ms']
                      })


    # Clean up after test.
    tempfile.mkdtemp = save_real_mkdtemp
    command = 'rm -Rf %s' % self.tmpdir
    self.result._ce.RunCommand(command)


  @mock.patch.object (misc, 'GetRoot')
  @mock.patch.object (command_executer.CommandExecuter, 'RunCommand')
  def test_cleanup(self, mock_runcmd, mock_getroot):

    # Test 1. 'rm_chroot_tmp' is True; self.results_dir exists;
    # self._temp_dir exists; results_dir name contains 'test_that_results_'.
    mock_getroot.return_value = ['/tmp/tmp_AbcXyz', 'test_that_results_fake']
    self.result._ce.RunCommand = mock_runcmd
    self.result.results_dir = 'test_results_dir'
    self.result._temp_dir = 'test_temp_dir'
    self.result.CleanUp(True)
    self.assertEqual(mock_getroot.call_count, 1)
    self.assertEqual(mock_runcmd.call_count, 2)
    self.assertEqual(mock_runcmd.call_args_list[0][0],
                     ('rm -rf test_results_dir',))
    self.assertEqual(mock_runcmd.call_args_list[1][0],
                     ('rm -rf test_temp_dir',))

    # Test 2. Same, except ath results_dir name does not contain
    # 'test_that_results_'
    mock_getroot.reset_mock()
    mock_runcmd.reset_mock()
    mock_getroot.return_value = ['/tmp/tmp_AbcXyz', 'other_results_fake']
    self.result._ce.RunCommand = mock_runcmd
    self.result.results_dir = 'test_results_dir'
    self.result._temp_dir = 'test_temp_dir'
    self.result.CleanUp(True)
    self.assertEqual(mock_getroot.call_count, 1)
    self.assertEqual(mock_runcmd.call_count, 2)
    self.assertEqual(mock_runcmd.call_args_list[0][0],
                     ('rm -rf /tmp/tmp_AbcXyz',))
    self.assertEqual(mock_runcmd.call_args_list[1][0],
                     ('rm -rf test_temp_dir',))

    # Test 3. mock_getroot returns nothing; 'rm_chroot_tmp' is False.
    mock_getroot.reset_mock()
    mock_runcmd.reset_mock()
    self.result.CleanUp(False)
    self.assertEqual(mock_getroot.call_count, 0)
    self.assertEqual(mock_runcmd.call_count, 1)
    self.assertEqual(mock_runcmd.call_args_list[0][0],
                     ('rm -rf test_temp_dir',))

    # Test 4. 'rm_chroot_tmp' is True, but result_dir & _temp_dir are None.
    mock_getroot.reset_mock()
    mock_runcmd.reset_mock()
    self.result.results_dir = None
    self.result._temp_dir = None
    self.result.CleanUp(True)
    self.assertEqual(mock_getroot.call_count, 0)
    self.assertEqual(mock_runcmd.call_count, 0)


  @mock.patch.object (misc, 'GetInsideChrootPath')
  @mock.patch.object (command_executer.CommandExecuter, 'ChrootRunCommand')
  def test_store_to_cache_dir(self, mock_chrootruncmd, mock_getpath):

    def FakeMkdtemp(dir=''):
      return self.tmpdir

    current_path = os.getcwd()
    cache_dir = os.path.join(current_path, 'test_cache/test_output')

    self.result._ce = command_executer.GetCommandExecuter(log_level='average')
    self.result.out = OUTPUT
    self.result.err = error
    self.result.retval = 0
    self.tmpdir = tempfile.mkdtemp()
    if not os.path.exists(self.tmpdir):
      os.makedirs(self.tmpdir)
    self.result.results_dir = os.path.join(os.getcwd(), 'test_cache')
    save_real_mkdtemp = tempfile.mkdtemp
    tempfile.mkdtemp = FakeMkdtemp

    mock_mm = machine_manager.MockMachineManager('/tmp/chromeos_root', 0,
                                                 'average')
    mock_mm.machine_checksum_string['mock_label'] = 'fake_machine_checksum123'

    self.result.StoreToCacheDir(cache_dir, mock_mm)

    # Check that the correct things were written to the 'cache'.
    test_dir = os.path.join(os.getcwd(), 'test_cache/test_output')
    base_dir = os.path.join(os.getcwd(), 'test_cache/compare_output')
    self.assertTrue(os.path.exists(os.path.join(test_dir, 'autotest.tbz2')))
    self.assertTrue(os.path.exists(os.path.join(test_dir, 'machine.txt')))
    self.assertTrue(os.path.exists(os.path.join(test_dir, 'results.txt')))

    f1 = os.path.join(test_dir, 'machine.txt')
    f2 = os.path.join(base_dir, 'machine.txt')
    cmd = 'diff %s %s' % (f1, f2)
    [_, out, _] = self.result._ce.RunCommand(cmd, return_output=True)
    self.assertEqual(len(out), 0)

    f1 = os.path.join(test_dir, 'results.txt')
    f2 = os.path.join(base_dir, 'results.txt')
    cmd = 'diff %s %s' % (f1, f2)
    [_, out, _] = self.result._ce.RunCommand(cmd, return_output=True)
    self.assertEqual(len(out), 0)

    # Clean up after test.
    tempfile.mkdtemp = save_real_mkdtemp
    command = 'rm %s/*' % test_dir
    self.result._ce.RunCommand(command)


TELEMETRY_RESULT_KEYVALS = {'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html math-cordic (ms)': '11.4', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html access-nbody (ms)': '6.9', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html access-fannkuch (ms)': '26.3', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html math-spectral-norm (ms)': '6.3', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html bitops-nsieve-bits (ms)': '9.3', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html math-partial-sums (ms)': '32.8', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html regexp-dna (ms)': '16.1', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html 3d-cube (ms)': '42.7', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html crypto-md5 (ms)': '10.8', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html crypto-sha1 (ms)': '12.4', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html string-tagcloud (ms)': '47.2', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html string-fasta (ms)': '36.3', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html access-binary-trees (ms)': '7.3', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html date-format-xparb (ms)': '138.1', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html crypto-aes (ms)': '19.2', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html Total (ms)': '656.5', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html string-base64 (ms)': '17.5', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html string-validate-input (ms)': '24.8', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html 3d-raytrace (ms)': '28.7', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html controlflow-recursive (ms)': '5.3', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html bitops-bits-in-byte (ms)': '9.8', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html 3d-morph (ms)': '50.2', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html bitops-bitwise-and (ms)': '8.8', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html access-nsieve (ms)': '8.6', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html date-format-tofte (ms)': '31.2', 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html bitops-3bit-bits-in-byte (ms)': '3.5', 'retval': 0, 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html string-unpack-code (ms)': '45.0'}

PURE_TELEMETRY_OUTPUT = """page_name,3d-cube (ms),3d-morph (ms),3d-raytrace (ms),Total (ms),access-binary-trees (ms),access-fannkuch (ms),access-nbody (ms),access-nsieve (ms),bitops-3bit-bits-in-byte (ms),bitops-bits-in-byte (ms),bitops-bitwise-and (ms),bitops-nsieve-bits (ms),controlflow-recursive (ms),crypto-aes (ms),crypto-md5 (ms),crypto-sha1 (ms),date-format-tofte (ms),date-format-xparb (ms),math-cordic (ms),math-partial-sums (ms),math-spectral-norm (ms),regexp-dna (ms),string-base64 (ms),string-fasta (ms),string-tagcloud (ms),string-unpack-code (ms),string-validate-input (ms)\r\nhttp://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html,42.7,50.2,28.7,656.5,7.3,26.3,6.9,8.6,3.5,9.8,8.8,9.3,5.3,19.2,10.8,12.4,31.2,138.1,11.4,32.8,6.3,16.1,17.5,36.3,47.2,45.0,24.8\r\n"""

class TelemetryResultTest(unittest.TestCase):

  mock_logger = mock.Mock(spec=logger.Logger)
  mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)
  mock_label = MockLabel('mock_label', 'chromeos_image', '/tmp', 'lumpy',
                         'remote', 'image_args', 'cache_dir', False)

  def test_populate_from_run(self):

    def FakeProcessResults():
      self.callFakeProcessResults = True

    self.callFakeProcessResults = False
    self.result = TelemetryResult(self.mock_logger, self.mock_label,
                                  'average', self.mock_cmd_exec)
    self.result._ProcessResults = FakeProcessResults
    self.result._PopulateFromRun(OUTPUT, error, 3, False, 'fake_test',
                                 'telemetry_Crosperf')
    self.assertTrue(self.callFakeProcessResults)
    self.assertEqual(self.result.out, OUTPUT)
    self.assertEqual(self.result.err, error)
    self.assertEqual(self.result.retval, 3)


  def test_populate_from_cache_dir_and_process_results(self):

    self.result = TelemetryResult(self.mock_logger, self.mock_label,
                                  'average')
    current_path = os.getcwd()
    cache_dir = os.path.join(current_path,
                             'test_cache/test_puretelemetry_input')
    self.result._PopulateFromCacheDir(cache_dir)
    self.assertEqual(self.result.out, PURE_TELEMETRY_OUTPUT)
    self.assertEqual(self.result.err, '')
    self.assertEqual(self.result.retval, 0)
    self.assertEqual(self.result.keyvals, TELEMETRY_RESULT_KEYVALS)


class ResultsCacheTest(unittest.TestCase):

  mock_logger = mock.Mock(spec=logger.Logger)
  mock_label = MockLabel('mock_label', 'chromeos_image', '/tmp', 'lumpy',
                         'remote', 'image_args', 'cache_dir', False)
  def setUp(self):
    self.results_cache = ResultsCache()


    mock_mm = machine_manager.MockMachineManager('/tmp/chromeos_root', 0,
                                                 'average')
    mock_mm.machine_checksum_string['mock_label'] = 'fake_machine_checksum123'

    self.results_cache.Init(self.mock_label.chromeos_image,
                            self.mock_label.chromeos_root,
                            'sunspider',
                            1,          # benchmark_run.iteration,
                            '',         # benchmark_run.test_args,
                            '',         # benchmark_run.profiler_args,
                            mock_mm,
                            self.mock_label.board,
                            [CacheConditions.CACHE_FILE_EXISTS,
                             CacheConditions.CHECKSUMS_MATCH],
                            self.mock_logger,
                            'average',
                            self.mock_label,
                            '',         # benchmark_run.share_cache
                            'telemetry_Crosperf',
                            True)       # benchmark_run.show_all_results


  @mock.patch.object (image_checksummer.ImageChecksummer, 'Checksum')
  def test_get_cache_dir_for_write(self, mock_checksum):

    def FakeGetMachines(label):
      m1 = machine_manager.MockCrosMachine('lumpy1.cros',
                                           self.results_cache.chromeos_root,
                                           'average')
      m2 = machine_manager.MockCrosMachine('lumpy2.cros',
                                           self.results_cache.chromeos_root,
                                           'average')
      return  [m1, m2]


    mock_checksum.return_value = 'FakeImageChecksumabc123'
    self.results_cache.machine_manager.GetMachines = FakeGetMachines
    self.results_cache.machine_manager.machine_checksum['mock_label'] = \
        'FakeMachineChecksumabc987'
    # Based on the label, benchmark and machines, get the directory in which
    # to store the cache information for this test run.
    result_path = self.results_cache._GetCacheDirForWrite()
    # Verify that the returned directory is correct (since the label
    # contained a cache_dir, named 'cache_dir', that's what is expected in
    # the result, rather than '~/cros_scratch').
    comp_path = os.path.join(os.getcwd(),
                             'cache_dir/54524606abaae4fdf7b02f49f7ae7127_'
                             'sunspider_1_7215ee9c7d9dc229d2921a40e899ec5f_'
                             'FakeImageChecksumabc123_FakeMachineChecksum'
                             'abc987__6')
    self.assertEqual(result_path, comp_path)


  def test_form_cache_dir(self):
    # This is very similar to the previous test (_FormCacheDir is called
    # from _GetCacheDirForWrite).
    cache_key_list = ('54524606abaae4fdf7b02f49f7ae7127', 'sunspider', '1',
                      '7215ee9c7d9dc229d2921a40e899ec5f',
                      'FakeImageChecksumabc123', '*', '*', '6')
    path = self.results_cache._FormCacheDir(cache_key_list)
    self.assertEqual(len(path), 1)
    path1 = path[0]
    test_dirname = ('54524606abaae4fdf7b02f49f7ae7127_sunspider_1_7215ee9'
                    'c7d9dc229d2921a40e899ec5f_FakeImageChecksumabc123_*_*_6')
    comp_path = os.path.join(os.getcwd(), 'cache_dir', test_dirname)
    self.assertEqual(path1, comp_path)


  @mock.patch.object (image_checksummer.ImageChecksummer, 'Checksum')
  def test_get_cache_key_list(self, mock_checksum):
    # This tests the mechanism that generates the various pieces of the
    # cache directory name, based on various conditions.

    def FakeGetMachines(label):
      m1 = machine_manager.MockCrosMachine('lumpy1.cros',
                                           self.results_cache.chromeos_root,
                                           'average')
      m2 = machine_manager.MockCrosMachine('lumpy2.cros',
                                           self.results_cache.chromeos_root,
                                           'average')
      return  [m1, m2]


    mock_checksum.return_value = 'FakeImageChecksumabc123'
    self.results_cache.machine_manager.GetMachines = FakeGetMachines
    self.results_cache.machine_manager.machine_checksum['mock_label'] = \
        'FakeMachineChecksumabc987'

    # Test 1. Generating cache name for reading (not writing).
    key_list = self.results_cache._GetCacheKeyList(True)
    self.assertEqual(key_list[0], '*') # Machine checksum value, for read.
    self.assertEqual(key_list[1], 'sunspider')
    self.assertEqual(key_list[2], '1')
    self.assertEqual(key_list[3], '7215ee9c7d9dc229d2921a40e899ec5f')
    self.assertEqual(key_list[4], 'FakeImageChecksumabc123')
    self.assertEqual(key_list[5], '*')
    self.assertEqual(key_list[6], '*')
    self.assertEqual(key_list[7], '6')

    # Test 2. Generating cache name for writing, with local image type.
    key_list = self.results_cache._GetCacheKeyList(False)
    self.assertEqual(key_list[0], '54524606abaae4fdf7b02f49f7ae7127')
    self.assertEqual(key_list[1], 'sunspider')
    self.assertEqual(key_list[2], '1')
    self.assertEqual(key_list[3], '7215ee9c7d9dc229d2921a40e899ec5f')
    self.assertEqual(key_list[4], 'FakeImageChecksumabc123')
    self.assertEqual(key_list[5], 'FakeMachineChecksumabc987')
    self.assertEqual(key_list[6], '')
    self.assertEqual(key_list[7], '6')

    # Test 3. Generating cache name for writing, with trybot image type.
    self.results_cache.label.image_type = 'trybot'
    key_list = self.results_cache._GetCacheKeyList(False)
    self.assertEqual(key_list[0], '54524606abaae4fdf7b02f49f7ae7127')
    self.assertEqual(key_list[3], '7215ee9c7d9dc229d2921a40e899ec5f')
    self.assertEqual(key_list[4], '54524606abaae4fdf7b02f49f7ae7127')
    self.assertEqual(key_list[5], 'FakeMachineChecksumabc987')

    # Test 4. Generating cache name for writing, with official image type.
    self.results_cache.label.image_type = 'official'
    key_list = self.results_cache._GetCacheKeyList(False)
    self.assertEqual(key_list[0], '54524606abaae4fdf7b02f49f7ae7127')
    self.assertEqual(key_list[1], 'sunspider')
    self.assertEqual(key_list[2], '1')
    self.assertEqual(key_list[3], '7215ee9c7d9dc229d2921a40e899ec5f')
    self.assertEqual(key_list[4], '*')
    self.assertEqual(key_list[5], 'FakeMachineChecksumabc987')
    self.assertEqual(key_list[6], '')
    self.assertEqual(key_list[7], '6')

    # Test 5. Generating cache name for writing, with local image type, and
    # specifying that the image path must match the cached image path.
    self.results_cache.label.image_type = 'local'
    self.results_cache.cache_conditions.append(CacheConditions.IMAGE_PATH_MATCH)
    key_list = self.results_cache._GetCacheKeyList(False)
    self.assertEqual(key_list[0], '54524606abaae4fdf7b02f49f7ae7127')
    self.assertEqual(key_list[3], '7215ee9c7d9dc229d2921a40e899ec5f')
    self.assertEqual(key_list[4], 'FakeImageChecksumabc123')
    self.assertEqual(key_list[5], 'FakeMachineChecksumabc987')


  @mock.patch.object (command_executer.CommandExecuter, 'RunCommand')
  @mock.patch.object (os.path, 'isdir')
  @mock.patch.object (Result, 'CreateFromCacheHit')
  def test_read_result(self, mock_create, mock_isdir, mock_runcmd):

    self.fakeCacheReturnResult = None
    def FakeGetCacheDirForRead():
      return self.fakeCacheReturnResult

    def FakeGetCacheDirForWrite():
      return self.fakeCacheReturnResult

    mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)
    fake_result = Result(self.mock_logger, self.mock_label, 'average',
                         mock_cmd_exec)
    fake_result.retval = 0

    # Set up results_cache _GetCacheDirFor{Read,Write} to return
    # self.fakeCacheReturnResult, which is initially None (see above).
    # So initially, no cache dir is returned.
    self.results_cache._GetCacheDirForRead  = FakeGetCacheDirForRead
    self.results_cache._GetCacheDirForWrite = FakeGetCacheDirForWrite

    mock_isdir.return_value = True
    save_cc = [CacheConditions.CACHE_FILE_EXISTS,
               CacheConditions.CHECKSUMS_MATCH]
    self.results_cache.cache_conditions.append(CacheConditions.FALSE)

    # Test 1. CacheCondition.FALSE, which means do not read from the cache.
    # (force re-running of test).  Result should be None.
    res = self.results_cache.ReadResult()
    self.assertIsNone(res)
    self.assertEqual(mock_runcmd.call_count, 1)

    # Test 2. Remove CacheCondition.FALSE. Result should still be None,
    # because _GetCacheDirForRead is returning None at the moment.
    mock_runcmd.reset_mock()
    self.results_cache.cache_conditions = save_cc
    res = self.results_cache.ReadResult()
    self.assertIsNone(res)
    self.assertEqual(mock_runcmd.call_count, 0)

    # Test 3. Now set up cache dir to be returned by _GetCacheDirForRead.
    # Since cache_dir is found, will call Result.CreateFromCacheHit, which
    # which will actually all our mock_create and should return fake_result.
    self.fakeCacheReturnResult = 'fake/cache/dir'
    mock_create.return_value = fake_result
    res = self.results_cache.ReadResult()
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertEqual(res, fake_result)

    # Test 4. os.path.isdir(cache_dir) will now return false, so result
    # should be None again (no cache found).
    mock_isdir.return_value = False
    res = self.results_cache.ReadResult()
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertIsNone(res)

    # Test 5. os.path.isdir returns true, but mock_create now returns None
    # (the call to CreateFromCacheHit returns None), so overal result is None.
    mock_isdir.return_value = True
    mock_create.return_value = None
    res = self.results_cache.ReadResult()
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertIsNone(res)

    # Test 6. Everything works 'as expected', result should be fake_result.
    mock_create.return_value = fake_result
    res = self.results_cache.ReadResult()
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertEqual(res, fake_result)

    # Test 7. The run failed; result should be None.
    mock_create.return_value = fake_result
    fake_result.retval = 1
    self.results_cache.cache_conditions.append(CacheConditions.RUN_SUCCEEDED)
    res = self.results_cache.ReadResult()
    self.assertEqual(mock_runcmd.call_count, 0)
    self.assertIsNone(res)


if __name__ == '__main__':
  unittest.main()
