1 /*
2 	belcard-vcard-tester.cpp
3 	Copyright (C) 2015  Belledonne Communications SARL
4 
5 	This program is free software: you can redistribute it and/or modify
6 	it under the terms of the GNU General Public License as published by
7 	the Free Software Foundation, either version 3 of the License, or
8 	(at your option) any later version.
9 
10 	This program is distributed in the hope that it will be useful,
11 	but WITHOUT ANY WARRANTY; without even the implied warranty of
12 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 	GNU General Public License for more details.
14 
15 	You should have received a copy of the GNU General Public License
16 	along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 
20 #include "belcard/belcard.hpp"
21 #include "belcard/belcard_parser.hpp"
22 #include "belcard/belcard_utils.hpp"
23 #include "belcard-tester.hpp"
24 
25 #include <bctoolbox/tester.h>
26 #include <iostream>
27 #include <fstream>
28 #include <sstream>
29 #include <string>
30 
31 using namespace::std;
32 using namespace::belcard;
33 
openFile(const char * name)34 static string openFile(const char *name) {
35 	ifstream istr(bc_tester_res(name), std::ios::binary);
36 	if (!istr.is_open()) {
37 		BC_FAIL(name);
38 	}
39 
40 	stringstream vcardStream;
41 	vcardStream << istr.rdbuf();
42 	string vcard = vcardStream.str();
43 	return vcard;
44 }
45 
folding(void)46 static void folding(void) {
47 	string vcard = openFile("vcards/foldtest.vcf");
48 	string folded_vcard = belcard_fold(vcard);
49 	string unfolded_vcard = openFile("vcards/unfoldtest.vcf");
50 	BC_ASSERT_EQUAL(unfolded_vcard.compare(folded_vcard), 0, int, "%d");
51 }
52 
unfolding(void)53 static void unfolding(void) {
54 	string vcard = openFile("vcards/unfoldtest.vcf");
55 	string unfolded_vcard = belcard_unfold(vcard);
56 	string folded_vcard = openFile("vcards/foldtest.vcf");
57 	BC_ASSERT_EQUAL(folded_vcard.compare(unfolded_vcard), 0, int, "%d");
58 }
59 
vcard_parsing(void)60 static void vcard_parsing(void) {
61 	string vcard = openFile("vcards/vcard.vcf");
62 
63 	BelCardParser *parser = new BelCardParser();
64 	shared_ptr<BelCard> belCard = parser->parseOne(vcard);
65 	if (!BC_ASSERT_TRUE(belCard!=NULL)) return;
66 	BC_ASSERT_TRUE(belCard->assertRFCCompliance());
67 
68 	string vcard2 = belCard->toFoldedString();
69 	BC_ASSERT_EQUAL(vcard2.compare(vcard), 0, int, "%d");
70 	delete(parser);
71 }
72 
vcards_parsing(void)73 static void vcards_parsing(void) {
74 	string vcards = openFile("vcards/vcards.vcf");
75 
76 	BelCardParser *parser = new BelCardParser();
77 	shared_ptr<BelCardList> belCards = parser->parse(vcards);
78 	if (!BC_ASSERT_TRUE(belCards!=NULL)) return;
79 	BC_ASSERT_EQUAL((unsigned int)belCards->getCards().size(), 2, unsigned int, "%u");
80 
81 	string vcards2 = belCards->toString();
82 	BC_ASSERT_EQUAL(vcards2.compare(vcards), 0, int, "%d");
83 	delete(parser);
84 }
85 
create_vcard_from_api(void)86 static void create_vcard_from_api(void) {
87 	shared_ptr<BelCard> belCard = BelCard::create<BelCard>();
88 	if (!BC_ASSERT_TRUE(belCard!=NULL)) return;
89 	BC_ASSERT_FALSE(belCard->assertRFCCompliance());
90 
91 	shared_ptr<BelCardFullName> fn = BelCard::create<BelCardFullName>();
92 	fn->setValue("Sylvain Berfini");
93 	belCard->setFullName(fn);
94 	BC_ASSERT_TRUE(belCard->assertRFCCompliance());
95 	BC_ASSERT_STRING_EQUAL(belCard->getFullName()->toString().c_str(), fn->toString().c_str());
96 
97 	fn = BelCard::create<BelCardFullName>();
98 	fn->setValue("Belcard Tester");
99 	belCard->setFullName(fn);
100 	BC_ASSERT_STRING_EQUAL(belCard->getFullName()->toString().c_str(), fn->toString().c_str());
101 
102 	string vcard = belCard->toString();
103 	BelCardParser *parser = new BelCardParser();
104 	shared_ptr<BelCard> belCard2 = parser->parseOne(vcard);
105 	if (!BC_ASSERT_TRUE(belCard2!=NULL)) return;
106 	BC_ASSERT_TRUE(belCard2->assertRFCCompliance());
107 	string vcard2 = belCard2->toString();
108 	BC_ASSERT_EQUAL(vcard.compare(vcard2), 0, unsigned, "%u");
109 	delete(parser);
110 }
111 
property_sort_using_pref_param(void)112 static void property_sort_using_pref_param(void) {
113 	shared_ptr<BelCard> belCard = BelCard::create<BelCard>();
114 	BC_ASSERT_TRUE(belCard!=NULL);
115 
116 	shared_ptr<BelCardImpp> impp1 = BelCardImpp::parse("IMPP;TYPE=home;PREF=2:sip:viish@sip.linphone.org\r\n");
117 	BC_ASSERT_TRUE(impp1!=NULL);
118 
119 	shared_ptr<BelCardImpp> impp2 = BelCardImpp::parse("IMPP;PREF=1;TYPE=work:sip:sylvain@sip.linphone.org\r\n");
120 	BC_ASSERT_TRUE(impp2!=NULL);
121 
122 	belCard->addImpp(impp1);
123 	belCard->addImpp(impp2);
124 
125 	const list<shared_ptr<BelCardImpp>> imppList = belCard->getImpp();
126 	BC_ASSERT_EQUAL((unsigned int)imppList.size(), 2, unsigned int, "%u");
127 	BC_ASSERT_TRUE(imppList.front() == impp2);
128 	BC_ASSERT_TRUE(imppList.back() == impp1);
129 
130 	const list<shared_ptr<BelCardProperty>> propertiesList = belCard->getProperties();
131 	BC_ASSERT_EQUAL((unsigned int)propertiesList.size(), 2, unsigned int, "%u");
132 
133 	belCard->removeImpp(impp1);
134 	BC_ASSERT_EQUAL((unsigned int)belCard->getImpp().size(), 1, unsigned int, "%u");
135 	BC_ASSERT_EQUAL((unsigned int)belCard->getProperties().size(), 1, unsigned int, "%u");
136 }
137 
138 static test_t tests[] = {
139 	TEST_NO_TAG("Folding", folding),
140 	TEST_NO_TAG("Unfolding", unfolding),
141 	TEST_NO_TAG("VCard parsing", vcard_parsing),
142 	TEST_NO_TAG("VCards parsing", vcards_parsing),
143 	TEST_NO_TAG("VCard created from scratch", create_vcard_from_api),
144 	TEST_NO_TAG("Property sort using pref param", property_sort_using_pref_param),
145 };
146 
147 test_suite_t vcard_test_suite = {
148 	"VCard",
149 	NULL,
150 	NULL,
151 	NULL,
152 	NULL,
153 	sizeof(tests) / sizeof(tests[0]),
154 	tests
155 };
156