Skip to content
Commits on Source (10)
......@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1)
cmake_policy(VERSION 3.1)
project(evolution-data-server
VERSION 3.44.2
VERSION 3.44.3
LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 14)
set(PROJECT_BUGREPORT "https://gitlab.gnome.org/GNOME/evolution-data-server/issues/")
......
Evolution-Data-Server 3.44.3 2022-07-01
---------------------------------------
Bug Fixes:
I#350 - LDAP: Conditionally use 'description' as Note
I#391 - Tests fail with libphonenumber 8.12.49
I#392 - Sanitize IPv6 proxy address before passing it to WebKitGTK
I#393 - Calendar: Correct UNTIL recurrence with midnight start
I#396 - Camel: Read message ID-s with multiple `@`
Miscellaneous:
Disable hardware acceleration for WebKitGTK
ESource: Reconnect signal handlers when the D-Bus 'source' interface changes
Evolution-Data-Server 3.44.2 2022-05-27
---------------------------------------
......
......@@ -262,6 +262,8 @@ static struct prop_info {
#define PROP_TYPE_GROUP (1 << 6)
#define PROP_TYPE_CONTACT (1 << 7) /* is ignored for contact lists */
#define PROP_TYPE_FORCE_BINARY (1 << 8) /* to force ";binary" in attribute name */
#define PROP_WITH_EVOSCHEME (1 << 9)
#define PROP_WITHOUT_EVOSCHEME (1 << 10)
gint prop_type;
/* the remaining items are only used for the TYPE_COMPLEX props */
......@@ -287,6 +289,8 @@ static struct prop_info {
#define GROUP_PROP(fid,a,ctor,ber,cmp) {fid, a, PROP_TYPE_GROUP, ctor, ber, cmp}
#define ADDRESS_STRING_PROP(fid,a, ctor) {fid, a, PROP_TYPE_COMPLEX, ctor}
#define CONTACT_STRING_PROP(fid,a) {fid, a, PROP_TYPE_STRING | PROP_TYPE_CONTACT}
#define CONTACT_STRING_PROP_WITH_EVOSCHEME(fid,a) {fid, a, PROP_TYPE_STRING | PROP_TYPE_CONTACT | PROP_WITH_EVOSCHEME}
#define CONTACT_STRING_PROP_WITHOUT_EVOSCHEME(fid,a) {fid, a, PROP_TYPE_STRING | PROP_TYPE_CONTACT | PROP_WITHOUT_EVOSCHEME}
#define CALENTRY_CONTACT_STRING_PROP(fid,a) {fid, a, PROP_TYPE_STRING | PROP_TYPE_CONTACT | PROP_CALENTRY}
/* name fields */
......@@ -361,7 +365,8 @@ static struct prop_info {
/* map nickname to displayName */
CONTACT_STRING_PROP (E_CONTACT_NICKNAME, "displayName"),
E_STRING_PROP (E_CONTACT_SPOUSE, "spouseName"),
E_STRING_PROP (E_CONTACT_NOTE, "note"),
CONTACT_STRING_PROP_WITH_EVOSCHEME (E_CONTACT_NOTE, "note"),
CONTACT_STRING_PROP_WITHOUT_EVOSCHEME (E_CONTACT_NOTE, "description"),
E_COMPLEX_PROP (E_CONTACT_ANNIVERSARY, "anniversary", anniversary_populate, anniversary_ber, anniversary_compare),
E_COMPLEX_PROP (E_CONTACT_BIRTH_DATE, "birthDate", birthday_populate, birthday_ber, birthday_compare),
E_STRING_PROP (E_CONTACT_MAILER, "mailer"),
......@@ -1300,6 +1305,13 @@ build_mods_from_contacts (EBookBackendLDAP *bl,
if (is_list)
continue;
}
if (((prop_info[i].prop_type & PROP_WITHOUT_EVOSCHEME) != 0 &&
bl->priv->evolutionPersonSupported) ||
((prop_info[i].prop_type & PROP_WITH_EVOSCHEME) != 0 &&
!bl->priv->evolutionPersonSupported))
continue;
if ((prop_info[i].prop_type & PROP_CALENTRY) != 0) {
if (!bl->priv->calEntrySupported)
continue;
......@@ -3874,6 +3886,11 @@ func_contains (struct _ESExp *f,
!(prop_info[i].prop_type & PROP_WRITE_ONLY) &&
(ldap_data->bl->priv->evolutionPersonSupported ||
!(prop_info[i].prop_type & PROP_EVOLVE)) &&
(!(prop_info[i].prop_type & (PROP_WITH_EVOSCHEME | PROP_WITHOUT_EVOSCHEME)) ||
((prop_info[i].prop_type & PROP_WITHOUT_EVOSCHEME) != 0 &&
!ldap_data->bl->priv->evolutionPersonSupported) ||
((prop_info[i].prop_type & PROP_WITH_EVOSCHEME) != 0 &&
ldap_data->bl->priv->evolutionPersonSupported)) &&
(ldap_data->bl->priv->calEntrySupported ||
!(prop_info[i].prop_type & PROP_CALENTRY))) {
g_string_append_c (big_query, '(');
......@@ -4073,6 +4090,11 @@ func_exists (struct _ESExp *f,
if (!(prop_info[i].prop_type & PROP_WRITE_ONLY) &&
(ldap_data->bl->priv->evolutionPersonSupported ||
!(prop_info[i].prop_type & PROP_EVOLVE)) &&
(!(prop_info[i].prop_type & (PROP_WITH_EVOSCHEME | PROP_WITHOUT_EVOSCHEME)) ||
((prop_info[i].prop_type & PROP_WITHOUT_EVOSCHEME) != 0 &&
!ldap_data->bl->priv->evolutionPersonSupported) ||
((prop_info[i].prop_type & PROP_WITH_EVOSCHEME) != 0 &&
ldap_data->bl->priv->evolutionPersonSupported)) &&
(ldap_data->bl->priv->calEntrySupported ||
!(prop_info[i].prop_type & PROP_CALENTRY))) {
g_string_append_c (big_query, '(');
......@@ -4192,6 +4214,11 @@ query_prop_to_ldap (const gchar *query_prop,
if (!strcmp (query_prop, e_contact_field_name (prop_info[i].field_id))) {
if ((evolution_person_supported ||
!(prop_info[i].prop_type & PROP_EVOLVE)) &&
(!(prop_info[i].prop_type & (PROP_WITH_EVOSCHEME | PROP_WITHOUT_EVOSCHEME)) ||
((prop_info[i].prop_type & PROP_WITHOUT_EVOSCHEME) != 0 &&
!evolution_person_supported) ||
((prop_info[i].prop_type & PROP_WITH_EVOSCHEME) != 0 &&
evolution_person_supported)) &&
(calentry_supported ||
!(prop_info[i].prop_type & PROP_CALENTRY))) {
return prop_info[i].ldap_attr;
......@@ -4268,7 +4295,12 @@ build_contact_from_entry (EBookBackendLDAP *bl,
}
else {
for (i = 0; i < G_N_ELEMENTS (prop_info); i++) {
if (!g_ascii_strcasecmp (attr, prop_info[i].ldap_attr)) {
if (!g_ascii_strcasecmp (attr, prop_info[i].ldap_attr) &&
(!(prop_info[i].prop_type & (PROP_WITH_EVOSCHEME | PROP_WITHOUT_EVOSCHEME)) ||
((prop_info[i].prop_type & PROP_WITHOUT_EVOSCHEME) != 0 &&
!bl->priv->evolutionPersonSupported) ||
((prop_info[i].prop_type & PROP_WITH_EVOSCHEME) != 0 &&
bl->priv->evolutionPersonSupported))) {
info = &prop_info[i];
break;
}
......
......@@ -529,11 +529,6 @@ e_cal_recur_generate_instances_sync (ICalComponent *icalcomp,
if (rrule_until && !i_cal_time_is_null_time (rrule_until) &&
i_cal_time_is_date (rrule_until) && !i_cal_time_is_date (dtstart)) {
i_cal_time_adjust (rrule_until, 1, 0, 0, 0);
i_cal_time_set_is_date (rrule_until, FALSE);
i_cal_time_set_time (rrule_until, 0, 0, 0);
if (!i_cal_time_get_timezone (rrule_until) && !i_cal_time_is_utc (rrule_until))
i_cal_time_set_timezone (rrule_until, dtstart_zone);
}
if (rrule_until && !i_cal_time_is_null_time (rrule_until))
......@@ -676,11 +671,6 @@ e_cal_recur_generate_instances_sync (ICalComponent *icalcomp,
if (exrule_until && !i_cal_time_is_null_time (exrule_until) &&
i_cal_time_is_date (exrule_until) && !i_cal_time_is_date (dtstart)) {
i_cal_time_adjust (exrule_until, 1, 0, 0, 0);
i_cal_time_set_is_date (exrule_until, FALSE);
i_cal_time_set_time (exrule_until, 0, 0, 0);
if (!i_cal_time_get_timezone (exrule_until) && !i_cal_time_is_utc (exrule_until))
i_cal_time_set_timezone (exrule_until, dtstart_zone);
}
if (exrule_until && !i_cal_time_is_null_time (exrule_until))
......
......@@ -2706,7 +2706,7 @@ header_decode_addrspec (const gchar **in)
w (g_warning ("Invalid address spec: %s", *in));
}
}
if (*inptr == '@') {
while (*inptr == '@') {
inptr++;
g_string_append_c (addr, '@');
word = header_decode_domain (&inptr);
......@@ -2716,8 +2716,6 @@ header_decode_addrspec (const gchar **in)
} else {
w (g_warning ("Invalid address, missing domain: %s", *in));
}
} else {
w (g_warning ("Invalid addr-spec, missing @: %s", *in));
}
} else {
w (g_warning ("invalid addr-spec, no local part"));
......@@ -3216,7 +3214,9 @@ camel_header_contentid_decode (const gchar *in)
}
static void
header_references_decode_single (const gchar **in, GSList **list)
header_references_decode_single (const gchar **in,
gboolean *had_valid_value,
GSList **list)
{
const gchar *inptr = *in;
GString *accum_word = NULL;
......@@ -3227,30 +3227,33 @@ header_references_decode_single (const gchar **in, GSList **list)
if (*inptr == '<') {
id = header_msgid_decode_internal (&inptr);
if (id) {
*had_valid_value = TRUE;
*list = g_slist_prepend (*list, id);
break;
}
} else {
word = header_decode_word (&inptr);
if (word) {
/* To support broken clients, which do not enclose message IDs into angle brackets, as
required in the RFC 2822: https://tools.ietf.org/html/rfc2822#section-3.6.4 */
if (!*inptr || camel_mime_is_lwsp (*inptr)) {
if (accum_word) {
g_string_append (accum_word, word);
*list = g_slist_prepend (*list, g_string_free (accum_word, FALSE));
accum_word = NULL;
if (!*had_valid_value) {
/* To support broken clients, which do not enclose message IDs into angle brackets, as
required in the RFC 2822: https://tools.ietf.org/html/rfc2822#section-3.6.4 */
if (!*inptr || camel_mime_is_lwsp (*inptr)) {
if (accum_word) {
g_string_append (accum_word, word);
*list = g_slist_prepend (*list, g_string_free (accum_word, FALSE));
accum_word = NULL;
} else {
*list = g_slist_prepend (*list, word);
word = NULL;
}
} else {
*list = g_slist_prepend (*list, word);
word = NULL;
}
} else {
if (accum_word)
g_string_append (accum_word, word);
else
accum_word = g_string_new (word);
if (accum_word)
g_string_append (accum_word, word);
else
accum_word = g_string_new (word);
g_string_append_c (accum_word, *inptr);
g_string_append_c (accum_word, *inptr);
}
}
g_free (word);
} else if (*inptr != '\0')
......@@ -3276,12 +3279,13 @@ GSList *
camel_header_references_decode (const gchar *in)
{
GSList *refs = NULL;
gboolean had_valid_value = FALSE;
if (in == NULL || in[0] == '\0')
return NULL;
while (*in)
header_references_decode_single (&in, &refs);
header_references_decode_single (&in, &had_valid_value, &refs);
return refs;
}
......
......@@ -36,6 +36,11 @@ struct {
{ "test@camel.host", "test.groupwise@bug.novell", "test@camel.host" } },
{ " << test.groupwise@bug.novell>@novell> <test@camel.host> <<test.groupwise@bug.novell>@novell>",
{ "test.groupwise@bug.novell", "test@camel.host", "test.groupwise@bug.novell" } },
{ "<test@camel@host>", { "test@camel@host" } }, /* broken clients with multiple '@' */
{ "test@camel.host", { "test@camel.host" } }, /* broken clients without <> */
{ "test@camel@host", { "test@camel@host" } }, /* broken clients without <> */
{ "<test@camel> <test.1.2.3@camel.1.2.3@host.3.2.1> <t.e.s.t@c.a.m.e.l>", /* mix of good and broken values */
{ "t.e.s.t@c.a.m.e.l", "test.1.2.3@camel.1.2.3@host.3.2.1", "test@camel" } },
};
gint
......@@ -55,7 +60,9 @@ main (gint argc,
list = camel_header_references_decode (test1[i].header);
for (j = 0; test1[i].values[j]; j++) {
check_msg (list != NULL, "didn't find all references");
check (strcmp (test1[i].values[j], list->data) == 0);
check_msg (string_equal (test1[i].values[j], list->data),
"returned ID '%s' doesn't match expected '%s'",
(const gchar *) list->data, test1[i].values[j]);
list = g_slist_next (list);
}
check_msg (list == NULL, "found more references than should have");
......
......@@ -1042,6 +1042,20 @@ source_idle_changed_cb (gpointer user_data)
return FALSE;
}
static void source_connect_dbus_source (ESource *source);
static void
e_source_dbus_object_notify_source_cb (GObject *dbus_object,
GParamSpec *param,
gpointer user_data)
{
ESource *source = user_data;
g_return_if_fail (E_IS_SOURCE (source));
source_connect_dbus_source (source);
}
static void
source_set_dbus_object (ESource *source,
EDBusObject *dbus_object)
......@@ -1053,7 +1067,10 @@ source_set_dbus_object (ESource *source,
g_return_if_fail (E_DBUS_IS_OBJECT (dbus_object));
g_return_if_fail (source->priv->dbus_object == NULL);
source->priv->dbus_object = g_object_ref (dbus_object);
source->priv->dbus_object = G_DBUS_OBJECT (g_object_ref (dbus_object));
g_signal_connect_object (source->priv->dbus_object, "notify::source",
G_CALLBACK (e_source_dbus_object_notify_source_cb), source, 0);
}
static void
......@@ -1231,14 +1248,13 @@ source_dispose (GObject *object)
dbus_source = e_dbus_object_get_source (dbus_object);
if (dbus_source != NULL) {
g_signal_handlers_disconnect_matched (
dbus_source, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, object);
g_signal_handlers_disconnect_by_data (dbus_source, object);
g_object_unref (dbus_source);
}
g_object_unref (priv->dbus_object);
priv->dbus_object = NULL;
g_signal_handlers_disconnect_by_data (priv->dbus_object, object);
g_clear_object (&priv->dbus_object);
}
g_mutex_unlock (&priv->property_lock);
......@@ -2014,6 +2030,11 @@ source_connect_dbus_source (ESource *source)
dbus_source = e_dbus_object_get_source (dbus_object);
g_return_if_fail (E_DBUS_IS_SOURCE (dbus_source));
g_signal_handlers_disconnect_by_func (dbus_source, source_notify_dbus_data_cb, source);
g_signal_handlers_disconnect_by_func (dbus_source, source_notify_dbus_connection_status_cb, source);
g_signal_handlers_disconnect_by_func (dbus_source, source_dbus_credentials_required_cb, source);
g_signal_handlers_disconnect_by_func (dbus_source, source_dbus_authenticate_cb, source);
g_signal_connect_object (
dbus_source, "notify::data",
G_CALLBACK (source_notify_dbus_data_cb), source, 0);
......@@ -2504,14 +2525,21 @@ __e_source_private_replace_dbus_object (ESource *source,
dbus_source = e_dbus_object_get_source (E_DBUS_OBJECT (source->priv->dbus_object));
if (dbus_source) {
g_signal_handlers_disconnect_by_data (dbus_source, source),
g_signal_handlers_disconnect_by_data (dbus_source, source);
g_object_unref (dbus_source);
}
g_signal_handlers_disconnect_by_func (source->priv->dbus_object, e_source_dbus_object_notify_source_cb, source);
}
g_clear_object (&source->priv->dbus_object);
source->priv->dbus_object = dbus_object;
if (source->priv->dbus_object) {
g_signal_connect_object (source->priv->dbus_object, "notify::source",
G_CALLBACK (e_source_dbus_object_notify_source_cb), source, 0);
}
g_mutex_unlock (&source->priv->property_lock);
source_connect_dbus_source (source);
......
......@@ -561,6 +561,24 @@ credentials_prompter_impl_oauth2_get_prompt_strings (ESourceRegistry *registry,
g_free (display_name);
}
static gchar *
credentials_prompter_impl_oauth2_sanitize_host (gchar *host)
{
if (!host || !*host)
return host;
if (*host == '[' && strchr (host, ':')) {
gint len = strlen (host);
if (len > 2 && host[len - 1] == ']') {
memmove (host, host + 1, len - 2);
host[len - 2] = '\0';
}
}
return host;
}
static void
credentials_prompter_impl_oauth2_set_proxy (WebKitWebContext *web_context,
ESourceRegistry *registry,
......@@ -604,7 +622,7 @@ credentials_prompter_impl_oauth2_set_proxy (WebKitWebContext *web_context,
case E_PROXY_METHOD_MANUAL:
ignore_hosts = e_source_proxy_dup_ignore_hosts (proxy);
tmp = e_source_proxy_dup_socks_host (proxy);
tmp = credentials_prompter_impl_oauth2_sanitize_host (e_source_proxy_dup_socks_host (proxy));
if (tmp && *tmp) {
suri = soup_uri_new (NULL);
soup_uri_set_scheme (suri, "socks");
......@@ -623,7 +641,7 @@ credentials_prompter_impl_oauth2_set_proxy (WebKitWebContext *web_context,
}
g_free (tmp);
tmp = e_source_proxy_dup_http_host (proxy);
tmp = credentials_prompter_impl_oauth2_sanitize_host (e_source_proxy_dup_http_host (proxy));
if (tmp && *tmp) {
suri = soup_uri_new (NULL);
soup_uri_set_scheme (suri, SOUP_URI_SCHEME_HTTP);
......@@ -650,7 +668,7 @@ credentials_prompter_impl_oauth2_set_proxy (WebKitWebContext *web_context,
}
g_free (tmp);
tmp = e_source_proxy_dup_https_host (proxy);
tmp = credentials_prompter_impl_oauth2_sanitize_host (e_source_proxy_dup_https_host (proxy));
if (tmp && *tmp) {
suri = soup_uri_new (NULL);
soup_uri_set_scheme (suri, SOUP_URI_SCHEME_HTTP);
......@@ -856,6 +874,7 @@ e_credentials_prompter_impl_oauth2_show_dialog (ECredentialsPrompterImplOAuth2 *
"enable-page-cache", FALSE,
"enable-plugins", FALSE,
"media-playback-allows-inline", FALSE,
"hardware-acceleration-policy", WEBKIT_HARDWARE_ACCELERATION_POLICY_NEVER,
NULL);
web_context = webkit_web_context_new ();
......
......@@ -363,6 +363,151 @@ test_recur_plain (ETestServerFixture *fixture,
}
}
static ICalComponent *
create_component_midnight (const gchar *tz_location)
{
const gchar *comp_str =
"BEGIN:VEVENT\r\n"
"SUMMARY:recurs\r\n"
"UID:recurs-id\r\n"
"DTSTART%s:20190107T000000%s\r\n"
"DTEND%s:20190107T003000%s\r\n"
"DTSTAMP:20190101T050000Z\r\n"
"CREATED:20190101T050000Z\r\n"
"LAST-MODIFIED:20190101T050000Z\r\n"
"RRULE:FREQ=DAILY;UNTIL=20190109\r\n"
"END:VEVENT\r\n";
gchar *tzref = NULL, tzsuffix[2] = { 0, 0 };
gchar *str;
ICalComponent *icomp;
ICalTimezone *zone = NULL;
ICalTime *itt;
if (tz_location) {
if (g_ascii_strcasecmp (tz_location, "UTC") == 0) {
tzsuffix[0] = 'Z';
zone = i_cal_timezone_get_utc_timezone ();
} else {
const gchar *tzid;
zone = i_cal_timezone_get_builtin_timezone (tz_location);
g_assert_nonnull (zone);
tzid = i_cal_timezone_get_tzid (zone);
g_assert_nonnull (tzid);
tzref = g_strconcat (";TZID=", tzid, NULL);
}
}
str = g_strdup_printf (comp_str, tzref ? tzref : "", tzsuffix, tzref ? tzref : "", tzsuffix);
icomp = i_cal_component_new_from_string (str);
g_assert_nonnull (icomp);
g_free (tzref);
g_free (str);
itt = i_cal_component_get_dtstart (icomp);
g_assert_nonnull (itt);
g_assert_true (i_cal_time_get_timezone (itt) == zone);
g_object_unref (itt);
itt = i_cal_component_get_dtend (icomp);
g_assert_nonnull (itt);
g_assert_true (i_cal_time_get_timezone (itt) == zone);
g_object_unref (itt);
return icomp;
}
static void
setup_cal_midnight (ECalClient *cal_client,
const gchar *tz_location)
{
ICalComponent *icomp;
gboolean success;
gchar *uid = NULL;
GError *error = NULL;
icomp = create_component_midnight (tz_location);
if (!e_cal_client_remove_object_sync (cal_client, i_cal_component_get_uid (icomp), NULL, E_CAL_OBJ_MOD_ALL, E_CAL_OPERATION_FLAG_NONE, NULL, &error)) {
g_assert_error (error, E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND);
g_clear_error (&error);
} else {
g_assert_no_error (error);
}
success = e_cal_client_create_object_sync (cal_client, icomp, E_CAL_OPERATION_FLAG_NONE, &uid, NULL, &error);
g_assert_no_error (error);
g_assert_true (success);
g_assert_nonnull (uid);
g_object_unref (icomp);
g_free (uid);
}
static gboolean
recur_instance_midnight_cb (ICalComponent *icomp,
ICalTime *instance_start,
ICalTime *instance_end,
gpointer user_data,
GCancellable *cancellable,
GError **error)
{
GSList **listp = user_data;
*listp = g_slist_append (*listp, i_cal_time_as_ical_string (instance_start));
return TRUE;
}
static void
test_recur_midnight_for_zone (ECalClient *client,
const gchar *tz_location)
{
ICalTime *start, *end;
GSList *list = NULL, *last;
setup_cal_midnight (client, tz_location);
start = i_cal_time_new_from_string ("20190101T000000Z");
end = i_cal_time_new_from_string ("20190131T000000Z");
e_cal_client_generate_instances_sync (client,
i_cal_time_as_timet (start),
i_cal_time_as_timet (end),
NULL, /* GCancellable * */
recur_instance_midnight_cb, &list);
last = g_slist_last (list);
g_assert_nonnull (last);
if (g_ascii_strcasecmp (tz_location, "UTC") == 0)
g_assert_cmpstr (last->data, ==, "20190109T000000Z");
else
g_assert_cmpstr (last->data, ==, "20190109T000000");
g_assert_cmpint (g_slist_length (list), ==, 3);
g_slist_free_full (list, g_free);
g_clear_object (&start);
g_clear_object (&end);
}
static void
test_recur_midnight (ETestServerFixture *fixture,
gconstpointer user_data)
{
ECalClient *client;
client = E_TEST_SERVER_UTILS_SERVICE (fixture, ECalClient);
e_cal_client_set_default_timezone (client, i_cal_timezone_get_builtin_timezone ("UTC"));
test_recur_midnight_for_zone (client, "UTC");
test_recur_midnight_for_zone (client, "America/New_York");
test_recur_midnight_for_zone (client, "Europe/Berlin");
}
static void
test_recur_client (ETestServerFixture *fixture,
gconstpointer user_data)
......@@ -623,6 +768,13 @@ main (gint argc,
e_test_server_utils_setup,
test_recur_duration,
e_test_server_utils_teardown);
g_test_add (
"/ECalRecur/Midnight",
ETestServerFixture,
&test_closure,
e_test_server_utils_setup,
test_recur_midnight,
e_test_server_utils_teardown);
return e_test_server_utils_run (argc, argv);
}
......@@ -69,7 +69,7 @@ main (gint argc,
tcu_step_test_add_assertion (data, 5, 17, 16, 18, 10, 14);
tcu_step_test_add_assertion (data, 5, 12, 13, 9, 19, 20);
tcu_step_test_change_locale (data, "fr_CA.UTF-8", 0);
tcu_step_test_change_locale (data, "fr_CA.UTF-8", -1);
tcu_step_test_add_assertion (data, 5, 11, 1, 2, 5, 6);
tcu_step_test_add_assertion (data, 5, 4, 3, 7, 8, 15);
tcu_step_test_add_assertion (data, 5, 17, 16, 18, 10, 14);
......
......@@ -72,7 +72,7 @@ main (gint argc,
step_test_add_assertion (data, 5, 17, 16, 18, 10, 14);
step_test_add_assertion (data, 5, 12, 13, 9, 19, 20);
step_test_change_locale (data, "fr_CA.UTF-8", 0);
step_test_change_locale (data, "fr_CA.UTF-8", -1);
step_test_add_assertion (data, 5, 11, 1, 2, 5, 6);
step_test_add_assertion (data, 5, 4, 3, 7, 8, 15);
step_test_add_assertion (data, 5, 17, 16, 18, 10, 14);
......