View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.validator.routines;
18  
19  import static org.hamcrest.MatcherAssert.assertThat;
20  import static org.hamcrest.core.Is.is;
21  import static org.hamcrest.core.IsEqual.equalTo;
22  import static org.junit.jupiter.api.Assertions.assertEquals;
23  import static org.junit.jupiter.api.Assertions.assertFalse;
24  import static org.junit.jupiter.api.Assertions.assertThrows;
25  import static org.junit.jupiter.api.Assertions.assertTrue;
26  
27  import java.util.ArrayList;
28  import java.util.List;
29  
30  import org.apache.commons.validator.ResultPair;
31  import org.junit.jupiter.api.BeforeEach;
32  import org.junit.jupiter.api.Disabled;
33  import org.junit.jupiter.api.Test;
34  
35  /**
36   * Performs Validation Test for e-mail validations.
37   */
38  public class EmailValidatorTest {
39  
40      /**
41       * The key used to retrieve the set of validation rules from the xml file.
42       */
43      protected static String FORM_KEY = "emailForm";
44  
45      /**
46       * The key used to retrieve the validator action.
47       */
48      protected static String ACTION = "email";
49  
50      /**
51       * These test values derive directly from RFC 822 & Mail::RFC822::Address & RFC::RFC822::Address perl test.pl For traceability don't combine these test
52       * values with other tests.
53       */
54      private static final ResultPair[] testEmailFromPerl = {
55          // @formatter:off
56          new ResultPair("abigail@example.com", true),
57          new ResultPair("abigail@example.com ", true),
58          new ResultPair(" abigail@example.com", true),
59          new ResultPair("abigail @example.com ", true),
60          new ResultPair("*@example.net", true),
61          new ResultPair("\"\\\"\"@foo.bar", true),
62          new ResultPair("fred&barny@example.com", true),
63          new ResultPair("---@example.com", true),
64          new ResultPair("foo-bar@example.net", true),
65          new ResultPair("\"127.0.0.1\"@[127.0.0.1]", true),
66          new ResultPair("Abigail <abigail@example.com>", true),
67          new ResultPair("Abigail<abigail@example.com>", true),
68          new ResultPair("Abigail<@a,@b,@c:abigail@example.com>", true),
69          new ResultPair("\"This is a phrase\"<abigail@example.com>", true),
70          new ResultPair("\"Abigail \"<abigail@example.com>", true),
71          new ResultPair("\"Joe & J. Harvey\" <example @Org>", true),
72          new ResultPair("Abigail <abigail @ example.com>", true),
73          new ResultPair("Abigail made this <  abigail   @   example  .    com    >", true),
74          new ResultPair("Abigail(the bitch)@example.com", true),
75          new ResultPair("Abigail <abigail @ example . (bar) com >", true),
76          new ResultPair("Abigail < (one)  abigail (two) @(three)example . (bar) com (quz) >", true),
77          new ResultPair("Abigail (foo) (((baz)(nested) (comment)) ! ) < (one)  abigail (two) @(three)example . (bar) com (quz) >", true),
78          new ResultPair("Abigail <abigail(fo\\(o)@example.com>", true),
79          new ResultPair("Abigail <abigail(fo\\)o)@example.com> ", true),
80          new ResultPair("(foo) abigail@example.com", true),
81          new ResultPair("abigail@example.com (foo)", true),
82          new ResultPair("\"Abi\\\"gail\" <abigail@example.com>", true),
83          new ResultPair("abigail@[example.com]", true),
84          new ResultPair("abigail@[exa\\[ple.com]", true),
85          new ResultPair("abigail@[exa\\]ple.com]", true),
86          new ResultPair("\":sysmail\"@  Some-Group. Some-Org", true),
87          new ResultPair("Muhammed.(I am  the greatest) Ali @(the)Vegas.WBA", true),
88          new ResultPair("mailbox.sub1.sub2@this-domain", true),
89          new ResultPair("sub-net.mailbox@sub-domain.domain", true),
90          new ResultPair("name:;", true),
91          new ResultPair("':;", true),
92          new ResultPair("name:   ;", true),
93          new ResultPair("Alfred Neuman <Neuman@BBN-TENEXA>", true),
94          new ResultPair("Neuman@BBN-TENEXA", true),
95          new ResultPair("\"George, Ted\" <Shared@Group.Arpanet>", true),
96          new ResultPair("Wilt . (the  Stilt) Chamberlain@NBA.US", true),
97          new ResultPair("Cruisers:  Port@Portugal, Jones@SEA;", true),
98          new ResultPair("$@[]", true),
99          new ResultPair("*()@[]", true),
100         new ResultPair("\"quoted ( brackets\" ( a comment )@example.com", true),
101         new ResultPair("\"Joe & J. Harvey\"\\x0D\\x0A     <ddd\\@ Org>", true),
102         new ResultPair("\"Joe &\\x0D\\x0A J. Harvey\" <ddd \\@ Org>", true),
103         new ResultPair("Gourmets:  Pompous Person <WhoZiWhatZit\\@Cordon-Bleu>,\\x0D\\x0A" +
104             "        Childs\\@WGBH.Boston, \"Galloping Gourmet\"\\@\\x0D\\x0A" +
105             "        ANT.Down-Under (Australian National Television),\\x0D\\x0A" +
106             "        Cheapie\\@Discount-Liquors;", true),
107         new ResultPair("   Just a string", false),
108         new ResultPair("string", false),
109         new ResultPair("(comment)", false),
110         new ResultPair("()@example.com", false),
111         new ResultPair("fred(&)barny@example.com", false),
112         new ResultPair("fred\\ barny@example.com", false),
113         new ResultPair("Abigail <abi gail @ example.com>", false),
114         new ResultPair("Abigail <abigail(fo(o)@example.com>", false),
115         new ResultPair("Abigail <abigail(fo)o)@example.com>", false),
116         new ResultPair("\"Abi\"gail\" <abigail@example.com>", false),
117         new ResultPair("abigail@[exa]ple.com]", false),
118         new ResultPair("abigail@[exa[ple.com]", false),
119         new ResultPair("abigail@[exaple].com]", false),
120         new ResultPair("abigail@", false),
121         new ResultPair("@example.com", false),
122         new ResultPair("phrase: abigail@example.com abigail@example.com ;", false),
123         new ResultPair("invalid�char@example.com", false)
124     // @formatter:on
125     };
126 
127     public static void main(final String[] args) {
128         final EmailValidator validator = EmailValidator.getInstance();
129         for (final String arg : args) {
130             System.out.printf("%s: %s%n", arg, validator.isValid(arg));
131         }
132     }
133 
134     private EmailValidator validator;
135 
136     @BeforeEach
137     public void setUp() {
138         validator = EmailValidator.getInstance();
139     }
140 
141     /**
142      * Tests the e-mail validation.
143      */
144     @Test
145     public void testEmail() {
146         assertTrue(validator.isValid("jsmith@apache.org"));
147     }
148 
149     /**
150      * Tests the e-mail validation with a user at a TLD
151      *
152      * http://tools.ietf.org/html/rfc5321#section-2.3.5 (In the case of a top-level domain used by itself in an email address, a single string is used without
153      * any dots)
154      */
155     @Test
156     public void testEmailAtTLD() {
157         final EmailValidator val = EmailValidator.getInstance(false, true);
158         assertTrue(val.isValid("test@com"));
159     }
160 
161     /**
162      * Tests the e-mail validation.
163      */
164     @Test
165     public void testEmailExtension() {
166         assertTrue(validator.isValid("jsmith@apache.org"));
167 
168         assertTrue(validator.isValid("jsmith@apache.com"));
169 
170         assertTrue(validator.isValid("jsmith@apache.net"));
171 
172         assertTrue(validator.isValid("jsmith@apache.info"));
173 
174         assertFalse(validator.isValid("jsmith@apache."));
175 
176         assertFalse(validator.isValid("jsmith@apache.c"));
177 
178         assertTrue(validator.isValid("someone@yahoo.museum"));
179 
180         assertFalse(validator.isValid("someone@yahoo.mu-seum"));
181     }
182 
183     /**
184      * Write this test based on perl Mail::RFC822::Address which takes its example email address directly from RFC822
185      *
186      * This test fails so disable it The real solution is to fix the email parsing.
187      */
188     @Disabled("VALIDATOR-267")
189     @Test
190     public void testEmailFromPerl() {
191         int errors = 0;
192         for (final ResultPair element : testEmailFromPerl) {
193             final String item = element.item;
194             final boolean exp = element.valid;
195             final boolean act = validator.isValid(item);
196             if (act != exp) {
197                 System.out.printf("%s: expected %s actual %s%n", item, exp, act);
198                 errors += 1;
199             }
200         }
201         assertEquals(0, errors, "Expected 0 errors");
202     }
203 
204     /**
205      * Test that @localhost and @localhost.localdomain addresses are declared as valid when requested.
206      */
207     @Test
208     public void testEmailLocalhost() {
209         // Check the default is not to allow
210         final EmailValidator noLocal = EmailValidator.getInstance(false);
211         final EmailValidator allowLocal = EmailValidator.getInstance(true);
212         assertEquals(validator, noLocal);
213 
214         // Depends on the validator
215         assertTrue(allowLocal.isValid("joe@localhost.localdomain"), "@localhost.localdomain should be accepted but wasn't");
216         assertTrue(allowLocal.isValid("joe@localhost"), "@localhost should be accepted but wasn't");
217 
218         assertFalse(noLocal.isValid("joe@localhost.localdomain"), "@localhost.localdomain should be accepted but wasn't");
219         assertFalse(noLocal.isValid("joe@localhost"), "@localhost should be accepted but wasn't");
220     }
221 
222     /**
223      * Write this test according to parts of RFC, as opposed to the type of character that is being tested.
224      */
225     @Test
226     public void testEmailUserName() {
227 
228         assertTrue(validator.isValid("joe1blow@apache.org"));
229 
230         assertTrue(validator.isValid("joe$blow@apache.org"));
231 
232         assertTrue(validator.isValid("joe-@apache.org"));
233 
234         assertTrue(validator.isValid("joe_@apache.org"));
235 
236         assertTrue(validator.isValid("joe+@apache.org")); // + is valid unquoted
237 
238         assertTrue(validator.isValid("joe!@apache.org")); // ! is valid unquoted
239 
240         assertTrue(validator.isValid("joe*@apache.org")); // * is valid unquoted
241 
242         assertTrue(validator.isValid("joe'@apache.org")); // ' is valid unquoted
243 
244         assertTrue(validator.isValid("joe%45@apache.org")); // % is valid unquoted
245 
246         assertTrue(validator.isValid("joe?@apache.org")); // ? is valid unquoted
247 
248         assertTrue(validator.isValid("joe&@apache.org")); // & ditto
249 
250         assertTrue(validator.isValid("joe=@apache.org")); // = ditto
251 
252         assertTrue(validator.isValid("+joe@apache.org")); // + is valid unquoted
253 
254         assertTrue(validator.isValid("!joe@apache.org")); // ! is valid unquoted
255 
256         assertTrue(validator.isValid("*joe@apache.org")); // * is valid unquoted
257 
258         assertTrue(validator.isValid("'joe@apache.org")); // ' is valid unquoted
259 
260         assertTrue(validator.isValid("%joe45@apache.org")); // % is valid unquoted
261 
262         assertTrue(validator.isValid("?joe@apache.org")); // ? is valid unquoted
263 
264         assertTrue(validator.isValid("&joe@apache.org")); // & ditto
265 
266         assertTrue(validator.isValid("=joe@apache.org")); // = ditto
267 
268         assertTrue(validator.isValid("+@apache.org")); // + is valid unquoted
269 
270         assertTrue(validator.isValid("!@apache.org")); // ! is valid unquoted
271 
272         assertTrue(validator.isValid("*@apache.org")); // * is valid unquoted
273 
274         assertTrue(validator.isValid("'@apache.org")); // ' is valid unquoted
275 
276         assertTrue(validator.isValid("%@apache.org")); // % is valid unquoted
277 
278         assertTrue(validator.isValid("?@apache.org")); // ? is valid unquoted
279 
280         assertTrue(validator.isValid("&@apache.org")); // & ditto
281 
282         assertTrue(validator.isValid("=@apache.org")); // = ditto
283 
284         // UnQuoted Special characters are invalid
285 
286         assertFalse(validator.isValid("joe.@apache.org")); // . not allowed at end of local part
287 
288         assertFalse(validator.isValid(".joe@apache.org")); // . not allowed at start of local part
289 
290         assertFalse(validator.isValid(".@apache.org")); // . not allowed alone
291 
292         assertTrue(validator.isValid("joe.ok@apache.org")); // . allowed embedded
293 
294         assertFalse(validator.isValid("joe..ok@apache.org")); // .. not allowed embedded
295 
296         assertFalse(validator.isValid("..@apache.org")); // .. not allowed alone
297 
298         assertFalse(validator.isValid("joe(@apache.org"));
299 
300         assertFalse(validator.isValid("joe)@apache.org"));
301 
302         assertFalse(validator.isValid("joe,@apache.org"));
303 
304         assertFalse(validator.isValid("joe;@apache.org"));
305 
306         // Quoted Special characters are valid
307         assertTrue(validator.isValid("\"joe.\"@apache.org"));
308 
309         assertTrue(validator.isValid("\".joe\"@apache.org"));
310 
311         assertTrue(validator.isValid("\"joe+\"@apache.org"));
312 
313         assertTrue(validator.isValid("\"joe@\"@apache.org"));
314 
315         assertTrue(validator.isValid("\"joe!\"@apache.org"));
316 
317         assertTrue(validator.isValid("\"joe*\"@apache.org"));
318 
319         assertTrue(validator.isValid("\"joe'\"@apache.org"));
320 
321         assertTrue(validator.isValid("\"joe(\"@apache.org"));
322 
323         assertTrue(validator.isValid("\"joe)\"@apache.org"));
324 
325         assertTrue(validator.isValid("\"joe,\"@apache.org"));
326 
327         assertTrue(validator.isValid("\"joe%45\"@apache.org"));
328 
329         assertTrue(validator.isValid("\"joe;\"@apache.org"));
330 
331         assertTrue(validator.isValid("\"joe?\"@apache.org"));
332 
333         assertTrue(validator.isValid("\"joe&\"@apache.org"));
334 
335         assertTrue(validator.isValid("\"joe=\"@apache.org"));
336 
337         assertTrue(validator.isValid("\"..\"@apache.org"));
338 
339         // escaped quote character valid in quoted string
340         assertTrue(validator.isValid("\"john\\\"doe\"@apache.org"));
341 
342         assertTrue(validator.isValid("john56789.john56789.john56789.john56789.john56789.john56789.john@example.com"));
343 
344         assertFalse(validator.isValid("john56789.john56789.john56789.john56789.john56789.john56789.john5@example.com"));
345 
346         assertTrue(validator.isValid("\\>escape\\\\special\\^characters\\<@example.com"));
347 
348         assertTrue(validator.isValid("Abc\\@def@example.com"));
349 
350         assertFalse(validator.isValid("Abc@def@example.com"));
351 
352         assertTrue(validator.isValid("space\\ monkey@example.com"));
353     }
354 
355     /**
356      * Tests the e-mail validation with an RCS-noncompliant character in the address.
357      */
358     @Test
359     public void testEmailWithBogusCharacter() {
360 
361         assertFalse(validator.isValid("andy.noble@\u008fdata-workshop.com"));
362 
363         // The ' character is valid in an email username.
364         assertTrue(validator.isValid("andy.o'reilly@data-workshop.com"));
365 
366         // But not in the domain name.
367         assertFalse(validator.isValid("andy@o'reilly.data-workshop.com"));
368 
369         // The + character is valid in an email username.
370         assertTrue(validator.isValid("foo+bar@i.am.not.in.us.example.com"));
371 
372         // But not in the domain name
373         assertFalse(validator.isValid("foo+bar@example+3.com"));
374 
375         // Domains with only special characters aren't allowed (VALIDATOR-286)
376         assertFalse(validator.isValid("test@%*.com"));
377         assertFalse(validator.isValid("test@^&#.com"));
378 
379     }
380 
381     /**
382      * Tests the email validation with commas.
383      */
384     @Test
385     public void testEmailWithCommas() {
386         assertFalse(validator.isValid("joeblow@apa,che.org"));
387 
388         assertFalse(validator.isValid("joeblow@apache.o,rg"));
389 
390         assertFalse(validator.isValid("joeblow@apache,org"));
391 
392     }
393 
394     /**
395      * Tests the email validation with ASCII control characters. (i.e. ASCII chars 0 - 31 and 127)
396      */
397     @Test
398     public void testEmailWithControlChars() {
399         for (char c = 0; c < 32; c++) {
400             assertFalse(validator.isValid("foo" + c + "bar@domain.com"), "Test control char " + (int) c);
401         }
402         assertFalse(validator.isValid("foo" + (char) 127 + "bar@domain.com"), "Test control char 127");
403     }
404 
405     /**
406      * <p>
407      * Tests the e-mail validation with a dash in the address.
408      * </p>
409      */
410     @Test
411     public void testEmailWithDash() {
412         assertTrue(validator.isValid("andy.noble@data-workshop.com"));
413 
414         assertFalse(validator.isValid("andy-noble@data-workshop.-com"));
415 
416         assertFalse(validator.isValid("andy-noble@data-workshop.c-om"));
417 
418         assertFalse(validator.isValid("andy-noble@data-workshop.co-m"));
419     }
420 
421     /**
422      * Tests the e-mail validation with a dot at the end of the address.
423      */
424     @Test
425     public void testEmailWithDotEnd() {
426         assertFalse(validator.isValid("andy.noble@data-workshop.com."));
427     }
428 
429     /**
430      * Tests the email validation with numeric domains.
431      */
432     @Test
433     public void testEmailWithNumericAddress() {
434         assertTrue(validator.isValid("someone@[216.109.118.76]"));
435         assertTrue(validator.isValid("someone@yahoo.com"));
436     }
437 
438     /**
439      * VALIDATOR-296 - A / or a ! is valid in the user part, but not in the domain part
440      */
441     @Test
442     public void testEmailWithSlashes() {
443         assertTrue(validator.isValid("joe!/blow@apache.org"), "/ and ! valid in username");
444         assertFalse(validator.isValid("joe@ap/ache.org"), "/ not valid in domain");
445         assertFalse(validator.isValid("joe@apac!he.org"), "! not valid in domain");
446     }
447 
448     /**
449      * Tests the email validation with spaces.
450      */
451     @Test
452     public void testEmailWithSpaces() {
453         assertFalse(validator.isValid("joeblow @apache.org"));
454 
455         assertFalse(validator.isValid("joeblow@ apache.org"));
456 
457         assertFalse(validator.isValid(" joeblow@apache.org"));
458 
459         assertFalse(validator.isValid("joeblow@apache.org "));
460 
461         assertFalse(validator.isValid("joe blow@apache.org "));
462 
463         assertFalse(validator.isValid("joeblow@apa che.org "));
464 
465         assertTrue(validator.isValid("\"joeblow \"@apache.org"));
466 
467         assertTrue(validator.isValid("\" joeblow\"@apache.org"));
468 
469         assertTrue(validator.isValid("\" joe blow \"@apache.org"));
470 
471     }
472 
473     @Test
474     public void testVALIDATOR_278() {
475         assertFalse(validator.isValid("someone@-test.com"));// hostname starts with dash/hyphen
476         assertFalse(validator.isValid("someone@test-.com"));// hostname ends with dash/hyphen
477     }
478 
479     @Test
480     public void testVALIDATOR_315() {
481         assertFalse(validator.isValid("me@at&t.net"));
482         assertTrue(validator.isValid("me@att.net")); // Make sure TLD is not the cause of the failure
483     }
484 
485     @Test
486     public void testValidator235() {
487         final String version = System.getProperty("java.version");
488         if (version.compareTo("1.6") < 0) {
489             System.out.println("Cannot run Unicode IDN tests");
490             return; // Cannot run the test
491         }
492         assertTrue(validator.isValid("someone@xn--d1abbgf6aiiy.xn--p1ai"), "xn--d1abbgf6aiiy.xn--p1ai should validate");
493         assertTrue(validator.isValid("someone@президент.рф"), "президент.рф should validate");
494         assertTrue(validator.isValid("someone@www.b\u00fccher.ch"), "www.b\u00fccher.ch should validate");
495         assertFalse(validator.isValid("someone@www.\uFFFD.ch"), "www.\uFFFD.ch FFFD should fail");
496         assertTrue(validator.isValid("someone@www.b\u00fccher.ch"), "www.b\u00fccher.ch should validate");
497         assertFalse(validator.isValid("someone@www.\uFFFD.ch"), "www.\uFFFD.ch FFFD should fail");
498     }
499 
500     @Test
501     public void testValidator293() {
502         assertTrue(validator.isValid("abc-@abc.com"));
503         assertTrue(validator.isValid("abc_@abc.com"));
504         assertTrue(validator.isValid("abc-def@abc.com"));
505         assertTrue(validator.isValid("abc_def@abc.com"));
506         assertFalse(validator.isValid("abc@abc_def.com"));
507     }
508 
509     @Test
510     public void testValidator359() {
511         final EmailValidator val = EmailValidator.getInstance(false, true);
512         assertFalse(val.isValid("test@.com"));
513     }
514 
515     @Test
516     public void testValidator365() {
517         assertFalse(validator.isValid("Loremipsumdolorsitametconsecteturadipiscingelit.Nullavitaeligulamattisrhoncusnuncegestasmattisleo."
518                 + "Donecnonsapieninmagnatristiquedictumaacturpis.Fusceorciduifacilisisutsapieneuconsequatpharetralectus."
519                 + "Quisqueenimestpulvinarutquamvitaeportamattisex.Nullamquismaurisplaceratconvallisjustoquisportamauris."
520                 + "Innullalacusconvalliseufringillautvenenatissitametdiam.Maecenasluctusligulascelerisquepulvinarfeugiat."
521                 + "Sedmolestienullaaliquetorciluctusidpharetranislfinibus.Suspendissemalesuadatinciduntduisitametportaarcusollicitudinnec."
522                 + "Donecetmassamagna.Curabitururnadiampretiumveldignissimporttitorfringillaeuneque."
523                 + "Duisantetelluspharetraidtinciduntinterdummolestiesitametfelis.Utquisquamsitametantesagittisdapibusacnonodio."
524                 + "Namrutrummolestiediamidmattis.Cumsociisnatoquepenatibusetmagnisdisparturientmontesnasceturridiculusmus."
525                 + "Morbiposueresedmetusacconsectetur.Etiamquisipsumvitaejustotempusmaximus.Sedultriciesplaceratvolutpat."
526                 + "Integerlacuslectusmaximusacornarequissagittissitametjusto."
527                 + "Cumsociisnatoquepenatibusetmagnisdisparturientmontesnasceturridiculusmus.Maecenasindictumpurussedrutrumex.Nullafacilisi."
528                 + "Integerfinibusfinibusmietpharetranislfaucibusvel.Maecenasegetdolorlacinialobortisjustovelullamcorpersem."
529                 + "Vivamusaliquetpurusidvariusornaresapienrisusrutrumnisitinciduntmollissemnequeidmetus."
530                 + "Etiamquiseleifendpurus.Nuncfelisnuncscelerisqueiddignissimnecfinibusalibero."
531                 + "Nuncsemperenimnequesitamethendreritpurusfacilisisac.Maurisdapibussemperfelisdignissimgravida."
532                 + "Aeneanultricesblanditnequealiquamfinibusodioscelerisqueac.Aliquamnecmassaeumaurisfaucibusfringilla."
533                 + "Etiamconsequatligulanisisitametaliquamnibhtemporquis.Nuncinterdumdignissimnullaatsodalesarcusagittiseu."
534                 + "Proinpharetrametusneclacuspulvinarsedvolutpatliberoornare.Sedligulanislpulvinarnonlectuseublanditfacilisisante."
535                 + "Sedmollisnislalacusauctorsuscipit.Inhachabitasseplateadictumst.Phasellussitametvelittemporvenenatisfeliseuegestasrisus."
536                 + "Aliquameteratsitametnibhcommodofinibus.Morbiefficiturodiovelpulvinariaculis."
537                 + "Aeneantemporipsummassaaconsecteturturpisfaucibusultrices.Praesentsodalesmaurisquisportafermentum."
538                 + "Etiamnisinislvenenatisvelauctorutullamcorperinjusto.Proinvelligulaerat.Phasellusvestibulumgravidamassanonfeugiat."
539                 + "Maecenaspharetraeuismodmetusegetefficitur.Suspendisseamet@gmail.com"));
540     }
541 
542     @Test
543     public void testValidator374() {
544         assertTrue(validator.isValid("abc@school.school"));
545     }
546 
547     @Test
548     public void testValidator473_1() { // reject null DomainValidator
549         final IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> new EmailValidator(false, false, null));
550         assertThat(thrown.getMessage(), is(equalTo("DomainValidator cannot be null")));
551     }
552 
553     @Test
554     public void testValidator473_2() { // reject null DomainValidator with mismatched allowLocal
555         final List<DomainValidator.Item> items = new ArrayList<>();
556         final IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
557                 () -> new EmailValidator(false, false, DomainValidator.getInstance(true, items)));
558         assertThat(thrown.getMessage(), is(equalTo("DomainValidator must agree with allowLocal setting")));
559     }
560 
561     @Test
562     public void testValidator473_3() { // reject null DomainValidator with mismatched allowLocal
563         final List<DomainValidator.Item> items = new ArrayList<>();
564         final IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
565                 () -> new EmailValidator(true, false, DomainValidator.getInstance(false, items)));
566         assertThat(thrown.getMessage(), is(equalTo("DomainValidator must agree with allowLocal setting")));
567     }
568 
569     @Test
570     public void testValidator473_4() { // Show that can override domain validation
571         assertFalse(validator.isValidDomain("test.local"));
572         final List<DomainValidator.Item> items = new ArrayList<>();
573         items.add(new DomainValidator.Item(DomainValidator.ArrayType.GENERIC_PLUS, "local"));
574         final EmailValidator val = new EmailValidator(true, false, DomainValidator.getInstance(true, items));
575         assertTrue(val.isValidDomain("test.local"));
576     }
577 }