qulogic/pidgin
Clone
Summary
Browse
Changes
Graph
Make sure all of the license headers for IRCv3 are GPLv2
default
4 months ago, Gary Kramlich
31e8c7c92e2f
Make sure all of the license headers for IRCv3 are GPLv2
Testing Done:
Ran `licensecheck` from debian in the following way.
```
$ licensecheck *.[ch] | cut -d: -f 2 | sort | uniq -c
27 GNU General Public License v2.0 or later
```
Reviewed at https://reviews.imfreedom.org/r/2913/
/*
* Purple - Internet Messaging Library
* Copyright (C) Pidgin Developers <devel@pidgin.im>
*
* This library 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 of the License, or (at your option) any later version.
*
* This library 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 this library; if not, see <https://www.gnu.org/licenses/>.
*/
#include
<glib.h>
#include
<purple.h>
#include
"test_ui.h"
/******************************************************************************
* Callbacks
*****************************************************************************/
static
void
test_purple_person_items_changed_cb
(
G_GNUC_UNUSED
GListModel
*
model
,
G_GNUC_UNUSED
guint
position
,
G_GNUC_UNUSED
guint
removed
,
G_GNUC_UNUSED
guint
added
,
gpointer
data
)
{
gboolean
*
called
=
data
;
*
called
=
TRUE
;
}
static
void
test_purple_person_notify_cb
(
G_GNUC_UNUSED
GObject
*
obj
,
G_GNUC_UNUSED
GParamSpec
*
pspec
,
gpointer
data
)
{
guint
*
called
=
data
;
*
called
=
*
called
+
1
;
}
/******************************************************************************
* Tests
*****************************************************************************/
static
void
test_purple_person_new
(
void
)
{
PurplePerson
*
person
=
NULL
;
person
=
purple_person_new
();
g_assert_true
(
PURPLE_IS_PERSON
(
person
));
g_clear_object
(
&
person
);
}
static
void
test_purple_person_properties
(
void
)
{
PurpleAvatar
*
avatar
=
NULL
;
PurpleAvatar
*
avatar1
=
NULL
;
PurpleAvatar
*
avatar_for_display
=
NULL
;
PurpleContact
*
person
=
NULL
;
PurpleTags
*
tags
=
NULL
;
char
*
id
=
NULL
;
char
*
alias
=
NULL
;
char
*
color
=
NULL
;
char
*
color_for_display
=
NULL
;
char
*
name_for_display
=
NULL
;
/* Create our avatar for testing. */
avatar
=
g_object_new
(
PURPLE_TYPE_AVATAR
,
NULL
);
/* Use g_object_new so we can test setting properties by name. All of them
* call the setter methods, so by doing it this way we exercise more of the
* code.
*/
person
=
g_object_new
(
PURPLE_TYPE_PERSON
,
"alias"
,
"alias"
,
"avatar"
,
avatar
,
"color"
,
"#794a85"
,
NULL
);
/* Now use g_object_get to read all of the properties. */
g_object_get
(
person
,
"id"
,
&
id
,
"alias"
,
&
alias
,
"avatar"
,
&
avatar1
,
"avatar-for-display"
,
&
avatar_for_display
,
"color"
,
&
color
,
"color-for-display"
,
&
color_for_display
,
"name-for-display"
,
&
name_for_display
,
"tags"
,
&
tags
,
NULL
);
/* Test all the things. */
g_assert_nonnull
(
id
);
g_clear_pointer
(
&
id
,
g_free
);
g_assert_cmpstr
(
alias
,
==
,
"alias"
);
g_clear_pointer
(
&
alias
,
g_free
);
g_assert_true
(
avatar1
==
avatar
);
g_clear_object
(
&
avatar1
);
g_assert_true
(
avatar_for_display
==
avatar
);
g_clear_object
(
&
avatar_for_display
);
g_assert_cmpstr
(
color
,
==
,
"#794a85"
);
g_clear_pointer
(
&
color
,
g_free
);
g_assert_cmpstr
(
color_for_display
,
==
,
"#794a85"
);
g_clear_pointer
(
&
color_for_display
,
g_free
);
g_assert_cmpstr
(
name_for_display
,
==
,
"alias"
);
g_clear_pointer
(
&
name_for_display
,
g_free
);
g_assert_nonnull
(
tags
);
g_clear_object
(
&
tags
);
/* Additional cleanup. */
g_clear_object
(
&
avatar
);
g_clear_object
(
&
person
);
}
static
void
test_purple_person_avatar_for_display_person
(
void
)
{
PurpleAvatar
*
avatar
=
NULL
;
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
guint
called
=
0
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::avatar"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
g_signal_connect
(
person
,
"notify::avatar-for-display"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
avatar
=
g_object_new
(
PURPLE_TYPE_AVATAR
,
NULL
);
purple_person_set_avatar
(
person
,
avatar
);
g_assert_cmpuint
(
called
,
==
,
2
);
info
=
purple_contact_info_new
(
"id"
);
purple_person_add_contact_info
(
person
,
info
);
/* Make sure the person's avatar is overriding the contact info. */
g_assert_true
(
purple_person_get_avatar_for_display
(
person
)
==
avatar
);
g_clear_object
(
&
info
);
g_clear_object
(
&
person
);
g_clear_object
(
&
avatar
);
}
static
void
test_purple_person_avatar_for_display_contact
(
void
)
{
PurpleAvatar
*
avatar
=
NULL
;
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
guint
called
=
0
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::avatar-for-display"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
info
=
purple_contact_info_new
(
"id"
);
avatar
=
g_object_new
(
PURPLE_TYPE_AVATAR
,
NULL
);
purple_contact_info_set_avatar
(
info
,
avatar
);
purple_person_add_contact_info
(
person
,
info
);
g_assert_cmpuint
(
called
,
==
,
1
);
called
=
0
;
/* Make sure the person's alias is overriding the contact info. */
g_assert_true
(
purple_person_get_avatar_for_display
(
person
)
==
avatar
);
g_clear_object
(
&
avatar
);
/* Now change the avatar on the contact info an verify that we not notified
* of the property changing.
*/
called
=
0
;
avatar
=
g_object_new
(
PURPLE_TYPE_AVATAR
,
NULL
);
purple_contact_info_set_avatar
(
info
,
avatar
);
g_assert_cmpuint
(
called
,
==
,
1
);
g_clear_object
(
&
info
);
g_clear_object
(
&
person
);
g_clear_object
(
&
avatar
);
}
static
void
test_purple_person_color_for_display_person
(
void
)
{
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
const
char
*
color
=
NULL
;
guint
color_called
=
0
;
guint
color_for_display_called
=
0
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::color"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
color_called
);
g_signal_connect
(
person
,
"notify::color-for-display"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
color_for_display_called
);
purple_person_set_color
(
person
,
"#abcdef"
);
g_assert_cmpuint
(
color_called
,
==
,
1
);
color_called
=
0
;
g_assert_cmpuint
(
color_for_display_called
,
==
,
1
);
color_for_display_called
=
0
;
/* Make sure the person's color is overriding the contact info. */
info
=
purple_contact_info_new
(
"id"
);
purple_person_add_contact_info
(
person
,
info
);
color
=
purple_person_get_color_for_display
(
person
);
g_assert_cmpstr
(
color
,
==
,
"#abcdef"
);
g_assert_cmpuint
(
color_called
,
==
,
0
);
g_assert_cmpuint
(
color_for_display_called
,
==
,
0
);
/* Cleanup. */
g_clear_object
(
&
info
);
g_clear_object
(
&
person
);
}
static
void
test_purple_person_color_for_display_contact
(
void
)
{
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
const
char
*
color
=
NULL
;
guint
called
=
0
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::color-for-display"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
info
=
purple_contact_info_new
(
"id"
);
purple_contact_info_set_color
(
info
,
"#012345"
);
purple_person_add_contact_info
(
person
,
info
);
g_assert_cmpuint
(
called
,
==
,
1
);
called
=
0
;
/* Make sure the person's alias is overriding the contact info. */
color
=
purple_person_get_color_for_display
(
person
);
g_assert_cmpstr
(
color
,
==
,
"#012345"
);
/* Now change the avatar on the contact info and verify that we are
* notified of the property changing.
*/
purple_contact_info_set_color
(
info
,
"#6789ab"
);
g_assert_cmpuint
(
called
,
==
,
1
);
g_clear_object
(
&
info
);
g_clear_object
(
&
person
);
}
static
void
test_purple_person_name_for_display_person
(
void
)
{
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
person
=
purple_person_new
();
purple_person_set_alias
(
person
,
"person-alias"
);
info
=
purple_contact_info_new
(
"id"
);
purple_person_add_contact_info
(
person
,
info
);
/* Make sure the person's alias is overriding the contact info. */
g_assert_cmpstr
(
purple_person_get_name_for_display
(
person
),
==
,
"person-alias"
);
g_clear_object
(
&
info
);
g_clear_object
(
&
person
);
}
static
void
test_purple_person_name_for_display_contact
(
void
)
{
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
guint
called
=
0
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::name-for-display"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
info
=
purple_contact_info_new
(
"id"
);
purple_person_add_contact_info
(
person
,
info
);
g_assert_cmpuint
(
called
,
==
,
1
);
/* Make sure the name for display matches the id of the contact. */
g_assert_cmpstr
(
purple_person_get_name_for_display
(
person
),
==
,
"id"
);
/* Now set a username on the contact and verify that the name for display
* matches and that the notify signal was emitted for the property.
*/
purple_contact_info_set_username
(
info
,
"clu"
);
g_assert_cmpstr
(
purple_person_get_name_for_display
(
person
),
==
,
"clu"
);
g_assert_cmpuint
(
called
,
==
,
2
);
g_clear_object
(
&
info
);
g_clear_object
(
&
person
);
}
static
void
test_purple_person_contacts_single
(
void
)
{
PurpleContactInfo
*
info
=
NULL
;
PurplePerson
*
person
=
NULL
;
PurplePerson
*
person1
=
NULL
;
guint
n_items
=
0
;
gboolean
removed
=
FALSE
;
gboolean
changed
=
FALSE
;
info
=
purple_contact_info_new
(
"id"
);
person
=
purple_person_new
();
g_signal_connect
(
person
,
"items-changed"
,
G_CALLBACK
(
test_purple_person_items_changed_cb
),
&
changed
);
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
0
);
purple_person_add_contact_info
(
person
,
info
);
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
1
);
g_assert_true
(
changed
);
person1
=
purple_contact_info_get_person
(
info
);
g_assert_true
(
person1
==
person
);
changed
=
FALSE
;
removed
=
purple_person_remove_contact_info
(
person
,
info
);
g_assert_true
(
removed
);
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
0
);
g_assert_true
(
changed
);
person1
=
purple_contact_info_get_person
(
info
);
g_assert_null
(
person1
);
g_clear_object
(
&
person
);
g_clear_object
(
&
info
);
}
static
void
test_purple_person_contacts_multiple
(
void
)
{
PurplePerson
*
person
=
NULL
;
GPtrArray
*
infos
=
NULL
;
guint
n_items
=
0
;
const
gint
n_infos
=
5
;
gboolean
changed
=
FALSE
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"items-changed"
,
G_CALLBACK
(
test_purple_person_items_changed_cb
),
&
changed
);
infos
=
g_ptr_array_new_full
(
n_infos
,
g_object_unref
);
for
(
gint
i
=
0
;
i
<
n_infos
;
i
++
)
{
PurpleContactInfo
*
info
=
NULL
;
gchar
*
username
=
NULL
;
changed
=
FALSE
;
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
i
);
username
=
g_strdup_printf
(
"username%d"
,
i
);
info
=
purple_contact_info_new
(
NULL
);
purple_contact_info_set_username
(
info
,
username
);
g_free
(
username
);
/* Add the contact info to the ptr array so we can remove it below. */
g_ptr_array_add
(
infos
,
info
);
/* Add the contact info to the person and make sure that all the magic
* happened.
*/
purple_person_add_contact_info
(
person
,
info
);
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
i
+
1
);
g_assert_true
(
changed
);
}
for
(
gint
i
=
0
;
i
<
n_infos
;
i
++
)
{
PurpleContactInfo
*
info
=
g_ptr_array_index
(
infos
,
i
);
gboolean
removed
=
FALSE
;
changed
=
FALSE
;
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
n_infos
-
i
);
removed
=
purple_person_remove_contact_info
(
person
,
info
);
g_assert_true
(
removed
);
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
n_infos
-
(
i
+
1
));
g_assert_true
(
changed
);
}
/* Final sanity check that the person has no more contacts. */
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
0
);
g_ptr_array_free
(
infos
,
TRUE
);
g_clear_object
(
&
person
);
}
static
void
test_purple_person_priority_single
(
void
)
{
PurpleContactInfo
*
info
=
NULL
;
PurpleContactInfo
*
priority
=
NULL
;
PurplePerson
*
person
=
NULL
;
PurplePresence
*
presence
=
NULL
;
guint
called
=
0
;
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::priority-contact-info"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
priority
=
purple_person_get_priority_contact_info
(
person
);
g_assert_null
(
priority
);
/* Now create a real contact. */
info
=
purple_contact_info_new
(
NULL
);
purple_person_add_contact_info
(
person
,
info
);
/* Set the presence of the contact. */
presence
=
purple_contact_info_get_presence
(
info
);
purple_presence_set_primitive
(
presence
,
PURPLE_PRESENCE_PRIMITIVE_AVAILABLE
);
g_assert_cmpuint
(
called
,
==
,
1
);
priority
=
purple_person_get_priority_contact_info
(
person
);
g_assert_true
(
priority
==
info
);
g_clear_object
(
&
person
);
g_clear_object
(
&
info
);
g_clear_object
(
&
presence
);
}
static
void
test_purple_person_priority_multiple_with_change
(
void
)
{
PurpleContactInfo
*
priority
=
NULL
;
PurpleContactInfo
*
first
=
NULL
;
PurpleContactInfo
*
sorted_contact
=
NULL
;
PurplePerson
*
person
=
NULL
;
PurplePresence
*
sorted_presence
=
NULL
;
guint
called
=
0
;
gint
n_infos
=
5
;
guint
n_items
=
0
;
/* This unit test is a bit complicated, but it adds 5 contact infos to a
* person all whose presences are set to offline. After adding all the
* contact infos, we verify that the first contact info we added is the
* priority contact info. Then we flip the active status of the n_infos - 2
* infos to available. This should make it the priority contact info which
* we then assert.
*/
/* Create the person and connected to the notify signal for the
* priority-contact property.
*/
person
=
purple_person_new
();
g_signal_connect
(
person
,
"notify::priority-contact-info"
,
G_CALLBACK
(
test_purple_person_notify_cb
),
&
called
);
priority
=
purple_person_get_priority_contact_info
(
person
);
g_assert_null
(
priority
);
/* Create and add all contact infos. */
for
(
gint
i
=
0
;
i
<
n_infos
;
i
++
)
{
PurpleContactInfo
*
info
=
NULL
;
gchar
*
username
=
NULL
;
/* Set called to 0 as it shouldn't be called as the priority contact
* info shouldn't change except for the first index.
*/
called
=
0
;
/* Now create a real contact. */
username
=
g_strdup_printf
(
"username%d"
,
i
+
1
);
info
=
purple_contact_info_new
(
NULL
);
purple_contact_info_set_username
(
info
,
username
);
g_free
(
username
);
purple_person_add_contact_info
(
person
,
info
);
if
(
i
==
0
)
{
first
=
g_object_ref
(
info
);
g_assert_cmpuint
(
called
,
==
,
1
);
}
else
{
g_assert_cmpuint
(
called
,
==
,
0
);
if
(
i
==
n_infos
-
2
)
{
PurplePresence
*
presence
=
NULL
;
/* Add a reference to the presence of this specific contact
* info, as we want to tweak it later.
*/
presence
=
purple_contact_info_get_presence
(
info
);
sorted_presence
=
g_object_ref
(
presence
);
sorted_contact
=
g_object_ref
(
info
);
}
}
g_clear_object
(
&
info
);
}
n_items
=
g_list_model_get_n_items
(
G_LIST_MODEL
(
person
));
g_assert_cmpuint
(
n_items
,
==
,
n_infos
);
priority
=
purple_person_get_priority_contact_info
(
person
);
g_assert_true
(
priority
==
first
);
g_clear_object
(
&
first
);
/* Now set the second from the last contact info's status to available, and
* verify that that contact info is now the priority contact info.
*/
called
=
0
;
purple_presence_set_primitive
(
sorted_presence
,
PURPLE_PRESENCE_PRIMITIVE_AVAILABLE
);
priority
=
purple_person_get_priority_contact_info
(
person
);
g_assert_true
(
priority
==
sorted_contact
);
g_assert_cmpuint
(
called
,
==
,
1
);
/* Cleanup. */
g_clear_object
(
&
sorted_contact
);
g_clear_object
(
&
sorted_presence
);
g_clear_object
(
&
person
);
}
/******************************************************************************
* Matches tests
*****************************************************************************/
static
void
test_purple_person_matches_accepts_null
(
void
)
{
PurplePerson
*
person
=
purple_person_new
();
g_assert_true
(
purple_person_matches
(
person
,
NULL
));
g_clear_object
(
&
person
);
}
static
void
test_purple_person_matches_empty_string
(
void
)
{
PurplePerson
*
person
=
purple_person_new
();
g_assert_true
(
purple_person_matches
(
person
,
""
));
g_clear_object
(
&
person
);
}
static
void
test_purple_person_matches_alias
(
void
)
{
PurplePerson
*
person
=
purple_person_new
();
purple_person_set_alias
(
person
,
"this is the alias"
);
g_assert_true
(
purple_person_matches
(
person
,
"the"
));
g_assert_false
(
purple_person_matches
(
person
,
"what"
));
g_clear_object
(
&
person
);
}
static
void
test_purple_person_matches_contact_info
(
void
)
{
PurplePerson
*
person
=
purple_person_new
();
PurpleContactInfo
*
info
=
purple_contact_info_new
(
NULL
);
purple_contact_info_set_username
(
info
,
"user1"
);
purple_person_add_contact_info
(
person
,
info
);
g_clear_object
(
&
info
);
g_assert_true
(
purple_person_matches
(
person
,
"user1"
));
g_clear_object
(
&
person
);
}
/******************************************************************************
* Main
*****************************************************************************/
gint
main
(
gint
argc
,
gchar
*
argv
[])
{
gint
ret
=
0
;
g_test_init
(
&
argc
,
&
argv
,
NULL
);
test_ui_purple_init
();
g_test_add_func
(
"/person/new"
,
test_purple_person_new
);
g_test_add_func
(
"/person/properties"
,
test_purple_person_properties
);
g_test_add_func
(
"/person/avatar-for-display/person"
,
test_purple_person_avatar_for_display_person
);
g_test_add_func
(
"/person/avatar-for-display/contact"
,
test_purple_person_avatar_for_display_contact
);
g_test_add_func
(
"/person/color-for-display/person"
,
test_purple_person_color_for_display_person
);
g_test_add_func
(
"/person/color-for-display/contact"
,
test_purple_person_color_for_display_contact
);
g_test_add_func
(
"/person/name-for-display/person"
,
test_purple_person_name_for_display_person
);
g_test_add_func
(
"/person/name-for-display/contact"
,
test_purple_person_name_for_display_contact
);
g_test_add_func
(
"/person/contacts/single"
,
test_purple_person_contacts_single
);
g_test_add_func
(
"/person/contacts/multiple"
,
test_purple_person_contacts_multiple
);
g_test_add_func
(
"/person/priority/single"
,
test_purple_person_priority_single
);
g_test_add_func
(
"/person/priority/multiple-with-change"
,
test_purple_person_priority_multiple_with_change
);
g_test_add_func
(
"/person/matches/accepts_null"
,
test_purple_person_matches_accepts_null
);
g_test_add_func
(
"/person/matches/empty_string"
,
test_purple_person_matches_empty_string
);
g_test_add_func
(
"/person/matches/alias"
,
test_purple_person_matches_alias
);
g_test_add_func
(
"/person/matches/contact_info"
,
test_purple_person_matches_contact_info
);
ret
=
g_test_run
();
test_ui_purple_uninit
();
return
ret
;
}