blob: 46edaf6aaa80d09505b2b81c6f05139282bdcdd5 [file] [log] [blame]
# Copyright 2019 Google LLC
#
# 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.
"""Unit tests for messages."""
from absl.testing import absltest
from tradefed_cluster import common
from tradefed_cluster import testbed_dependent_test
from multitest_transport.models import messages
from multitest_transport.models import ndb_models
class MessagesTest(testbed_dependent_test.TestbedDependentTest):
def testConvertNameValuePairs(self):
models = [ndb_models.NameValuePair(name='foo', value='BAR'),
ndb_models.NameValuePair(name='bar', value='BAR'),
ndb_models.NameValuePair(name='foo', value='FOO')]
# removes duplicate keys
expected = [messages.NameValuePair(name='foo', value='FOO'),
messages.NameValuePair(name='bar', value='BAR')]
actual = messages.ConvertNameValuePairs(models, messages.NameValuePair)
self.assertEqual(expected, actual)
def testConvertNameValuePairs_multi(self):
models = [ndb_models.NameMultiValuePair(name='foo', values=['1', '2']),
ndb_models.NameMultiValuePair(name='bar', values=['3', '4']),
ndb_models.NameMultiValuePair(name='bar', values=['5', '6'])]
# removes duplicate keys
expected = [messages.NameMultiValuePair(name='foo', values=['1', '2']),
messages.NameMultiValuePair(name='bar', values=['5', '6'])]
actual = messages.ConvertNameValuePairs(models, messages.NameMultiValuePair)
self.assertEqual(expected, actual)
def assertSameNameValuePair(self, obj, msg):
self.assertEqual(obj.name, msg.name)
self.assertEqual(obj.value, msg.value)
def assertSameTestResourceDef(self, obj, msg):
self.assertIsInstance(obj, ndb_models.TestResourceDef)
self.assertIsInstance(msg, messages.TestResourceDef)
self.assertEqual(obj.name, msg.name)
self.assertEqual(obj.default_download_url, msg.default_download_url)
self.assertEqual(obj.decompress, msg.decompress)
self.assertEqual(obj.decompress_dir, msg.decompress_dir)
if obj.params and msg.params:
self.assertEqual(obj.params.decompress_files, msg.params.decompress_files)
else:
self.assertIsNone(msg.params)
self.assertIsNone(obj.params)
def testConvert_TestResourceDef(self):
obj = ndb_models.TestResourceDef(
name='foo', default_download_url='bar', decompress=True,
decompress_dir='dir',
params=ndb_models.TestResourceParameters(decompress_files=['file']))
msg = messages.TestResourceDef(
name='foo', default_download_url='bar', decompress=True,
decompress_dir='dir',
params=messages.TestResourceParameters(decompress_files=['file']))
self.assertSameTestResourceDef(
obj, messages.Convert(obj, messages.TestResourceDef))
self.assertSameTestResourceDef(
messages.Convert(msg, ndb_models.TestResourceDef), msg)
obj = ndb_models.TestResourceDef(name='foo')
msg = messages.TestResourceDef(name='foo')
self.assertSameTestResourceDef(
obj, messages.Convert(obj, messages.TestResourceDef))
self.assertSameTestResourceDef(
messages.Convert(msg, ndb_models.TestResourceDef), msg)
def assertSameTestRunParameter(self, obj, msg):
self.assertEqual(
obj.max_retry_on_test_failures, msg.max_retry_on_test_failures)
self.assertEqual(
obj.invocation_timeout_seconds, msg.invocation_timeout_seconds)
self.assertEqual(
obj.output_idle_timeout_seconds, msg.output_idle_timeout_seconds)
def assertSameTest(self, obj, msg):
self.assertEqual(obj.name, msg.name)
self.assertEqual(obj.command, msg.command)
for o, m in zip(obj.test_resource_defs, msg.test_resource_defs):
self.assertSameTestResourceDef(o, m)
for o, m in zip(obj.env_vars, msg.env_vars):
self.assertSameNameValuePair(o, m)
self.assertEqual(obj.output_file_patterns, msg.output_file_patterns)
self.assertEqual(obj.setup_scripts, msg.setup_scripts)
if msg.default_test_run_parameters is None:
self.assertIsNone(obj.default_test_run_parameters)
else:
self.assertIsNotNone(obj.default_test_run_parameters)
self.assertSameTestRunParameter(
obj.default_test_run_parameters, msg.default_test_run_parameters)
def testConvert_Test(self):
obj = ndb_models.Test(
name='name',
test_resource_defs=[
ndb_models.TestResourceDef(name='foo', default_download_url='bar')
],
command='command',
env_vars=[
ndb_models.NameValuePair(name='name', value='value'),
],
output_file_patterns=['pattern_1', 'pattern_2'],
setup_scripts=['script_1', 'script_2', 'script_3'])
msg = messages.Convert(obj, messages.Test)
self.assertIsInstance(msg, messages.Test)
self.assertSameTest(obj, msg)
def testGetTestRunStateInfo_error(self):
obj = ndb_models.TestRun(
state=ndb_models.TestRunState.ERROR,
error_reason='error')
self.assertEqual('error', messages._GetTestRunStateInfo(obj))
def testGetTestRunStateInfo_canceled(self):
obj = ndb_models.TestRun(
state=ndb_models.TestRunState.CANCELED,
cancel_reason=common.CancelReason.INVALID_REQUEST)
expected = ndb_models._TEST_RUN_CANCEL_REASON_MAP[
common.CancelReason.INVALID_REQUEST]
self.assertEqual(expected, messages._GetTestRunStateInfo(obj))
def testGetTestRunStateInfo_downloading(self):
obj = ndb_models.TestRun(
state=ndb_models.TestRunState.PENDING,
test_resources=[ndb_models.TestResourceObj(name='resource', url='url')])
# resource tracker found with 50% progress
tracker = ndb_models.TestResourceTracker(id='url', download_progress=0.5)
tracker.put()
expected = 'Downloading resource [50%]'
self.assertEqual(expected, messages._GetTestRunStateInfo(obj))
def testGetTestRunStateInfo_notDownloading(self):
obj = ndb_models.TestRun(
state=ndb_models.TestRunState.PENDING,
# resource already has cache URL (already downloaded)
test_resources=[ndb_models.TestResourceObj(name='resource', url='url',
cache_url='cache')])
self.assertIsNone(messages._GetTestRunStateInfo(obj))
def testConvertNameValuePairsToDict(self):
pairs = [
messages.NameValuePair(name='foo', value='FOO'),
messages.NameValuePair(name='bar', value='BAR')
]
expected = {'foo': 'FOO', 'bar': 'BAR'}
self.assertEqual(expected, messages.ConvertNameValuePairsToDict(pairs))
if __name__ == '__main__':
absltest.main()