#!/usr/bin/env vpython
# Copyright 2015 The Chromium 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 os
import tempfile
import unittest

import orderfile_generator_backend

class TestOrderfileGenerator(unittest.TestCase):
  def testStepRecorder(self):
    """Checks that the step recorder records step timings correctly."""
    step_recorder = orderfile_generator_backend.StepRecorder(False)
    self.assertFalse(step_recorder.ErrorRecorded())
    step_recorder.BeginStep('foo')
    self.assertFalse(step_recorder.ErrorRecorded())
    step_recorder.BeginStep('bar')
    self.assertFalse(step_recorder.ErrorRecorded())
    step_recorder.FailStep()
    self.assertEqual(2, len(step_recorder.timings))
    self.assertEqual('foo', step_recorder.timings[0][0])
    self.assertEqual('bar', step_recorder.timings[1][0])
    self.assertLess(0, step_recorder.timings[0][1])
    self.assertLess(0, step_recorder.timings[1][1])
    self.assertTrue(step_recorder.ErrorRecorded())

  def testGetFileExtension(self):
    self.assertEqual('zip',
        orderfile_generator_backend._GetFileExtension('/foo/bar/baz.blub.zip'))

  def testGenerateHash(self):
    try:
      with tempfile.NamedTemporaryFile(mode='w', delete=False) as handle:
        filename = handle.name
        handle.write('foo')
      self.assertEqual('0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33',
                       orderfile_generator_backend._GenerateHash(filename))
    finally:
      if filename:
        os.unlink(filename)


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