mirror of
https://github.com/google/nomulus
synced 2026-01-04 04:04:22 +00:00
Remove more usage of AutoValue (#2432)
This PR also removes `SerializedForm` used to serialize `PendingDeposit`, as it is now a simple record.
This commit is contained in:
@@ -59,7 +59,7 @@ public abstract class QuotaHandler extends ChannelInboundHandlerAdapter {
|
||||
if (quotaResponse == null) {
|
||||
String userId = getUserId(ctx);
|
||||
checkNotNull(userId, "Cannot obtain User ID");
|
||||
quotaResponse = quotaManager.acquireQuota(QuotaRequest.create(userId));
|
||||
quotaResponse = quotaManager.acquireQuota(new QuotaRequest(userId));
|
||||
if (!quotaResponse.success()) {
|
||||
String protocolName = ctx.channel().attr(PROTOCOL_KEY).get().name();
|
||||
metrics.registerQuotaRejection(protocolName, isUserIdPii() ? "none" : userId);
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
|
||||
package google.registry.proxy.quota;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import google.registry.proxy.quota.TokenStore.TimestampedInteger;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Future;
|
||||
@@ -40,42 +39,16 @@ import org.joda.time.DateTime;
|
||||
public class QuotaManager {
|
||||
|
||||
/** Value class representing a quota request. */
|
||||
@AutoValue
|
||||
public abstract static class QuotaRequest {
|
||||
|
||||
public static QuotaRequest create(String userId) {
|
||||
return new AutoValue_QuotaManager_QuotaRequest(userId);
|
||||
}
|
||||
|
||||
abstract String userId();
|
||||
}
|
||||
public record QuotaRequest(String userId) {}
|
||||
|
||||
/** Value class representing a quota response. */
|
||||
@AutoValue
|
||||
public abstract static class QuotaResponse {
|
||||
public static QuotaResponse create(
|
||||
boolean success, String userId, DateTime grantedTokenRefillTime) {
|
||||
return new AutoValue_QuotaManager_QuotaResponse(success, userId, grantedTokenRefillTime);
|
||||
}
|
||||
|
||||
public abstract boolean success();
|
||||
|
||||
abstract String userId();
|
||||
|
||||
abstract DateTime grantedTokenRefillTime();
|
||||
}
|
||||
public record QuotaResponse(boolean success, String userId, DateTime grantedTokenRefillTime) {}
|
||||
|
||||
/** Value class representing a quota rebate. */
|
||||
@AutoValue
|
||||
public abstract static class QuotaRebate {
|
||||
public record QuotaRebate(String userId, DateTime grantedTokenRefillTime) {
|
||||
public static QuotaRebate create(QuotaResponse response) {
|
||||
return new AutoValue_QuotaManager_QuotaRebate(
|
||||
response.userId(), response.grantedTokenRefillTime());
|
||||
return new QuotaRebate(response.userId(), response.grantedTokenRefillTime());
|
||||
}
|
||||
|
||||
abstract String userId();
|
||||
|
||||
abstract DateTime grantedTokenRefillTime();
|
||||
}
|
||||
|
||||
private final TokenStore tokenStore;
|
||||
@@ -91,7 +64,7 @@ public class QuotaManager {
|
||||
/** Attempts to acquire requested quota, synchronously. */
|
||||
public QuotaResponse acquireQuota(QuotaRequest request) {
|
||||
TimestampedInteger tokens = tokenStore.take(request.userId());
|
||||
return QuotaResponse.create(tokens.value() != 0, request.userId(), tokens.timestamp());
|
||||
return new QuotaResponse(tokens.value() != 0, request.userId(), tokens.timestamp());
|
||||
}
|
||||
|
||||
/** Returns granted quota to the token store, asynchronously. */
|
||||
|
||||
@@ -78,14 +78,14 @@ class EppQuotaHandlerTest {
|
||||
|
||||
@Test
|
||||
void testSuccess_quotaGrantedAndReturned() {
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(clientCertHash)))
|
||||
.thenReturn(QuotaResponse.create(true, clientCertHash, now));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(clientCertHash)))
|
||||
.thenReturn(new QuotaResponse(true, clientCertHash, now));
|
||||
|
||||
// First read, acquire quota.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
assertThat((Object) channel.readInbound()).isEqualTo(message);
|
||||
assertThat(channel.isActive()).isTrue();
|
||||
verify(quotaManager).acquireQuota(QuotaRequest.create(clientCertHash));
|
||||
verify(quotaManager).acquireQuota(new QuotaRequest(clientCertHash));
|
||||
|
||||
// Second read, should not acquire quota again.
|
||||
Object newMessage = new Object();
|
||||
@@ -96,19 +96,19 @@ class EppQuotaHandlerTest {
|
||||
// Channel closed, release quota.
|
||||
ChannelFuture unusedFuture = channel.close();
|
||||
verify(quotaManager)
|
||||
.releaseQuota(QuotaRebate.create(QuotaResponse.create(true, clientCertHash, now)));
|
||||
.releaseQuota(QuotaRebate.create(new QuotaResponse(true, clientCertHash, now)));
|
||||
verifyNoMoreInteractions(quotaManager);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFailure_quotaNotGranted() {
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(clientCertHash)))
|
||||
.thenReturn(QuotaResponse.create(false, clientCertHash, now));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(clientCertHash)))
|
||||
.thenReturn(new QuotaResponse(false, clientCertHash, now));
|
||||
OverQuotaException e =
|
||||
assertThrows(OverQuotaException.class, () -> channel.writeInbound(message));
|
||||
ChannelFuture unusedFuture = channel.close();
|
||||
assertThat(e).hasMessageThat().contains(clientCertHash);
|
||||
verify(quotaManager).acquireQuota(QuotaRequest.create(clientCertHash));
|
||||
verify(quotaManager).acquireQuota(new QuotaRequest(clientCertHash));
|
||||
// Make sure that quotaManager.releaseQuota() is not called when the channel closes.
|
||||
verifyNoMoreInteractions(quotaManager);
|
||||
verify(metrics).registerQuotaRejection("epp", clientCertHash);
|
||||
@@ -125,10 +125,10 @@ class EppQuotaHandlerTest {
|
||||
setProtocol(otherChannel);
|
||||
final DateTime later = now.plus(Duration.standardSeconds(1));
|
||||
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(clientCertHash)))
|
||||
.thenReturn(QuotaResponse.create(true, clientCertHash, now));
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(otherClientCertHash)))
|
||||
.thenReturn(QuotaResponse.create(false, otherClientCertHash, later));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(clientCertHash)))
|
||||
.thenReturn(new QuotaResponse(true, clientCertHash, now));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(otherClientCertHash)))
|
||||
.thenReturn(new QuotaResponse(false, otherClientCertHash, later));
|
||||
|
||||
// Allows the first user.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
@@ -152,9 +152,9 @@ class EppQuotaHandlerTest {
|
||||
setProtocol(otherChannel);
|
||||
final DateTime later = now.plus(Duration.standardSeconds(1));
|
||||
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(clientCertHash)))
|
||||
.thenReturn(QuotaResponse.create(true, clientCertHash, now))
|
||||
.thenReturn(QuotaResponse.create(false, clientCertHash, later));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(clientCertHash)))
|
||||
.thenReturn(new QuotaResponse(true, clientCertHash, now))
|
||||
.thenReturn(new QuotaResponse(false, clientCertHash, later));
|
||||
|
||||
// Allows the first channel.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
|
||||
@@ -77,14 +77,14 @@ class WhoisQuotaHandlerTest {
|
||||
|
||||
@Test
|
||||
void testSuccess_quotaGranted() {
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(remoteAddress)))
|
||||
.thenReturn(QuotaResponse.create(true, remoteAddress, now));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(remoteAddress)))
|
||||
.thenReturn(new QuotaResponse(true, remoteAddress, now));
|
||||
|
||||
// First read, acquire quota.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
assertThat((Object) channel.readInbound()).isEqualTo(message);
|
||||
assertThat(channel.isActive()).isTrue();
|
||||
verify(quotaManager).acquireQuota(QuotaRequest.create(remoteAddress));
|
||||
verify(quotaManager).acquireQuota(new QuotaRequest(remoteAddress));
|
||||
|
||||
// Second read, should not acquire quota again.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
@@ -97,8 +97,8 @@ class WhoisQuotaHandlerTest {
|
||||
|
||||
@Test
|
||||
void testFailure_quotaNotGranted() {
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(remoteAddress)))
|
||||
.thenReturn(QuotaResponse.create(false, remoteAddress, now));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(remoteAddress)))
|
||||
.thenReturn(new QuotaResponse(false, remoteAddress, now));
|
||||
OverQuotaException e =
|
||||
assertThrows(OverQuotaException.class, () -> channel.writeInbound(message));
|
||||
assertThat(e).hasMessageThat().contains("none");
|
||||
@@ -116,10 +116,10 @@ class WhoisQuotaHandlerTest {
|
||||
setProtocol(otherChannel);
|
||||
final DateTime later = now.plus(Duration.standardSeconds(1));
|
||||
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(remoteAddress)))
|
||||
.thenReturn(QuotaResponse.create(true, remoteAddress, now));
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(otherRemoteAddress)))
|
||||
.thenReturn(QuotaResponse.create(false, otherRemoteAddress, later));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(remoteAddress)))
|
||||
.thenReturn(new QuotaResponse(true, remoteAddress, now));
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(otherRemoteAddress)))
|
||||
.thenReturn(new QuotaResponse(false, otherRemoteAddress, later));
|
||||
|
||||
// Allows the first user.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
@@ -149,12 +149,12 @@ class WhoisQuotaHandlerTest {
|
||||
thirdChannel.attr(REMOTE_ADDRESS_KEY).set(remoteAddress);
|
||||
final DateTime evenLater = now.plus(Duration.standardSeconds(60));
|
||||
|
||||
when(quotaManager.acquireQuota(QuotaRequest.create(remoteAddress)))
|
||||
.thenReturn(QuotaResponse.create(true, remoteAddress, now))
|
||||
when(quotaManager.acquireQuota(new QuotaRequest(remoteAddress)))
|
||||
.thenReturn(new QuotaResponse(true, remoteAddress, now))
|
||||
// Throttles the second connection.
|
||||
.thenReturn(QuotaResponse.create(false, remoteAddress, later))
|
||||
.thenReturn(new QuotaResponse(false, remoteAddress, later))
|
||||
// Allows the third connection because token refilled.
|
||||
.thenReturn(QuotaResponse.create(true, remoteAddress, evenLater));
|
||||
.thenReturn(new QuotaResponse(true, remoteAddress, evenLater));
|
||||
|
||||
// Allows the first channel.
|
||||
assertThat(channel.writeInbound(message)).isTrue();
|
||||
|
||||
@@ -48,7 +48,7 @@ class QuotaManagerTest {
|
||||
void testSuccess_requestApproved() {
|
||||
when(tokenStore.take(anyString())).thenReturn(TimestampedInteger.create(1, clock.nowUtc()));
|
||||
|
||||
request = QuotaRequest.create(USER_ID);
|
||||
request = new QuotaRequest(USER_ID);
|
||||
response = quotaManager.acquireQuota(request);
|
||||
assertThat(response.success()).isTrue();
|
||||
assertThat(response.userId()).isEqualTo(USER_ID);
|
||||
@@ -59,7 +59,7 @@ class QuotaManagerTest {
|
||||
void testSuccess_requestDenied() {
|
||||
when(tokenStore.take(anyString())).thenReturn(TimestampedInteger.create(0, clock.nowUtc()));
|
||||
|
||||
request = QuotaRequest.create(USER_ID);
|
||||
request = new QuotaRequest(USER_ID);
|
||||
response = quotaManager.acquireQuota(request);
|
||||
assertThat(response.success()).isFalse();
|
||||
assertThat(response.userId()).isEqualTo(USER_ID);
|
||||
@@ -69,7 +69,7 @@ class QuotaManagerTest {
|
||||
@Test
|
||||
void testSuccess_rebate() {
|
||||
DateTime grantedTokenRefillTime = clock.nowUtc();
|
||||
response = QuotaResponse.create(true, USER_ID, grantedTokenRefillTime);
|
||||
response = new QuotaResponse(true, USER_ID, grantedTokenRefillTime);
|
||||
QuotaRebate rebate = QuotaRebate.create(response);
|
||||
Future<?> unusedFuture = quotaManager.releaseQuota(rebate);
|
||||
verify(tokenStore).scheduleRefresh();
|
||||
|
||||
Reference in New Issue
Block a user