/*
* Copyright (C) 2013 Collabora Ltd.
*
* 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.1 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 .
*
* Authors: Philip Withnall
*/
using Gee;
using Folks;
using BluezTest;
public class VcardParsingTests : BluezTest.TestCase
{
public VcardParsingTests ()
{
base ("VcardParsing");
this.add_test ("multiple attributes", this.test_multiple_attributes);
this.add_test ("name components", this.test_name_components);
this.add_test ("encoding", this.test_encoding);
}
/* Test that vCards containing multiple attributes with the same name (e.g.
* multiple phone numbers or e-mail addresses) are parsed correctly. */
public void test_multiple_attributes ()
{
/* Set up the backend. */
this.bluez_backend.create_simple_device_with_vcard (
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:Forrest Gump\n" +
"TEL;TYPE=WORK,VOICE:(111) 555-1212\n" +
"TEL;TYPE=HOME,VOICE:(404) 555-1212\n" +
"EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com\n" +
"EMAIL:test@example.com\n" +
"URL;TYPE=HOME:http://example.com/\n" +
"URL:http://forest.com/\n" +
"URL:https://test.com/\n" +
"END:VCARD\n");
/* Set up the aggregator and wait until either the expected persona are
* seen, or the test times out and fails. */
var aggregator = IndividualAggregator.dup ();
TestUtils.aggregator_prepare_and_wait_for_individuals_sync_with_timeout (
aggregator, {"Forrest Gump"});
/* Check the properties of our friend Forrest. */
var ind = TestUtils.get_individual_by_name (aggregator, "Forrest Gump");
var expected_phone_numbers = new SmallSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var expected_phone_fd = new PhoneFieldDetails ("(111) 555-1212");
expected_phone_fd.add_parameter ("type", "work");
expected_phone_fd.add_parameter ("type", "voice");
expected_phone_numbers.add (expected_phone_fd);
expected_phone_fd = new PhoneFieldDetails ("(404) 555-1212");
expected_phone_fd.add_parameter ("type", "home");
expected_phone_fd.add_parameter ("type", "voice");
expected_phone_numbers.add (expected_phone_fd);
var expected_email_addresses = new SmallSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var expected_email_fd = new EmailFieldDetails ("forrestgump@example.com");
expected_email_fd.add_parameter ("type", "pref");
expected_email_fd.add_parameter ("type", "internet");
expected_email_addresses.add (expected_email_fd);
expected_email_fd = new EmailFieldDetails ("test@example.com");
expected_email_addresses.add (expected_email_fd);
var expected_uris = new SmallSet (
AbstractFieldDetails.hash_static,
AbstractFieldDetails.equal_static);
var expected_uri_fd = new UrlFieldDetails ("http://example.com/");
expected_uri_fd.add_parameter ("type", "home");
expected_uris.add (expected_uri_fd);
expected_uri_fd = new UrlFieldDetails ("http://forest.com/");
expected_uris.add (expected_uri_fd);
expected_uri_fd = new UrlFieldDetails ("https://test.com/");
expected_uris.add (expected_uri_fd);
assert (Utils.set_afd_equal (ind.phone_numbers, expected_phone_numbers));
assert (Utils.set_afd_equal (ind.email_addresses,
expected_email_addresses));
assert (Utils.set_afd_equal (ind.urls, expected_uris));
}
/* Test that vCards with different numbers of values for their N (structured
* name) attribute are parsed correctly. */
public void test_name_components ()
{
/* Set up the backend. */
this.bluez_backend.create_simple_device_with_vcard (
/* Valid N attributes. */
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:John Public\n" +
"N:Public;John;Quinlan;Mr.;Esq.\n" +
"END:VCARD\n" +
"\n" +
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:John Stevenson\n" +
"N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.\n" +
"END:VCARD\n" +
"\n" +
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:Franco Dianno\n" +
"N:Dianno;Franco;;;\n" +
"END:VCARD\n" +
"\n" +
/* Invalid N attributes (but we should handle them anyway). */
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:Amelia Smith\n" +
"N:Smith;Amelia;David;Dr.\n" +
"END:VCARD\n" +
"\n" +
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:Sadie Jones\n" +
"N:Jones;Sadie;M.\n" +
"END:VCARD\n" +
"\n" +
"BEGIN:VCARD\n" +
"VERSION:3.0\n" +
"FN:Alex Lawson\n" +
"N:Lawson;Alex\n" +
"END:VCARD\n");
/* Set up the aggregator and wait until either the expected persona are
* seen, or the test times out and fails. */
var aggregator = IndividualAggregator.dup ();
TestUtils.aggregator_prepare_and_wait_for_individuals_sync_with_timeout (
aggregator,
{
"John Public",
"John Stevenson",
"Franco Dianno",
"Amelia Smith",
"Sadie Jones",
"Alex Lawson"
});
/* Check the properties of our individuals. */
var ind = TestUtils.get_individual_by_name (aggregator, "John Public");
var expected_name =
new StructuredName ("Public", "John", "Quinlan", "Mr.", "Esq.");
assert (ind.structured_name.equal (expected_name));
ind = TestUtils.get_individual_by_name (aggregator, "John Stevenson");
expected_name =
new StructuredName ("Stevenson", "John", "Philip,Paul", "Dr.",
"Jr.,M.D.,A.C.P.");
assert (ind.structured_name.equal (expected_name));
ind = TestUtils.get_individual_by_name (aggregator, "Franco Dianno");
expected_name = new StructuredName ("Dianno", "Franco", null, null, null);
assert (ind.structured_name.equal (expected_name));
ind = TestUtils.get_individual_by_name (aggregator, "Amelia Smith");
expected_name =
new StructuredName ("Smith", "Amelia", "David", "Dr.", null);
assert (ind.structured_name.equal (expected_name));
ind = TestUtils.get_individual_by_name (aggregator, "Sadie Jones");
expected_name = new StructuredName ("Jones", "Sadie", "M.", null, null);
assert (ind.structured_name.equal (expected_name));
ind = TestUtils.get_individual_by_name (aggregator, "Alex Lawson");
expected_name = new StructuredName ("Lawson", "Alex", null, null, null);
assert (ind.structured_name.equal (expected_name));
}
/* Test that vCards with weird encodings are parsed correctly. */
public void test_encoding ()
{
/* Set up the backend. */
this.bluez_backend.create_simple_device_with_vcard (
/* From https://bugs.kde.org/show_bug.cgi?id=98790 */
"BEGIN:VCARD\n" +
"VERSION:2.1\n" +
"FN:Test 1\n" +
"N;CHARSET=UTF-8:溌剌;元気\n" +
"END:VCARD\n" +
"\n" +
/* From https://git.gnome.org/browse/evolution-data-server/tree/tests/
* libebook-contacts/test-vcard-parsing.c#n360 */
"BEGIN:VCARD\n" +
"VERSION:2.1\n" +
"FN;ENCODING=quoted-printable:ActualValue=20=C4=9B=C5=A1" +
"=C4=8D=C5=99=C5=BE=C3=BD=C3=A1=C3=AD=C3=A9=C3=BA=C5=AF=C3" +
"=B3=C3=B6=C4=9A=C5=A0=C4=8C=C5=98=C5=BD=C3=9D=C3=81=C3=8D" +
"=C3=89=C3=9A=C5=AE=C3=93=C3=96=C2=A7=201234567890=2012345" +
"67890=201234567890=201234567890=201234567890\n" +
"END:VCARD\n");
/* Set up the aggregator and wait until either the expected persona are
* seen, or the test times out and fails. */
var aggregator = IndividualAggregator.dup ();
TestUtils.aggregator_prepare_and_wait_for_individuals_sync_with_timeout (
aggregator,
{
"Test 1",
"ActualValue ěščřžýáíéúůóöĚŠČŘŽÝÁÍÉÚŮÓÖ§ " +
"1234567890 1234567890 1234567890 1234567890 1234567890"
});
/* Check the properties of our individuals. */
var ind = TestUtils.get_individual_by_name (aggregator, "Test 1");
var expected_name =
new StructuredName ("溌剌", "元気", null, null, null);
assert (ind.structured_name.equal (expected_name));
ind =
TestUtils.get_individual_by_name (aggregator,
"ActualValue ěščřžýáíéúůóöĚŠČŘŽÝÁÍÉÚŮÓÖ§ " +
"1234567890 1234567890 1234567890 1234567890 1234567890");
assert (ind.full_name == "ActualValue ěščřžýáíéúůóöĚŠČŘŽÝÁÍÉÚŮÓÖ§ " +
"1234567890 1234567890 1234567890 1234567890 1234567890");
}
}
public int main (string[] args)
{
Test.init (ref args);
var tests = new VcardParsingTests ();
tests.register ();
Test.run ();
tests.final_tear_down ();
return 0;
}