Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: client/tests/isolateserver_test.py

Issue 2186263002: luci-py: Refactor file writing code to allow file objects. (Closed) Base URL: https://github.com/luci/luci-py.git@master
Patch Set: Rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « client/run_isolated.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/tests/isolateserver_test.py
diff --git a/client/tests/isolateserver_test.py b/client/tests/isolateserver_test.py
index 9f9772c923b2ead861d3079679773d7c1bc5dbda..2435a699d86e2305d8280c3b18774e8e4a774965 100755
--- a/client/tests/isolateserver_test.py
+++ b/client/tests/isolateserver_test.py
@@ -10,6 +10,7 @@ import collections
import hashlib
import json
import logging
+import io
import os
import StringIO
import sys
@@ -151,6 +152,134 @@ class MockedStorageApi(isolateserver.StorageApi):
return missing
+class UtilsTest(TestCase):
+ """Tests for helper methods in isolateserver file."""
+
+ def assertFile(self, path, contents):
+ self.assertTrue(fs.exists(path), 'File %s doesn\'t exist!' % path)
+ self.assertMultiLineEqual(contents, fs.open(path, 'rb').read())
+
+ def test_file_read(self):
+ # TODO(maruel): Write test for file_read generator (or remove it).
+ pass
+
+ def test_file_write(self):
+ # TODO(maruel): Write test for file_write generator (or remove it).
+ pass
+
+ def test_fileobj_path(self):
+ # No path on in-memory objects
+ self.assertIs(None, isolateserver.fileobj_path(io.BytesIO('hello')))
+
+ # Path on opened files
+ thisfile = os.path.abspath(__file__.decode(sys.getfilesystemencoding()))
+ f = fs.open(thisfile)
+ result = isolateserver.fileobj_path(f)
+ self.assertIsInstance(result, unicode)
+ self.assertSequenceEqual(result, thisfile)
+
+ # Path on temporary files
+ tf = tempfile.NamedTemporaryFile()
+ result = isolateserver.fileobj_path(tf)
+ self.assertIsInstance(result, unicode)
+ self.assertSequenceEqual(result, tf.name)
+
+ # No path on files which are no longer on the file system
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ fs.unlink(tf.name.decode(sys.getfilesystemencoding()))
+ self.assertIs(None, isolateserver.fileobj_path(tf))
+
+ def test_fileobj_copy_simple(self):
+ inobj = io.BytesIO('hello')
+ outobj = io.BytesIO()
+
+ isolateserver.fileobj_copy(outobj, inobj)
+ self.assertEqual('hello', outobj.getvalue())
+
+ def test_fileobj_copy_partial(self):
+ inobj = io.BytesIO('adatab')
+ outobj = io.BytesIO()
+ inobj.read(1)
+
+ isolateserver.fileobj_copy(outobj, inobj, size=4)
+ self.assertEqual('data', outobj.getvalue())
+
+ def test_fileobj_copy_partial_file_no_size(self):
+ with self.assertRaises(IOError):
+ inobj = io.BytesIO('hello')
+ outobj = io.BytesIO()
+
+ inobj.read(1)
+ isolateserver.fileobj_copy(outobj, inobj)
+
+ def test_fileobj_copy_size_but_file_short(self):
+ with self.assertRaises(IOError):
+ inobj = io.BytesIO('hello')
+ outobj = io.BytesIO()
+
+ isolateserver.fileobj_copy(outobj, inobj, size=10)
+
+ def test_putfile(self):
+ tmpoutdir = None
+ tmpindir = None
+
+ try:
+ tmpindir = tempfile.mkdtemp(prefix='isolateserver_test')
+ infile = os.path.join(tmpindir, u'in')
+ with fs.open(infile, 'wb') as f:
+ f.write('data')
+
+ tmpoutdir = tempfile.mkdtemp(prefix='isolateserver_test')
+
+ # Copy as fileobj
+ fo = os.path.join(tmpoutdir, u'fo')
+ isolateserver.putfile(io.BytesIO('data'), fo)
+ self.assertEqual(True, fs.exists(fo))
+ self.assertEqual(False, fs.islink(fo))
+ self.assertFile(fo, 'data')
+
+ # Copy with partial fileobj
+ pfo = os.path.join(tmpoutdir, u'pfo')
+ fobj = io.BytesIO('adatab')
+ fobj.read(1) # Read the 'a'
+ isolateserver.putfile(fobj, pfo, size=4)
+ self.assertEqual(True, fs.exists(pfo))
+ self.assertEqual(False, fs.islink(pfo))
+ self.assertEqual('b', fobj.read())
+ self.assertFile(pfo, 'data')
+
+ # Copy as not readonly
+ cp = os.path.join(tmpoutdir, u'cp')
+ with fs.open(infile, 'rb') as f:
+ isolateserver.putfile(f, cp, file_mode=0755)
+ self.assertEqual(True, fs.exists(cp))
+ self.assertEqual(False, fs.islink(cp))
+ self.assertFile(cp, 'data')
+
+ # Use hardlink
+ hl = os.path.join(tmpoutdir, u'hl')
+ with fs.open(infile, 'rb') as f:
+ isolateserver.putfile(f, hl, use_symlink=False)
+ self.assertEqual(True, fs.exists(hl))
+ self.assertEqual(False, fs.islink(hl))
+ self.assertFile(hl, 'data')
+
+ # Use symlink
+ sl = os.path.join(tmpoutdir, u'sl')
+ with fs.open(infile, 'rb') as f:
+ isolateserver.putfile(f, sl, use_symlink=True)
+ self.assertEqual(True, fs.exists(sl))
+ self.assertEqual(True, fs.islink(sl))
+ self.assertEqual('data', fs.open(sl, 'rb').read())
+ self.assertFile(sl, 'data')
+
+ finally:
+ if tmpindir:
+ file_path.rmtree(tmpindir)
+ if tmpoutdir:
+ file_path.rmtree(tmpoutdir)
+
+
class StorageTest(TestCase):
"""Tests for Storage methods."""
@@ -723,9 +852,12 @@ class IsolateServerStorageSmokeTest(unittest.TestCase):
pending.discard(fetched)
# Ensure fetched same data as was pushed.
- self.assertEqual(
- [i.buffer for i in items],
- [cache.read(i.digest) for i in items])
+ actual = []
+ for i in items:
+ with cache.getfileobj(i.digest) as f:
+ actual.append(f.read())
+
+ self.assertEqual([i.buffer for i in items], actual)
def test_push_and_fetch(self):
self.run_push_and_fetch_test('default')
@@ -839,18 +971,19 @@ class IsolateServerDownloadTest(TestCase):
}
self.assertEqual(expected, actual)
- def test_download_isolated(self):
+ def test_download_isolated_simple(self):
# Test downloading an isolated tree.
actual = {}
- def file_write_mock(key, generator):
- actual[key] = ''.join(generator)
- self.mock(isolateserver, 'file_write', file_write_mock)
+ def putfile_mock(
+ srcfileobj, dstpath, file_mode=None, size=-1, use_symlink=False):
+ actual[dstpath] = srcfileobj.read()
+ self.mock(isolateserver, 'putfile', putfile_mock)
self.mock(os, 'makedirs', lambda _: None)
server = 'http://example.com'
files = {
os.path.join('a', 'foo'): 'Content',
'b': 'More content',
- }
+ }
isolated = {
'command': ['Absurb', 'command'],
'relative_cwd': 'a',
@@ -1023,27 +1156,13 @@ class DiskCacheTest(TestCase):
h_a = self.to_hash('a')[0]
with self.get_cache() as cache:
cache.write(h_a, 'a')
- self.assertEqual('a', cache.read(h_a))
+ with cache.getfileobj(h_a) as f:
+ self.assertEqual('a', f.read())
with self.get_cache() as cache:
cache.evict(h_a)
with self.assertRaises(isolateserver.CacheMiss):
- cache.read(h_a)
-
- def test_link(self):
- self._free_disk = 1100
- cache = self.get_cache()
- h_a = self.to_hash('a')[0]
- cache.write(h_a, 'a')
- mapped = tempfile.mkdtemp(prefix='isolateserver_test')
- try:
- cache.link(h_a, os.path.join(mapped, u'hl'), False, False)
- cache.link(h_a, os.path.join(mapped, u'sl'), False, True)
- self.assertEqual(sorted(['hl', 'sl']), sorted(os.listdir(mapped)))
- self.assertEqual(False, fs.islink(os.path.join(mapped, u'hl')))
- self.assertEqual(True, fs.islink(os.path.join(mapped, u'sl')))
- finally:
- file_path.rmtree(mapped)
+ cache.getfileobj(h_a)
def test_policies_free_disk(self):
with self.assertRaises(isolateserver.Error):
« no previous file with comments | « client/run_isolated.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698