CI tests migration to tmt
This commit is contained in:
parent
e9e619c1c4
commit
ecd0c4d528
1
.fmf/version
Normal file
1
.fmf/version
Normal file
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -5,7 +5,7 @@
|
|||||||
Summary: GNU tools and libraries for localized translated messages
|
Summary: GNU tools and libraries for localized translated messages
|
||||||
Name: gettext
|
Name: gettext
|
||||||
Version: 0.22.5
|
Version: 0.22.5
|
||||||
Release: 4%{?dist}
|
Release: 5%{?dist}
|
||||||
|
|
||||||
# The following are licensed under LGPLv2+:
|
# The following are licensed under LGPLv2+:
|
||||||
# - libintl and its headers
|
# - libintl and its headers
|
||||||
@ -457,12 +457,12 @@ make check LIBUNISTRING=-lunistring
|
|||||||
%{_mandir}/man1/msghack.1*
|
%{_mandir}/man1/msghack.1*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jul 11 2024 Manish Tiwari <matiwari@redhat.com> - 0.22.5-5
|
||||||
|
- CI gating tests migration to tmt
|
||||||
|
|
||||||
* Thu Jul 4 2024 Manish Tiwari <matiwari@redhat.com> - 0.22.5-4
|
* Thu Jul 4 2024 Manish Tiwari <matiwari@redhat.com> - 0.22.5-4
|
||||||
- Add explicit package version requirement for libtextstyle
|
- Add explicit package version requirement for libtextstyle
|
||||||
|
|
||||||
* Tue Jul 2 2024 Manish Tiwari <matiwari@redhat.com> - 0.22.5-3
|
|
||||||
- Add back libtextstyle for f40 (#2278984)
|
|
||||||
|
|
||||||
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 0.22.5-3
|
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 0.22.5-3
|
||||||
- Bump release for June 2024 mass rebuild
|
- Bump release for June 2024 mass rebuild
|
||||||
|
|
||||||
|
5
plans/basic.fmf
Normal file
5
plans/basic.fmf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
summary: Basic smoke test
|
||||||
|
discover:
|
||||||
|
how: fmf
|
||||||
|
execute:
|
||||||
|
how: tmt
|
5
tests/main.fmf
Normal file
5
tests/main.fmf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
summary: Run gettext test
|
||||||
|
test: ./test.sh
|
||||||
|
framework: beakerlib
|
||||||
|
require:
|
||||||
|
- gettext
|
25
tests/test.sh
Executable file
25
tests/test.sh
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||||||
|
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
||||||
|
|
||||||
|
PACKAGE="gettext"
|
||||||
|
|
||||||
|
rlJournalStart
|
||||||
|
rlPhaseStartSetup
|
||||||
|
rlAssertRpm $PACKAGE
|
||||||
|
rlRun "TmpDir=\`mktemp -d\`" 0 "Creating tmp directory"
|
||||||
|
rlRun "cp test_i18n.py test_gettext.py $TmpDir"
|
||||||
|
rlRun "pushd $TmpDir"
|
||||||
|
rlPhaseEnd
|
||||||
|
|
||||||
|
rlPhaseStartTest
|
||||||
|
rlLog "Run test_gettext.py"
|
||||||
|
rlRun "python3 test_gettext.py"
|
||||||
|
rlPhaseEnd
|
||||||
|
|
||||||
|
rlPhaseStartCleanup
|
||||||
|
rlRun "popd"
|
||||||
|
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
||||||
|
rlPhaseEnd
|
||||||
|
rlJournalPrintText
|
||||||
|
rlJournalEnd
|
227
tests/test_gettext.py
Normal file
227
tests/test_gettext.py
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
# Saving logs
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
DECORATE_STR = "************************************"
|
||||||
|
logging.info("TEST RESULTS FOR GETTEXT\n{0}".format(DECORATE_STR))
|
||||||
|
|
||||||
|
# CONSTANTS
|
||||||
|
PACKAGE_TO_TEST = "gettext"
|
||||||
|
DOMAIN_TO_BIND = "testdomain"
|
||||||
|
PYTHON_INTERPRETER = "python3"
|
||||||
|
TEST_I18N_FILE = "test_i18n.py"
|
||||||
|
|
||||||
|
LOG_INFO_PASS = "[ PASS ]"
|
||||||
|
LOG_INFO_FAIL = "[ FAIL ]"
|
||||||
|
LOG_INFO_OS_ERROR = "[ OS Error ]"
|
||||||
|
|
||||||
|
# Test Data
|
||||||
|
TEST_DATA = {"fr_FR": '''msgstr "Bonjour le monde!"''',
|
||||||
|
"de_DE": '''msgstr "Hallo Welt!"''',
|
||||||
|
"es_ES": '''msgstr "Hola Mundo!"''',
|
||||||
|
"it_IT": '''msgstr "Ciao mondo!"''',
|
||||||
|
"pt_BR": '''msgstr "Olá Mundo!"''',
|
||||||
|
"ja_JP": '''msgstr "「こんにちは世界」"''',
|
||||||
|
"ko_KR": '''msgstr "안녕하세요!"''',
|
||||||
|
"ru_RU": '''msgstr "Привет мир!"''',
|
||||||
|
"zh_CN": '''msgstr "你好,世界!"''',
|
||||||
|
"zh_TW": '''msgstr "你好,世界!"'''}
|
||||||
|
|
||||||
|
|
||||||
|
def test_locale():
|
||||||
|
"""
|
||||||
|
Check common files for locale support
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = "Locale Support Test"
|
||||||
|
|
||||||
|
try:
|
||||||
|
all_locales = subprocess.Popen(["locale", "-a"], stdout=subprocess.PIPE)
|
||||||
|
all_locales_data = all_locales.communicate()
|
||||||
|
|
||||||
|
if all_locales_data:
|
||||||
|
actual = all_locales_data[0].decode().split('\n')
|
||||||
|
else:
|
||||||
|
logging.error("{0}: ERROR\n".format(subject))
|
||||||
|
return
|
||||||
|
|
||||||
|
expected_locales = ['en_US', 'en_US.iso88591',
|
||||||
|
'en_US.iso885915', 'en_US.utf8']
|
||||||
|
if set(expected_locales).issubset(set(actual)):
|
||||||
|
logging.info("{0}: {1}\n".format(subject, LOG_INFO_PASS))
|
||||||
|
else:
|
||||||
|
logging.error("{0}: {1}\n".format(subject, LOG_INFO_FAIL))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("{0}: {1}\n".format(subject, LOG_INFO_OS_ERROR))
|
||||||
|
|
||||||
|
|
||||||
|
def test_gettext():
|
||||||
|
"""
|
||||||
|
Check if gettext is present
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = "GNU Internationalization Utilities Test"
|
||||||
|
|
||||||
|
try:
|
||||||
|
cmd_check_gettext = ['rpm', '-q', PACKAGE_TO_TEST]
|
||||||
|
p1 = subprocess.Popen(cmd_check_gettext, stdout=subprocess.PIPE)
|
||||||
|
std_data, stderr = p1.communicate()
|
||||||
|
std_data = std_data.decode()
|
||||||
|
logging.info("Found {0} NVR: {1}".format(PACKAGE_TO_TEST, std_data))
|
||||||
|
if PACKAGE_TO_TEST in std_data:
|
||||||
|
logging.info("{0}: {1}\n".format(subject, LOG_INFO_PASS))
|
||||||
|
else:
|
||||||
|
logging.error("{0}: {1}\n".format(subject, LOG_INFO_FAIL))
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("{0}: {1}\n".format(subject, LOG_INFO_OS_ERROR))
|
||||||
|
|
||||||
|
|
||||||
|
def test_pot_creation():
|
||||||
|
"""
|
||||||
|
Creates hello.pot file using test_i18n.py file
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = "POT file Creation Test"
|
||||||
|
|
||||||
|
try:
|
||||||
|
pot_file = subprocess.Popen(
|
||||||
|
"xgettext -d '{0}' -o {1}.pot {2}".format(DOMAIN_TO_BIND,
|
||||||
|
DOMAIN_TO_BIND,
|
||||||
|
TEST_I18N_FILE),
|
||||||
|
shell=True
|
||||||
|
)
|
||||||
|
pot_file.communicate()
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("{0}: {1}\n".format(subject, LOG_INFO_OS_ERROR))
|
||||||
|
else:
|
||||||
|
logging.info("{0}: {1}\n".format(subject, LOG_INFO_PASS))
|
||||||
|
|
||||||
|
|
||||||
|
def make_dir(locale_dir):
|
||||||
|
path = "./locale/{0}/LC_MESSAGES".format(locale_dir)
|
||||||
|
os.makedirs(path)
|
||||||
|
|
||||||
|
|
||||||
|
def create_po_files(active_locale):
|
||||||
|
"""
|
||||||
|
creates .po file using POT file
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = "PO file Creation"
|
||||||
|
|
||||||
|
try:
|
||||||
|
cmd_po_files = subprocess.Popen(
|
||||||
|
"msginit --no-translator -l {0} -i {1}.pot -o ./locale/{2}/LC_MESSAGES/{3}.po".format(
|
||||||
|
active_locale, DOMAIN_TO_BIND, active_locale, active_locale), shell=True
|
||||||
|
)
|
||||||
|
cmd_po_files.communicate()
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("{0} failed: {1}\n".format(subject, LOG_INFO_OS_ERROR))
|
||||||
|
else:
|
||||||
|
logging.info("{0} Succeed.".format(subject))
|
||||||
|
|
||||||
|
|
||||||
|
def translate(active_locale):
|
||||||
|
"""
|
||||||
|
Updates .po file with the translations for respective language
|
||||||
|
"""
|
||||||
|
|
||||||
|
data = TEST_DATA.get(active_locale)
|
||||||
|
if not data:
|
||||||
|
return
|
||||||
|
with open('./locale/{0}/LC_MESSAGES/{1}.po'.format(active_locale,
|
||||||
|
active_locale),
|
||||||
|
'r', encoding='latin-1') as f1:
|
||||||
|
data1 = f1.readlines()
|
||||||
|
data1.pop()
|
||||||
|
data1.append(data)
|
||||||
|
for index, data in enumerate(data1):
|
||||||
|
if "Content-Type" in data:
|
||||||
|
data1[index] = '"Content-Type: text/plain; charset=UTF-8\\n"\n'
|
||||||
|
|
||||||
|
with open('./locale/{0}/LC_MESSAGES/{1}'.format(active_locale,
|
||||||
|
active_locale) + ".po", 'w') as f2:
|
||||||
|
for line in data1:
|
||||||
|
f2.write(line)
|
||||||
|
|
||||||
|
|
||||||
|
def create_mo_files(active_locale):
|
||||||
|
"""
|
||||||
|
Creates .mo file for different locale form .po file
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = "MO file Creation"
|
||||||
|
|
||||||
|
try:
|
||||||
|
mo_files = subprocess.Popen(
|
||||||
|
"msgfmt ./locale/{0}/LC_MESSAGES/{1}.po --output-file ./locale/{2}/LC_MESSAGES/{3}.mo".format(
|
||||||
|
active_locale, active_locale, active_locale, active_locale
|
||||||
|
), shell=True
|
||||||
|
)
|
||||||
|
mo_files.communicate()
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("{0} failed: {1}\n".format(subject, LOG_INFO_OS_ERROR))
|
||||||
|
else:
|
||||||
|
logging.info("{0} Succeed.".format(subject))
|
||||||
|
|
||||||
|
|
||||||
|
def test_translations(active_locale):
|
||||||
|
"""
|
||||||
|
Verify if the output is correct for different language
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = "Translation Test"
|
||||||
|
|
||||||
|
try:
|
||||||
|
cmd_translation_test = subprocess.check_output(
|
||||||
|
'LANGUAGE={0} {1} {2} {3}'.format(active_locale,
|
||||||
|
PYTHON_INTERPRETER,
|
||||||
|
TEST_I18N_FILE,
|
||||||
|
active_locale),
|
||||||
|
encoding='UTF-8', shell=True
|
||||||
|
)
|
||||||
|
if cmd_translation_test.strip() == TEST_DATA[active_locale].strip('msgstr "'):
|
||||||
|
logging.info("{0} for {1}: {2}\n".format(subject, active_locale, LOG_INFO_PASS))
|
||||||
|
else:
|
||||||
|
logging.error("{0} for {1}: {2}\n".format(subject, active_locale, LOG_INFO_FAIL))
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("{0} for {1}: {2}\n".format(subject, active_locale, LOG_INFO_OS_ERROR))
|
||||||
|
|
||||||
|
|
||||||
|
def tear_off():
|
||||||
|
try:
|
||||||
|
subprocess.call(['rm', '-rf', './locale', '{0}.pot'.format(DOMAIN_TO_BIND)])
|
||||||
|
except OSError as e:
|
||||||
|
logging.error("OSError\n")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
"""
|
||||||
|
Gettext Tests
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Prepare tests
|
||||||
|
env_tests = [test_locale,
|
||||||
|
test_gettext,
|
||||||
|
test_pot_creation]
|
||||||
|
|
||||||
|
translation_tests = [make_dir,
|
||||||
|
create_po_files,
|
||||||
|
translate,
|
||||||
|
create_mo_files,
|
||||||
|
test_translations]
|
||||||
|
|
||||||
|
# Execute tests
|
||||||
|
[env_test() for env_test in env_tests]
|
||||||
|
|
||||||
|
for locale in TEST_DATA.keys():
|
||||||
|
[test(locale) for test in translation_tests]
|
||||||
|
|
||||||
|
tear_off()
|
14
tests/test_i18n.py
Normal file
14
tests/test_i18n.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import gettext
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def print_message(locale):
|
||||||
|
# Set up message catalog access
|
||||||
|
t = gettext.translation('%s' % locale, 'locale', fallback=True)
|
||||||
|
_ = t.gettext
|
||||||
|
|
||||||
|
s = _('Hello World!')
|
||||||
|
print(s)
|
||||||
|
|
||||||
|
|
||||||
|
print_message(sys.argv[1])
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
# Tests run on Atomic, Classic and Container
|
|
||||||
- hosts: localhost
|
|
||||||
roles:
|
|
||||||
- role: standard-test-beakerlib
|
|
||||||
tags:
|
|
||||||
- atomic
|
|
||||||
- classic
|
|
||||||
- container
|
|
||||||
repositories:
|
|
||||||
- repo: "https://src.fedoraproject.org/tests/gettext.git"
|
|
||||||
dest: "gettext"
|
|
||||||
tests:
|
|
||||||
- gettext/gettext-tests
|
|
||||||
required_packages:
|
|
||||||
- gettext
|
|
Loading…
Reference in New Issue
Block a user