#!/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 StringIO
import unittest
from experiment_file import ExperimentFile

EXPERIMENT_FILE_1 = """
  board: x86-alex
  remote: chromeos-alex3
  perf_args: record -a -e cycles
  benchmark: PageCycler {
    iterations: 3
  }

  image1 {
    chromeos_image: /usr/local/google/cros_image1.bin
  }

  image2 {
    remote: chromeos-lumpy1
    chromeos_image: /usr/local/google/cros_image2.bin
  }
  """

EXPERIMENT_FILE_2 = """
  board: x86-alex
  remote: chromeos-alex3
  iterations: 3

  benchmark: PageCycler {
  }

  benchmark: AndroidBench {
    iterations: 2
  }

  image1 {
    chromeos_image:/usr/local/google/cros_image1.bin
  }

  image2 {
    chromeos_image: /usr/local/google/cros_image2.bin
  }
  """

EXPERIMENT_FILE_3 = """
  board: x86-alex
  remote: chromeos-alex3
  iterations: 3

  benchmark: PageCycler {
  }

  image1 {
    chromeos_image:/usr/local/google/cros_image1.bin
  }

  image1 {
    chromeos_image: /usr/local/google/cros_image2.bin
  }
  """

OUTPUT_FILE = """board: x86-alex
remote: chromeos-alex3
perf_args: record -a -e cycles

benchmark: PageCycler {
\titerations: 3
}

label: image1 {
\tremote: chromeos-alex3
\tchromeos_image: /usr/local/google/cros_image1.bin
}

label: image2 {
\tremote: chromeos-lumpy1
\tchromeos_image: /usr/local/google/cros_image2.bin
}\n\n"""


class ExperimentFileTest(unittest.TestCase):

  def testLoadExperimentFile1(self):
    input_file = StringIO.StringIO(EXPERIMENT_FILE_1)
    experiment_file = ExperimentFile(input_file)
    global_settings = experiment_file.GetGlobalSettings()
    self.assertEqual(global_settings.GetField('remote'), ['chromeos-alex3'])
    self.assertEqual(
        global_settings.GetField('perf_args'), 'record -a -e cycles')
    benchmark_settings = experiment_file.GetSettings('benchmark')
    self.assertEqual(len(benchmark_settings), 1)
    self.assertEqual(benchmark_settings[0].name, 'PageCycler')
    self.assertEqual(benchmark_settings[0].GetField('iterations'), 3)

    label_settings = experiment_file.GetSettings('label')
    self.assertEqual(len(label_settings), 2)
    self.assertEqual(label_settings[0].name, 'image1')
    self.assertEqual(label_settings[0].GetField('chromeos_image'),
                     '/usr/local/google/cros_image1.bin')
    self.assertEqual(label_settings[1].GetField('remote'), ['chromeos-lumpy1'])
    self.assertEqual(label_settings[0].GetField('remote'), ['chromeos-alex3'])

  def testOverrideSetting(self):
    input_file = StringIO.StringIO(EXPERIMENT_FILE_2)
    experiment_file = ExperimentFile(input_file)
    global_settings = experiment_file.GetGlobalSettings()
    self.assertEqual(global_settings.GetField('remote'), ['chromeos-alex3'])

    benchmark_settings = experiment_file.GetSettings('benchmark')
    self.assertEqual(len(benchmark_settings), 2)
    self.assertEqual(benchmark_settings[0].name, 'PageCycler')
    self.assertEqual(benchmark_settings[0].GetField('iterations'), 3)
    self.assertEqual(benchmark_settings[1].name, 'AndroidBench')
    self.assertEqual(benchmark_settings[1].GetField('iterations'), 2)

  def testDuplicateLabel(self):
    input_file = StringIO.StringIO(EXPERIMENT_FILE_3)
    self.assertRaises(Exception, ExperimentFile, input_file)

  def testCanonicalize(self):
    input_file = StringIO.StringIO(EXPERIMENT_FILE_1)
    experiment_file = ExperimentFile(input_file)
    res = experiment_file.Canonicalize()
    self.assertEqual(res, OUTPUT_FILE)


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