/*
* This file is part of Cockpit.
*
* Copyright (C) 2016 Red Hat, Inc.
*
* Cockpit is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* Cockpit is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Cockpit; If not, see .
*/
#include "config.h"
#include "cockpitlocale.h"
#include "cockpittest.h"
#include
#include
typedef struct {
const gchar *language;
const gchar *encoding;
const gchar *locale;
const gchar *shorter;
} FromFixture;
static FromFixture from_fixtures[] = {
{ "en", NULL, "en", "en" },
{ "en-us", NULL, "en_US", "en" },
{ "en-us", "UTF-8", "en_US.UTF-8", "en" },
{ "zh-cn", NULL, "zh_CN", "zh" },
{ "zh-cn", "UTF-8", "zh_CN.UTF-8", "zh" },
{ NULL, NULL, "C", "C" },
};
static void
test_from_language (gconstpointer data)
{
const FromFixture *fixture = data;
gchar *locale;
gchar *shorter;
locale = cockpit_locale_from_language (fixture->language, fixture->encoding, &shorter);
g_assert_cmpstr (locale, ==, fixture->locale);
if (locale)
g_assert_cmpstr (shorter, ==, fixture->shorter);
g_free (locale);
g_free (shorter);
locale = cockpit_locale_from_language (fixture->language, fixture->encoding, NULL);
g_assert_cmpstr (locale, ==, fixture->locale);
g_free (locale);
}
typedef struct {
const gchar *language;
const gchar *lang;
const gchar *string;
} SetFixture;
static SetFixture set_fixtures[] = {
{ "en-us", "en_US.UTF-8", "Unavailable", },
{ "de-de", "de_DE.UTF-8", "Nicht verfügbar" },
{ "zh-cn", "zh_CN.UTF-8", "不可用" },
{ "__xx;%%%", NULL, NULL },
{ NULL, "C", "Unavailable" },
{ "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", NULL, NULL },
};
static gboolean
locale_available (const gchar *locale)
{
GError *error = NULL;
gchar *dot;
gchar *output;
gint status;
gchar *copy;
gboolean ret;
g_spawn_command_line_sync ("locale -a", &output, NULL, &status, &error);
g_assert_no_error (error);
g_assert_cmpint (status, ==, 0);
copy = g_strdup_printf ("\n%s", locale);
dot = strchr (copy, '.');
if (dot)
dot[1] = '\0';
ret = strstr (output, copy) ? TRUE : FALSE;
g_free (output);
g_free (copy);
return ret;
}
static void
test_set_language (const gconstpointer data)
{
const SetFixture *fixture = data;
const gchar *old;
/* Check if the locale is available on the test system */
if (fixture->lang && !locale_available (fixture->lang))
{
cockpit_test_skip ("locale not available");
return;
}
old = g_getenv ("LANG");
cockpit_locale_set_language (fixture->language);
/* Was supposed to fail */
if (fixture->lang == NULL)
{
g_assert_cmpstr (old, ==, g_getenv ("LANG"));
}
/* Was supposed to succeed */
else
{
g_assert_cmpstr (fixture->lang, ==, g_getenv ("LANG"));
g_assert_cmpstr (dgettext ("test", "Unavailable"), ==, fixture->string);
}
/* A second time, excercise cache code */
cockpit_locale_set_language (fixture->language);
/* Was supposed to fail */
if (fixture->lang == NULL)
{
g_assert_cmpstr (old, ==, g_getenv ("LANG"));
}
/* Was supposed to succeed */
else
{
g_assert_cmpstr (fixture->lang, ==, g_getenv ("LANG"));
g_assert_cmpstr (dgettext ("test", "Unavailable"), ==, fixture->string);
}
}
int
main (int argc,
char *argv[])
{
const gchar *val;
gchar *name;
gint i;
g_unsetenv ("LANGUAGE");
g_unsetenv ("LANG");
g_unsetenv ("LC_ALL");
g_unsetenv ("LC_MESSAGES");
bindtextdomain ("test", BUILDDIR "/src/common/mock-locale");
cockpit_test_init (&argc, &argv);
for (i = 0; i < G_N_ELEMENTS (from_fixtures); i++)
{
name = g_strdup_printf ("/locale/from-language/%s", from_fixtures[i].locale);
g_test_add_data_func (name, from_fixtures + i, test_from_language);
g_free (name);
}
for (i = 0; i < G_N_ELEMENTS (set_fixtures); i++)
{
val = set_fixtures[i].language;
if (!val)
val = "null";
name = g_strdup_printf ("/locale/set-language/%s", val);
g_test_add_data_func (name, set_fixtures + i, test_set_language);
g_free (name);
}
return g_test_run ();
}