Add a test to ensure all actions are routable by the RegistryServlet (#2361)

This commit is contained in:
Lai Jiang 2024-03-12 13:18:44 -04:00 committed by GitHub
parent e881f254f8
commit 6acb14c60d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 183 additions and 11 deletions

View file

@ -99,7 +99,7 @@ import google.registry.tmch.TmchSmdrlAction;
VoidDnsWriterModule.class, VoidDnsWriterModule.class,
WhiteboxModule.class, WhiteboxModule.class,
}) })
interface BackendRequestComponent { public interface BackendRequestComponent {
BrdaCopyAction brdaCopyAction(); BrdaCopyAction brdaCopyAction();

View file

@ -27,7 +27,7 @@ import google.registry.request.RequestScope;
@RequestScope @RequestScope
@Subcomponent(modules = {RequestModule.class, UrlConnectionServiceModule.class}) @Subcomponent(modules = {RequestModule.class, UrlConnectionServiceModule.class})
interface BsaRequestComponent { public interface BsaRequestComponent {
BsaDownloadAction bsaDownloadAction(); BsaDownloadAction bsaDownloadAction();

View file

@ -53,7 +53,7 @@ import google.registry.ui.server.registrar.RegistryLockVerifyAction;
RequestModule.class, RequestModule.class,
WhiteboxModule.class, WhiteboxModule.class,
}) })
interface FrontendRequestComponent { public interface FrontendRequestComponent {
ConsoleDomainGetAction consoleDomainGetAction(); ConsoleDomainGetAction consoleDomainGetAction();
ConsoleDomainListAction consoleDomainListAction(); ConsoleDomainListAction consoleDomainListAction();

View file

@ -50,7 +50,7 @@ import google.registry.whois.WhoisModule;
WhiteboxModule.class, WhiteboxModule.class,
WhoisModule.class, WhoisModule.class,
}) })
interface PubApiRequestComponent { public interface PubApiRequestComponent {
CheckApiAction checkApiAction(); CheckApiAction checkApiAction();
RdapAutnumAction rdapAutnumAction(); RdapAutnumAction rdapAutnumAction();
RdapDomainAction rdapDomainAction(); RdapDomainAction rdapDomainAction();

View file

@ -49,7 +49,7 @@ import google.registry.tools.server.VerifyOteAction;
ToolsServerModule.class, ToolsServerModule.class,
WhiteboxModule.class, WhiteboxModule.class,
}) })
interface ToolsRequestComponent { public interface ToolsRequestComponent {
CreateGroupsAction createGroupsAction(); CreateGroupsAction createGroupsAction();
EppToolAction eppToolAction(); EppToolAction eppToolAction();
FlowComponent.Builder flowComponentBuilder(); FlowComponent.Builder flowComponentBuilder();

View file

@ -0,0 +1,92 @@
// Copyright 2024 The Nomulus Authors. All Rights Reserved.
//
// 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 google.registry.module;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import google.registry.module.backend.BackendRequestComponent;
import google.registry.module.bsa.BsaRequestComponent;
import google.registry.module.frontend.FrontendRequestComponent;
import google.registry.module.pubapi.PubApiRequestComponent;
import google.registry.module.tools.ToolsRequestComponent;
import google.registry.testing.GoldenFileTestHelper;
import google.registry.testing.TestDataHelper;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.testcontainers.shaded.com.google.common.collect.ImmutableMap;
/** Unit tests for {@link RequestComponent}. */
public class RequestComponentTest {
private static final ImmutableMap<Class<?>, String> GaeComponents =
ImmutableMap.of(
FrontendRequestComponent.class, "frontend",
BackendRequestComponent.class, "backend",
ToolsRequestComponent.class, "tools",
PubApiRequestComponent.class, "pubapi",
BsaRequestComponent.class, "bsa");
@Test
void testRoutingMap() {
GoldenFileTestHelper.assertThatRoutesFromComponent(RequestComponent.class)
.describedAs("routing map")
.isEqualToGolden(RequestComponentTest.class, "routing.txt");
}
@Test
void testGaeToJettyRoutingCoverage() {
List<Route> jettyRoutes = getRoutes(RequestComponent.class, "routing.txt");
List<Route> gaeRoutes = new ArrayList<>();
for (var component : GaeComponents.entrySet()) {
gaeRoutes.addAll(getRoutes(component.getKey(), component.getValue() + "_routing.txt"));
}
assertThat(jettyRoutes).containsExactlyElementsIn(gaeRoutes);
}
private List<Route> getRoutes(Class<?> context, String filename) {
return TestDataHelper.loadFile(context, filename)
.trim()
.lines()
.skip(1) // Skip the headers
.map(Route::create)
.toList();
}
private record Route(
String path,
String clazz,
String methods,
String ok,
String authMethods,
String min,
String userPolicy) {
private static final Splitter splitter = Splitter.on(' ').omitEmptyStrings().trimResults();
static Route create(String line) {
ImmutableList<String> parts = ImmutableList.copyOf(splitter.split(line));
assertThat(parts.size()).isEqualTo(7);
return new Route(
parts.get(0),
parts.get(1),
parts.get(2),
parts.get(3),
parts.get(4),
parts.get(5),
parts.get(6));
}
}
}

View file

@ -73,13 +73,12 @@ public final class TestDataHelper {
} }
/** /**
* Loads a text file from the "testdata" directory relative to the location of the specified * Loads a text file from a directory with a relative path to the location of the specified
* context class. * context class under {@code src/test/resources/}.
*/ */
public static String loadFile(Class<?> context, String filename) { public static String loadFile(Class<?> context, String filename) {
return fileCache.computeIfAbsent( return fileCache.computeIfAbsent(
FileKey.create(context, filename), FileKey.create(context, filename), k -> readResourceUtf8(context, filename));
k -> readResourceUtf8(context, filename));
} }
/** /**
@ -101,8 +100,7 @@ public final class TestDataHelper {
*/ */
public static ByteSource loadBytes(Class<?> context, String filename) { public static ByteSource loadBytes(Class<?> context, String filename) {
return byteCache.computeIfAbsent( return byteCache.computeIfAbsent(
FileKey.create(context, filename), FileKey.create(context, filename), k -> readResourceBytes(context, filename));
k -> readResourceBytes(context, filename));
} }
/** /**

View file

@ -0,0 +1,82 @@
PATH CLASS METHODS OK AUTH_METHODS MIN USER_POLICY
/_dr/admin/createGroups CreateGroupsAction POST n API APP ADMIN
/_dr/admin/list/domains ListDomainsAction GET,POST n API APP ADMIN
/_dr/admin/list/hosts ListHostsAction GET,POST n API APP ADMIN
/_dr/admin/list/premiumLists ListPremiumListsAction GET,POST n API APP ADMIN
/_dr/admin/list/registrars ListRegistrarsAction GET,POST n API APP ADMIN
/_dr/admin/list/reservedLists ListReservedListsAction GET,POST n API APP ADMIN
/_dr/admin/list/tlds ListTldsAction GET,POST n API APP ADMIN
/_dr/admin/verifyOte VerifyOteAction POST n API APP ADMIN
/_dr/cron/fanout TldFanoutAction GET y API APP ADMIN
/_dr/dnsRefresh RefreshDnsAction GET y API APP ADMIN
/_dr/epp EppTlsAction POST n API APP ADMIN
/_dr/epptool EppToolAction POST n API APP ADMIN
/_dr/loadtest LoadTestAction POST y API APP ADMIN
/_dr/task/brdaCopy BrdaCopyAction POST y API APP ADMIN
/_dr/task/bsaDownload BsaDownloadAction GET,POST n API APP ADMIN
/_dr/task/bsaRefresh BsaRefreshAction GET,POST n API APP ADMIN
/_dr/task/bsaValidate BsaValidateAction GET,POST n API APP ADMIN
/_dr/task/copyDetailReports CopyDetailReportsAction POST n API APP ADMIN
/_dr/task/deleteExpiredDomains DeleteExpiredDomainsAction GET n API APP ADMIN
/_dr/task/deleteLoadTestData DeleteLoadTestDataAction POST n API APP ADMIN
/_dr/task/deleteProberData DeleteProberDataAction POST n API APP ADMIN
/_dr/task/executeCannedScript CannedScriptExecutionAction POST,GET y API APP ADMIN
/_dr/task/expandBillingRecurrences ExpandBillingRecurrencesAction GET n API APP ADMIN
/_dr/task/exportDomainLists ExportDomainListsAction POST n API APP ADMIN
/_dr/task/exportPremiumTerms ExportPremiumTermsAction POST n API APP ADMIN
/_dr/task/exportReservedTerms ExportReservedTermsAction POST n API APP ADMIN
/_dr/task/generateInvoices GenerateInvoicesAction POST n API APP ADMIN
/_dr/task/generateSpec11 GenerateSpec11ReportAction POST n API APP ADMIN
/_dr/task/generateZoneFiles GenerateZoneFilesAction POST n API APP ADMIN
/_dr/task/icannReportingStaging IcannReportingStagingAction POST n API APP ADMIN
/_dr/task/icannReportingUpload IcannReportingUploadAction POST n API APP ADMIN
/_dr/task/nordnUpload NordnUploadAction POST y API APP ADMIN
/_dr/task/nordnVerify NordnVerifyAction POST y API APP ADMIN
/_dr/task/publishDnsUpdates PublishDnsUpdatesAction POST y API APP ADMIN
/_dr/task/publishInvoices PublishInvoicesAction POST n API APP ADMIN
/_dr/task/publishSpec11 PublishSpec11ReportAction POST n API APP ADMIN
/_dr/task/rdeReport RdeReportAction POST n API APP ADMIN
/_dr/task/rdeStaging RdeStagingAction GET,POST n API APP ADMIN
/_dr/task/rdeUpload RdeUploadAction POST n API APP ADMIN
/_dr/task/readDnsRefreshRequests ReadDnsRefreshRequestsAction POST y API APP ADMIN
/_dr/task/refreshDnsForAllDomains RefreshDnsForAllDomainsAction GET n API APP ADMIN
/_dr/task/refreshDnsOnHostRename RefreshDnsOnHostRenameAction POST n API APP ADMIN
/_dr/task/relockDomain RelockDomainAction POST y API APP ADMIN
/_dr/task/resaveAllEppResourcesPipeline ResaveAllEppResourcesPipelineAction GET n API APP ADMIN
/_dr/task/resaveEntity ResaveEntityAction POST n API APP ADMIN
/_dr/task/sendExpiringCertificateNotificationEmail SendExpiringCertificateNotificationEmailAction GET n API APP ADMIN
/_dr/task/syncGroupMembers SyncGroupMembersAction POST n API APP ADMIN
/_dr/task/syncRegistrarsSheet SyncRegistrarsSheetAction POST n API APP ADMIN
/_dr/task/tmchCrl TmchCrlAction POST y API APP ADMIN
/_dr/task/tmchDnl TmchDnlAction POST y API APP ADMIN
/_dr/task/tmchSmdrl TmchSmdrlAction POST y API APP ADMIN
/_dr/task/updateRegistrarRdapBaseUrls UpdateRegistrarRdapBaseUrlsAction GET y API APP ADMIN
/_dr/task/uploadBsaUnavailableNames UploadBsaUnavailableDomainsAction GET,POST n API APP ADMIN
/_dr/task/wipeOutContactHistoryPii WipeOutContactHistoryPiiAction GET n API APP ADMIN
/_dr/whois WhoisAction POST n API APP ADMIN
/check CheckApiAction GET n API NONE PUBLIC
/console-api/domain ConsoleDomainGetAction GET n API,LEGACY USER PUBLIC
/console-api/domain-list ConsoleDomainListAction GET n API,LEGACY USER PUBLIC
/console-api/registrars RegistrarsAction GET,POST n API,LEGACY USER PUBLIC
/console-api/settings/contacts ContactAction GET,POST n API,LEGACY USER PUBLIC
/console-api/settings/security SecurityAction POST n API,LEGACY USER PUBLIC
/console-api/settings/whois-fields WhoisRegistrarFieldsAction POST n API,LEGACY USER PUBLIC
/console-api/userdata ConsoleUserDataAction GET n API,LEGACY USER PUBLIC
/rdap/autnum/(*) RdapAutnumAction GET,HEAD n API NONE PUBLIC
/rdap/domain/(*) RdapDomainAction GET,HEAD n API NONE PUBLIC
/rdap/domains RdapDomainSearchAction GET,HEAD n API NONE PUBLIC
/rdap/entities RdapEntitySearchAction GET,HEAD n API NONE PUBLIC
/rdap/entity/(*) RdapEntityAction GET,HEAD n API NONE PUBLIC
/rdap/help(*) RdapHelpAction GET,HEAD n API NONE PUBLIC
/rdap/ip/(*) RdapIpAction GET,HEAD n API NONE PUBLIC
/rdap/nameserver/(*) RdapNameserverAction GET,HEAD n API NONE PUBLIC
/rdap/nameservers RdapNameserverSearchAction GET,HEAD n API NONE PUBLIC
/registrar ConsoleUiAction GET n API,LEGACY NONE PUBLIC
/registrar-create ConsoleRegistrarCreatorAction POST,GET n API,LEGACY NONE PUBLIC
/registrar-ote-setup ConsoleOteSetupAction POST,GET n API,LEGACY NONE PUBLIC
/registrar-ote-status OteStatusAction POST n API,LEGACY USER PUBLIC
/registrar-settings RegistrarSettingsAction POST n API,LEGACY USER PUBLIC
/registry-lock-get RegistryLockGetAction GET n API,LEGACY USER PUBLIC
/registry-lock-post RegistryLockPostAction POST n API,LEGACY USER PUBLIC
/registry-lock-verify RegistryLockVerifyAction GET n API,LEGACY NONE PUBLIC
/whois/(*) WhoisHttpAction GET n API NONE PUBLIC