import glob
import os
import shutil
import subprocess
import pytest
from unit.applications.proto import TestApplicationProto
from unit.option import option
class TestApplicationJava(TestApplicationProto):
application_type = "java"
def prepare_env(self, script):
app_path = f'{option.temp_dir}/java'
web_inf_path = f'{app_path}/WEB-INF/'
classes_path = f'{web_inf_path}classes/'
script_path = f'{option.test_dir}/java/{script}/'
if not os.path.isdir(app_path):
os.makedirs(app_path)
src = []
for f in os.listdir(script_path):
file_path = f'{script_path}{f}'
if f.endswith('.java'):
src.append(file_path)
continue
if f.startswith('.') or f == 'Makefile':
continue
if os.path.isdir(file_path):
if f == 'WEB-INF':
continue
shutil.copytree(file_path, f'{app_path}/{f}')
continue
if f == 'web.xml':
if not os.path.isdir(web_inf_path):
os.makedirs(web_inf_path)
shutil.copy2(file_path, web_inf_path)
else:
shutil.copy2(file_path, app_path)
if src:
if not os.path.isdir(classes_path):
os.makedirs(classes_path)
classpath = (
f'{option.current_dir}/build/tomcat-servlet-api-9.0.70.jar'
)
ws_jars = glob.glob(
f'{option.current_dir}/build/websocket-api-java*.jar'
)
if not ws_jars:
pytest.fail('websocket api jar not found.')
javac = [
'javac',
'-target',
'8',
'-source',
'8',
'-nowarn',
'-encoding',
'utf-8',
'-d',
classes_path,
'-classpath',
f'{classpath}:{ws_jars[0]}',
]
javac.extend(src)
if option.detailed:
print(f'\n$ {" ".join(javac)}')
try:
subprocess.check_output(javac, stderr=subprocess.STDOUT)
except KeyboardInterrupt:
raise
except subprocess.CalledProcessError:
pytest.fail("Can't run javac process.")
def load(self, script, **kwargs):
self.prepare_env(script)
script_path = f'{option.test_dir}/java/{script}/'
self._load_conf(
{
"listeners": {"*:7080": {"pass": f"applications/{script}"}},
"applications": {
script: {
"unit_jars": f'{option.current_dir}/build',
"type": self.get_application_type(),
"processes": {"spare": 0},
"working_directory": script_path,
"webapp": f'{option.temp_dir}/java',
}
},
},
**kwargs,
)