1cad810f21b803229eb11403f9209855525a25d57Steve Block# Copyright (C) 2010 Google Inc. All rights reserved.
2cad810f21b803229eb11403f9209855525a25d57Steve Block#
3cad810f21b803229eb11403f9209855525a25d57Steve Block# Redistribution and use in source and binary forms, with or without
4cad810f21b803229eb11403f9209855525a25d57Steve Block# modification, are permitted provided that the following conditions
5cad810f21b803229eb11403f9209855525a25d57Steve Block# are met:
6cad810f21b803229eb11403f9209855525a25d57Steve Block#
7cad810f21b803229eb11403f9209855525a25d57Steve Block# 1.  Redistributions of source code must retain the above copyright
8cad810f21b803229eb11403f9209855525a25d57Steve Block#     notice, this list of conditions and the following disclaimer.
9cad810f21b803229eb11403f9209855525a25d57Steve Block# 2.  Redistributions in binary form must reproduce the above copyright
10cad810f21b803229eb11403f9209855525a25d57Steve Block#     notice, this list of conditions and the following disclaimer in the
11cad810f21b803229eb11403f9209855525a25d57Steve Block#     documentation and/or other materials provided with the distribution.
12cad810f21b803229eb11403f9209855525a25d57Steve Block#
13cad810f21b803229eb11403f9209855525a25d57Steve Block# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
14cad810f21b803229eb11403f9209855525a25d57Steve Block# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15cad810f21b803229eb11403f9209855525a25d57Steve Block# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16cad810f21b803229eb11403f9209855525a25d57Steve Block# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17cad810f21b803229eb11403f9209855525a25d57Steve Block# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18cad810f21b803229eb11403f9209855525a25d57Steve Block# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19cad810f21b803229eb11403f9209855525a25d57Steve Block# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20cad810f21b803229eb11403f9209855525a25d57Steve Block# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21cad810f21b803229eb11403f9209855525a25d57Steve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22cad810f21b803229eb11403f9209855525a25d57Steve Block# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23cad810f21b803229eb11403f9209855525a25d57Steve Block
24cad810f21b803229eb11403f9209855525a25d57Steve Blockimport os
25cad810f21b803229eb11403f9209855525a25d57Steve Blockimport shutil
26cad810f21b803229eb11403f9209855525a25d57Steve Blockimport tempfile
27cad810f21b803229eb11403f9209855525a25d57Steve Blockimport unittest
28cad810f21b803229eb11403f9209855525a25d57Steve Blockimport zipfile
29cad810f21b803229eb11403f9209855525a25d57Steve Block
30cad810f21b803229eb11403f9209855525a25d57Steve Blockfrom webkitpy.common.system.filesystem_mock import MockFileSystem
31cad810f21b803229eb11403f9209855525a25d57Steve Blockfrom webkitpy.common.system.zipfileset import ZipFileSet
32cad810f21b803229eb11403f9209855525a25d57Steve Block
33cad810f21b803229eb11403f9209855525a25d57Steve Block
34cad810f21b803229eb11403f9209855525a25d57Steve Blockclass FakeZip(object):
35cad810f21b803229eb11403f9209855525a25d57Steve Block    def __init__(self, filesystem):
36cad810f21b803229eb11403f9209855525a25d57Steve Block        self._filesystem = filesystem
37cad810f21b803229eb11403f9209855525a25d57Steve Block        self._files = {}
38cad810f21b803229eb11403f9209855525a25d57Steve Block
39cad810f21b803229eb11403f9209855525a25d57Steve Block    def add_file(self, filename, contents):
40cad810f21b803229eb11403f9209855525a25d57Steve Block        self._files[filename] = contents
41cad810f21b803229eb11403f9209855525a25d57Steve Block
42cad810f21b803229eb11403f9209855525a25d57Steve Block    def open(self, filename):
43cad810f21b803229eb11403f9209855525a25d57Steve Block        return FileSetFileHandle(self, filename, self._filesystem)
44cad810f21b803229eb11403f9209855525a25d57Steve Block
45cad810f21b803229eb11403f9209855525a25d57Steve Block    def namelist(self):
46cad810f21b803229eb11403f9209855525a25d57Steve Block        return self._files.keys()
47cad810f21b803229eb11403f9209855525a25d57Steve Block
48cad810f21b803229eb11403f9209855525a25d57Steve Block    def read(self, filename):
49cad810f21b803229eb11403f9209855525a25d57Steve Block        return self._files[filename]
50cad810f21b803229eb11403f9209855525a25d57Steve Block
51cad810f21b803229eb11403f9209855525a25d57Steve Block    def extract(self, filename, path):
52cad810f21b803229eb11403f9209855525a25d57Steve Block        self._filesystem.write_text_file(self._filesystem.join(path, filename), self.read(filename))
53cad810f21b803229eb11403f9209855525a25d57Steve Block
54cad810f21b803229eb11403f9209855525a25d57Steve Block    def delete(self, filename):
55cad810f21b803229eb11403f9209855525a25d57Steve Block        raise Exception("Can't delete from a ZipFileSet.")
56cad810f21b803229eb11403f9209855525a25d57Steve Block
57cad810f21b803229eb11403f9209855525a25d57Steve Block
58cad810f21b803229eb11403f9209855525a25d57Steve Blockclass ZipFileSetTest(unittest.TestCase):
59cad810f21b803229eb11403f9209855525a25d57Steve Block    def setUp(self):
60cad810f21b803229eb11403f9209855525a25d57Steve Block        self._filesystem = MockFileSystem()
61cad810f21b803229eb11403f9209855525a25d57Steve Block        self._zip = ZipFileSet('blah', self._filesystem, self.make_fake_zip)
62cad810f21b803229eb11403f9209855525a25d57Steve Block
63cad810f21b803229eb11403f9209855525a25d57Steve Block    def make_fake_zip(self, zip_url):
64cad810f21b803229eb11403f9209855525a25d57Steve Block        result = FakeZip(self._filesystem)
65cad810f21b803229eb11403f9209855525a25d57Steve Block        result.add_file('some-file', 'contents')
66cad810f21b803229eb11403f9209855525a25d57Steve Block        result.add_file('a/b/some-other-file', 'other contents')
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return (None, result)
68cad810f21b803229eb11403f9209855525a25d57Steve Block
69cad810f21b803229eb11403f9209855525a25d57Steve Block    def test_open(self):
70cad810f21b803229eb11403f9209855525a25d57Steve Block        file = self._zip.open('a/b/some-other-file')
71cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertEquals('a/b/some-other-file', file.name())
72cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertEquals('other contents', file.contents())
73cad810f21b803229eb11403f9209855525a25d57Steve Block
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def test_close(self):
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        zipfileset = ZipFileSet('blah', self._filesystem, self.make_fake_zip)
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        zipfileset.close()
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
78cad810f21b803229eb11403f9209855525a25d57Steve Block    def test_read(self):
79cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertEquals('contents', self._zip.read('some-file'))
80cad810f21b803229eb11403f9209855525a25d57Steve Block
81cad810f21b803229eb11403f9209855525a25d57Steve Block    def test_extract(self):
82cad810f21b803229eb11403f9209855525a25d57Steve Block        self._filesystem.maybe_make_directory('/some-dir')
83cad810f21b803229eb11403f9209855525a25d57Steve Block        self._zip.extract('some-file', '/some-dir')
84cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertTrue(self._filesystem.isfile('/some-dir/some-file'))
85cad810f21b803229eb11403f9209855525a25d57Steve Block
86cad810f21b803229eb11403f9209855525a25d57Steve Block    def test_deep_extract(self):
87cad810f21b803229eb11403f9209855525a25d57Steve Block        self._filesystem.maybe_make_directory('/some-dir')
88cad810f21b803229eb11403f9209855525a25d57Steve Block        self._zip.extract('a/b/some-other-file', '/some-dir')
89cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertTrue(self._filesystem.isfile('/some-dir/a/b/some-other-file'))
90cad810f21b803229eb11403f9209855525a25d57Steve Block
91cad810f21b803229eb11403f9209855525a25d57Steve Block    def test_cant_delete(self):
92cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertRaises(Exception, self._zip.delete, 'some-file')
93cad810f21b803229eb11403f9209855525a25d57Steve Block
94cad810f21b803229eb11403f9209855525a25d57Steve Block    def test_namelist(self):
95cad810f21b803229eb11403f9209855525a25d57Steve Block        self.assertTrue('some-file' in self._zip.namelist())
96cad810f21b803229eb11403f9209855525a25d57Steve Block
97cad810f21b803229eb11403f9209855525a25d57Steve Block
98cad810f21b803229eb11403f9209855525a25d57Steve Blockif __name__ == '__main__':
99cad810f21b803229eb11403f9209855525a25d57Steve Block    unittest.main()
100