#!/usr/bin/env python
#
# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""Test utilities."""


import filecmp
import os
import uuid


class FileWriter(object):
  """Write files into a given directory."""
  def __init__(self, cwd):
    self._cwd = cwd
    if not os.path.exists(self._cwd):
      os.makedirs(self._cwd)

  def mkdir(self, dname, mode=0755):
    """Create the given directory with the given mode."""
    dname = os.path.join(self._cwd, dname)
    os.mkdir(dname)
    os.chmod(dname, mode)

  def write(self, fname, mode=0640):
    """Write the file with the given mode and random contents."""
    fname = os.path.join(self._cwd, fname)
    with open(fname, 'w') as f:
      f.write(str(uuid.uuid4()))
    os.chmod(fname, mode)

  def remove(self, fname):
    """Remove the file."""
    fname = os.path.join(self._cwd, fname)
    if os.path.isfile(fname):
      os.remove(fname)
    else:
      os.rmdir(fname)


def compare_trees(test, a, b):
  """Compare two directory trees, assert if any differences."""
  def _cmp(prefix, dcmp):
    # Verify that the file and directory names are the same.
    test.assertEqual(len(dcmp.left_only), 0)
    test.assertEqual(len(dcmp.right_only), 0)
    test.assertEqual(len(dcmp.diff_files), 0)
    test.assertEqual(len(dcmp.funny_files), 0)

    # Verify that the files are identical.
    for f in dcmp.common_files:
      pathA = os.path.join(a, prefix, f)
      pathB = os.path.join(b, prefix, f)
      test.assertTrue(filecmp.cmp(pathA, pathB, shallow=False))
      statA = os.stat(pathA)
      statB = os.stat(pathB)
      test.assertEqual(statA.st_mode, statB.st_mode)
      with open(pathA, 'rb') as f:
        contentsA = f.read()
      with open(pathB, 'rb') as f:
        contentsB = f.read()
      test.assertEqual(contentsA, contentsB)

    # Recurse on subdirectories.
    for prefix, obj in dcmp.subdirs.iteritems():
      _cmp(prefix, obj)

  _cmp('', filecmp.dircmp(a, b))
