From b12ee4a28ac316b4b0565f339350269e53a17c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20K=C3=B6rber?= Date: Sun, 13 Dec 2015 19:36:24 +0100 Subject: [PATCH] Add unit tests for AcmeClientProviders --- .../AbstractAcmeClientProviderTest.java | 212 ++++++++++++++++++ .../GenericAcmeClientProviderTest.java | 56 +++++ .../LetsEncryptAcmeClientProviderTest.java | 32 --- 3 files changed, 268 insertions(+), 32 deletions(-) create mode 100644 acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeClientProviderTest.java create mode 100644 acme4j-client/src/test/java/org/shredzone/acme4j/provider/GenericAcmeClientProviderTest.java diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeClientProviderTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeClientProviderTest.java new file mode 100644 index 00000000..ba38cdab --- /dev/null +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeClientProviderTest.java @@ -0,0 +1,212 @@ +/* + * acme4j - Java ACME client + * + * Copyright (C) 2015 Richard "Shred" Körber + * http://acme4j.shredzone.org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ +package org.shredzone.acme4j.provider; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URISyntaxException; + +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.shredzone.acme4j.AcmeClient; +import org.shredzone.acme4j.challenge.Challenge; +import org.shredzone.acme4j.challenge.DnsChallenge; +import org.shredzone.acme4j.challenge.GenericChallenge; +import org.shredzone.acme4j.challenge.HttpChallenge; +import org.shredzone.acme4j.challenge.ProofOfPossessionChallenge; +import org.shredzone.acme4j.challenge.TlsSniChallenge; + +/** + * Unit tests for {@link AbstractAcmeClientProvider}. + * + * @author Richard "Shred" Körber + */ +public class AbstractAcmeClientProviderTest { + + /** + * Test if an {@link AcmeClient} is properly generated and configurated. + */ + @Test + public void testResolveAndConnect() throws URISyntaxException { + final URI testAcmeUri = new URI("acme://example.com"); + final URI testDirectoryUri = new URI("http://example.com/acme"); + + AbstractAcmeClientProvider provider = new AbstractAcmeClientProvider() { + @Override + public boolean accepts(URI serverUri) { + return serverUri.equals(testAcmeUri); + } + + @Override + protected URI resolve(URI serverUri) { + assertThat(serverUri, is(testAcmeUri)); + return testDirectoryUri; + } + + @Override + protected AcmeClient createAcmeClient(URI directoryUri) { + assertThat(directoryUri, is(equalTo(testDirectoryUri))); + return super.createAcmeClient(directoryUri); + } + }; + + AcmeClient client = provider.connect(testAcmeUri); + assertThat(client, is(notNullValue())); + + try { + provider.connect(new URI("acme://example.org/isbad")); + fail("accepted unknown acme API"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + /** + * Test if a HTTP connection can be opened. + *

+ * This test requires a network connection. It should be excluded from automated + * builds. + */ + @Test + @Category(HttpURLConnection.class) + public void testOpenConnection() throws IOException, URISyntaxException { + AbstractAcmeClientProvider provider = new AbstractAcmeClientProvider() { + @Override + public boolean accepts(URI serverUri) { + throw new UnsupportedOperationException(); + } + + @Override + protected URI resolve(URI serverUri) { + throw new UnsupportedOperationException(); + } + }; + + HttpURLConnection conn = provider.openConnection(new URI("http://example.com")); + assertThat(conn, not(nullValue())); + conn.connect(); + assertThat(conn.getResponseCode(), is(HttpURLConnection.HTTP_OK)); + } + + /** + * Test that all base challenges are registered on initialization, and that additional + * challenges are properly registered. + */ + @Test + public void testRegisterChallenges() { + AbstractAcmeClientProvider provider = new AbstractAcmeClientProvider() { + @Override + protected void registerBaseChallenges() { + assertThat(getRegisteredChallengeTypes(), is(empty())); + super.registerBaseChallenges(); + } + + @Override + public boolean accepts(URI serverUri) { + throw new UnsupportedOperationException(); + } + + @Override + protected URI resolve(URI serverUri) { + throw new UnsupportedOperationException(); + } + }; + + assertThat(provider.getRegisteredChallengeTypes(), hasSize(4)); + assertThat(provider.getRegisteredChallengeTypes(), containsInAnyOrder( + DnsChallenge.TYPE, + HttpChallenge.TYPE, + ProofOfPossessionChallenge.TYPE, + TlsSniChallenge.TYPE + )); + + provider.registerChallenge("foo", GenericChallenge.class); + + assertThat(provider.getRegisteredChallengeTypes(), hasSize(5)); + assertThat(provider.getRegisteredChallengeTypes(), containsInAnyOrder( + DnsChallenge.TYPE, + HttpChallenge.TYPE, + ProofOfPossessionChallenge.TYPE, + TlsSniChallenge.TYPE, + "foo" + )); + + try { + provider.registerChallenge(null, GenericChallenge.class); + fail("accepts null type"); + } catch (NullPointerException ex) { + // expected + } + + try { + provider.registerChallenge("bar", null); + fail("accepts null class"); + } catch (NullPointerException ex) { + // expected + } + + try { + provider.registerChallenge("", GenericChallenge.class); + fail("accepts empty type"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + /** + * Test that challenges are generated properly. + */ + @Test + public void testCreateChallenge() { + AbstractAcmeClientProvider provider = new AbstractAcmeClientProvider() { + @Override + public boolean accepts(URI serverUri) { + throw new UnsupportedOperationException(); + } + + @Override + protected URI resolve(URI serverUri) { + throw new UnsupportedOperationException(); + } + }; + + Challenge c1 = provider.createChallenge(HttpChallenge.TYPE); + assertThat(c1, not(nullValue())); + assertThat(c1, instanceOf(HttpChallenge.class)); + + Challenge c2 = provider.createChallenge(HttpChallenge.TYPE); + assertThat(c2, not(sameInstance(c1))); + + Challenge c3 = provider.createChallenge(DnsChallenge.TYPE); + assertThat(c3, not(nullValue())); + assertThat(c3, instanceOf(DnsChallenge.class)); + + Challenge c4 = provider.createChallenge(ProofOfPossessionChallenge.TYPE); + assertThat(c4, not(nullValue())); + assertThat(c4, instanceOf(ProofOfPossessionChallenge.class)); + + Challenge c5 = provider.createChallenge(TlsSniChallenge.TYPE); + assertThat(c5, not(nullValue())); + assertThat(c5, instanceOf(TlsSniChallenge.class)); + + Challenge c6 = provider.createChallenge("foobar-01"); + assertThat(c6, not(nullValue())); + assertThat(c6, instanceOf(GenericChallenge.class)); + } + +} diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/provider/GenericAcmeClientProviderTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/GenericAcmeClientProviderTest.java new file mode 100644 index 00000000..04b84c9c --- /dev/null +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/GenericAcmeClientProviderTest.java @@ -0,0 +1,56 @@ +/* + * acme4j - Java ACME client + * + * Copyright (C) 2015 Richard "Shred" Körber + * http://acme4j.shredzone.org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ +package org.shredzone.acme4j.provider; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.junit.Test; + +/** + * Unit tests for {@link GenericAcmeClientProvider}. + * + * @author Richard "Shred" Körber + */ +public class GenericAcmeClientProviderTest { + + /** + * Tests if the provider accepts the correct URIs. + */ + @Test + public void testAccepts() throws URISyntaxException { + GenericAcmeClientProvider provider = new GenericAcmeClientProvider(); + + assertThat(provider.accepts(new URI("http://example.com/acme")), is(true)); + assertThat(provider.accepts(new URI("https://example.com/acme")), is(true)); + assertThat(provider.accepts(new URI("acme://example.com")), is(false)); + } + + /** + * Test if the provider resolves the URI correctly. + */ + @Test + public void testResolve() throws URISyntaxException { + URI serverUri = new URI("http://example.com/acme"); + + GenericAcmeClientProvider provider = new GenericAcmeClientProvider(); + + URI resolvedUri = provider.resolve(serverUri); + assertThat(resolvedUri, is(equalTo(serverUri))); + } + +} diff --git a/acme4j-letsencrypt/src/test/java/org/shredzone/acme4j/provider/LetsEncryptAcmeClientProviderTest.java b/acme4j-letsencrypt/src/test/java/org/shredzone/acme4j/provider/LetsEncryptAcmeClientProviderTest.java index 12be8d51..fbb44593 100644 --- a/acme4j-letsencrypt/src/test/java/org/shredzone/acme4j/provider/LetsEncryptAcmeClientProviderTest.java +++ b/acme4j-letsencrypt/src/test/java/org/shredzone/acme4j/provider/LetsEncryptAcmeClientProviderTest.java @@ -27,7 +27,6 @@ import javax.net.ssl.SSLSocketFactory; import org.junit.Test; import org.junit.experimental.categories.Category; -import org.shredzone.acme4j.AcmeClient; /** * Unit tests for {@link LetsEncryptAcmeClientProvider}. @@ -73,37 +72,6 @@ public class LetsEncryptAcmeClientProviderTest { } catch (IllegalArgumentException ex) { // expected } - - try { - provider.resolve(new URI("acme://example.com")); - fail("accepted foreign server"); - } catch (IllegalArgumentException ex) { - // expected - } - - try { - provider.resolve(new URI("http://example.com/acme")); - fail("accepted http schema"); - } catch (IllegalArgumentException ex) { - // expected - } - } - - /** - * Test if an {@link AcmeClient} is properly generated and configurated. - */ - @Test - public void testConnect() throws URISyntaxException { - LetsEncryptAcmeClientProvider provider = new LetsEncryptAcmeClientProvider() { - @Override - protected AcmeClient createAcmeClient(URI directoryUri) { - assertThat(directoryUri.toString(), is(V01_DIRECTORY_URI)); - return super.createAcmeClient(directoryUri); - } - }; - - AcmeClient client = provider.connect(new URI("acme://letsencrypt.org")); - assertThat(client, is(notNullValue())); } /**