Skip to content

Commit 60545fc

Browse files
mount a www and a downloads directory into both client and server
So far, the server had only /www and the client had only /downloads.
1 parent 225b84b commit 60545fc

File tree

3 files changed

+99
-41
lines changed

3 files changed

+99
-41
lines changed

docker-compose.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ services:
3232
stdin_open: true
3333
tty: true
3434
volumes:
35-
- $WWW:/www:ro
35+
- $SERVER_WWW:/www:ro
36+
- $SERVER_DOWNLOADS:/downloads:delegated
3637
- $CERTS:/certs:ro
3738
environment:
3839
- CRON=$CRON
@@ -63,7 +64,8 @@ services:
6364
stdin_open: true
6465
tty: true
6566
volumes:
66-
- $DOWNLOADS:/downloads:delegated
67+
- $CLIENT_WWW:/www:ro
68+
- $CLIENT_DOWNLOADS:/downloads:delegated
6769
- $CERTS:/certs:ro
6870
environment:
6971
- CRON=$CRON

interop.py

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,19 @@ def _check_impl_is_compliant(self, name: str, role: Perspective) -> bool:
110110
self.compliant.setdefault(name, {})
111111

112112
client_log_dir = tempfile.TemporaryDirectory(dir="/tmp", prefix="logs_client_")
113-
www_dir = tempfile.TemporaryDirectory(dir="/tmp", prefix="compliance_www_")
114113
certs_dir = tempfile.TemporaryDirectory(dir="/tmp", prefix="compliance_certs_")
115-
downloads_dir = tempfile.TemporaryDirectory(
116-
dir="/tmp", prefix="compliance_downloads_"
114+
115+
client_www_dir = tempfile.TemporaryDirectory(
116+
dir="/tmp", prefix="compliance_client_www_"
117+
)
118+
client_downloads_dir = tempfile.TemporaryDirectory(
119+
dir="/tmp", prefix="compliance_client_downloads_"
120+
)
121+
server_www_dir = tempfile.TemporaryDirectory(
122+
dir="/tmp", prefix="compliance_server_www_"
123+
)
124+
server_downloads_dir = tempfile.TemporaryDirectory(
125+
dir="/tmp", prefix="compliance_server_downloads_"
117126
)
118127

119128
testcases_quic.generate_cert_chain(certs_dir.name)
@@ -126,8 +135,10 @@ def _check_impl_is_compliant(self, name: str, role: Perspective) -> bool:
126135
"TESTCASE_CLIENT=" + generate_slug() + " "
127136
"SERVER_LOGS=/dev/null "
128137
"CLIENT_LOGS=" + client_log_dir.name + " "
129-
"WWW=" + www_dir.name + " "
130-
"DOWNLOADS=" + downloads_dir.name + " "
138+
"CLIENT_WWW=" + client_www_dir.name + " "
139+
"CLIENT_DOWNLOADS=" + client_downloads_dir.name + " "
140+
"SERVER_WWW=" + server_www_dir.name + " "
141+
"SERVER_DOWNLOADS=" + server_downloads_dir.name + " "
131142
'SCENARIO="simple-p2p --delay=15ms --bandwidth=10Mbps --queue=25" '
132143
"CLIENT=" + self._implementations[name]["image"] + " "
133144
"SERVER="
@@ -155,8 +166,10 @@ def _check_impl_is_compliant(self, name: str, role: Perspective) -> bool:
155166
"TESTCASE_SERVER=" + generate_slug() + " "
156167
"SERVER_LOGS=" + server_log_dir.name + " "
157168
"CLIENT_LOGS=/dev/null "
158-
"WWW=" + www_dir.name + " "
159-
"DOWNLOADS=" + downloads_dir.name + " "
169+
"CLIENT_WWW=" + client_www_dir.name + " "
170+
"CLIENT_DOWNLOADS=" + client_downloads_dir.name + " "
171+
"SERVER_WWW=" + server_www_dir.name + " "
172+
"SERVER_DOWNLOADS=" + server_downloads_dir.name + " "
160173
"CLIENT="
161174
+ self._implementations[name]["image"]
162175
+ " " # only needed so docker compose doesn't complain
@@ -172,8 +185,6 @@ def _check_impl_is_compliant(self, name: str, role: Perspective) -> bool:
172185
self.compliant[name][role] = False
173186
return False
174187
logging.debug("%s server compliant.", name)
175-
else:
176-
raise ValueError(f"Unknown perspective for compliance check: {role}")
177188

178189
# remember compliance test outcome for this role
179190
self.compliant[name][role] = True
@@ -410,8 +421,10 @@ def _run_test(
410421
"CERTS=" + test.certs_dir() + " "
411422
"TESTCASE_SERVER=" + test.testname(Perspective.SERVER) + " "
412423
"TESTCASE_CLIENT=" + test.testname(Perspective.CLIENT) + " "
413-
"WWW=" + test.www_dir() + " "
414-
"DOWNLOADS=" + test.download_dir() + " "
424+
"CLIENT_WWW=" + test.client_www_dir() + " "
425+
"CLIENT_DOWNLOADS=" + test.client_download_dir() + " "
426+
"SERVER_WWW=" + test.server_www_dir() + " "
427+
"SERVER_DOWNLOADS=" + test.server_download_dir() + " "
415428
"SERVER_LOGS=" + server_log_dir.name + " "
416429
"CLIENT_LOGS=" + client_log_dir.name + " "
417430
'SCENARIO="{}" '
@@ -423,7 +436,7 @@ def _run_test(
423436
containers = "sim client server " + " ".join(test.additional_containers())
424437
cmd = (
425438
params
426-
+ " docker compose --env-file empty.env up --abort-on-container-exit --timeout 1 "
439+
+ " docker compose --env-file empty.env up --abort-on-container-exit --timeout 10 "
427440
+ containers
428441
)
429442
logging.debug("Command: %s", cmd)
@@ -485,11 +498,30 @@ def _run_test(
485498
shutil.copytree(sim_log_dir.name, log_dir + "/sim")
486499
shutil.copyfile(log_file.name, log_dir + "/output.txt")
487500
if self._save_files and status == TestResult.FAILED:
488-
shutil.copytree(test.www_dir(), log_dir + "/www")
489501
try:
490-
shutil.copytree(test.download_dir(), log_dir + "/downloads")
502+
shutil.copytree(test.server_www_dir(), log_dir + "/server_www")
503+
except Exception as exception:
504+
logging.info("Could not copy server www files: %s", exception)
505+
try:
506+
shutil.copytree(
507+
test.client_download_dir(), log_dir + "/client_downloads"
508+
)
491509
except Exception as exception:
492-
logging.info("Could not copy downloaded files: %s", exception)
510+
logging.info(
511+
"Could not copy client downloaded files: %s", exception
512+
)
513+
try:
514+
shutil.copytree(test.client_www_dir(), log_dir + "/client_www")
515+
except Exception as exception:
516+
logging.info("Could not copy client www files: %s", exception)
517+
try:
518+
shutil.copytree(
519+
test.server_download_dir(), log_dir + "/server_downloads"
520+
)
521+
except Exception as exception:
522+
logging.info(
523+
"Could not copy server downloaded files: %s", exception
524+
)
493525

494526
test.cleanup()
495527
server_log_dir.cleanup()

testcase.py

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,16 @@ def generate_cert_chain(directory: str, length: int = 1):
4141

4242
class TestCase(abc.ABC):
4343
_files = []
44-
_www_dir = None
4544
_client_keylog_file = None
4645
_server_keylog_file = None
47-
_download_dir = None
4846
_sim_log_dir = None
4947
_cert_dir = None
5048
_cached_server_trace = None
5149
_cached_client_trace = None
50+
_client_www_dir = None
51+
_client_download_dir = None
52+
_server_www_dir = None
53+
_server_download_dir = None
5254

5355
def __init__(
5456
self,
@@ -99,17 +101,33 @@ def additional_envs() -> List[str]:
99101
def additional_containers() -> List[str]:
100102
return [""]
101103

102-
def www_dir(self):
103-
if not self._www_dir:
104-
self._www_dir = tempfile.TemporaryDirectory(dir="/tmp", prefix="www_")
105-
return self._www_dir.name + "/"
104+
def client_www_dir(self):
105+
if not self._client_www_dir:
106+
self._client_www_dir = tempfile.TemporaryDirectory(
107+
dir="/tmp", prefix="client_www_"
108+
)
109+
return self._client_www_dir.name + "/"
110+
111+
def client_download_dir(self):
112+
if not self._client_download_dir:
113+
self._client_download_dir = tempfile.TemporaryDirectory(
114+
dir="/tmp", prefix="client_download_"
115+
)
116+
return self._client_download_dir.name + "/"
117+
118+
def server_www_dir(self):
119+
if not self._server_www_dir:
120+
self._server_www_dir = tempfile.TemporaryDirectory(
121+
dir="/tmp", prefix="server_www_"
122+
)
123+
return self._server_www_dir.name + "/"
106124

107-
def download_dir(self):
108-
if not self._download_dir:
109-
self._download_dir = tempfile.TemporaryDirectory(
110-
dir="/tmp", prefix="download_"
125+
def server_download_dir(self):
126+
if not self._server_download_dir:
127+
self._server_download_dir = tempfile.TemporaryDirectory(
128+
dir="/tmp", prefix="server_download_"
111129
)
112-
return self._download_dir.name + "/"
130+
return self._server_download_dir.name + "/"
113131

114132
def certs_dir(self):
115133
if not self._cert_dir:
@@ -176,7 +194,7 @@ def _generate_random_file(self, size: int, filename: str = None) -> str:
176194
filename = generate_slug()
177195
# see https://www.stefanocappellini.it/generate-pseudorandom-bytes-with-python/ for benchmarks
178196
enc = AES.new(os.urandom(32), AES.MODE_OFB, b"a" * 16)
179-
f = open(self.www_dir() + filename, "wb")
197+
f = open(self.server_www_dir() + filename, "wb")
180198
f.write(enc.encrypt(b" " * size))
181199
f.close()
182200
logging.debug("Generated random file: %s of size: %d", filename, size)
@@ -200,8 +218,8 @@ def _check_files(self) -> bool:
200218
raise Exception("No test files generated.")
201219
files = [
202220
n
203-
for n in os.listdir(self.download_dir())
204-
if os.path.isfile(os.path.join(self.download_dir(), n))
221+
for n in os.listdir(self.client_download_dir())
222+
if os.path.isfile(os.path.join(self.client_download_dir(), n))
205223
]
206224
too_many = [f for f in files if f not in self._files]
207225
if len(too_many) != 0:
@@ -212,12 +230,12 @@ def _check_files(self) -> bool:
212230
if len(too_many) != 0 or len(too_few) != 0:
213231
return False
214232
for f in self._files:
215-
fp = self.download_dir() + f
233+
fp = self.client_download_dir() + f
216234
if not os.path.isfile(fp):
217235
logging.info("File %s does not exist.", fp)
218236
return False
219237
try:
220-
size = os.path.getsize(self.www_dir() + f)
238+
size = os.path.getsize(self.server_www_dir() + f)
221239
downloaded_size = os.path.getsize(fp)
222240
if size != downloaded_size:
223241
logging.info(
@@ -227,13 +245,13 @@ def _check_files(self) -> bool:
227245
downloaded_size,
228246
)
229247
return False
230-
if not filecmp.cmp(self.www_dir() + f, fp, shallow=False):
248+
if not filecmp.cmp(self.server_www_dir() + f, fp, shallow=False):
231249
logging.info("File contents of %s do not match.", fp)
232250
return False
233251
except Exception as exception:
234252
logging.info(
235253
"Could not compare files %s and %s: %s",
236-
self.www_dir() + f,
254+
self.server_www_dir() + f,
237255
fp,
238256
exception,
239257
)
@@ -268,12 +286,18 @@ def _payload_size(self, packets: List) -> int:
268286
return size
269287

270288
def cleanup(self):
271-
if self._www_dir:
272-
self._www_dir.cleanup()
273-
self._www_dir = None
274-
if self._download_dir:
275-
self._download_dir.cleanup()
276-
self._download_dir = None
289+
if self._client_www_dir:
290+
self._client_www_dir.cleanup()
291+
self._client_www_dir = None
292+
if self._client_download_dir:
293+
self._client_download_dir.cleanup()
294+
self._client_download_dir = None
295+
if self._server_www_dir:
296+
self._server_www_dir.cleanup()
297+
self._server_www_dir = None
298+
if self._server_download_dir:
299+
self._server_download_dir.cleanup()
300+
self._server_download_dir = None
277301

278302
@abc.abstractmethod
279303
def get_paths(self):

0 commit comments

Comments
 (0)