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