forked from square/okhttp
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Port DistinguishedNameParserTest from AOSP
This is ported from http://r.android.com/183814 with only minor modifications in order to make the test compile and conform to OkHttp code style: - use of @test rather than JUnit 3 TestCase - two-spaces indent - commented out use of API that does not exist in OkHttp's DistinguishedNameParser Changes to make the test pass are left to a follow-up commit.
- Loading branch information
1 parent
3e12610
commit 21f9c37
Showing
1 changed file
with
160 additions
and
0 deletions.
There are no files selected for viewing
160 changes: 160 additions & 0 deletions
160
okhttp-tests/src/test/java/okhttp3/internal/tls/DistinguishedNameParserTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
/* | ||
* 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 okhttp3.internal.tls; | ||
|
||
|
||
import javax.security.auth.x500.X500Principal; | ||
|
||
import org.junit.Test; | ||
|
||
import static org.junit.Assert.assertEquals; | ||
import static org.junit.Assert.assertNull; | ||
import static org.junit.Assert.fail; | ||
|
||
public final class DistinguishedNameParserTest { | ||
@Test public void testGetCns() { | ||
assertCns(""); | ||
assertCns("ou=xxx"); | ||
assertCns("ou=xxx,cn=xxx", "xxx"); | ||
assertCns("ou=xxx+cn=yyy,cn=zzz+cn=abc", "yyy", "zzz", "abc"); | ||
assertCns("cn=a,cn=b", "a", "b"); | ||
assertCns("cn=a c,cn=b", "a c", "b"); | ||
assertCns("cn=a ,cn=b", "a", "b"); | ||
assertCns("cn=Cc,cn=Bb,cn=Aa", "Cc", "Bb", "Aa"); | ||
assertCns("cn=imap.gmail.com", "imap.gmail.com"); | ||
assertCns("l=\"abcn=a,b\", cn=c", "c"); | ||
assertCns("l=\"abcn=a,b\", cn=c", "c"); | ||
assertCns("l=\"abcn=a,b\", cn= c", "c"); | ||
assertCns("cn=<", "<"); | ||
assertCns("cn=>", ">"); | ||
assertCns("cn= >", ">"); | ||
assertCns("cn=a b", "a b"); | ||
assertCns("cn =a b", "a b"); | ||
assertCns("Cn=a b", "a b"); | ||
assertCns("cN=a b", "a b"); | ||
assertCns("CN=a b", "a b"); | ||
assertCns("cn=a#b", "a#b"); | ||
assertCns("cn=#130161", "a"); | ||
assertCns("l=q\t+cn=p", "p"); | ||
assertCns("l=q\n+cn=p", "p"); | ||
assertCns("l=q\n,cn=p", "p"); | ||
assertCns("l=,cn=p", "p"); | ||
assertCns("l=\tq\n,cn=\tp", "\tp"); | ||
} | ||
|
||
/** A cn=, generates an empty value, unless it's at the very end. */ | ||
@Test public void emptyValues() { | ||
assertCns("l=,cn=+cn=q", "", "q"); | ||
assertCns("l=,cn=,cn=q", "", "q"); | ||
assertCns("l=,cn="); | ||
assertCns("l=,cn=q,cn= ", "q"); | ||
assertCns("l=,cn=q ,cn= ", "q"); | ||
assertCns("l=,cn=\"\""); | ||
assertCns("l=,cn=\" \",cn=\" \""," "); | ||
assertCns("l=,cn= ,cn= ",""); | ||
assertCns("l=,cn=,cn= ,cn= ", "", ""); | ||
} | ||
|
||
|
||
@Test public void testGetCns_escapedChars() { | ||
assertCns("cn=\\,", ","); | ||
assertCns("cn=\\#", "#"); | ||
assertCns("cn=\\+", "+"); | ||
assertCns("cn=\\\"", "\""); | ||
assertCns("cn=\\\\", "\\"); | ||
assertCns("cn=\\<", "<"); | ||
assertCns("cn=\\>", ">"); | ||
assertCns("cn=\\;", ";"); | ||
assertCns("cn=\\+", "+"); | ||
assertCns("cn=\"\\+\"", "+"); | ||
assertCns("cn=\"\\,\"", ","); | ||
assertCns("cn= a =", "a ="); | ||
assertCns("cn==", "="); | ||
} | ||
|
||
@Test public void testGetCns_whitespace() { | ||
assertCns("cn= p", "p"); | ||
assertCns("cn=\np", "\np"); | ||
assertCns("cn=\tp", "\tp"); | ||
} | ||
|
||
@Test public void testGetCnsWithOid() { | ||
assertCns("2.5.4.3=a,ou=xxx", "a"); | ||
assertCns("2.5.4.3=\" a \",ou=xxx", " a "); | ||
assertCns("2.5.5.3=a,ou=xxx,cn=b", "b"); | ||
} | ||
|
||
@Test public void testGetCnsWithQuotedStrings() { | ||
assertCns("cn=\"\\\" a ,=<>#;\"", "\" a ,=<>#;"); | ||
assertCns("cn=abc\\,def", "abc,def"); | ||
assertCns("cn=\"\\\" a ,\\=<>\\#;\"", "\" a ,=<>#;"); | ||
} | ||
|
||
@Test public void testGetCnsWithUtf8() { | ||
assertCns("cn=\"Lu\\C4\\8Di\\C4\\87\"", "\u004c\u0075\u010d\u0069\u0107"); | ||
assertCns("cn=Lu\\C4\\8Di\\C4\\87", "\u004c\u0075\u010d\u0069\u0107"); | ||
assertCns("cn=Lu\\C4\\8di\\c4\\87", "\u004c\u0075\u010d\u0069\u0107"); | ||
assertCns("cn=\"Lu\\C4\\8di\\c4\\87\"", "\u004c\u0075\u010d\u0069\u0107"); | ||
assertCns("cn=\u004c\u0075\u010d\u0069\u0107", "\u004c\u0075\u010d\u0069\u0107"); | ||
// \63=c | ||
expectExceptionInPrincipal("\\63n=ab"); | ||
expectExceptionInPrincipal("cn=\\a"); | ||
} | ||
|
||
@Test public void testGetCnsWithWhitespace() { | ||
|
||
assertCns("ou=a, cn= a b ,o=x", "a b"); | ||
assertCns("cn=\" a b \" ,o=x", " a b "); | ||
} | ||
|
||
private void assertCns(String dn, String... expected) { | ||
X500Principal principal = new X500Principal(dn); | ||
DistinguishedNameParser parser = new DistinguishedNameParser(principal); | ||
// Test getAllMostSpecificFirst | ||
// assertEquals(dn, Arrays.asList(expected), parser.getAllMostSpecificFirst("cn")); | ||
|
||
// Test findMostSpecific | ||
if (expected.length > 0) { | ||
assertEquals(dn, expected[0], parser.findMostSpecific("cn")); | ||
} else { | ||
assertNull(dn, parser.findMostSpecific("cn")); | ||
} | ||
} | ||
|
||
private void assertGetAttribute(String dn, String attribute, String... expected) { | ||
X500Principal principal = new X500Principal(dn); | ||
DistinguishedNameParser parser = new DistinguishedNameParser(principal); | ||
// Test getAllMostSpecificFirst | ||
// assertEquals(dn, Arrays.asList(expected), parser.getAllMostSpecificFirst(attribute)); | ||
|
||
// Test findMostSpecific | ||
if (expected.length > 0) { | ||
assertEquals(dn, expected[0], parser.findMostSpecific(attribute)); | ||
} else { | ||
assertNull(dn, parser.findMostSpecific(attribute)); | ||
} | ||
} | ||
|
||
private void expectExceptionInPrincipal(String dn) { | ||
try { | ||
X500Principal principal = new X500Principal(dn); | ||
fail("Expected " + IllegalArgumentException.class.getName() | ||
+ " because of incorrect input name"); | ||
} catch (IllegalArgumentException e) { | ||
// Expected. | ||
} | ||
} | ||
} |