Skip to content

Commit 5c28a85

Browse files
committed
Merged in [19555] from jennifer@painless-security.com:
Use temporary directories instead of 'real' filesystem for tests. Fixes ietf-tools#3414. - Legacy-Id: 19561 Note: SVN reference [19555] has been migrated to Git commit 81d9234
2 parents e3cd5f5 + 81d9234 commit 5c28a85

35 files changed

Lines changed: 279 additions & 420 deletions

ietf/api/tests.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import json
66
import html
77
import os
8-
import shutil
98
import sys
109

1110
from importlib import import_module
@@ -38,14 +37,7 @@
3837
)
3938

4039
class CustomApiTests(TestCase):
41-
def setUp(self):
42-
self.agenda_path = self.tempdir('materials')
43-
self.saved_agenda_path = settings.AGENDA_PATH
44-
settings.AGENDA_PATH = self.agenda_path
45-
46-
def tearDown(self):
47-
shutil.rmtree(self.agenda_path)
48-
settings.AGENDA_PATH = self.saved_agenda_path
40+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH']
4941

5042
# Using mock to patch the import functions in ietf.meeting.views, where
5143
# api_import_recordings() are using them:

ietf/doc/tests.py

Lines changed: 38 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44

55
import os
6-
import shutil
76
import datetime
87
import io
98
import lxml
@@ -13,6 +12,7 @@
1312
import copy
1413

