Source code

Revision control

Copy as Markdown

Other Tools

#!/usr/bin/env python3
import contextlib
import os
import shutil
import subprocess
import sys
import tempfile
import unittest
import pytest
from mozunit import main
testDir = os.path.dirname(os.path.abspath(__file__))
OUT_DIR = os.path.abspath(os.path.join(testDir, "..", "out"))
EXPECTED_DIR = os.path.join(testDir, "expected")
ex = os.path.join(testDir, "..", "test262-export.py")
importExec = os.path.join(testDir, "..", "test262-update.py")
@contextlib.contextmanager
def TemporaryDirectory():
tmpDir = tempfile.mkdtemp()
try:
yield tmpDir
finally:
shutil.rmtree(tmpDir)
class TestExport(unittest.TestCase):
maxDiff = None
def exportScript(self):
abspath = os.path.abspath(os.path.join(testDir, "fixtures", "export"))
sp = subprocess.Popen(
[sys.executable, os.path.abspath(ex), abspath, "--out", OUT_DIR],
stdout=subprocess.PIPE,
cwd=os.path.join(testDir, ".."),
)
stdout, stderr = sp.communicate()
return dict(stdout=stdout, stderr=stderr, returncode=sp.returncode)
def importLocal(self):
with TemporaryDirectory() as cloneDir:
branch = "smTempBranch"
# Clone Test262 to a local branch
subprocess.check_call(["git", "clone", "--depth=1", test262Url, cloneDir])
# Checkout to a new branch
subprocess.check_call(["git", "-C", cloneDir, "checkout", "-b", branch])
# Make changes on the new branch
# Remove test/language/export/escaped-from.js
subprocess.check_call(
["git", "-C", cloneDir, "rm", "test/language/export/escaped-from.js"]
)
# Rename test/language/export/escaped-default.js
subprocess.check_call(
[
"git",
"-C",
cloneDir,
"mv",
"test/language/export/escaped-default.js",
"test/language/export/escaped-foobarbaz.js",
]
)
# Copy fixtures files
fixturesDir = os.path.join(testDir, "fixtures", "import", "files")
shutil.copytree(fixturesDir, os.path.join(cloneDir, "test", "temp42"))
# Stage and Commit changes
subprocess.check_call(["git", "-C", cloneDir, "add", "."])
subprocess.check_call(
["git", "-C", cloneDir, "commit", "-m", '"local foo"']
)
# Run import script
print(
"%s %s --local %s --out %s"
% (sys.executable, importExec, cloneDir, OUT_DIR)
)
sp = subprocess.Popen(
[sys.executable, importExec, "--local", cloneDir, "--out", OUT_DIR],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
cwd=os.path.join(testDir, ".."),
)
stdoutdata, stderrdata = sp.communicate()
return stdoutdata, stderrdata, sp.returncode, cloneDir
def isTestFile(self, filename: str):
return not (
filename.startswith(".")
or filename.startswith("#")
or filename.endswith("~")
)
def getFiles(self, path: str):
names: list[str] = []
for root, _, fileNames in os.walk(path):
for fileName in filter(self.isTestFile, fileNames):
names.append(os.path.join(root, fileName))
names.sort()
return names
def compareTrees(self, expectedPath: str, actualPath: str):
expectedFiles = self.getFiles(expectedPath)
actualFiles = self.getFiles(actualPath)
self.assertListEqual(
[os.path.relpath(x, expectedPath) for x in expectedFiles],
[os.path.relpath(x, actualPath) for x in actualFiles],
)
for expectedFile, actualFile in zip(expectedFiles, actualFiles):
with open(expectedFile) as expectedHandle:
with open(actualFile) as actualHandle:
self.assertMultiLineEqual(
expectedHandle.read(), actualHandle.read(), expectedFile
)
def compareContents(self, output: bytes, filePath: str, folder: str):
with open(filePath, "r") as file:
expected = file.read()
expected = expected.replace("{{folder}}", folder)
self.assertMultiLineEqual(output.decode("utf-8"), expected)
def tearDown(self):
shutil.rmtree(OUT_DIR, ignore_errors=True)
def test_export(self):
result = self.exportScript()
self.assertEqual(result["returncode"], 0)
expectedPath = os.path.join(EXPECTED_DIR, "export")
actualPath = os.path.join(OUT_DIR, "tests", "export")
self.compareTrees(expectedPath, actualPath)
@pytest.mark.skip(reason="test fetches from github")
def test_import_local(self):
stdoutdata, stderrdata, returncode, folder = self.importLocal()
self.assertEqual(stderrdata, b"")
self.assertEqual(returncode, 0)
self.compareTrees(
os.path.join(EXPECTED_DIR, "import", "files", "local"),
os.path.join(OUT_DIR, "local"),
)
self.compareContents(
stdoutdata,
os.path.join(testDir, "expected", "import", "output.txt"),
folder,
)
if __name__ == "__main__":
main()