#!/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.


"""Tests for zip_utils."""


import filecmp
import os
import test_utils
import unittest
import utils
import uuid
import zip_utils


class ZipUtilsTest(unittest.TestCase):
  def test_zip_unzip(self):
    with utils.tmp_dir():
      fw = test_utils.FileWriter(os.path.join(os.getcwd(), 'input'))
      # Create input files and directories.
      fw.mkdir('mydir')
      fw.mkdir('anotherdir', 0666)
      fw.mkdir('dir3', 0600)
      fw.mkdir('subdir')
      fw.write('a.txt', 0777)
      fw.write('b.txt', 0751)
      fw.write('c.txt', 0640)
      fw.write(os.path.join('subdir', 'd.txt'), 0640)

      # Zip, unzip.
      zip_utils.zip('input', 'test.zip')
      zip_utils.unzip('test.zip', 'output')

      # Compare the inputs and outputs.
      test_utils.compare_trees(self, 'input', 'output')

  def test_blacklist(self):
    with utils.tmp_dir():
      # Create input files and directories.
      fw = test_utils.FileWriter(os.path.join(os.getcwd(), 'input'))
      fw.mkdir('.git')
      fw.write(os.path.join('.git', 'index'))
      fw.write('somefile')
      fw.write('.DS_STORE')
      fw.write('leftover.pyc')
      fw.write('.pycfile')

      # Zip, unzip.
      zip_utils.zip('input', 'test.zip', blacklist=['.git', '.DS*', '*.pyc'])
      zip_utils.unzip('test.zip', 'output')

      # Remove the files/dirs we don't expect to see in output, so that we can
      # use self._compare_trees to check the results.
      fw.remove(os.path.join('.git', 'index'))
      fw.remove('.git')
      fw.remove('.DS_STORE')
      fw.remove('leftover.pyc')

      # Compare results.
      test_utils.compare_trees(self, 'input', 'output')

  def test_nonexistent_dir(self):
    with utils.tmp_dir():
      with self.assertRaises(IOError):
        zip_utils.zip('input', 'test.zip')


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