1514
from http.cookies import SimpleCookie
15+
from pathlib import Path
1616
from pyquery import PyQuery
1717
from urllib.parse import urlparse, parse_qs
1818
from tempfile import NamedTemporaryFile
@@ -523,19 +523,10 @@ class DocDraftTestCase(TestCase):
523523
"""
524524

525525
def setUp(self):
526-
self.id_dir = self.tempdir('id')
527-
self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH
528-
settings.INTERNET_DRAFT_PATH = self.id_dir
529-
self.saved_internet_all_drafts_archive_dir = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR
530-
settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR = self.id_dir
531-
f = io.open(os.path.join(self.id_dir, 'draft-ietf-mars-test-01.txt'), 'w')
532-
f.write(self.draft_text)
533-
f.close()
534-
535-
def tearDown(self):
536-
settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR = self.saved_internet_all_drafts_archive_dir
537-
settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path
538-
shutil.rmtree(self.id_dir)
526+
super().setUp()
527+
for dir in [settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR, settings.INTERNET_DRAFT_PATH]:
528+
with (Path(dir) / 'draft-ietf-mars-test-01.txt').open('w') as f:
529+
f.write(self.draft_text)
539530

540531
def test_document_draft(self):
541532
draft = WgDraftFactory(name='draft-ietf-mars-test',rev='01')
@@ -694,6 +685,7 @@ def test_document_draft(self):
694685
self.assertEqual(r.status_code, 200)
695686

696687
rfc = WgRfcFactory()
688+
(Path(settings.RFC_PATH) / rfc.get_base_name()).touch()
697689
r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.canonical_name())))
698690
self.assertEqual(r.status_code, 200)
699691
r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.rfc_number())))
@@ -1895,6 +1887,7 @@ def test_references(self):
18951887

18961888
class GenerateDraftAliasesTests(TestCase):
18971889
def setUp(self):
1890+
super().setUp()
18981891
self.doc_aliases_file = NamedTemporaryFile(delete=False, mode='w+')
18991892
self.doc_aliases_file.close()
19001893
self.doc_virtual_file = NamedTemporaryFile(delete=False, mode='w+')
@@ -1909,6 +1902,7 @@ def tearDown(self):
19091902
settings.DRAFT_VIRTUAL_PATH = self.saved_draft_virtual_path
19101903
os.unlink(self.doc_aliases_file.name)
19111904
os.unlink(self.doc_virtual_file.name)
1905+
super().tearDown()
19121906

19131907
def testManagementCommand(self):
19141908
a_month_ago = datetime.datetime.now() - datetime.timedelta(30)
@@ -2013,6 +2007,7 @@ def testManagementCommand(self):
20132007
class EmailAliasesTests(TestCase):
20142008

20152009
def setUp(self):
2010+
super().setUp()
20162011
WgDraftFactory(name='draft-ietf-mars-test',group__acronym='mars')
20172012
WgDraftFactory(name='draft-ietf-ames-test',group__acronym='ames')
20182013
RoleFactory(group__type_id='review', group__acronym='yangdoctors', name_id='secr')
@@ -2044,6 +2039,7 @@ def setUp(self):
20442039
def tearDown(self):
20452040
settings.DRAFT_VIRTUAL_PATH = self.saved_draft_virtual_path
20462041
os.unlink(self.doc_alias_file.name)
2042+
super().tearDown()
20472043

20482044
def testAliases(self):
20492045
PersonFactory(user__username='plain')
@@ -2068,6 +2064,7 @@ def testExpansions(self):
20682064
class DocumentMeetingTests(TestCase):
20692065

20702066
def setUp(self):
2067+
super().setUp()
20712068
self.group = GroupFactory(type_id='wg',state_id='active')
20722069
self.group_chair = PersonFactory()
20732070
self.group.role_set.create(name_id='chair',person=self.group_chair,email=self.group_chair.email())
@@ -2384,53 +2381,42 @@ class _TestForm(Form):
23842381
)
23852382

23862383
class MaterialsTests(TestCase):
2387-
2384+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH']
23882385
def setUp(self):
2389-
self.id_dir = self.tempdir('id')
2390-
self.saved_agenda_path = settings.AGENDA_PATH
2391-
settings.AGENDA_PATH = self.id_dir
2386+
super().setUp()
23922387

23932388
meeting_number='111'
2394-
meeting_dir = os.path.join(f'{settings.AGENDA_PATH}',f'{meeting_number}')
2395-
os.mkdir(meeting_dir)
2396-
agenda_dir = os.path.join(meeting_dir,'agenda')
2397-
os.mkdir(agenda_dir)
2389+
meeting_dir = Path(settings.AGENDA_PATH) / meeting_number
2390+
meeting_dir.mkdir()
2391+
agenda_dir = meeting_dir / 'agenda'
2392+
agenda_dir.mkdir()
23982393

23992394
group_acronym='bogons'
24002395

24012396
# This is too much work - the factory should
24022397
# * build the DocumentHistory correctly
24032398
# * maybe do something by default with uploaded_filename
24042399
# and there should be a more usable unit to save bits to disk (handle_file_upload isn't quite right) that tests can leverage
2405-
try:
2406-
uploaded_filename_00 = f'agenda-{meeting_number}-{group_acronym}-00.txt'
2407-
uploaded_filename_01 = f'agenda-{meeting_number}-{group_acronym}-01.md'
2408-
f = io.open(os.path.join(agenda_dir, uploaded_filename_00), 'w')
2409-
f.write('This is some unremarkable text')
2410-
f.close()
2411-
f = io.open(os.path.join(agenda_dir, uploaded_filename_01), 'w')
2412-
f.write('This links to [an unusual place](https://unusual.example).')
2413-
f.close()
2414-
2415-
self.doc = DocumentFactory(type_id='agenda',rev='00',group__acronym=group_acronym, newrevisiondocevent=None, name=f'agenda-{meeting_number}-{group_acronym}', uploaded_filename=uploaded_filename_00)
2416-
e = NewRevisionDocEventFactory(doc=self.doc,rev='00')
2417-
self.doc.save_with_history([e])
2418-
self.doc.rev = '01'
2419-
self.doc.uploaded_filename = uploaded_filename_01
2420-
e = NewRevisionDocEventFactory(doc=self.doc, rev='01')
2421-
self.doc.save_with_history([e])
2422-
2423-
# This is necessary for the view to be able to find the document
2424-
# which hints that the view has an issue : if a materials document is taken out of all SessionPresentations, it is no longer accessable by this view
2425-
SessionPresentationFactory(session__meeting__number=meeting_number, session__group=self.doc.group, document=self.doc)
2426-
2427-
except:
2428-
shutil.rmtree(self.id_dir)
2429-
raise
2400+
uploaded_filename_00 = f'agenda-{meeting_number}-{group_acronym}-00.txt'
2401+
uploaded_filename_01 = f'agenda-{meeting_number}-{group_acronym}-01.md'
2402+
f = io.open(os.path.join(agenda_dir, uploaded_filename_00), 'w')
2403+
f.write('This is some unremarkable text')
2404+
f.close()
2405+
f = io.open(os.path.join(agenda_dir, uploaded_filename_01), 'w')
2406+
f.write('This links to [an unusual place](https://unusual.example).')
2407+
f.close()
24302408

2431-
def tearDown(self):
2432-
settings.AGENDA_PATH = self.saved_agenda_path
2433-
shutil.rmtree(self.id_dir)
2409+
self.doc = DocumentFactory(type_id='agenda',rev='00',group__acronym=group_acronym, newrevisiondocevent=None, name=f'agenda-{meeting_number}-{group_acronym}', uploaded_filename=uploaded_filename_00)
2410+
e = NewRevisionDocEventFactory(doc=self.doc,rev='00')
2411+
self.doc.save_with_history([e])
2412+
self.doc.rev = '01'
2413+
self.doc.uploaded_filename = uploaded_filename_01
2414+
e = NewRevisionDocEventFactory(doc=self.doc, rev='01')
2415+
self.doc.save_with_history([e])
2416+
2417+
# This is necessary for the view to be able to find the document
2418+
# which hints that the view has an issue : if a materials document is taken out of all SessionPresentations, it is no longer accessable by this view
2419+
SessionPresentationFactory(session__meeting__number=meeting_number, session__group=self.doc.group, document=self.doc)
24342420

24352421
def test_markdown_and_text(self):
24362422
url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=self.doc.name,rev='00'))
@@ -2446,15 +2432,7 @@ def test_markdown_and_text(self):
24462432
self.assertEqual(q('#materials-content .panel-body a').attr['href'],'https://unusual.example')
24472433

24482434
class Idnits2SupportTests(TestCase):
2449-
2450-
def setUp(self):
2451-
self.derived_dir = self.tempdir('derived')
2452-
self.saved_derived_dir = settings.DERIVED_DIR
2453-
settings.DERIVED_DIR = self.derived_dir
2454-
2455-
def tearDown(self):
2456-
settings.DERIVED_DIR = self.saved_derived_dir
2457-
shutil.rmtree(self.derived_dir)
2435+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['DERIVED_DIR']
24582436

24592437
def test_obsoleted(self):
24602438
rfc = WgRfcFactory(alias2__name='rfc1001')
@@ -2506,6 +2484,7 @@ def test_idnits2_state(self):
25062484
class RfcdiffSupportTests(TestCase):
25072485

25082486
def setUp(self):
2487+
super().setUp()
25092488
self.target_view = 'ietf.doc.views_doc.rfcdiff_latest_json'
25102489

25112490
def getJson(self, view_args):

ietf/doc/tests_ballot.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,7 @@ def test_undefer_status_change(self):
10561056
# when charters support being deferred, be sure to test them here
10571057

10581058
def setUp(self):
1059+
super().setUp()
10591060
IndividualDraftFactory(name='draft-ietf-mars-test',states=[('draft','active'),('draft-iesg','iesg-eva')],
10601061
ad=Person.objects.get(user__username='ad'))
10611062
DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review',states=[('statchg','iesgeval')])

ietf/doc/tests_bofreq.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
import datetime
44
import debug # pyflakes:ignore
5-
import io
65
import os
7-
import shutil
86

7+
from pathlib import Path
98
from pyquery import PyQuery
109
from random import randint
1110
from tempfile import NamedTemporaryFile
@@ -24,19 +23,11 @@
2423

2524

2625
class BofreqTests(TestCase):
27-
28-
def setUp(self):
29-
self.bofreq_dir = self.tempdir('bofreq')
30-
self.saved_bofreq_path = settings.BOFREQ_PATH
31-
settings.BOFREQ_PATH = self.bofreq_dir
32-
33-
def tearDown(self):
34-
settings.BOFREQ_PATH = self.saved_bofreq_path
35-
shutil.rmtree(self.bofreq_dir)
26+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['BOFREQ_PATH']
3627

3728
def write_bofreq_file(self, bofreq):
38-
fname = os.path.join(self.bofreq_dir, "%s-%s.md" % (bofreq.canonical_name(), bofreq.rev))
39-
with io.open(fname, "w") as f:
29+
fname = Path(settings.BOFREQ_PATH) / ("%s-%s.md" % (bofreq.canonical_name(), bofreq.rev))
30+
with fname.open("w") as f:
4031
f.write(f"""# This is a test bofreq.
4132
Version: {bofreq.rev}
4233

