Index: appengine/monorail/framework/test/validate_test.py |
diff --git a/appengine/monorail/framework/test/validate_test.py b/appengine/monorail/framework/test/validate_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f8b6901c7a6cbb777c31f7b4d5c05fd3ef7b0963 |
--- /dev/null |
+++ b/appengine/monorail/framework/test/validate_test.py |
@@ -0,0 +1,127 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is govered by a BSD-style |
+# license that can be found in the LICENSE file or at |
+# https://developers.google.com/open-source/licenses/bsd |
+ |
+"""This file provides unit tests for Validate functions.""" |
+ |
+import unittest |
+ |
+from framework import validate |
+ |
+ |
+class ValidateUnitTest(unittest.TestCase): |
+ """Set of unit tests for validation functions.""" |
+ |
+ GOOD_EMAIL_ADDRESSES = [ |
+ 'user@example.com', |
+ 'user@e.com', |
+ 'user+tag@example.com', |
+ 'u.ser@example.com', |
+ 'us.er@example.com', |
+ 'u.s.e.r@example.com', |
+ 'user@ex-ample.com', |
+ 'user@ex.ample.com', |
+ 'user@e.x.ample.com', |
+ 'user@exampl.e.com', |
+ 'user@e-x-ample.com', |
+ 'user@e-x-a-m-p-l-e.com', |
+ 'user@e-x.am-ple.com', |
+ 'user@e--xample.com', |
+ ] |
+ |
+ BAD_EMAIL_ADDRESSES = [ |
+ ' leading.whitespace@example.com', |
+ 'trailing.whitespace@example.com ', |
+ '(paren.quoted@example.com)', |
+ '<angle.quoted@example.com>', |
+ 'trailing.@example.com', |
+ 'trailing.dot.@example.com', |
+ '.leading@example.com', |
+ '.leading.dot@example.com', |
+ 'user@example.com.', |
+ 'us..er@example.com', |
+ 'user@ex..ample.com', |
+ 'user@example..com', |
+ 'user@ex-.ample.com', |
+ 'user@-example.com', |
+ 'user@.example.com', |
+ 'user@example-.com', |
+ 'user@example', |
+ 'user@example.', |
+ 'user@example.c', |
+ 'user@example.comcomcomc', |
+ 'user@example.co-m', |
+ 'user@exa_mple.com', |
+ 'user@exa-_mple.com', |
+ 'user@example.c0m', |
+ ] |
+ |
+ def testIsValidEmail(self): |
+ """Tests the Email validator class.""" |
+ for email in self.GOOD_EMAIL_ADDRESSES: |
+ self.assertTrue(validate.IsValidEmail(email), msg='Rejected:%r' % email) |
+ |
+ for email in self.BAD_EMAIL_ADDRESSES: |
+ self.assertFalse(validate.IsValidEmail(email), msg='Accepted:%r' % email) |
+ |
+ def testIsValidMailTo(self): |
+ for email in self.GOOD_EMAIL_ADDRESSES: |
+ self.assertTrue( |
+ validate.IsValidMailTo('mailto:' + email), |
+ msg='Rejected:%r' % ('mailto:' + email)) |
+ |
+ for email in self.BAD_EMAIL_ADDRESSES: |
+ self.assertFalse( |
+ validate.IsValidMailTo('mailto:' + email), |
+ msg='Accepted:%r' % ('mailto:' + email)) |
+ |
+ GOOD_URLS = [ |
+ 'http://google.com', |
+ 'http://maps.google.com/', |
+ 'https://secure.protocol.com', |
+ 'https://dash-domain.com', |
+ 'http://www.google.com/search?q=foo&hl=en', |
+ 'https://a.very.long.domain.name.net/with/a/long/path/inf0/too', |
+ 'http://funny.ws/', |
+ 'http://we.love.anchors.info/page.html#anchor', |
+ 'http://redundant-slashes.com//in/path//info', |
+ 'http://trailingslashe.com/in/path/info/', |
+ 'http://domain.with.port.com:8080', |
+ 'http://domain.with.port.com:8080/path/info', |
+ 'ftp://ftp.gnu.org', |
+ 'ftp://some.server.some.place.com' |
+ ] |
+ |
+ BAD_URLS = [ |
+ ' http://leading.whitespace.com', |
+ 'http://trailing.domain.whitespace.com ', |
+ 'http://trailing.whitespace.com/after/path/info ', |
+ 'http://no-tld/', |
+ 'http://underscore_domain.com/', |
+ 'http://space in domain.com', |
+ 'http://user@example.com', # standard, but we purposely don't accept it. |
+ 'http://user:pass@ex.com', # standard, but we purposely don't accept it. |
+ 'http://:password@ex.com', # standard, but we purposely don't accept it. |
+ 'missing-http.com', |
+ 'http:missing-slashes.com', |
+ 'http:/only-one-slash.com', |
+ 'http://bad-tld.c0m', |
+ 'http://bad-tld.c', |
+ 'http://trailing.dot.', |
+ 'mailto:bad.scheme', |
+ 'javascript:attempt-to-inject', |
+ 'http://:8080/', |
+ 'http://badport.com:808a0/ ', |
+ ] |
+ |
+ def testURL(self): |
+ for url in self.GOOD_URLS: |
+ self.assertTrue(validate.IsValidURL(url), msg='Rejected:%r' % url) |
+ |
+ for url in self.BAD_URLS: |
+ self.assertFalse(validate.IsValidURL(url), msg='Accepted:%r' % url) |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main() |