Commit 749d8bcc by apoorvnaik

ATLAS-2218: TestMetadata fix after ATLAS-1218, ATLAS-2087 changes

parent bd513f25
...@@ -30,163 +30,242 @@ import platform ...@@ -30,163 +30,242 @@ import platform
IS_WINDOWS = platform.system() == "Windows" IS_WINDOWS = platform.system() == "Windows"
logger = logging.getLogger() logger = logging.getLogger()
class TestMetadata(unittest.TestCase): class TestMetadata(unittest.TestCase):
@patch.object(mc,"runProcess") # A map of mock values for the get_config calls
@patch.object(mc,"configure_hbase") mock_values = {
@patch.object(mc,"getConfig") 'port': 21000,
@patch.object(mc,"grep") 'host': "locahost",
@patch.object(mc,"exist_pid") 'atlas.graph.index.search.solr.zookeeper-url': "localhost:9838",
@patch.object(mc,"writePid") 'atlas.server.http.port': 21000,
@patch.object(mc, "executeEnvSh") 'atlas.server.https.port': 21443
@patch.object(mc,"atlasDir") }
@patch.object(mc, "expandWebApp")
@patch("os.path.exists") # The getConfig mock has to be configured here to return the expected mock values
@patch.object(mc, "java") def get_config_mock_side_effect(*args, **kwargs):
@patch.object(mc, "is_hbase_local") print "get_config_mock_side_effect (" + args[2] + ")"
@patch.object(mc, "is_solr_local") return TestMetadata.mock_values.get(args[2])
def test_main_embedded(self, is_solr_local_mock, is_hbase_local_mock, java_mock, exists_mock, expandWebApp_mock, # The getConfig mock has to be configured here to return the expected mock values
atlasDir_mock, executeEnvSh_mock, writePid_mock, exist_pid_mock, grep_mock, getConfig_mock, def get_default_config_mock_side_effect(*args, **kwargs):
configure_hbase_mock, runProcess_mock): print "get_default_config_mock_side_effect (" + args[3] + ")"
sys.argv = [] return TestMetadata.mock_values.get(args[3])
exists_mock.return_value = True
expandWebApp_mock.return_value = "webapp" @patch.object(mc, "runProcess")
atlasDir_mock.return_value = "atlas_home" @patch.object(mc, "configure_hbase")
is_hbase_local_mock.return_value = True @patch.object(mc, "getConfig")
is_solr_local_mock.return_value = True @patch.object(mc, "getConfigWithDefault")
@patch.object(mc, "grep")
exist_pid_mock(789) @patch.object(mc, "exist_pid")
exist_pid_mock.assert_called_with(789) @patch.object(mc, "writePid")
grep_mock.return_value = "hbase" @patch.object(mc, "executeEnvSh")
getConfig_mock.return_value = "localhost:9838" @patch.object(mc, "atlasDir")
@patch.object(mc, "expandWebApp")
atlas.main() @patch("os.path.exists")
self.assertTrue(configure_hbase_mock.called) @patch.object(mc, "java")
@patch.object(mc, "is_hbase_local")
if IS_WINDOWS: @patch.object(mc, "is_solr_local")
calls = [call(['atlas_home\\hbase\\bin\\start-hbase.cmd', '--config', 'atlas_home\\hbase\\conf'], 'atlas_home\\logs', False, True), @patch.object(mc, "wait_for_startup")
call(['atlas_home\\solr\\bin\\solr.cmd', 'start', '-z', 'localhost:9838', '-p', '9838'], 'atlas_home\\logs', False, True), def test_main_embedded(self, wait_for_startup_mock, is_solr_local_mock, is_hbase_local_mock, java_mock, exists_mock, expandWebApp_mock,
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'vertex_index', '-d', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home\\logs', False, True), atlasDir_mock, executeEnvSh_mock, writePid_mock, exist_pid_mock, grep_mock,
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'edge_index', '-d', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home\\logs', False, True), getConfigWithDefault_mock, getConfig_mock, configure_hbase_mock, runProcess_mock):
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'fulltext_index', '-d', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home\\logs', False, True)] sys.argv = []
exists_mock.return_value = True
runProcess_mock.assert_has_calls(calls) expandWebApp_mock.return_value = "webapp"
else: atlasDir_mock.return_value = "atlas_home"
calls = [call(['atlas_home/hbase/bin/hbase-daemon.sh', '--config', 'atlas_home/hbase/conf', 'start', 'master'], 'atlas_home/logs', False, True), is_hbase_local_mock.return_value = True
call(['atlas_home/solr/bin/solr', 'start', '-z', 'localhost:9838', '-p', '9838'], 'atlas_home/logs', False, True), is_solr_local_mock.return_value = True
call(['atlas_home/solr/bin/solr', 'create', '-c', 'vertex_index', '-d', 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home/logs', False, True), wait_for_startup_mock.return_value = True
call(['atlas_home/solr/bin/solr', 'create', '-c', 'edge_index', '-d', 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home/logs', False, True),
call(['atlas_home/solr/bin/solr', 'create', '-c', 'fulltext_index', '-d', 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home/logs', False, True)] exist_pid_mock(789)
exist_pid_mock.assert_called_with(789)
runProcess_mock.assert_has_calls(calls) grep_mock.return_value = "hbase"
getConfig_mock.side_effect = self.get_config_mock_side_effect
self.assertTrue(java_mock.called) getConfigWithDefault_mock.side_effect = self.get_default_config_mock_side_effect
if IS_WINDOWS:
atlas.main()
java_mock.assert_called_with( self.assertTrue(configure_hbase_mock.called)
'org.apache.atlas.Atlas',
['-app', 'atlas_home\\server\\webapp\\atlas'], if IS_WINDOWS:
'atlas_home\\conf;atlas_home\\server\\webapp\\atlas\\WEB-INF\\classes;atlas_home\\server\\webapp\\atlas\\WEB-INF\\lib\\*;atlas_home\\libext\\*;atlas_home\\hbase\\conf', calls = [call(['atlas_home\\hbase\\bin\\start-hbase.cmd', '--config', 'atlas_home\\hbase\\conf'],
['-Datlas.log.dir=atlas_home\\logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home', '-Datlas.conf=atlas_home\\conf', '-Xmx1024m', '-XX:MaxPermSize=512m', '-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'], 'atlas_home\\logs') 'atlas_home\\logs', False, True),
call(['atlas_home\\solr\\bin\\solr.cmd', 'start', '-z', 'localhost:9838', '-p', '9838'],
else: 'atlas_home\\logs', False, True),
java_mock.assert_called_with( call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'vertex_index', '-d',
'org.apache.atlas.Atlas', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1',
['-app', 'atlas_home/server/webapp/atlas'], '-replicationFactor', '1'], 'atlas_home\\logs', False, True),
'atlas_home/conf:atlas_home/server/webapp/atlas/WEB-INF/classes:atlas_home/server/webapp/atlas/WEB-INF/lib/*:atlas_home/libext/*:atlas_home/hbase/conf', call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'edge_index', '-d',
['-Datlas.log.dir=atlas_home/logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home', '-Datlas.conf=atlas_home/conf', '-Xmx1024m', '-XX:MaxPermSize=512m', '-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'], 'atlas_home/logs') 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1',
'-replicationFactor', '1'], 'atlas_home\\logs', False, True),
pass call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'fulltext_index', '-d',
'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1',
@patch.object(mc,"runProcess") '-replicationFactor', '1'], 'atlas_home\\logs', False, True)]
@patch.object(mc,"configure_hbase")
@patch.object(mc,"getConfig") runProcess_mock.assert_has_calls(calls)
@patch.object(mc,"grep") else:
@patch.object(mc,"exist_pid") calls = [
@patch.object(mc,"writePid") call(['atlas_home/hbase/bin/hbase-daemon.sh', '--config', 'atlas_home/hbase/conf', 'start', 'master'],
@patch.object(mc, "executeEnvSh") 'atlas_home/logs', False, True),
@patch.object(mc,"atlasDir") call(['atlas_home/solr/bin/solr', 'start', '-z', 'localhost:9838', '-p', '9838'], 'atlas_home/logs',
@patch.object(mc, "expandWebApp") False, True),
@patch("os.path.exists") call(['atlas_home/solr/bin/solr', 'create', '-c', 'vertex_index', '-d',
@patch.object(mc, "java") 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor',
@patch.object(mc, "is_hbase_local") '1'], 'atlas_home/logs', False, True),
@patch.object(mc, "is_solr_local") call(['atlas_home/solr/bin/solr', 'create', '-c', 'edge_index', '-d',
def test_main_default(self, is_solr_local_mock, is_hbase_local_mock, java_mock, exists_mock, expandWebApp_mock, 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor',
atlasDir_mock, executeEnvSh_mock, writePid_mock, exist_pid_mock, grep_mock, getConfig_mock, '1'], 'atlas_home/logs', False, True),
configure_hbase_mock, runProcess_mock): call(['atlas_home/solr/bin/solr', 'create', '-c', 'fulltext_index', '-d',
sys.argv = [] 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor',
exists_mock.return_value = True '1'], 'atlas_home/logs', False, True)]
expandWebApp_mock.return_value = "webapp"
atlasDir_mock.return_value = "atlas_home" runProcess_mock.assert_has_calls(calls)
is_hbase_local_mock.return_value = False
is_solr_local_mock.return_value = False self.assertTrue(java_mock.called)
if IS_WINDOWS:
exist_pid_mock(789)
exist_pid_mock.assert_called_with(789) java_mock.assert_called_with(
grep_mock.return_value = "hbase" 'org.apache.atlas.Atlas',
getConfig_mock.return_value = "localhost:9838" ['-app', 'atlas_home\\server\\webapp\\atlas'],
'atlas_home\\conf;atlas_home\\server\\webapp\\atlas\\WEB-INF\\classes;atlas_home\\server\\webapp\\atlas\\WEB-INF\\lib\\*;atlas_home\\libext\\*;atlas_home\\hbase\\conf',
atlas.main() ['-Datlas.log.dir=atlas_home\\logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home',
self.assertFalse(configure_hbase_mock.called) '-Datlas.conf=atlas_home\\conf', '-Xmx1024m', '-XX:MaxPermSize=512m',
'-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'],
if IS_WINDOWS: 'atlas_home\\logs')
calls = [call(['atlas_home\\hbase\\bin\\start-hbase.cmd', '--config', 'atlas_home\\hbase\\conf'], 'atlas_home\\logs', False, True),
call(['atlas_home\\solr\\bin\\solr.cmd', 'start', '-z', 'localhost:9838', '-p', '9838'], 'atlas_home\\logs', False, True), else:
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'vertex_index', '-d', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home\\logs', False, True), java_mock.assert_called_with(
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'edge_index', '-d', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home\\logs', False, True), 'org.apache.atlas.Atlas',
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'fulltext_index', '-d', 'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home\\logs', False, True)] ['-app', 'atlas_home/server/webapp/atlas'],
'atlas_home/conf:atlas_home/server/webapp/atlas/WEB-INF/classes:atlas_home/server/webapp/atlas/WEB-INF/lib/*:atlas_home/libext/*:atlas_home/hbase/conf',
runProcess_mock.assert_not_called(calls) ['-Datlas.log.dir=atlas_home/logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home',
else: '-Datlas.conf=atlas_home/conf', '-Xmx1024m', '-XX:MaxPermSize=512m',
calls = [call(['atlas_home/hbase/bin/hbase-daemon.sh', '--config', 'atlas_home/hbase/conf', 'start', 'master'], 'atlas_home/logs', False, True), '-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'],
call(['atlas_home/solr/bin/solr', 'start', '-z', 'localhost:9838', '-p', '9838'], 'atlas_home/logs', False, True), 'atlas_home/logs')
call(['atlas_home/solr/bin/solr', 'create', '-c', 'vertex_index', '-d', 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home/logs', False, True),
call(['atlas_home/solr/bin/solr', 'create', '-c', 'edge_index', '-d', 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home/logs', False, True), pass
call(['atlas_home/solr/bin/solr', 'create', '-c', 'fulltext_index', '-d', 'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor', '1'], 'atlas_home/logs', False, True)]
@patch.object(mc, "runProcess")
runProcess_mock.assert_not_called(calls) @patch.object(mc, "configure_hbase")
@patch.object(mc, "getConfig")
self.assertTrue(java_mock.called) @patch.object(mc, "getConfigWithDefault")
if IS_WINDOWS: @patch.object(mc, "grep")
@patch.object(mc, "exist_pid")
java_mock.assert_called_with( @patch.object(mc, "writePid")
'org.apache.atlas.Atlas', @patch.object(mc, "executeEnvSh")
['-app', 'atlas_home\\server\\webapp\\atlas'], @patch.object(mc, "atlasDir")
'atlas_home\\conf;atlas_home\\server\\webapp\\atlas\\WEB-INF\\classes;atlas_home\\server\\webapp\\atlas\\WEB-INF\\lib\\*;atlas_home\\libext\\*;atlas_home\\hbase\\conf', @patch.object(mc, "expandWebApp")
['-Datlas.log.dir=atlas_home\\logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home', '-Datlas.conf=atlas_home\\conf', '-Xmx1024m', '-XX:MaxPermSize=512m', '-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'], 'atlas_home\\logs') @patch("os.path.exists")
@patch.object(mc, "java")
else: @patch.object(mc, "is_hbase_local")
java_mock.assert_called_with( @patch.object(mc, "is_solr_local")
'org.apache.atlas.Atlas', @patch.object(mc, "wait_for_startup")
['-app', 'atlas_home/server/webapp/atlas'], def test_main_default(self, wait_for_startup_mock, is_solr_local_mock, is_hbase_local_mock, java_mock, exists_mock, expandWebApp_mock,
'atlas_home/conf:atlas_home/server/webapp/atlas/WEB-INF/classes:atlas_home/server/webapp/atlas/WEB-INF/lib/*:atlas_home/libext/*:atlas_home/hbase/conf', atlasDir_mock, executeEnvSh_mock, writePid_mock, exist_pid_mock, grep_mock,
['-Datlas.log.dir=atlas_home/logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home', '-Datlas.conf=atlas_home/conf', '-Xmx1024m', '-XX:MaxPermSize=512m', '-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'], 'atlas_home/logs') getConfigWithDefault_mock, getConfig_mock, configure_hbase_mock, runProcess_mock):
sys.argv = []
pass exists_mock.return_value = True
expandWebApp_mock.return_value = "webapp"
def test_jar_java_lookups_fail(self): atlasDir_mock.return_value = "atlas_home"
java_home = environ['JAVA_HOME'] is_hbase_local_mock.return_value = False
del environ['JAVA_HOME'] is_solr_local_mock.return_value = False
orig_path = environ['PATH'] wait_for_startup_mock.return_value = True
environ['PATH'] = "/dev/null"
exist_pid_mock(789)
self.assertRaises(EnvironmentError, mc.jar, "foo") exist_pid_mock.assert_called_with(789)
self.assertRaises(EnvironmentError, mc.java, "empty", "empty", "empty", "empty") grep_mock.return_value = "hbase"
getConfig_mock.side_effect = self.get_config_mock_side_effect
environ['JAVA_HOME'] = java_home getConfigWithDefault_mock.side_effect = self.get_config_mock_side_effect
environ['PATH'] = orig_path
atlas.main()
@patch.object(mc, "runProcess") self.assertFalse(configure_hbase_mock.called)
@patch.object(mc, "which", return_value="foo")
def test_jar_java_lookups_succeed_from_path(self, which_mock, runProcess_mock): if IS_WINDOWS:
java_home = environ['JAVA_HOME'] calls = [call(['atlas_home\\hbase\\bin\\start-hbase.cmd', '--config', 'atlas_home\\hbase\\conf'],
del environ['JAVA_HOME'] 'atlas_home\\logs', False, True),
call(['atlas_home\\solr\\bin\\solr.cmd', 'start', '-z', 'localhost:9838', '-p', '9838'],
mc.jar("foo") 'atlas_home\\logs', False, True),
mc.java("empty", "empty", "empty", "empty") call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'vertex_index', '-d',
'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1',
environ['JAVA_HOME'] = java_home '-replicationFactor', '1'], 'atlas_home\\logs', False, True),
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'edge_index', '-d',
'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1',
'-replicationFactor', '1'], 'atlas_home\\logs', False, True),
call(['atlas_home\\solr\\bin\\solr.cmd', 'create', '-c', 'fulltext_index', '-d',
'atlas_home\\solr\\server\\solr\\configsets\\basic_configs\\conf', '-shards', '1',
'-replicationFactor', '1'], 'atlas_home\\logs', False, True)]
runProcess_mock.assert_not_called(calls)
else:
calls = [
call(['atlas_home/hbase/bin/hbase-daemon.sh', '--config', 'atlas_home/hbase/conf', 'start', 'master'],
'atlas_home/logs', False, True),
call(['atlas_home/solr/bin/solr', 'start', '-z', 'localhost:9838', '-p', '9838'], 'atlas_home/logs',
False, True),
call(['atlas_home/solr/bin/solr', 'create', '-c', 'vertex_index', '-d',
'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor',
'1'], 'atlas_home/logs', False, True),
call(['atlas_home/solr/bin/solr', 'create', '-c', 'edge_index', '-d',
'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor',
'1'], 'atlas_home/logs', False, True),
call(['atlas_home/solr/bin/solr', 'create', '-c', 'fulltext_index', '-d',
'atlas_home/solr/server/solr/configsets/basic_configs/conf', '-shards', '1', '-replicationFactor',
'1'], 'atlas_home/logs', False, True)]
runProcess_mock.assert_not_called(calls)
self.assertTrue(java_mock.called)
if IS_WINDOWS:
java_mock.assert_called_with(
'org.apache.atlas.Atlas',
['-app', 'atlas_home\\server\\webapp\\atlas'],
'atlas_home\\conf;atlas_home\\server\\webapp\\atlas\\WEB-INF\\classes;atlas_home\\server\\webapp\\atlas\\WEB-INF\\lib\\*;atlas_home\\libext\\*;atlas_home\\hbase\\conf',
['-Datlas.log.dir=atlas_home\\logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home',
'-Datlas.conf=atlas_home\\conf', '-Xmx1024m', '-XX:MaxPermSize=512m',
'-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'],
'atlas_home\\logs')
else:
java_mock.assert_called_with(
'org.apache.atlas.Atlas',
['-app', 'atlas_home/server/webapp/atlas'],
'atlas_home/conf:atlas_home/server/webapp/atlas/WEB-INF/classes:atlas_home/server/webapp/atlas/WEB-INF/lib/*:atlas_home/libext/*:atlas_home/hbase/conf',
['-Datlas.log.dir=atlas_home/logs', '-Datlas.log.file=application.log', '-Datlas.home=atlas_home',
'-Datlas.conf=atlas_home/conf', '-Xmx1024m', '-XX:MaxPermSize=512m',
'-Dlog4j.configuration=atlas-log4j.xml', '-Djava.net.preferIPv4Stack=true', '-server'],
'atlas_home/logs')
pass
def test_jar_java_lookups_fail(self):
java_home = environ.get("JAVA_HOME", None)
if java_home != None:
del environ['JAVA_HOME']
orig_path = environ.get("PATH", None)
environ['PATH'] = "/dev/null"
self.assertRaises(EnvironmentError, mc.jar, "foo")
self.assertRaises(EnvironmentError, mc.java, "empty", "empty", "empty", "empty")
if java_home != None:
environ['JAVA_HOME'] = java_home
if orig_path != None:
environ['PATH'] = orig_path
@patch.object(mc, "runProcess")
@patch.object(mc, "which", return_value="foo")
def test_jar_java_lookups_succeed_from_path(self, which_mock, runProcess_mock):
java_home = environ.get("JAVA_HOME", None)
if java_home != None:
del environ['JAVA_HOME']
mc.jar("foo")
mc.java("empty", "empty", "empty", "empty")
if java_home != None:
environ['JAVA_HOME'] = java_home
if __name__ == "__main__": if __name__ == "__main__":
logging.basicConfig(format='%(asctime)s %(message)s', level=logging.DEBUG) logging.basicConfig(format='%(asctime)s %(message)s', level=logging.DEBUG)
unittest.main() unittest.main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment