mirror of https://github.com/shred/acme4j
Remove new resources when exception is thrown on creation
parent
8aa7e4ad8e
commit
b9b7bda342
|
@ -247,6 +247,17 @@ public class MockAcmeServer {
|
||||||
.findFirst();
|
.findFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a {@link MockAccount}.
|
||||||
|
*
|
||||||
|
* @param account
|
||||||
|
* {@link MockAccount} to remove
|
||||||
|
*/
|
||||||
|
public void removeAccount(MockAccount account) {
|
||||||
|
account.detach(repository);
|
||||||
|
accounts.remove(account);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link MockAuthorization} for the given {@link Identifier}. If there
|
* Creates a new {@link MockAuthorization} for the given {@link Identifier}. If there
|
||||||
* is already a {@link MockAuthorization} for that {@link Identifier}, it is returned
|
* is already a {@link MockAuthorization} for that {@link Identifier}, it is returned
|
||||||
|
@ -272,6 +283,17 @@ public class MockAcmeServer {
|
||||||
return Optional.ofNullable(authorizations.get(identifier));
|
return Optional.ofNullable(authorizations.get(identifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a {@link MockAuthorization}.
|
||||||
|
*
|
||||||
|
* @param authorization
|
||||||
|
* {@link MockAuthorization} to remove
|
||||||
|
*/
|
||||||
|
public void removeAuthorization(MockAuthorization authorization) {
|
||||||
|
authorization.detach(repository);
|
||||||
|
authorizations.remove(authorization.getIdentifier());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link MockChallenge} instance of the given type.
|
* Creates a new {@link MockChallenge} instance of the given type.
|
||||||
*
|
*
|
||||||
|
@ -284,6 +306,16 @@ public class MockAcmeServer {
|
||||||
return MockChallenge.create(repository, type);
|
return MockChallenge.create(repository, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a {@link MockChallenge}.
|
||||||
|
*
|
||||||
|
* @param challenge
|
||||||
|
* {@link MockChallenge} to remove
|
||||||
|
*/
|
||||||
|
public void removeChallenge(MockChallenge challenge) {
|
||||||
|
challenge.detach(repository);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link MockOrder} for the given {@link Identifier}.
|
* Creates a new {@link MockOrder} for the given {@link Identifier}.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -343,6 +375,16 @@ public class MockAcmeServer {
|
||||||
return MockOrder.create(repository, identifiers, authorizations, ca);
|
return MockOrder.create(repository, identifiers, authorizations, ca);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a {@link MockOrder}.
|
||||||
|
*
|
||||||
|
* @param order
|
||||||
|
* {@link MockOrder} to remove
|
||||||
|
*/
|
||||||
|
public void removeOrder(MockOrder order) {
|
||||||
|
order.detach(repository);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link MockAccount} that corresponds to the given {@link Account}.
|
* Returns the {@link MockAccount} that corresponds to the given {@link Account}.
|
||||||
*
|
*
|
||||||
|
|
|
@ -87,6 +87,21 @@ public class Repository {
|
||||||
resourceMap.put(uri, wrapperFactory.apply(receiver));
|
resourceMap.put(uri, wrapperFactory.apply(receiver));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a controller {@link URL}.
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* {@link URL} of the controller to be removed
|
||||||
|
*/
|
||||||
|
public void removeController(URL url) {
|
||||||
|
URI uri = safeToURI(url);
|
||||||
|
Controller receiver = resourceMap.get(uri);
|
||||||
|
if (receiver == null) {
|
||||||
|
throw new IllegalArgumentException("No controller is registered for " + url);
|
||||||
|
}
|
||||||
|
resourceMap.remove(uri);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a {@link MockResource} to this repository.
|
* Adds a {@link MockResource} to this repository.
|
||||||
*
|
*
|
||||||
|
@ -115,6 +130,21 @@ public class Repository {
|
||||||
.map(type::cast);
|
.map(type::cast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a {@link MockResource} from this repository. Also removes the controller.
|
||||||
|
*
|
||||||
|
* @param resource
|
||||||
|
* {@link MockResource} to remove
|
||||||
|
*/
|
||||||
|
public void removeResource(MockResource resource) {
|
||||||
|
URI uri = safeToURI(resource.getLocation());
|
||||||
|
if (!resources.containsKey(uri)) {
|
||||||
|
throw new IllegalArgumentException("Unknown resource " + resource.getLocation());
|
||||||
|
}
|
||||||
|
removeController(resource.getLocation());
|
||||||
|
resources.remove(uri);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Safely converts an {@link URL} to an {@link URI}.
|
* Safely converts an {@link URL} to an {@link URI}.
|
||||||
*
|
*
|
||||||
|
|
|
@ -182,6 +182,17 @@ public class MockAccount extends MockResource {
|
||||||
return buildUrl("account", getUniqueId(), "orders");
|
return buildUrl("account", getUniqueId(), "orders");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches this {@link MockAccount} from the {@link Repository}.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* {@link Repository} to remove the account from.
|
||||||
|
*/
|
||||||
|
public void detach(Repository repository) {
|
||||||
|
repository.removeController(getOrdersLocation());
|
||||||
|
repository.removeResource(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSON toJSON() {
|
public JSON toJSON() {
|
||||||
JSONBuilder jb = new JSONBuilder();
|
JSONBuilder jb = new JSONBuilder();
|
||||||
|
|
|
@ -164,6 +164,16 @@ public class MockAuthorization extends MockResource {
|
||||||
return buildUrl("authz", getUniqueId());
|
return buildUrl("authz", getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches this {@link MockAuthorization} from the {@link Repository}.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* {@link Repository} to remove the authorization from.
|
||||||
|
*/
|
||||||
|
public void detach(Repository repository) {
|
||||||
|
repository.removeResource(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSON toJSON() {
|
public JSON toJSON() {
|
||||||
JSONBuilder jb = new JSONBuilder();
|
JSONBuilder jb = new JSONBuilder();
|
||||||
|
|
|
@ -193,6 +193,16 @@ public class MockChallenge extends MockResource {
|
||||||
return buildUrl("challenge", getUniqueId());
|
return buildUrl("challenge", getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches this {@link MockChallenge} from the {@link Repository}.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* {@link Repository} to remove the challenge from.
|
||||||
|
*/
|
||||||
|
public void detach(Repository repository) {
|
||||||
|
repository.removeResource(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSON toJSON() {
|
public JSON toJSON() {
|
||||||
JSONBuilder jb = new JSONBuilder();
|
JSONBuilder jb = new JSONBuilder();
|
||||||
|
|
|
@ -319,6 +319,18 @@ public class MockOrder extends MockResource {
|
||||||
return buildUrl("certificate", getUniqueId());
|
return buildUrl("certificate", getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches this {@link MockOrder} from the {@link Repository}.
|
||||||
|
*
|
||||||
|
* @param repository
|
||||||
|
* {@link Repository} to remove the order from.
|
||||||
|
*/
|
||||||
|
public void detach(Repository repository) {
|
||||||
|
repository.removeController(getFinalizeLocation());
|
||||||
|
repository.removeController(getCertificateLocation());
|
||||||
|
repository.removeResource(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSON toJSON() {
|
public JSON toJSON() {
|
||||||
JSONBuilder jb = new JSONBuilder();
|
JSONBuilder jb = new JSONBuilder();
|
||||||
|
|
|
@ -20,6 +20,7 @@ import static org.junit.Assert.fail;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -184,6 +185,12 @@ public class MockAcmeServerTest {
|
||||||
assertThat(server.getAccounts().size(), is(2));
|
assertThat(server.getAccounts().size(), is(2));
|
||||||
assertThat(server.findAccount(keyPair1.getPublic()).isPresent(), is(false));
|
assertThat(server.findAccount(keyPair1.getPublic()).isPresent(), is(false));
|
||||||
assertThat(server.findAccount(keyPair2.getPublic()).isPresent(), is(false));
|
assertThat(server.findAccount(keyPair2.getPublic()).isPresent(), is(false));
|
||||||
|
|
||||||
|
server.removeAccount(account1);
|
||||||
|
assertThat(server.getAccounts().size(), is(1));
|
||||||
|
|
||||||
|
server.removeAccount(account2);
|
||||||
|
assertThat(server.getAccounts().size(), is(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -213,6 +220,9 @@ public class MockAcmeServerTest {
|
||||||
|
|
||||||
Optional<MockAuthorization> missingAuth = server.findAuthorization(Identifier.dns("example.com"));
|
Optional<MockAuthorization> missingAuth = server.findAuthorization(Identifier.dns("example.com"));
|
||||||
assertThat(missingAuth.isPresent(), is(false));
|
assertThat(missingAuth.isPresent(), is(false));
|
||||||
|
|
||||||
|
server.removeAuthorization(auth);
|
||||||
|
assertThat(server.findAuthorization(identifier).isPresent(), is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -268,6 +278,14 @@ public class MockAcmeServerTest {
|
||||||
|
|
||||||
MockChallenge mockChallenge = server.getMockOf(challenge);
|
MockChallenge mockChallenge = server.getMockOf(challenge);
|
||||||
assertThat(mockChallenge, sameInstance(createdChallenge));
|
assertThat(mockChallenge, sameInstance(createdChallenge));
|
||||||
|
|
||||||
|
server.removeChallenge(createdChallenge);
|
||||||
|
try {
|
||||||
|
server.getMockOf(challenge);
|
||||||
|
fail("Challenge is still there");
|
||||||
|
} catch (NoSuchElementException ex) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -284,6 +302,14 @@ public class MockAcmeServerTest {
|
||||||
Order order = login.bindOrder(createdOrder.getLocation());
|
Order order = login.bindOrder(createdOrder.getLocation());
|
||||||
MockOrder mockOrder = server.getMockOf(order);
|
MockOrder mockOrder = server.getMockOf(order);
|
||||||
assertThat(mockOrder, sameInstance(createdOrder));
|
assertThat(mockOrder, sameInstance(createdOrder));
|
||||||
|
|
||||||
|
server.removeOrder(createdOrder);
|
||||||
|
try {
|
||||||
|
server.getMockOf(order);
|
||||||
|
fail("Order is still there");
|
||||||
|
} catch (NoSuchElementException ex) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -68,6 +68,15 @@ public class MockAccountTest {
|
||||||
assertThat(account.getPublicKey(), is(PUBLIC_KEY));
|
assertThat(account.getPublicKey(), is(PUBLIC_KEY));
|
||||||
assertThat(account.getStatus(), is(Status.VALID));
|
assertThat(account.getStatus(), is(Status.VALID));
|
||||||
assertThat(account.getTermsOfServiceAgreed(), is(nullValue()));
|
assertThat(account.getTermsOfServiceAgreed(), is(nullValue()));
|
||||||
|
|
||||||
|
// Detach from repository
|
||||||
|
account.detach(repository);
|
||||||
|
assertThat(repository.getController(account.getLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getController(account.getOrdersLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getResourceOfType(account.getLocation(), MockAccount.class).isPresent(),
|
||||||
|
is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -59,6 +59,13 @@ public class MockAuthorizationTest {
|
||||||
assertThat(auth.getIdentifier(), is(IDENTIFIER));
|
assertThat(auth.getIdentifier(), is(IDENTIFIER));
|
||||||
assertThat(auth.getStatus(), is(Status.PENDING));
|
assertThat(auth.getStatus(), is(Status.PENDING));
|
||||||
assertThat(auth.getWildcard(), is(nullValue()));
|
assertThat(auth.getWildcard(), is(nullValue()));
|
||||||
|
|
||||||
|
// Detach from repository
|
||||||
|
auth.detach(repository);
|
||||||
|
assertThat(repository.getController(auth.getLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getResourceOfType(auth.getLocation(), MockAuthorization.class).isPresent(),
|
||||||
|
is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -59,6 +59,13 @@ public class MockChallengeTest {
|
||||||
assertThat(challenge.getToken(), is(nullValue()));
|
assertThat(challenge.getToken(), is(nullValue()));
|
||||||
assertThat(challenge.getType(), is(Http01Challenge.TYPE));
|
assertThat(challenge.getType(), is(Http01Challenge.TYPE));
|
||||||
assertThat(challenge.getValidated(), is(nullValue()));
|
assertThat(challenge.getValidated(), is(nullValue()));
|
||||||
|
|
||||||
|
// Detach from repository
|
||||||
|
challenge.detach(repository);
|
||||||
|
assertThat(repository.getController(challenge.getLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getResourceOfType(challenge.getLocation(), MockChallenge.class).isPresent(),
|
||||||
|
is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,6 +32,8 @@ import org.shredzone.acme4j.Status;
|
||||||
import org.shredzone.acme4j.mock.connection.MockCertificateAuthority;
|
import org.shredzone.acme4j.mock.connection.MockCertificateAuthority;
|
||||||
import org.shredzone.acme4j.mock.connection.ProblemBuilder;
|
import org.shredzone.acme4j.mock.connection.ProblemBuilder;
|
||||||
import org.shredzone.acme4j.mock.connection.Repository;
|
import org.shredzone.acme4j.mock.connection.Repository;
|
||||||
|
import org.shredzone.acme4j.mock.controller.CertificateController;
|
||||||
|
import org.shredzone.acme4j.mock.controller.FinalizeController;
|
||||||
import org.shredzone.acme4j.mock.controller.OrderController;
|
import org.shredzone.acme4j.mock.controller.OrderController;
|
||||||
import org.shredzone.acme4j.toolbox.JSONBuilder;
|
import org.shredzone.acme4j.toolbox.JSONBuilder;
|
||||||
|
|
||||||
|
@ -64,6 +66,10 @@ public class MockOrderTest {
|
||||||
// Controllers were added to the repository?
|
// Controllers were added to the repository?
|
||||||
assertThat(repository.getController(order.getLocation()).get(),
|
assertThat(repository.getController(order.getLocation()).get(),
|
||||||
is(instanceOf(OrderController.class)));
|
is(instanceOf(OrderController.class)));
|
||||||
|
assertThat(repository.getController(order.getFinalizeLocation()).get(),
|
||||||
|
is(instanceOf(FinalizeController.class)));
|
||||||
|
assertThat(repository.getController(order.getCertificateLocation()).get(),
|
||||||
|
is(instanceOf(CertificateController.class)));
|
||||||
assertThat(repository.getResourceOfType(order.getLocation(), MockOrder.class).get(),
|
assertThat(repository.getResourceOfType(order.getLocation(), MockOrder.class).get(),
|
||||||
is(sameInstance(order)));
|
is(sameInstance(order)));
|
||||||
|
|
||||||
|
@ -76,6 +82,17 @@ public class MockOrderTest {
|
||||||
assertThat(order.getNotBefore(), is(nullValue()));
|
assertThat(order.getNotBefore(), is(nullValue()));
|
||||||
assertThat(order.getNotAfter(), is(nullValue()));
|
assertThat(order.getNotAfter(), is(nullValue()));
|
||||||
assertThat(order.getStatus(), is(Status.PENDING));
|
assertThat(order.getStatus(), is(Status.PENDING));
|
||||||
|
|
||||||
|
// Detach from repository
|
||||||
|
order.detach(repository);
|
||||||
|
assertThat(repository.getController(order.getLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getController(order.getFinalizeLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getController(order.getCertificateLocation()).isPresent(),
|
||||||
|
is(false));
|
||||||
|
assertThat(repository.getResourceOfType(order.getLocation(), MockOrder.class).isPresent(),
|
||||||
|
is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue