Blob Blame History Raw
# -*- 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()