diff --git a/GEMINI.md b/GEMINI.md index 0c983023c..f519d0349 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -57,6 +57,7 @@ This document outlines foundational mandates, architectural patterns, and projec - **FakeClock and Sleeper:** Use `FakeClock` and `Sleeper` for any logic involving timeouts, delays, or expiration. - **Empirical Reproduction:** Before fixing a bug, always create a test case that reproduces the failure. - **Base Classes:** Leverage `CommandTestCase`, `EppToolCommandTestCase`, etc., to reduce boilerplate and ensure consistent setup (e.g., clock initialization). +- **Gradle Test Patterns:** When running tests to investigate fixes in the "core" directory, try to first use the "standardTest" Gradle task. It is faster than the "test" task, which includes the "fragileTest" task. Only run the full "test" task after "standardTest" succeeds. ### 6. Project Dependencies - **Common Module:** When using `Clock` or other core utilities in a new or separate module (like `load-testing`), ensure `implementation project(':common')` is added to the module's `build.gradle`. diff --git a/core/src/main/java/google/registry/beam/rde/RdeIO.java b/core/src/main/java/google/registry/beam/rde/RdeIO.java index f772ee99d..a945a3e37 100644 --- a/core/src/main/java/google/registry/beam/rde/RdeIO.java +++ b/core/src/main/java/google/registry/beam/rde/RdeIO.java @@ -220,6 +220,9 @@ public class RdeIO { } } + output.write(marshaller.marshalRdeEppParams()); + counter.increment(RdeResourceType.EPP_PARAMS); + // Output XML that says how many resources were emitted. header = counter.makeHeader(tld, mode); output.write(marshaller.marshalOrDie(new XjcRdeHeaderElement(header))); diff --git a/core/src/main/java/google/registry/rde/RdeMarshaller.java b/core/src/main/java/google/registry/rde/RdeMarshaller.java index 4d79b075b..2c638e48d 100644 --- a/core/src/main/java/google/registry/rde/RdeMarshaller.java +++ b/core/src/main/java/google/registry/rde/RdeMarshaller.java @@ -20,15 +20,26 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.flogger.FluentLogger; import google.registry.model.ImmutableObject; import google.registry.model.domain.Domain; +import google.registry.model.eppcommon.ProtocolDefinition; import google.registry.model.host.Host; import google.registry.model.rde.RdeMode; import google.registry.model.registrar.Registrar; import google.registry.tldconfig.idn.IdnTable; import google.registry.xjc.XjcXmlTransformer; +import google.registry.xjc.epp.XjcEppDcpAccessType; +import google.registry.xjc.epp.XjcEppDcpOursType; +import google.registry.xjc.epp.XjcEppDcpPurposeType; +import google.registry.xjc.epp.XjcEppDcpRecipientType; +import google.registry.xjc.epp.XjcEppDcpRetentionType; +import google.registry.xjc.epp.XjcEppDcpStatementType; +import google.registry.xjc.epp.XjcEppDcpType; +import google.registry.xjc.epp.XjcEppExtURIType; import google.registry.xjc.rde.XjcRdeContentsType; import google.registry.xjc.rde.XjcRdeDeposit; import google.registry.xjc.rde.XjcRdeDepositTypeType; import google.registry.xjc.rde.XjcRdeMenuType; +import google.registry.xjc.rdeeppparams.XjcRdeEppParams; +import google.registry.xjc.rdeeppparams.XjcRdeEppParamsElement; import google.registry.xjc.rdeidn.XjcRdeIdn; import google.registry.xjc.rdeidn.XjcRdeIdnElement; import google.registry.xjc.rdepolicy.XjcRdePolicy; @@ -151,6 +162,43 @@ public final class RdeMarshaller implements Serializable { return marshalOrDie(new XjcRdeIdnElement(bean)); } + public String marshalRdeEppParams() { + XjcRdeEppParams bean = new XjcRdeEppParams(); + bean.getVersions().add("1.0"); + bean.getLangs().add("en"); + bean.getObjURIs().add(RdeResourceType.DOMAIN.getUri()); + bean.getObjURIs().add(RdeResourceType.HOST.getUri()); + + XjcEppExtURIType serviceExtensions = new XjcEppExtURIType(); + serviceExtensions.getExtURIs().addAll(ProtocolDefinition.getVisibleServiceExtensionUris()); + bean.setSvcExtension(serviceExtensions); + + XjcEppDcpType dcpType = new XjcEppDcpType(); + XjcEppDcpAccessType accessType = new XjcEppDcpAccessType(); + accessType.setAll(new XjcEppDcpAccessType.All()); + dcpType.setAccess(accessType); + + XjcEppDcpStatementType statementType = new XjcEppDcpStatementType(); + + XjcEppDcpPurposeType purposeType = new XjcEppDcpPurposeType(); + purposeType.setAdmin(new XjcEppDcpPurposeType.Admin()); + purposeType.setProv(new XjcEppDcpPurposeType.Prov()); + statementType.setPurpose(purposeType); + + XjcEppDcpRecipientType recipientType = new XjcEppDcpRecipientType(); + recipientType.getOurs().add(new XjcEppDcpOursType()); + recipientType.setPublic(new XjcEppDcpRecipientType.Public()); + statementType.setRecipient(recipientType); + + XjcEppDcpRetentionType retentionType = new XjcEppDcpRetentionType(); + retentionType.setStated(new XjcEppDcpRetentionType.Stated()); + statementType.setRetention(retentionType); + + dcpType.getStatements().add(statementType); + bean.setDcp(dcpType); + return marshalOrDie(new XjcRdeEppParamsElement(bean)); + } + private DepositFragment marshalResource( RdeResourceType type, ImmutableObject resource, JAXBElement element) { String xml = ""; diff --git a/core/src/main/java/google/registry/rde/RdeResourceType.java b/core/src/main/java/google/registry/rde/RdeResourceType.java index 8e31a870c..c8b80d551 100644 --- a/core/src/main/java/google/registry/rde/RdeResourceType.java +++ b/core/src/main/java/google/registry/rde/RdeResourceType.java @@ -29,7 +29,8 @@ public enum RdeResourceType { HOST("urn:ietf:params:xml:ns:rdeHost-1.0", EnumSet.of(FULL)), REGISTRAR("urn:ietf:params:xml:ns:rdeRegistrar-1.0", EnumSet.of(FULL, THIN)), IDN("urn:ietf:params:xml:ns:rdeIDN-1.0", EnumSet.of(FULL)), - HEADER("urn:ietf:params:xml:ns:rdeHeader-1.0", EnumSet.of(FULL, THIN)); + HEADER("urn:ietf:params:xml:ns:rdeHeader-1.0", EnumSet.of(FULL, THIN)), + EPP_PARAMS("urn:ietf:params:xml:ns:rdeEppParams-1.0", EnumSet.of(FULL, THIN)); private final String uri; private final ImmutableSet modes; diff --git a/core/src/main/java/google/registry/xml/xsd/epp.xsd b/core/src/main/java/google/registry/xml/xsd/epp.xsd index 6dad49765..6f42413c0 100644 --- a/core/src/main/java/google/registry/xml/xsd/epp.xsd +++ b/core/src/main/java/google/registry/xml/xsd/epp.xsd @@ -91,12 +91,12 @@ Data Collection Policy types. - - - - - - + + + + + + @@ -111,28 +111,29 @@ Data Collection Policy types. + minOccurs="0"> + minOccurs="0"> + minOccurs="0"> + minOccurs="0"> + minOccurs="0"> + minOccurs="0" maxOccurs="unbounded"/> + minOccurs="0"> + minOccurs="0"> + minOccurs="0"> + @@ -152,11 +153,11 @@ Data Collection Policy types. - - - - - + + + + + diff --git a/core/src/test/resources/google/registry/beam/rde/reducer_brda.xml b/core/src/test/resources/google/registry/beam/rde/reducer_brda.xml index 6cd6a4234..4f47d05de 100644 --- a/core/src/test/resources/google/registry/beam/rde/reducer_brda.xml +++ b/core/src/test/resources/google/registry/beam/rde/reducer_brda.xml @@ -4,6 +4,7 @@ 1.0 urn:ietf:params:xml:ns:rdeDomain-1.0 + urn:ietf:params:xml:ns:rdeEppParams-1.0 urn:ietf:params:xml:ns:rdeHeader-1.0 urn:ietf:params:xml:ns:rdeRegistrar-1.0 @@ -11,10 +12,45 @@ + + 1.0 + en + urn:ietf:params:xml:ns:rdeDomain-1.0 + urn:ietf:params:xml:ns:rdeHost-1.0 + + urn:ietf:params:xml:ns:launch-1.0 + urn:ietf:params:xml:ns:rgp-1.0 + urn:ietf:params:xml:ns:secDNS-1.1 + urn:ietf:params:xml:ns:fee-0.6 + urn:ietf:params:xml:ns:fee-0.11 + urn:ietf:params:xml:ns:fee-0.12 + urn:ietf:params:xml:ns:epp:fee-1.0 + + + + + + + + + + + + + + + + + + + + + soy 1 1 + 1 diff --git a/core/src/test/resources/google/registry/beam/rde/reducer_rde.xml b/core/src/test/resources/google/registry/beam/rde/reducer_rde.xml index 33a01e0c9..069493831 100644 --- a/core/src/test/resources/google/registry/beam/rde/reducer_rde.xml +++ b/core/src/test/resources/google/registry/beam/rde/reducer_rde.xml @@ -4,6 +4,7 @@ 1.0 urn:ietf:params:xml:ns:rdeDomain-1.0 + urn:ietf:params:xml:ns:rdeEppParams-1.0 urn:ietf:params:xml:ns:rdeHeader-1.0 urn:ietf:params:xml:ns:rdeHost-1.0 urn:ietf:params:xml:ns:rdeIDN-1.0 @@ -34,12 +35,47 @@ https://www.registry.google/about/policies/domainabuse/ + + 1.0 + en + urn:ietf:params:xml:ns:rdeDomain-1.0 + urn:ietf:params:xml:ns:rdeHost-1.0 + + urn:ietf:params:xml:ns:launch-1.0 + urn:ietf:params:xml:ns:rgp-1.0 + urn:ietf:params:xml:ns:secDNS-1.1 + urn:ietf:params:xml:ns:fee-0.6 + urn:ietf:params:xml:ns:fee-0.11 + urn:ietf:params:xml:ns:fee-0.12 + urn:ietf:params:xml:ns:epp:fee-1.0 + + + + + + + + + + + + + + + + + + + + + soy 1 1 1 4 + 1 diff --git a/core/src/test/resources/google/registry/beam/rde/reducer_rde_report.xml b/core/src/test/resources/google/registry/beam/rde/reducer_rde_report.xml index e9211a11e..5271f2c41 100644 --- a/core/src/test/resources/google/registry/beam/rde/reducer_rde_report.xml +++ b/core/src/test/resources/google/registry/beam/rde/reducer_rde_report.xml @@ -14,5 +14,6 @@ 1 1 4 + 1