Skip to content

Commit

Permalink
Add a test to ensure all actions are routable by the RegistryServlet (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
jianglai committed Mar 12, 2024
1 parent e881f25 commit 6acb14c
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@
VoidDnsWriterModule.class,
WhiteboxModule.class,
})
interface BackendRequestComponent {
public interface BackendRequestComponent {

BrdaCopyAction brdaCopyAction();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

@RequestScope
@Subcomponent(modules = {RequestModule.class, UrlConnectionServiceModule.class})
interface BsaRequestComponent {
public interface BsaRequestComponent {

BsaDownloadAction bsaDownloadAction();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
RequestModule.class,
WhiteboxModule.class,
})
interface FrontendRequestComponent {
public interface FrontendRequestComponent {
ConsoleDomainGetAction consoleDomainGetAction();

ConsoleDomainListAction consoleDomainListAction();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
WhiteboxModule.class,
WhoisModule.class,
})
interface PubApiRequestComponent {
public interface PubApiRequestComponent {
CheckApiAction checkApiAction();
RdapAutnumAction rdapAutnumAction();
RdapDomainAction rdapDomainAction();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
ToolsServerModule.class,
WhiteboxModule.class,
})
interface ToolsRequestComponent {
public interface ToolsRequestComponent {
CreateGroupsAction createGroupsAction();
EppToolAction eppToolAction();
FlowComponent.Builder flowComponentBuilder();
Expand Down
Original file line number Diff line number Diff line change
@@ -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));
}
}
}
10 changes: 4 additions & 6 deletions core/src/test/java/google/registry/testing/TestDataHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,12 @@ public static ImmutableMap<String, String> updateSubstitutions(
}

/**
* Loads a text file from the "testdata" directory relative to the location of the specified
* context class.
* Loads a text file from a directory with a relative path to the location of the specified
* context class under {@code src/test/resources/}.
*/
public static String loadFile(Class<?> context, String filename) {
return fileCache.computeIfAbsent(
FileKey.create(context, filename),
k -> readResourceUtf8(context, filename));
FileKey.create(context, filename), k -> readResourceUtf8(context, filename));
}

/**
Expand All @@ -101,8 +100,7 @@ public static String loadFile(
*/
public static ByteSource loadBytes(Class<?> context, String filename) {
return byteCache.computeIfAbsent(
FileKey.create(context, filename),
k -> readResourceBytes(context, filename));
FileKey.create(context, filename), k -> readResourceBytes(context, filename));
}

/**
Expand Down
82 changes: 82 additions & 0 deletions core/src/test/resources/google/registry/module/routing.txt
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 6acb14c

Please sign in to comment.