|
ferencd@0
|
1 //
|
|
ferencd@0
|
2 // VMime library (http://www.vmime.org)
|
|
ferencd@0
|
3 // Copyright (C) 2002-2013 Vincent Richard <vincent@vmime.org>
|
|
ferencd@0
|
4 //
|
|
ferencd@0
|
5 // This program is free software; you can redistribute it and/or
|
|
ferencd@0
|
6 // modify it under the terms of the GNU General Public License as
|
|
ferencd@0
|
7 // published by the Free Software Foundation; either version 3 of
|
|
ferencd@0
|
8 // the License, or (at your option) any later version.
|
|
ferencd@0
|
9 //
|
|
ferencd@0
|
10 // This program is distributed in the hope that it will be useful,
|
|
ferencd@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ferencd@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
ferencd@0
|
13 // General Public License for more details.
|
|
ferencd@0
|
14 //
|
|
ferencd@0
|
15 // You should have received a copy of the GNU General Public License along
|
|
ferencd@0
|
16 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ferencd@0
|
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ferencd@0
|
18 //
|
|
ferencd@0
|
19 // Linking this library statically or dynamically with other modules is making
|
|
ferencd@0
|
20 // a combined work based on this library. Thus, the terms and conditions of
|
|
ferencd@0
|
21 // the GNU General Public License cover the whole combination.
|
|
ferencd@0
|
22 //
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 #include "tests/testUtils.hpp"
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26 #include "vmime/platform.hpp"
|
|
ferencd@0
|
27
|
|
ferencd@0
|
28 #include <locale>
|
|
ferencd@0
|
29 #include <clocale>
|
|
ferencd@0
|
30
|
|
ferencd@0
|
31
|
|
ferencd@0
|
32 VMIME_TEST_SUITE_BEGIN(emailAddressTest)
|
|
ferencd@0
|
33
|
|
ferencd@0
|
34 VMIME_TEST_LIST_BEGIN
|
|
ferencd@0
|
35 VMIME_TEST(testParseASCII)
|
|
ferencd@0
|
36 VMIME_TEST(testParseEAI)
|
|
ferencd@0
|
37 VMIME_TEST(testParseInvalid)
|
|
ferencd@0
|
38 VMIME_TEST(testGenerateASCII)
|
|
ferencd@0
|
39 VMIME_TEST(testGenerateEAI)
|
|
ferencd@0
|
40 VMIME_TEST(testParseSpecialChars)
|
|
ferencd@0
|
41 VMIME_TEST(testParseCommentInLocalPart)
|
|
ferencd@0
|
42 VMIME_TEST(testParseCommentInDomainPart)
|
|
ferencd@0
|
43 VMIME_TEST(testGenerateSpecialChars)
|
|
ferencd@0
|
44 VMIME_TEST_LIST_END
|
|
ferencd@0
|
45
|
|
ferencd@0
|
46
|
|
ferencd@0
|
47 void setUp()
|
|
ferencd@0
|
48 {
|
|
ferencd@0
|
49 // Set the global C and C++ locale to the user-configured locale.
|
|
ferencd@0
|
50 // The locale should use UTF-8 encoding for these tests to run successfully.
|
|
ferencd@0
|
51 try
|
|
ferencd@0
|
52 {
|
|
ferencd@0
|
53 std::locale::global(std::locale(""));
|
|
ferencd@0
|
54 }
|
|
ferencd@0
|
55 catch (std::exception &)
|
|
ferencd@0
|
56 {
|
|
ferencd@0
|
57 std::setlocale(LC_ALL, "");
|
|
ferencd@0
|
58 }
|
|
ferencd@0
|
59 }
|
|
ferencd@0
|
60
|
|
ferencd@0
|
61 void tearDown()
|
|
ferencd@0
|
62 {
|
|
ferencd@0
|
63 // Restore default locale
|
|
ferencd@0
|
64 std::locale::global(std::locale("C"));
|
|
ferencd@0
|
65 }
|
|
ferencd@0
|
66
|
|
ferencd@0
|
67
|
|
ferencd@0
|
68 void testParseASCII()
|
|
ferencd@0
|
69 {
|
|
ferencd@0
|
70 vmime::emailAddress eml1("local@domain");
|
|
ferencd@0
|
71 VASSERT_EQ("1/local", "local", eml1.getLocalName());
|
|
ferencd@0
|
72 VASSERT_EQ("1/domain", "domain", eml1.getDomainName());
|
|
ferencd@0
|
73
|
|
ferencd@0
|
74 // When not specified, domain should be local host name
|
|
ferencd@0
|
75 vmime::emailAddress eml2("local");
|
|
ferencd@0
|
76 VASSERT_EQ("2/local", "local", eml2.getLocalName());
|
|
ferencd@0
|
77 VASSERT_EQ("2/domain", vmime::platform::getHandler()->getHostName(), eml2.getDomainName());
|
|
ferencd@0
|
78 }
|
|
ferencd@0
|
79
|
|
ferencd@0
|
80 void testParseEAI()
|
|
ferencd@0
|
81 {
|
|
ferencd@0
|
82 // Examples taken from Wikipedia (http://en.wikipedia.org/wiki/Email_address)
|
|
ferencd@0
|
83
|
|
ferencd@0
|
84 // Latin Alphabet (with diacritics):
|
|
ferencd@0
|
85 vmime::emailAddress eml1("Pelé@example.com");
|
|
ferencd@0
|
86 VASSERT_EQ("1/local", "Pelé", eml1.getLocalName());
|
|
ferencd@0
|
87 VASSERT_EQ("1/domain", "example.com", eml1.getDomainName());
|
|
ferencd@0
|
88
|
|
ferencd@0
|
89 // Greek Alphabet
|
|
ferencd@0
|
90 vmime::emailAddress eml2("δοκιμή@παράδειγμα.δοκιμή");
|
|
ferencd@0
|
91 VASSERT_EQ("2/local", "δοκιμή", eml2.getLocalName());
|
|
ferencd@0
|
92 VASSERT_EQ("2/domain", "παράδειγμα.δοκιμή", eml2.getDomainName());
|
|
ferencd@0
|
93
|
|
ferencd@0
|
94 // Japanese Characters
|
|
ferencd@0
|
95 vmime::emailAddress eml3("甲斐@黒川.日本");
|
|
ferencd@0
|
96 VASSERT_EQ("3/local", "甲斐", eml3.getLocalName());
|
|
ferencd@0
|
97 VASSERT_EQ("3/domain", "黒川.日本", eml3.getDomainName());
|
|
ferencd@0
|
98
|
|
ferencd@0
|
99 // Cyrillic Characters
|
|
ferencd@0
|
100 vmime::emailAddress eml4("чебурашка@ящик-с-апельсинами.рф");
|
|
ferencd@0
|
101 VASSERT_EQ("4/local", "чебурашка", eml4.getLocalName());
|
|
ferencd@0
|
102 VASSERT_EQ("4/domain", "ящик-с-апельсинами.рф", eml4.getDomainName());
|
|
ferencd@0
|
103 }
|
|
ferencd@0
|
104
|
|
ferencd@0
|
105 void testParseInvalid()
|
|
ferencd@0
|
106 {
|
|
ferencd@0
|
107 // Only one @ is allowed outside quotation marks
|
|
ferencd@0
|
108 vmime::emailAddress eml1("local@part@domain");
|
|
ferencd@0
|
109 VASSERT_EQ("1/local", "local", eml1.getLocalName());
|
|
ferencd@0
|
110 VASSERT_EQ("1/domain", "part@domain", eml1.getDomainName());
|
|
ferencd@0
|
111
|
|
ferencd@0
|
112 // Quoted strings must be dot separated, or the only element making up
|
|
ferencd@0
|
113 // the local-part: should be parsed correctly, but it still represents
|
|
ferencd@0
|
114 // an invalid email address
|
|
ferencd@0
|
115 vmime::emailAddress eml2("Just\"not\"right@example.com");
|
|
ferencd@0
|
116 VASSERT_EQ("2/local", "Just\"not\"right", eml2.getLocalName());
|
|
ferencd@0
|
117 VASSERT_EQ("2/domain", "example.com", eml2.getDomainName());
|
|
ferencd@0
|
118
|
|
ferencd@0
|
119 // An @ character must separate the local and domain parts
|
|
ferencd@0
|
120 vmime::emailAddress eml3("Abc.example.com");
|
|
ferencd@0
|
121 VASSERT_EQ("3/local", "Abc.example.com", eml3.getLocalName());
|
|
ferencd@0
|
122 VASSERT_EQ("3/domain", vmime::platform::getHandler()->getHostName(), eml3.getDomainName());
|
|
ferencd@0
|
123
|
|
ferencd@0
|
124 // Whitespace must be escaped
|
|
ferencd@0
|
125 vmime::emailAddress eml4("local part@domain");
|
|
ferencd@0
|
126 VASSERT_EQ("4/local", "local", eml4.getLocalName());
|
|
ferencd@0
|
127 VASSERT_EQ("4/domain", vmime::platform::getHandler()->getHostName(), eml4.getDomainName());
|
|
ferencd@0
|
128
|
|
ferencd@0
|
129 vmime::emailAddress eml5("this\\ still\\\"not\\\\allowed@example.com");
|
|
ferencd@0
|
130 VASSERT_EQ("5/local", "this\\", eml5.getLocalName());
|
|
ferencd@0
|
131 VASSERT_EQ("5/domain", vmime::platform::getHandler()->getHostName(), eml5.getDomainName());
|
|
ferencd@0
|
132 }
|
|
ferencd@0
|
133
|
|
ferencd@0
|
134 void testParseSpecialChars()
|
|
ferencd@0
|
135 {
|
|
ferencd@0
|
136 // Examples taken from Wikipedia (http://en.wikipedia.org/wiki/Email_address)
|
|
ferencd@0
|
137
|
|
ferencd@0
|
138 vmime::emailAddress eml1("\" \"@example.org");
|
|
ferencd@0
|
139 VASSERT_EQ("1/local", " ", eml1.getLocalName());
|
|
ferencd@0
|
140 VASSERT_EQ("1/domain", "example.org", eml1.getDomainName());
|
|
ferencd@0
|
141
|
|
ferencd@0
|
142 vmime::emailAddress eml2("\"()<>[]:,;@\\\\\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org");
|
|
ferencd@0
|
143 VASSERT_EQ("2/local", "()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a", eml2.getLocalName());
|
|
ferencd@0
|
144 VASSERT_EQ("3/domain", "example.org", eml2.getDomainName());
|
|
ferencd@0
|
145
|
|
ferencd@0
|
146 vmime::emailAddress eml3("!#$%&'*+-/=?^_`{}|~@example.org");
|
|
ferencd@0
|
147 VASSERT_EQ("3/local", "!#$%&'*+-/=?^_`{}|~", eml3.getLocalName());
|
|
ferencd@0
|
148 VASSERT_EQ("3/domain", "example.org", eml3.getDomainName());
|
|
ferencd@0
|
149
|
|
ferencd@0
|
150 vmime::emailAddress eml4("!#$%&'*+-/=?^_`{}|~@example.org");
|
|
ferencd@0
|
151 VASSERT_EQ("4/local", "!#$%&'*+-/=?^_`{}|~", eml4.getLocalName());
|
|
ferencd@0
|
152 VASSERT_EQ("4/domain", "example.org", eml4.getDomainName());
|
|
ferencd@0
|
153
|
|
ferencd@0
|
154 vmime::emailAddress eml5("\"very.unusual.@.unusual.com\"@example.com");
|
|
ferencd@0
|
155 VASSERT_EQ("5/local", "very.unusual.@.unusual.com", eml5.getLocalName());
|
|
ferencd@0
|
156 VASSERT_EQ("5/domain", "example.com", eml5.getDomainName());
|
|
ferencd@0
|
157
|
|
ferencd@0
|
158 vmime::emailAddress eml6("\"very.(),:;<>[]\\\".VERY.\\\"very@\\\\ \\\"very\\\".unusual\"@strange.example.com");
|
|
ferencd@0
|
159 VASSERT_EQ("6/local", "very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual", eml6.getLocalName());
|
|
ferencd@0
|
160 VASSERT_EQ("6/domain", "strange.example.com", eml6.getDomainName());
|
|
ferencd@0
|
161 }
|
|
ferencd@0
|
162
|
|
ferencd@0
|
163 void testParseCommentInLocalPart()
|
|
ferencd@0
|
164 {
|
|
ferencd@0
|
165 vmime::emailAddress eml1("john.smith(comment)@example.com");
|
|
ferencd@0
|
166 VASSERT_EQ("1/local", "john.smith", eml1.getLocalName());
|
|
ferencd@0
|
167 VASSERT_EQ("1/domain", "example.com", eml1.getDomainName());
|
|
ferencd@0
|
168
|
|
ferencd@0
|
169 vmime::emailAddress eml2("(comment)john.smith@example.com");
|
|
ferencd@0
|
170 VASSERT_EQ("2/local", "john.smith", eml2.getLocalName());
|
|
ferencd@0
|
171 VASSERT_EQ("2/domain", "example.com", eml2.getDomainName());
|
|
ferencd@0
|
172
|
|
ferencd@0
|
173 vmime::emailAddress eml3("(comment (comment in comment))john.smith@example.com");
|
|
ferencd@0
|
174 VASSERT_EQ("3/local", "john.smith", eml3.getLocalName());
|
|
ferencd@0
|
175 VASSERT_EQ("3/domain", "example.com", eml3.getDomainName());
|
|
ferencd@0
|
176
|
|
ferencd@0
|
177 vmime::emailAddress eml4("(comment \\) end comment)john.smith@example.com");
|
|
ferencd@0
|
178 VASSERT_EQ("4/local", "john.smith", eml4.getLocalName());
|
|
ferencd@0
|
179 VASSERT_EQ("4/domain", "example.com", eml4.getDomainName());
|
|
ferencd@0
|
180 }
|
|
ferencd@0
|
181
|
|
ferencd@0
|
182 void testParseCommentInDomainPart()
|
|
ferencd@0
|
183 {
|
|
ferencd@0
|
184 vmime::emailAddress eml1("john.smith@(comment)example.com");
|
|
ferencd@0
|
185 VASSERT_EQ("1/local", "john.smith", eml1.getLocalName());
|
|
ferencd@0
|
186 VASSERT_EQ("1/domain", "example.com", eml1.getDomainName());
|
|
ferencd@0
|
187
|
|
ferencd@0
|
188 vmime::emailAddress eml2("john.smith@example.com(comment)");
|
|
ferencd@0
|
189 VASSERT_EQ("2/local", "john.smith", eml2.getLocalName());
|
|
ferencd@0
|
190 VASSERT_EQ("2/domain", "example.com", eml2.getDomainName());
|
|
ferencd@0
|
191
|
|
ferencd@0
|
192 vmime::emailAddress eml3("john.smith@(comment (comment in comment))example.com");
|
|
ferencd@0
|
193 VASSERT_EQ("3/local", "john.smith", eml3.getLocalName());
|
|
ferencd@0
|
194 VASSERT_EQ("3/domain", "example.com", eml3.getDomainName());
|
|
ferencd@0
|
195
|
|
ferencd@0
|
196 vmime::emailAddress eml4("john.smith@(comment \\) end comment)example.com");
|
|
ferencd@0
|
197 VASSERT_EQ("4/local", "john.smith", eml4.getLocalName());
|
|
ferencd@0
|
198 VASSERT_EQ("4/domain", "example.com", eml4.getDomainName());
|
|
ferencd@0
|
199 }
|
|
ferencd@0
|
200
|
|
ferencd@0
|
201 void testGenerateASCII()
|
|
ferencd@0
|
202 {
|
|
ferencd@0
|
203 VASSERT_EQ("email 1", "local@domain", vmime::emailAddress("local", "domain").generate());
|
|
ferencd@0
|
204
|
|
ferencd@0
|
205 VASSERT_EQ("email 2", "=?utf-8?Q?Pel=C3=A9?=@example.com",
|
|
ferencd@0
|
206 vmime::emailAddress("Pelé", "example.com").generate());
|
|
ferencd@0
|
207 VASSERT_EQ("email 3", "=?utf-8?B?55Sy5paQ?=@xn--5rtw95l.xn--wgv71a",
|
|
ferencd@0
|
208 vmime::emailAddress("甲斐", "黒川.日本").generate());
|
|
ferencd@0
|
209 VASSERT_EQ("email 4", "mailtest@xn--r8jz45g.xn--zckzah",
|
|
ferencd@0
|
210 vmime::emailAddress("mailtest", "例え.テスト").generate());
|
|
ferencd@0
|
211 VASSERT_EQ("email 5", "mailtest@xn--mgbh0fb.xn--kgbechtv",
|
|
ferencd@0
|
212 vmime::emailAddress("mailtest", "مثال.إختبار").generate());
|
|
ferencd@0
|
213 }
|
|
ferencd@0
|
214
|
|
ferencd@0
|
215 void testGenerateEAI()
|
|
ferencd@0
|
216 {
|
|
ferencd@0
|
217 vmime::generationContext ctx(vmime::generationContext::getDefaultContext());
|
|
ferencd@0
|
218 ctx.setInternationalizedEmailSupport(true);
|
|
ferencd@0
|
219
|
|
ferencd@0
|
220 vmime::generationContext::switcher <vmime::generationContext> contextSwitcher(ctx);
|
|
ferencd@0
|
221
|
|
ferencd@0
|
222 VASSERT_EQ("email 1", "Pelé@example.com",
|
|
ferencd@0
|
223 vmime::emailAddress("Pelé", "example.com").generate());
|
|
ferencd@0
|
224 VASSERT_EQ("email 2", "δοκιμή@παράδειγμα.δοκιμή",
|
|
ferencd@0
|
225 vmime::emailAddress("δοκιμή", "παράδειγμα.δοκιμή").generate());
|
|
ferencd@0
|
226 VASSERT_EQ("email 3", "甲斐@黒川.日本",
|
|
ferencd@0
|
227 vmime::emailAddress("甲斐", "黒川.日本").generate());
|
|
ferencd@0
|
228 VASSERT_EQ("email 4", "чебурашка@ящик-с-апельсинами.рф",
|
|
ferencd@0
|
229 vmime::emailAddress("чебурашка", "ящик-с-апельсинами.рф").generate());
|
|
ferencd@0
|
230 }
|
|
ferencd@0
|
231
|
|
ferencd@0
|
232 void testGenerateSpecialChars()
|
|
ferencd@0
|
233 {
|
|
ferencd@0
|
234 VASSERT_EQ("email 1", "\"very.unusual.@.unusual.com\"@example.com",
|
|
ferencd@0
|
235 vmime::emailAddress("very.unusual.@.unusual.com", "example.com").generate());
|
|
ferencd@0
|
236
|
|
ferencd@0
|
237 VASSERT_EQ("email 2", "\"very.(),:;<>[]\\\".VERY.\\\"very@\\\\ \\\"very\\\".unusual\"@strange.example.com",
|
|
ferencd@0
|
238 vmime::emailAddress("very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual", "strange.example.com").generate());
|
|
ferencd@0
|
239
|
|
ferencd@0
|
240 VASSERT_EQ("email 3", "\" \"@example.com",
|
|
ferencd@0
|
241 vmime::emailAddress(" ", "example.com").generate());
|
|
ferencd@0
|
242 }
|
|
ferencd@0
|
243
|
|
ferencd@0
|
244 VMIME_TEST_SUITE_END
|