blob: 1dd6c6da5d0979ad4ba4d3d05cbfde99c164217c [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests of directory storage adapter."""
import os
import posixpath
import unittest
import directory_storage
import fake_storage
import gsd_storage
import hashing_tools
import hashing_tools_test
import working_directory
class TestDirectoryStorage(unittest.TestCase):
def setUp(self):
storage = fake_storage.FakeStorage()
self._dir_storage = directory_storage.DirectoryStorageAdapter(storage)
def test_WriteRead(self):
# Check that a directory can be written and then read back.
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
temp2 = os.path.join(work_dir, 'temp2')
hashing_tools_test.GenerateTestTree('write_read', temp1)
self._dir_storage.PutDirectory(temp1, 'foo')
self._dir_storage.GetDirectory('foo', temp2)
self.assertEqual(hashing_tools.StableHashPath(temp1),
hashing_tools.StableHashPath(temp2))
def test_InputUntouched(self):
# Check that PutDirectory doesn't alter its inputs.
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
hashing_tools_test.GenerateTestTree('input_untouched', temp1)
h1 = hashing_tools.StableHashPath(temp1)
self._dir_storage.PutDirectory(temp1, 'hello')
h2 = hashing_tools.StableHashPath(temp1)
self.assertEqual(h1, h2)
def test_URLsPropagate(self):
# Check that consistent non-None URLs come from get and put.
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
temp2 = os.path.join(work_dir, 'temp2')
hashing_tools_test.GenerateTestTree('url_propagate', temp1)
url1 = self._dir_storage.PutDirectory(temp1, 'me').url
url2 = self._dir_storage.GetDirectory('me', temp2).url
self.assertEqual(url1, url2)
self.assertNotEqual(None, url1)
def test_DirectoryName(self):
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
temp2 = os.path.join(work_dir, 'temp2')
hashing_tools_test.GenerateTestTree('directory_name', temp1)
key_name = 'name_test'
key_location = posixpath.join('name_parent', key_name)
result1 = self._dir_storage.PutDirectory(temp1, key_location)
result2 = self._dir_storage.GetDirectory(key_location, temp2)
self.assertNotEqual(None, result1)
self.assertNotEqual(None, result2)
self.assertEqual(key_name, result1.name)
self.assertEqual(key_name, result2.name)
def test_HashStable(self):
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
temp2 = os.path.join(work_dir, 'temp2')
hashing_tools_test.GenerateTestTree('stable_hash', temp1)
result1 = self._dir_storage.PutDirectory(temp1, 'hash_test')
result2 = self._dir_storage.GetDirectory('hash_test', temp2)
self.assertNotEqual(None, result1)
self.assertNotEqual(None, result2)
self.assertEqual(result1.hash, result2.hash)
def test_CustomHasher(self):
hash_value = 'test_hash_value'
custom_hasher = lambda filename : hash_value
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp = os.path.join(work_dir, 'temp')
hashing_tools_test.GenerateTestTree('custom_hasher', temp)
result = self._dir_storage.PutDirectory(
temp,
'custom_hasher',
hasher=custom_hasher
)
self.assertNotEqual(None, result)
self.assertEqual(result.hash, hash_value)
def test_BadWrite(self):
def call(cmd):
return 1
storage = gsd_storage.GSDStorage(
gsutil=['mygsutil'],
write_bucket='mybucket',
read_buckets=[],
call=call)
dir_storage = directory_storage.DirectoryStorageAdapter(storage)
# Check that storage exceptions come thru on failure.
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
hashing_tools_test.GenerateTestTree('bad_write', temp1)
self.assertRaises(gsd_storage.GSDStorageError,
dir_storage.PutDirectory, temp1, 'bad')
def test_BadRead(self):
# Check that storage exceptions come thru on failure.
with working_directory.TemporaryWorkingDirectory() as work_dir:
temp1 = os.path.join(work_dir, 'temp1')
self.assertEqual(None, self._dir_storage.GetDirectory('foo', temp1))
if __name__ == '__main__':
unittest.main()