File: //snap/google-cloud-cli/current/platform/ext-runtime/java/test/runtime_test.py
#!/usr/bin/python
# Copyright 2015 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests of the java runtime."""
import logging
import mock
import os
import re
import sys
import shutil
import tempfile
import textwrap
import unittest
from gae_ext_runtime import testutil
from gae_ext_runtime import ext_runtime
# Augment the path with our library directory.
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.join(ROOT_DIR, 'lib'))
import constants
#from googlecloudsdk.third_party.appengine.api import appinfo
#from googlecloudsdk.core import log
#from googlecloudsdk.api_lib.app import ext_runtime
#from googlecloudsdk.api_lib.app.runtimes import fingerprinter
#from googlecloudsdk.api_lib.app.ext_runtimes import fingerprinting
RUNTIME_DEF_ROOT = os.path.dirname(os.path.dirname(__file__))
class RuntimeTests(testutil.TestBase):
def setUp(self):
self.runtime_def_root = RUNTIME_DEF_ROOT
super(RuntimeTests, self).setUp()
def assert_no_file(self, *path):
self.assertFalse(os.path.exists(self.full_path(*path)))
def make_app_yaml(self, runtime):
return 'env: flex\nruntime: {runtime}\n'.format(runtime=runtime)
def test_java_all_defaults(self):
self.write_file('foo.jar', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
self.generate_configs(deploy=True)
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
dockerfile_contents = [
constants.DOCKERFILE_JAVA_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('foo.jar'),
constants.DOCKERFILE_JAVA8_JAR_CMD.format('foo.jar'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assertEqual(set(os.listdir(self.temp_path)),
{'.dockerignore', 'Dockerfile', 'app.yaml', 'foo.jar'})
def test_java_all_defaults_no_write(self):
"""Test generate_config_data after writing app.yaml."""
self.write_file('foo.jar', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
cfg_files = self.generate_config_data(deploy=True)
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
dockerfile_contents = [
constants.DOCKERFILE_JAVA_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('foo.jar'),
constants.DOCKERFILE_JAVA8_JAR_CMD.format('foo.jar'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assertEqual(set(os.listdir(self.temp_path)),
{'app.yaml', 'foo.jar'})
def test_java_custom(self):
self.write_file('foo.jar', '')
self.generate_configs(deploy=False, custom=True)
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('custom'))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
dockerfile_contents = [
constants.DOCKERFILE_JAVA_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('foo.jar'),
constants.DOCKERFILE_JAVA8_JAR_CMD.format('foo.jar'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
def test_java_custom_no_write(self):
"""Test generate_config_data with custom=True.
app.yaml should be written to disk. Also tests correct dockerfile
contents with a .jar.
"""
self.write_file('foo.jar', '')
cfg_files = self.generate_config_data(deploy=False, custom=True)
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('custom'))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
dockerfile_contents = [
constants.DOCKERFILE_JAVA_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('foo.jar'),
constants.DOCKERFILE_JAVA8_JAR_CMD.format('foo.jar'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
def test_java_files_no_java(self):
self.write_file('foo.nojava', '')
self.assertFalse(self.generate_configs())
self.assertEqual(os.listdir(self.temp_path), ['foo.nojava'])
def test_java_files_with_war(self):
self.write_file('foo.war', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
self.generate_configs(deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_JETTY_PREAMBLE,
constants.DOCKERFILE_INSTALL_WAR.format('foo.war'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore', self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_war_no_write(self):
"""Test generate_config_data Dockerfile contents with .war file."""
self.write_file('foo.war', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
cfg_files = self.generate_config_data(deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_JETTY_PREAMBLE,
constants.DOCKERFILE_INSTALL_WAR.format('foo.war'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_jar(self):
self.write_file('foo.jar', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
self.generate_configs(deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_JAVA_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('foo.jar'),
constants.DOCKERFILE_JAVA8_JAR_CMD.format('foo.jar'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_jar_no_write(self):
"""Test generate_config_data Dockerfile contents with .jar file."""
self.write_file('foo.jar', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
cfg_files = self.generate_config_data(deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_JAVA_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('foo.jar'),
constants.DOCKERFILE_JAVA8_JAR_CMD.format('foo.jar'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_webinf(self):
self.write_file('WEB-INF', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
self.generate_configs(deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_COMPAT_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_webinf_no_write(self):
"""Test generate_config_data Dockerfile contents with 'WEB-INF' file."""
self.write_file('WEB-INF', '')
self.generate_configs()
self.assert_file_exists_with_contents('app.yaml',
self.make_app_yaml('java'))
self.assert_no_file('Dockerfile')
self.assert_no_file('.dockerignore')
cfg_files = self.generate_config_data(deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_COMPAT_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_too_many_artifacts(self):
self.write_file('WEB-INF', '')
self.write_file('foo.jar', '')
errors = []
def ErrorFake(message):
errors.append(message)
with mock.patch.dict(ext_runtime._LOG_FUNCS, {'error': ErrorFake}):
self.assertFalse(self.generate_configs())
self.assertEqual(errors,
['Too many java artifacts to deploy (.jar, .war, or '
'Java Web App).'])
# TODO(b/63385240): cover the case were the app.yaml might not be called
# app.yaml. For example: "gen-config --config=foo.yaml <path>"
# will use foo.yaml
def test_java_files_with_war_and_yaml(self):
self.write_file('foo.war', '')
appinfo = testutil.AppInfoFake(
runtime='java',
env='flex',
runtime_config=dict(
jdk='openjdk8',
server='jetty9'))
self.generate_configs(appinfo=appinfo, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_JETTY_PREAMBLE,
constants.DOCKERFILE_INSTALL_WAR.format('foo.war'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_war_and_yaml_no_write(self):
"""Test generate_config_data with .war and fake appinfo."""
self.write_file('foo.war', '')
appinfo = testutil.AppInfoFake(
runtime='java',
env='2',
runtime_config=dict(
jdk='openjdk8',
server='jetty9'))
cfg_files = self.generate_config_data(appinfo=appinfo, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_JETTY_PREAMBLE,
constants.DOCKERFILE_INSTALL_WAR.format('foo.war'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_web_inf_and_yaml_and_env2(self):
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java',
env='2',
runtime_config=dict(
jdk='openjdk8',
server='jetty9'))
self.generate_configs(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_COMPAT_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_web_inf_and_yaml_and_env2_no_write(self):
"""Test generate_config_data with .war, fake appinfo, env=2."""
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java',
env='2',
runtime_config=dict(
jdk='openjdk8',
server='jetty9'))
cfg_files = self.generate_config_data(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_COMPAT_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_web_inf_and_yaml_and_no_env2(self):
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java',
vm=True,
runtime_config=dict(server='jetty9'))
self.generate_configs(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_LEGACY_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_web_inf_and_yaml_and_no_env2_no_write(self):
"""Test generate_config_data with .war, fake appinfo, env != 2."""
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java',
vm=True,
runtime_config=dict(server='jetty9'))
cfg_files = self.generate_config_data(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_LEGACY_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_web_inf_and_yaml_and_open_jdk8_no_env2(self):
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java',
vm=True,
runtime_config=dict(
jdk='openjdk8',
server='jetty9'))
self.generate_configs(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_COMPAT_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_web_inf_and_yaml_and_open_jdk8_no_env2_no_write(
self):
"""Test generate_config_data with WEB-INF file, fake appinfo."""
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java',
vm=True,
runtime_config=dict(
jdk='openjdk8',
server='jetty9'))
cfg_files = self.generate_config_data(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_COMPAT_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java_files_with_config_error(self):
self.write_file('foo.war', '')
errors = []
def ErrorFake(message):
errors.append(message)
config = testutil.AppInfoFake(
runtime='java',
env='2',
runtime_config=dict(
jdk='openjdk9'))
with mock.patch.dict(ext_runtime._LOG_FUNCS, {'error': ErrorFake}):
self.assertFalse(self.generate_configs(appinfo=config, deploy=True))
self.assertEqual(errors, ['Unknown JDK : openjdk9.'])
def test_java_custom_runtime_field(self):
self.write_file('foo.jar', '')
config = testutil.AppInfoFake(
runtime='java',
env='2')
self.assertTrue(self.generate_configs(appinfo=config, deploy=True))
def test_java7_runtime(self):
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java7',
vm=True)
self.generate_configs(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_LEGACY_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_file_exists_with_contents('Dockerfile',
''.join(dockerfile_contents))
self.assert_file_exists_with_contents(
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_java7_runtime_no_write(self):
"""Test generate_config_data with java7 runtime."""
self.write_file('WEB-INF', '')
config = testutil.AppInfoFake(
runtime='java7',
vm=True)
cfg_files = self.generate_config_data(appinfo=config, deploy=True)
dockerfile_contents = [
constants.DOCKERFILE_LEGACY_PREAMBLE,
constants.DOCKERFILE_INSTALL_APP.format('.'),
]
self.assert_genfile_exists_with_contents(
cfg_files,
'Dockerfile',
''.join(dockerfile_contents))
self.assert_genfile_exists_with_contents(
cfg_files,
'.dockerignore',
self.read_runtime_def_file('data', 'dockerignore'))
def test_detect_appinfo_war(self):
self.write_file('foo.war', '')
configurator = self.detect()
self.assertEqual(configurator.generated_appinfo, {'runtime':'java',
'env': 'flex'})
def test_detect_appinfo_jar(self):
self.write_file('foo.jar', '')
configurator = self.detect()
self.assertEqual(configurator.generated_appinfo, {'runtime':'java',
'env': 'flex'})
if __name__ == '__main__':
unittest.main()