ietf/doc/tests_charter.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44

55
import datetime
66
import io
7-
import os
8-
import shutil
97

8+
from pathlib import Path
109
from pyquery import PyQuery
1110

1211
from django.conf import settings
@@ -84,17 +83,12 @@ def test_view_revisions(self):
8483

8584

8685
class EditCharterTests(TestCase):
87-
def setUp(self):
88-
self.charter_dir = self.tempdir('charter')
89-
self.saved_charter_path = settings.CHARTER_PATH
90-
settings.CHARTER_PATH = self.charter_dir
91-
92-
def tearDown(self):
93-
settings.CHARTER_PATH = self.saved_charter_path
94-
shutil.rmtree(self.charter_dir)
86+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CHARTER_PATH']
9587

9688
def write_charter_file(self, charter):
97-
with io.open(os.path.join(self.charter_dir, "%s-%s.txt" % (charter.canonical_name(), charter.rev)), "w") as f:
89+
with (Path(settings.CHARTER_PATH) /
90+
("%s-%s.txt" % (charter.canonical_name(), charter.rev))
91+
).open("w") as f:
9892
f.write("This is a charter.")
9993

10094
def test_startstop_process(self):
@@ -513,7 +507,7 @@ def test_submit_charter(self):
513507
self.assertEqual(charter.rev, next_revision(prev_rev))
514508
self.assertTrue("new_revision" in charter.latest_event().type)
515509

