1cb93a386Sopenharmony_ci#!/usr/bin/env python
2cb93a386Sopenharmony_ci#
3cb93a386Sopenharmony_ci# Copyright 2016 Google Inc.
4cb93a386Sopenharmony_ci#
5cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
6cb93a386Sopenharmony_ci# found in the LICENSE file.
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci"""Test utilities."""
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ciimport filecmp
13cb93a386Sopenharmony_ciimport os
14cb93a386Sopenharmony_ciimport uuid
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ciclass FileWriter(object):
18cb93a386Sopenharmony_ci  """Write files into a given directory."""
19cb93a386Sopenharmony_ci  def __init__(self, cwd):
20cb93a386Sopenharmony_ci    self._cwd = cwd
21cb93a386Sopenharmony_ci    if not os.path.exists(self._cwd):
22cb93a386Sopenharmony_ci      os.makedirs(self._cwd)
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_ci  def mkdir(self, dname, mode=0o755):
25cb93a386Sopenharmony_ci    """Create the given directory with the given mode."""
26cb93a386Sopenharmony_ci    dname = os.path.join(self._cwd, dname)
27cb93a386Sopenharmony_ci    os.mkdir(dname)
28cb93a386Sopenharmony_ci    os.chmod(dname, mode)
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci  def write(self, fname, mode=0o640):
31cb93a386Sopenharmony_ci    """Write the file with the given mode and random contents."""
32cb93a386Sopenharmony_ci    fname = os.path.join(self._cwd, fname)
33cb93a386Sopenharmony_ci    with open(fname, 'w') as f:
34cb93a386Sopenharmony_ci      f.write(str(uuid.uuid4()))
35cb93a386Sopenharmony_ci    os.chmod(fname, mode)
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ci  def remove(self, fname):
38cb93a386Sopenharmony_ci    """Remove the file."""
39cb93a386Sopenharmony_ci    fname = os.path.join(self._cwd, fname)
40cb93a386Sopenharmony_ci    if os.path.isfile(fname):
41cb93a386Sopenharmony_ci      os.remove(fname)
42cb93a386Sopenharmony_ci    else:
43cb93a386Sopenharmony_ci      os.rmdir(fname)
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_cidef compare_trees(test, a, b):
47cb93a386Sopenharmony_ci  """Compare two directory trees, assert if any differences."""
48cb93a386Sopenharmony_ci  def _cmp(prefix, dcmp):
49cb93a386Sopenharmony_ci    # Verify that the file and directory names are the same.
50cb93a386Sopenharmony_ci    test.assertEqual(len(dcmp.left_only), 0)
51cb93a386Sopenharmony_ci    test.assertEqual(len(dcmp.right_only), 0)
52cb93a386Sopenharmony_ci    test.assertEqual(len(dcmp.diff_files), 0)
53cb93a386Sopenharmony_ci    test.assertEqual(len(dcmp.funny_files), 0)
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    # Verify that the files are identical.
56cb93a386Sopenharmony_ci    for f in dcmp.common_files:
57cb93a386Sopenharmony_ci      pathA = os.path.join(a, prefix, f)
58cb93a386Sopenharmony_ci      pathB = os.path.join(b, prefix, f)
59cb93a386Sopenharmony_ci      test.assertTrue(filecmp.cmp(pathA, pathB, shallow=False))
60cb93a386Sopenharmony_ci      statA = os.stat(pathA)
61cb93a386Sopenharmony_ci      statB = os.stat(pathB)
62cb93a386Sopenharmony_ci      test.assertEqual(statA.st_mode, statB.st_mode)
63cb93a386Sopenharmony_ci      with open(pathA, 'rb') as f:
64cb93a386Sopenharmony_ci        contentsA = f.read()
65cb93a386Sopenharmony_ci      with open(pathB, 'rb') as f:
66cb93a386Sopenharmony_ci        contentsB = f.read()
67cb93a386Sopenharmony_ci      test.assertEqual(contentsA, contentsB)
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_ci    # Recurse on subdirectories.
70cb93a386Sopenharmony_ci    for prefix, obj in dcmp.subdirs.items():
71cb93a386Sopenharmony_ci      _cmp(prefix, obj)
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci  _cmp('', filecmp.dircmp(a, b))
74