Skip to content

Commit eea0c71

Browse files
hanslovskyctrueden
authored andcommitted
Add test suite
Simple tests so far: - test resolution for - auto - copy - hard - soft - test parsington with argument `1+3`
1 parent c62b42d commit eea0c71

File tree

3 files changed

+116
-7
lines changed

3 files changed

+116
-7
lines changed

jgo/jgo.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ def launch_java(
188188
main_class,
189189
*app_args,
190190
additional_jars=[],
191-
**subprocess_run_kwargs,
191+
stdout=None,
192+
stderr=None,
193+
**subprocess_run_kwargs
192194
):
193195
java = executable_path('java')
194196
if not java:
@@ -197,7 +199,7 @@ def launch_java(
197199
cp = classpath_separator().join([os.path.join(jar_dir, '*')] + additional_jars)
198200
_logger.debug("class path: %s", cp)
199201
jvm_args = tuple(arg for arg in jvm_args) if jvm_args else tuple()
200-
return subprocess.run((java, '-cp', cp) + jvm_args + (main_class,) + app_args, **subprocess_run_kwargs)
202+
return subprocess.run((java, '-cp', cp) + jvm_args + (main_class,) + app_args, stdout=stdout, stderr=stderr, **subprocess_run_kwargs)
201203

202204
def run_and_combine_outputs(command, *args):
203205
return subprocess.check_output((command,) + args, stderr=subprocess.STDOUT)
@@ -212,7 +214,7 @@ def find_endpoint(argv, shortcuts={}):
212214
indices.append(index)
213215
return -1 if len(indices) == 0 else indices[-1]
214216

215-
def jgo_main(argv=sys.argv[1:]):
217+
def jgo_main(argv=sys.argv[1:], stdout=None, stderr=None):
216218

217219
epilog='''
218220
The endpoint should have one of the following formats:
@@ -247,7 +249,7 @@ def jgo_main(argv=sys.argv[1:]):
247249

248250

249251
try:
250-
completed_process = run(parser, argv=argv)
252+
completed_process = run(parser, argv=argv, stdout=stdout, stderr=stderr)
251253
completed_process.check_returncode()
252254
except subprocess.CalledProcessError as e:
253255
_logger.error("Error in `%s': %d", ' '.join(e.cmd), e.returncode)
@@ -486,7 +488,7 @@ def resolve_dependencies(
486488
return primary_endpoint, workspace
487489

488490

489-
def run(parser, argv=sys.argv[1:]):
491+
def run(parser, argv=sys.argv[1:], stdout=None, stderr=None):
490492

491493
config = default_config()
492494
if not '--ignore-jgorc' in argv:
@@ -548,7 +550,7 @@ def run(parser, argv=sys.argv[1:]):
548550
try:
549551
with open(main_class_file, 'r') as f:
550552
main_class = f.readline()
551-
return launch_java(workspace, jvm_args, main_class, *program_args, additional_jars=args.additional_jars, check=False)
553+
return launch_java(workspace, jvm_args, main_class, *program_args, additional_jars=args.additional_jars, stdout=stdout, stderr=stderr, check=False)
552554
except FileNotFoundError:
553555
pass
554556

@@ -575,7 +577,7 @@ def run(parser, argv=sys.argv[1:]):
575577
f.write(main_class)
576578

577579

578-
return launch_java(workspace, jvm_args, main_class, *program_args, additional_jars=args.additional_jars, check=False)
580+
return launch_java(workspace, jvm_args, main_class, *program_args, additional_jars=args.additional_jars, stdout=stdout, stderr=stderr, check=False)
579581

580582

581583

setup.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
license='Public domain',
1818
url='https://github.com/scijava/jgo',
1919
packages=['jgo'],
20+
test_suite='nose.collector',
2021
entry_points={
2122
'console_scripts': [
2223
'jgo=jgo.jgo:jgo_main'
2324
]
2425
},
2526
python_requires='>=3',
27+
tests_require=['nose>=1.0']
2628
)

tests/test_parsington.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import glob
2+
import io
3+
import jgo
4+
import os
5+
import pathlib
6+
import unittest
7+
import shutil
8+
import subprocess
9+
import tempfile
10+
11+
import logging
12+
_logger = logging.getLogger(__name__)
13+
14+
15+
IGNORE_JGORC = '--ignore-jgorc'
16+
LINK_TYPE = '--link-type'
17+
PARSINGTON_VERSION = '1.0.4'
18+
PARSINGTON_ENDPOINT = 'org.scijava:parsington:{}'.format(PARSINGTON_VERSION)
19+
20+
def run_parsington(cache_dir, link_type, parsington_args):
21+
argv = (IGNORE_JGORC, LINK_TYPE, link_type, PARSINGTON_ENDPOINT) + parsington_args
22+
os.environ[jgo.jgo.jgo_cache_dir_environment_variable()] = cache_dir
23+
return jgo.jgo.jgo_main(argv=argv, stdout=subprocess.PIPE)
24+
25+
def resolve_parsington(cache_dir, link_type, m2_repo):
26+
return jgo.resolve_dependencies(
27+
PARSINGTON_ENDPOINT,
28+
m2_repo=m2_repo,
29+
cache_dir=cache_dir,
30+
link_type=link_type)
31+
32+
class ParsingtonTest(unittest.TestCase):
33+
34+
def test_resolve_hard(self):
35+
tmp_dir = tempfile.mkdtemp(prefix='jgo-test-cache-dir')
36+
m2_repo = os.path.join(str(pathlib.Path.home()), '.m2', 'repository')
37+
try:
38+
_, workspace = resolve_parsington(cache_dir=tmp_dir, link_type='hard', m2_repo=m2_repo)
39+
jars = glob.glob(os.path.join(workspace, '*jar'))
40+
self.assertEqual(len(jars), 1, 'Expected exactly one jar in workspace')
41+
self.assertEqual(jars[0], os.path.join(workspace, 'parsington-%s.jar' % PARSINGTON_VERSION), 'Expected parsington jar')
42+
self.assertFalse(os.path.islink(jars[0]), 'Expected hard link but found symbolic link.')
43+
self.assertTrue(os.path.isfile(jars[0]))
44+
self.assertGreaterEqual(os.stat(jars[0]).st_nlink, 2, 'Expected ref count of at least 2 for hard link.')
45+
except OSError as e:
46+
if e.errno == 18:
47+
_logger.warning('Unable to cross-device hard link, skipping hard link test: %s', str(e))
48+
else:
49+
raise e
50+
finally:
51+
shutil.rmtree(tmp_dir)
52+
53+
def test_resolve_soft(self):
54+
tmp_dir = tempfile.mkdtemp(prefix='jgo-test-cache-dir')
55+
m2_repo = os.path.join(str(pathlib.Path.home()), '.m2', 'repository')
56+
try:
57+
_, workspace = resolve_parsington(cache_dir=tmp_dir, link_type='soft', m2_repo=m2_repo)
58+
jars = glob.glob(os.path.join(workspace, '*jar'))
59+
self.assertEqual(len(jars), 1, 'Expected exactly one jar in workspace')
60+
self.assertEqual(jars[0], os.path.join(workspace, 'parsington-%s.jar' % PARSINGTON_VERSION), 'Expected parsington jar')
61+
self.assertTrue(os.path.islink(jars[0]), 'Expected soft link.')
62+
finally:
63+
shutil.rmtree(tmp_dir)
64+
65+
def test_resolve_copy(self):
66+
tmp_dir = tempfile.mkdtemp(prefix='jgo-test-cache-dir')
67+
m2_repo = os.path.join(str(pathlib.Path.home()), '.m2', 'repository')
68+
try:
69+
_, workspace = resolve_parsington(cache_dir=tmp_dir, link_type='copy', m2_repo=m2_repo)
70+
jars = glob.glob(os.path.join(workspace, '*jar'))
71+
self.assertEqual(len(jars), 1, 'Expected exactly one jar in workspace')
72+
self.assertEqual(jars[0], os.path.join(workspace, 'parsington-%s.jar' % PARSINGTON_VERSION), 'Expected parsington jar')
73+
self.assertFalse(os.path.islink(jars[0]), 'Expected copied file but found symbolic link.')
74+
self.assertTrue(os.path.isfile(jars[0]))
75+
self.assertEqual(os.stat(jars[0]).st_nlink, 1, 'Expected ref count of exactly 1 for copied file.')
76+
finally:
77+
shutil.rmtree(tmp_dir)
78+
79+
def test_resolve_auto(self):
80+
tmp_dir = tempfile.mkdtemp(prefix='jgo-test-cache-dir')
81+
m2_repo = os.path.join(str(pathlib.Path.home()), '.m2', 'repository')
82+
try:
83+
_, workspace = resolve_parsington(cache_dir=tmp_dir, link_type='auto', m2_repo=m2_repo)
84+
jars = glob.glob(os.path.join(workspace, '*jar'))
85+
self.assertEqual(len(jars), 1, 'Expected exactly one jar in workspace')
86+
self.assertEqual(jars[0], os.path.join(workspace, 'parsington-%s.jar' % PARSINGTON_VERSION), 'Expected parsington jar')
87+
finally:
88+
shutil.rmtree(tmp_dir)
89+
90+
def test_run_jgo(self):
91+
tmp_dir = tempfile.mkdtemp(prefix='jgo-test-cache-dir')
92+
93+
try:
94+
completed_process = run_parsington(cache_dir=tmp_dir, link_type='auto', parsington_args=('1+3',))
95+
self.assertEqual(completed_process.returncode, 0, 'Expected return code zero.')
96+
self.assertEqual(completed_process.stdout.decode('ascii').strip(), str(1+3))
97+
finally:
98+
shutil.rmtree(tmp_dir)
99+
100+
101+
if __name__ == '__main__':
102+
unittest.main()
103+
104+
105+

0 commit comments

Comments
 (0)