516-
with io.open(os.path.join(self.charter_dir, charter.canonical_name() + "-" + charter.rev + ".txt"), encoding='utf-8') as f:
510+
with (Path(settings.CHARTER_PATH) / (charter.canonical_name() + "-" + charter.rev + ".txt")).open(encoding='utf-8') as f:
517511
self.assertEqual(f.read(), "Windows line\nMac line\nUnix line\n" + utf_8_snippet.decode('utf-8'))
518512

519513
def test_submit_initial_charter(self):
@@ -792,7 +786,9 @@ def test_approve(self):
792786
self.assertTrue(not charter.ballot_open("approve"))
793787

794788
self.assertEqual(charter.rev, "01")
795-
self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "charter-ietf-%s-%s.txt" % (group.acronym, charter.rev))))
789+
self.assertTrue(
790+
(Path(settings.CHARTER_PATH) / ("charter-ietf-%s-%s.txt" % (group.acronym, charter.rev))).exists()
791+
)
796792

797793
self.assertEqual(len(outbox), 2)
798794
#

ietf/doc/tests_conflict_review.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import io
66
import os
7-
import shutil
87

98
from pyquery import PyQuery
109
from textwrap import wrap
@@ -367,11 +366,13 @@ def test_no_approval_pend_notice_secr_noprob(self):
367366
self.assertEqual(len(outbox), 0)
368367

369368
def setUp(self):
369+
super().setUp()
370370
IndividualDraftFactory(name='draft-imaginary-independent-submission')
371371
ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission',review_of=IndividualDraftFactory(name='draft-imaginary-irtf-submission',stream_id='irtf'),notify='notifyme@example.net')
372372

373373

374374
class ConflictReviewSubmitTests(TestCase):
375+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CONFLICT_REVIEW_PATH']
375376
def test_initial_submission(self):
376377
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
377378
url = urlreverse('ietf.doc.views_conflict_review.submit',kwargs=dict(name=doc.name))
@@ -447,11 +448,5 @@ def test_subsequent_submission(self):
447448
self.assertTrue(q('textarea')[0].text.strip().startswith("[Edit this page"))
448449

449450
def setUp(self):
451+
super().setUp()
450452
ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission',review_of=IndividualDraftFactory(name='draft-imaginary-irtf-submission',stream_id='irtf'),notify='notifyme@example.net')
451-
self.test_dir = self.tempdir('conflict-review')
452-
self.saved_conflict_review_path = settings.CONFLICT_REVIEW_PATH
453-
settings.CONFLICT_REVIEW_PATH = self.test_dir
454-
455-
def tearDown(self):
456-
settings.CONFLICT_REVIEW_PATH = self.saved_conflict_review_path
457-
shutil.rmtree(self.test_dir)

ietf/doc/tests_downref.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
class Downref(TestCase):
1717

1818
def setUp(self):
19+
super().setUp()
1920
PersonFactory(name='Plain Man',user__username='plain')
2021
self.draft = WgDraftFactory(name='draft-ietf-mars-test')
2122
self.draftalias = self.draft.docalias.get(name='draft-ietf-mars-test')

0 commit comments

Comments
 (0)