/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.common; import android.test.suitebuilder.annotation.SmallTest; import junit.framework.TestCase; import java.util.HashMap; import java.util.Map; public class Rfc822ValidatorTest extends TestCase { static final String[] VALID_EMAILS = new String[] { "a@example.org", "b@exemple.fr", "c@d.e-f", "Very.Common@example.org", "john@EXAMPLE.ORG", "john@a123b.c-d.dept.example.com", "xn--r8jz45g@example.com", "disposable.style.email.with+symbol@example.com", "other.email-with-dash@example.com", "!#$%&'*+-/=?^_`{}|~@example.com", // Use of allowed special characters. "a@domain-label-cannot-be-longer-than-63-chars-and-this-is-maximum.example.com", // Valid de facto, even if RFC doesn't allow it. "a..b@example.com", ".a@example.com", "b.@example.com", // Punycode is an ASCII representation of International domain names. "john.doe@xn--r8jz45g.xn--zckzah", "john.doe@XN--R8JZ45G.XN--ZXKZAH", "xn--r8jz45g@xn--r8jz45g.XN--ZXKZAH", // Quoted address. // TODO(regisd) Fix Rfc822Tokenizer which loses the quotes. // "\"much.more unusual\"", // "\"very.unusual.@.unusual.com\"" // Valid only in new Internalized email address. "a@\u00E9.example.com", //"みんな@例え.テスト", "\u307F\u3093\u306A@\u4F8B\u3048.\u30C6\u30B9\u30C8", // "test@test.テスト", // Unicode in TLD only. "everybody@example.\u30C6\u30B9\u30C8", // "test@例え.test", // Unicode in domain only. "everybody@\u4F8B\u3048.test", // "みんな@example.com" // Unicode in localpart only. "\u307F\u3093\u306A@example.test" }; static final String[] INVALID_EMAILS = new String[] { "a", "example.com", "john.example.com", // Missing at sign. "a b", "a space@example.com", // Space not allowed. // Invalid domain. "john@example..com", "a@b", "a@-b.com", "a@b-.com", "a@b.c", "a@a123456789-123456789-123456789-123456789-123456789-123456789-bcd.example.com", // Invalid characters in domain as per RFC 1034 and RFC 1035, // even if these characters are in RFC5322's domain production. "a@d_e.fg", "a@d!e.fg", "a@d#e.fg", "a@d$e.fg", "a@d%e.fg", "a@d&e.fg", "a@d'e.fg", "a@d*e.fg", "a@d+e.fg", "a@d/e.fg", "a@d=e.fg", "a@d?e.fg", "a@d^e.fg", "a@d{}e.fg", "a@d|e.fg", "a@d~e.fg", // The domain is too long "no@domain-label-cannot-be-longer-than-63-chars-but-this-is-64-chars.com", "john@doe@example.com", // @ must be unique. // Incorrect double quote. // TODO(regisd): Fix Rfc822tokenizer which strips the quotes // "just\"not\"right@example.com", "\"just.not\\\"@example.com", "this\\ still\\\"not\\\\allowed@example.com" }; @SmallTest public void testEmailValidator() { Rfc822Validator validator = new Rfc822Validator("gmail.com"); for (String email : VALID_EMAILS) { assertTrue(email + " should be a valid email address", validator.isValid(email)); } for (String email : INVALID_EMAILS) { assertFalse(email + " should not be a valid email address", validator.isValid(email)); } Map fixes = new HashMap(); fixes.put("a", ""); fixes.put("a b", ""); fixes.put("a@b", ""); fixes.put("()~><@not.work", ""); for (Map.Entry e : fixes.entrySet()) { assertEquals(e.getValue(), validator.fixText(e.getKey()).toString()); } } @SmallTest public void testEmailValidatorNullDomain() { Rfc822Validator validator = new Rfc822Validator(null); Map fixes = new HashMap(); fixes.put("a", ""); fixes.put("a b", ""); fixes.put("a@b", ""); fixes.put("a@b.com", ""); // this one is correct for (Map.Entry e : fixes.entrySet()) { assertEquals(e.getValue(), validator.fixText(e.getKey()).toString()); } } @SmallTest public void testEmailValidatorRemoveInvalid() { Rfc822Validator validator = new Rfc822Validator("google.com"); validator.setRemoveInvalid(true); Map fixes = new HashMap(); fixes.put("a", ""); fixes.put("a b", ""); fixes.put("a@b", ""); fixes.put("a@b.com", ""); // this one is correct for (Map.Entry e : fixes.entrySet()) { assertEquals(e.getValue(), validator.fixText(e.getKey()).toString()); } } }