Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Commit 8b99657

Browse files
author
Mangled Deutz
committed
Fixed test layers test - trying to reenable on travis
Docker-DCO-1.1-Signed-off-by: Mangled Deutz <[email protected]> (github: dmp42)
1 parent 995dbb9 commit 8b99657

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed

tests/test_layers.py

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import backports.lzma as lzma
4+
import os
5+
import random
6+
import string
7+
import tarfile
8+
9+
import base
10+
from docker_registry.lib import layers
11+
from docker_registry import storage
12+
13+
from docker_registry.core import compat
14+
json = compat.json
15+
StringIO = compat.StringIO
16+
17+
18+
# from mock import patch
19+
# from mockredis import mock_strict_redis_client
20+
21+
22+
def comp(n, f, *args, **kwargs):
23+
return (f(*args, **kwargs) for i in xrange(n))
24+
25+
26+
def rndstr(length=5):
27+
palette = string.ascii_uppercase + string.digits
28+
return ''.join(comp(length, random.choice, palette))
29+
30+
31+
def _get_tarfile(filenames):
32+
tfobj = StringIO()
33+
tar = tarfile.TarFile(fileobj=tfobj, mode='w')
34+
data = rndstr(512)
35+
for filename in filenames:
36+
tarinfo = tarfile.TarInfo(filename)
37+
tarinfo.size = len(data)
38+
io = StringIO()
39+
io.write(data)
40+
io.seek(0)
41+
tar.addfile(tarinfo, io)
42+
tfobj.seek(0)
43+
return tfobj
44+
45+
46+
def _get_xzfile(filenames):
47+
tar_data = _get_tarfile(filenames)
48+
lzma_fobj = StringIO()
49+
xz_file = lzma.open(lzma_fobj, 'w')
50+
xz_file.write(tar_data.read())
51+
xz_file.close()
52+
lzma_fobj.seek(0)
53+
return lzma_fobj
54+
55+
56+
class TestLayers(base.TestCase):
57+
58+
def setUp(self):
59+
self.store = storage.load(kind='file')
60+
self.filenames = list(comp(5, rndstr))
61+
62+
def test_tar_archive(self):
63+
tfobj = _get_tarfile(self.filenames)
64+
65+
archive = layers.Archive(tfobj)
66+
tar = tarfile.open(fileobj=archive)
67+
members = tar.getmembers()
68+
for tarinfo in members:
69+
self.assertIn(tarinfo.name, self.filenames)
70+
71+
def test_xz_archive(self):
72+
tfobj = _get_xzfile(self.filenames)
73+
archive = layers.Archive(tfobj)
74+
tar = tarfile.open(fileobj=archive)
75+
members = tar.getmembers()
76+
for tarinfo in members:
77+
self.assertIn(tarinfo.name, self.filenames)
78+
79+
def test_info_serialization(self):
80+
tfobj = _get_tarfile(self.filenames)
81+
archive = layers.Archive(tfobj)
82+
tar = tarfile.open(fileobj=archive)
83+
members = tar.getmembers()
84+
for tarinfo in members:
85+
sinfo = layers.serialize_tar_info(tarinfo)
86+
self.assertTrue(sinfo[0] in self.filenames)
87+
self.assertTrue(sinfo[1:] == ('f', False, 512, 0, 420, 0, 0))
88+
89+
def test_tar_serialization(self):
90+
tfobj = _get_tarfile(self.filenames)
91+
archive = layers.Archive(tfobj)
92+
tar = tarfile.open(fileobj=archive)
93+
infos = layers.read_tarfile(tar)
94+
for tarinfo in infos:
95+
self.assertIn(tarinfo[0], self.filenames)
96+
self.assertTrue(tarinfo[1:] == ('f', False, 512, 0, 420, 0, 0))
97+
98+
def test_layer_cache(self):
99+
layer_id = rndstr(16)
100+
layers.set_image_files_cache(layer_id, "{}")
101+
fetched_json = layers.get_image_files_cache(layer_id)
102+
self.assertTrue(fetched_json == "{}")
103+
104+
def test_tar_from_fobj(self):
105+
tfobj = _get_tarfile(self.filenames)
106+
files = layers.get_image_files_from_fobj(tfobj)
107+
for file in files:
108+
self.assertIn(file[0], self.filenames)
109+
self.assertTrue(file[1:] == ('f', False, 512, 0, 420, 0, 0))
110+
111+
def test_get_image_files_json_cached(self):
112+
layer_id = rndstr(16)
113+
layers.set_image_files_cache(layer_id, "{}")
114+
files_json = layers.get_image_files_json(layer_id)
115+
self.assertTrue(files_json, "{}")
116+
117+
def test_get_image_files_json(self):
118+
layer_id = rndstr(16)
119+
tfobj = _get_tarfile(self.filenames)
120+
121+
layer_path = self.store.image_layer_path(layer_id)
122+
layer_path = os.path.join(self.store._root_path, layer_path)
123+
path_parts = layer_path.split(os.sep)
124+
layer_parent = os.path.join(*path_parts[:-1])
125+
os.makedirs(layer_parent)
126+
127+
with open(layer_path, 'w') as fobj:
128+
fobj.write(tfobj.read())
129+
130+
files_json = layers.get_image_files_json(layer_id)
131+
file_infos = json.loads(files_json)
132+
for info in file_infos:
133+
self.assertIn(info[0], self.filenames)
134+
self.assertTrue(info[1:] == [u"f", False, 512, 0, 420, 0, 0])
135+
136+
def test_get_file_info_map(self):
137+
files = (
138+
("test", "f", False, 512, 0, 420, 0, 0),
139+
)
140+
map = layers.get_file_info_map(files)
141+
self.assertIn("test", map)
142+
self.assertTrue(map['test'], ("f", False, 512, 0, 420, 0, 0))
143+
144+
def test_image_diff_cache(self):
145+
layer_id = rndstr(16)
146+
layers.set_image_diff_cache(layer_id, layer_id)
147+
diff_json = layers.get_image_diff_cache(layer_id)
148+
self.assertTrue(layer_id == diff_json)
149+
150+
def test_image_diff_json(self):
151+
layer_1 = (
152+
("deleted", "f", False, 512, 0, 420, 0, 0),
153+
("changed", "f", False, 512, 0, 420, 0, 0),
154+
)
155+
156+
layer_2 = (
157+
("deleted", "f", True, 512, 0, 420, 0, 0),
158+
("changed", "f", False, 512, 0, 420, 0, 0),
159+
("created", "f", False, 512, 0, 420, 0, 0),
160+
)
161+
layer_1_id = rndstr(16)
162+
layer_2_id = rndstr(16)
163+
164+
ancestry = json.dumps([layer_2_id, layer_1_id])
165+
ancestry_path = self.store.image_ancestry_path(layer_2_id)
166+
self.store.put_content(ancestry_path, ancestry)
167+
168+
layer_1_files_path = self.store.image_files_path(layer_1_id)
169+
self.store.put_content(layer_1_files_path, json.dumps(layer_1))
170+
171+
layer_2_files_path = self.store.image_files_path(layer_2_id)
172+
self.store.put_content(layer_2_files_path, json.dumps(layer_2))
173+
174+
diff_json = layers.get_image_diff_json(layer_2_id)
175+
diff = json.loads(diff_json)
176+
177+
for type in ("deleted", "changed", "created"):
178+
self.assertIn(type, diff)
179+
self.assertIn(type, diff[type])

0 commit comments

Comments
 (0)