-
Ludovico de Nittis authored
Signed-off-by:
Ludovico de Nittis <ludovico.denittis@collabora.com>
Ludovico de Nittis authoredSigned-off-by:
Ludovico de Nittis <ludovico.denittis@collabora.com>
locale.c 14.46 KiB
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <steam-runtime-tools/steam-runtime-tools.h>
#include <string.h>
#include <unistd.h>
#include <glib.h>
#include <glib/gstdio.h>
#include "steam-runtime-tools/locale-internal.h"
#include "test-utils.h"
#define MOCK_DEFAULT_RESULTING_NAME \
"LC_CTYPE=en_GB.UTF-8;" \
"LC_NUMERIC=en_GB.utf8;" \
"LC_TIME=en_GB.utf8;" \
"LC_COLLATE=en_GB.UTF-8;" \
"LC_MONETARY=en_GB.utf8;" \
"LC_MESSAGES=en_GB.UTF-8;" \
"LC_PAPER=en_GB.utf8;" \
"LC_NAME=en_GB.UTF-8;" \
"LC_ADDRESS=en_GB.UTF-8;" \
"LC_TELEPHONE=en_GB.UTF-8;" \
"LC_MEASUREMENT=en_GB.utf8;" \
"LC_IDENTIFICATION=en_GB.UTF-8"
static const char *argv0;
typedef struct
{
int unused;
gchar *builddir;
} Fixture;
typedef struct
{
int unused;
} Config;
static void
setup (Fixture *f,
gconstpointer context)
{
G_GNUC_UNUSED const Config *config = context;
f->builddir = g_strdup (g_getenv ("G_TEST_BUILDDIR"));
if (f->builddir == NULL)
f->builddir = g_path_get_dirname (argv0);
}
static void
teardown (Fixture *f,
gconstpointer context)
{
G_GNUC_UNUSED const Config *config = context;
g_free (f->builddir);
}
/*
* Test basic functionality of the SrtLocale object.
*/
static void
test_object (Fixture *f,
gconstpointer context)
{
SrtLocale *locale;
gchar *req = NULL;
gchar *res = NULL;
gchar *charset = NULL;
gboolean is_utf8 = FALSE;
locale = _srt_locale_new ("",
"fr_CA.UTF-8",
"UTF-8",
TRUE);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "fr_CA.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_object_get (locale,
"requested-name", &req,
"resulting-name", &res,
"charset", &charset,
"is-utf8", &is_utf8,
NULL);
g_assert_cmpstr (req, ==, "");
g_assert_cmpstr (res, ==, "fr_CA.UTF-8");
g_assert_cmpstr (charset, ==, "UTF-8");
g_assert_cmpint (is_utf8, ==, TRUE);
g_free (req);
g_free (res);
g_free (charset);
g_object_unref (locale);
locale = _srt_locale_new ("en_US",
"en_US",
"ISO-8859-1",
FALSE);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ISO-8859-1");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_object_unref (locale);
}
static void
test_complete (Fixture *f,
gconstpointer context)
{
SrtLocale *locale = NULL;
SrtSystemInfo *info = srt_system_info_new (NULL);
SrtLocaleIssues issues;
GError *error = NULL;
srt_system_info_set_primary_multiarch_tuple (info, "mock");
srt_system_info_set_helpers_path (info, f->builddir);
issues = srt_system_info_get_locale_issues (info);
g_assert_cmpint (issues, ==, SRT_LOCALE_ISSUES_NONE);
locale = srt_system_info_check_locale (info, "C", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ANSI_X3.4-1968");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "POSIX", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "POSIX");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ANSI_X3.4-1968");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "C.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "C.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "en_US", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ISO-8859-1");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "en_US.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_US.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_US.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "en_GB.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_GB.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_GB.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==,
MOCK_DEFAULT_RESULTING_NAME);
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "fr_CA", &error);
g_assert_error (error, SRT_LOCALE_ERROR, SRT_LOCALE_ERROR_FAILED);
g_assert_null (locale);
g_clear_error (&error);
g_clear_object (&info);
}
static void
test_legacy (Fixture *f,
gconstpointer context)
{
SrtLocale *locale = NULL;
SrtSystemInfo *info = srt_system_info_new (NULL);
SrtLocaleIssues issues;
GError *error = NULL;
srt_system_info_set_primary_multiarch_tuple (info, "mock-legacy");
srt_system_info_set_helpers_path (info, f->builddir);
issues = srt_system_info_get_locale_issues (info);
g_assert_cmpint (issues, ==,
(SRT_LOCALE_ISSUES_DEFAULT_NOT_UTF8
| SRT_LOCALE_ISSUES_C_UTF8_MISSING));
locale = srt_system_info_check_locale (info, "C", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ANSI_X3.4-1968");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "POSIX", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "POSIX");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ANSI_X3.4-1968");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "C.UTF-8", &error);
g_assert_error (error, SRT_LOCALE_ERROR, SRT_LOCALE_ERROR_FAILED);
g_assert_null (locale);
g_clear_error (&error);
locale = srt_system_info_check_locale (info, "en_US", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ISO-8859-1");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "en_US.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_US.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_US.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "en_GB.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_GB.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_GB.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_US");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ISO-8859-1");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "fr_CA", &error);
g_assert_error (error, SRT_LOCALE_ERROR, SRT_LOCALE_ERROR_FAILED);
g_assert_null (locale);
g_clear_error (&error);
g_clear_object (&info);
}
static void
test_unamerican (Fixture *f,
gconstpointer context)
{
SrtLocale *locale = NULL;
SrtSystemInfo *info = srt_system_info_new (NULL);
SrtLocaleIssues issues;
GError *error = NULL;
srt_system_info_set_primary_multiarch_tuple (info, "mock-unamerican");
srt_system_info_set_helpers_path (info, f->builddir);
issues = srt_system_info_get_locale_issues (info);
g_assert_cmpint (issues, ==, SRT_LOCALE_ISSUES_EN_US_UTF8_MISSING);
locale = srt_system_info_check_locale (info, "C", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ANSI_X3.4-1968");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "POSIX", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "POSIX");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "ANSI_X3.4-1968");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, FALSE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "C.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "C.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "C.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "en_US", &error);
g_assert_error (error, SRT_LOCALE_ERROR, SRT_LOCALE_ERROR_FAILED);
g_assert_null (locale);
g_clear_error (&error);
locale = srt_system_info_check_locale (info, "en_US.UTF-8", &error);
g_assert_error (error, SRT_LOCALE_ERROR, SRT_LOCALE_ERROR_FAILED);
g_assert_null (locale);
g_clear_error (&error);
locale = srt_system_info_check_locale (info, "en_GB.UTF-8", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "en_GB.UTF-8");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==, "en_GB.UTF-8");
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "", &error);
g_assert_no_error (error);
g_assert_nonnull (locale);
g_assert_cmpstr (srt_locale_get_requested_name (locale), ==, "");
g_assert_cmpstr (srt_locale_get_resulting_name (locale), ==,
MOCK_DEFAULT_RESULTING_NAME);
g_assert_cmpstr (srt_locale_get_charset (locale), ==, "UTF-8");
g_assert_cmpint (srt_locale_is_utf8 (locale), ==, TRUE);
g_clear_object (&locale);
locale = srt_system_info_check_locale (info, "fr_CA", &error);
g_assert_error (error, SRT_LOCALE_ERROR, SRT_LOCALE_ERROR_FAILED);
g_assert_null (locale);
g_clear_error (&error);
g_clear_object (&info);
}
int
main (int argc,
char **argv)
{
argv0 = argv[0];
g_test_init (&argc, &argv, NULL);
g_test_add ("/locale/object", Fixture, NULL,
setup, test_object, teardown);
g_test_add ("/locale/complete", Fixture, NULL,
setup, test_complete, teardown);
g_test_add ("/locale/legacy", Fixture, NULL,
setup, test_legacy, teardown);
g_test_add ("/locale/unamerican", Fixture, NULL,
setup, test_unamerican, teardown);
return g_test_run ();
}