From 56fe588b565b3f051e226de9dde93e66be9c8f5f Mon Sep 17 00:00:00 2001 From: Ben McIlwain Date: Wed, 13 May 2026 12:07:19 -0400 Subject: [PATCH] Complete Joda-Time to java.time migration (#3039) This completes the exhaustive refactoring of foundational temporal types from Joda-Time to the native java.time API across the entire codebase. - Replaced org.joda.time.DateTime, Instant, LocalDate, and Duration with java.time equivalents. - Audited and updated Clock implementations (FakeClock, SystemClock). Added nowMillis(), nowDate(), and nowDateTime() to eliminate repetitive conversions and maintain parallel naming. - Replaced ZonedDateTime with OffsetDateTime globally per go/avoid-zdt. OffsetDateTime is a better fit as we use a hardcoded ZoneOffset.UTC throughout the system, making geographical time zone rules (like daylight saving time) irrelevant and preventing serialization ambiguities. Added a presubmit check. - Completely removed all transitional bridge methods from DateTimeUtils and deleted obsolete converters (e.g., DateTimeConverter). - Updated testing infrastructure, Apache Beam pipelines, custom JCommander parameters, and networking modules to solely rely on java.time primitives. - Retained the lone necessary org.joda.time.Instant usage in SafeBrowsingTransforms required by the Apache Beam API. - Cleared Gradle lockfiles and removed the joda-time dependency entirely from the build configuration. --- GEMINI.md | 52 +++------ common/build.gradle | 1 - common/gradle.lockfile | 1 - .../main/java/google/registry/util/Clock.java | 21 +++- .../google/registry/util/DateTimeUtils.java | 70 ++++------- .../google/registry/util/SystemClock.java | 7 +- .../google/registry/testing/FakeClock.java | 26 ----- config/nom_build.py | 1 - config/presubmits.py | 98 +++++----------- core/build.gradle | 3 - core/gradle.lockfile | 60 +++++----- .../batch/DeleteProberDataAction.java | 2 +- .../registry/beam/billing/BillingEvent.java | 5 +- .../registry/beam/common/RegistryQuery.java | 8 +- .../beam/spec11/SafeBrowsingTransforms.java | 9 +- .../bsa/persistence/DownloadScheduler.java | 6 +- .../registry/config/DelegatedCredentials.java | 2 +- .../registry/config/RegistryConfig.java | 5 +- .../config/files/cloud-tasks-queue.xml | 1 - .../google/registry/flows/EppTlsAction.java | 1 - .../StatelessRequestSessionMetadata.java | 2 - .../flows/contact/ContactCheckFlow.java | 1 - .../flows/contact/ContactCreateFlow.java | 1 - .../flows/contact/ContactDeleteFlow.java | 1 - .../flows/contact/ContactInfoFlow.java | 1 - .../contact/ContactTransferApproveFlow.java | 1 - .../contact/ContactTransferCancelFlow.java | 1 - .../contact/ContactTransferQueryFlow.java | 1 - .../contact/ContactTransferRejectFlow.java | 1 - .../contact/ContactTransferRequestFlow.java | 1 - .../flows/contact/ContactUpdateFlow.java | 1 - .../registry/keyring/api/KeySerializer.java | 1 - .../registry/loadtest/LoadTestModule.java | 7 +- .../google/registry/model/common/Cursor.java | 6 +- .../registry/model/common/TimeOfYear.java | 12 +- .../registry/model/contact/package-info.java | 4 +- .../google/registry/model/domain/Domain.java | 1 - .../registry/model/domain/DomainBase.java | 2 +- .../model/domain/DomainRenewData.java | 1 - .../model/domain/GracePeriodBase.java | 1 - .../registry/model/domain/fee/BaseFee.java | 2 +- .../fee/FeeCheckResponseExtensionItem.java | 1 - .../fee06/FeeInfoCommandExtensionV06.java | 1 - .../fee06/FeeInfoResponseExtensionV06.java | 1 - .../fee11/FeeCheckResponseExtensionV11.java | 1 - .../model/domain/launch/package-info.java | 4 +- .../model/domain/token/AllocationToken.java | 2 - .../registry/model/eppinput/package-info.java | 4 +- .../model/eppoutput/package-info.java | 4 +- .../poll/PollMessageExternalKeyConverter.java | 4 +- .../registry/model/poll/package-info.java | 4 +- .../model/transfer/BaseTransferObject.java | 1 - .../model/transfer/TransferResponse.java | 1 - .../registry/model/transfer/package-info.java | 4 +- .../monitoring/whitebox/CheckApiMetric.java | 1 - .../converter/DateTimeConverter.java | 43 ------- .../persistence/converter/MapUserType.java | 1 - .../secretmanager/SecretManagerModule.java | 1 - .../registry/rdap/AbstractJsonableObject.java | 26 ++--- .../registry/rdap/RdapDataStructures.java | 3 - .../google/registry/rdap/RdapMetrics.java | 1 - .../registry/rdap/RdapObjectClasses.java | 1 - .../registry/rdap/RdapSearchPattern.java | 1 - .../google/registry/rde/BrdaCopyAction.java | 1 - .../google/registry/rde/PendingDeposit.java | 1 - .../google/registry/rde/RdeReportAction.java | 1 - .../google/registry/rde/RdeUploadAction.java | 1 - .../java/google/registry/rde/RydeTar.java | 6 +- .../registry/reporting/ReportingModule.java | 3 +- .../reporting/billing/BillingModule.java | 1 - .../icann/IcannReportingUploadAction.java | 2 +- .../java/google/registry/request/Action.java | 1 - .../registry/request/RequestParameters.java | 48 -------- .../registry/security/XsrfTokenManager.java | 2 +- ...eateOrUpdateBulkPricingPackageCommand.java | 11 +- .../tools/CreateRegistrarGroupsCommand.java | 1 - .../tools/GenerateEscrowDepositCommand.java | 17 +-- .../tools/GenerateZoneFilesCommand.java | 6 +- .../tools/GetKeyringSecretCommand.java | 1 - .../java/google/registry/tools/GsonUtils.java | 4 +- .../registry/tools/SetupOteCommand.java | 1 - .../tools/UpdateKeyringSecretCommand.java | 1 - .../registry/tools/params/DateParameter.java | 28 ++--- .../tools/params/DateTimeParameter.java | 56 --------- .../tools/params/DurationParameter.java | 5 +- .../tools/params/InstantParameter.java | 17 ++- .../tools/params/IntervalParameter.java | 41 ------- .../tools/params/LocalDateParameter.java | 6 +- .../params/OptionalIntervalParameter.java | 21 ---- .../params/ParameterConverterValidator.java | 3 +- .../tools/params/ParameterFactory.java | 14 +-- .../tools/params/TransitionListParameter.java | 4 +- .../tools/params/YearMonthParameter.java | 5 +- .../tools/server/GenerateZoneFilesAction.java | 2 +- .../console/ConsoleDumDownloadAction.java | 4 +- .../google/registry/xml/PeriodAdapter.java | 2 +- .../registry/xml/UtcDateTimeAdapter.java | 68 ----------- .../registry/xml/UtcInstantAdapter.java | 27 ++--- .../main/resources/META-INF/persistence.xml | 1 - .../registry/batch/CloudTasksUtilsTest.java | 6 +- .../batch/ResaveEntityActionTest.java | 4 +- .../beam/common/RegistryJpaReadTest.java | 4 +- .../beam/common/RegistryJpaWriteTest.java | 4 +- .../registry/beam/rde/RdePipelineTest.java | 17 ++- .../beam/spec11/Spec11PipelineTest.java | 4 +- .../export/sheet/SyncRegistrarsSheetTest.java | 4 +- .../registry/flows/EppControllerTest.java | 4 +- .../registry/flows/EppLoggedOutTest.java | 1 - .../registry/flows/EppTestComponent.java | 1 - .../google/registry/flows/FlowTestCase.java | 5 +- .../flows/host/HostUpdateFlowTest.java | 1 - .../google/registry/model/EntityTestCase.java | 5 +- .../model/reporting/HistoryEntryDaoTest.java | 4 +- .../smd/SignedMarkRevocationListTest.java | 4 +- .../model/tld/label/ReservedListTest.java | 4 +- .../transfer/DomainTransferDataTest.java | 10 +- .../registry/mosapi/MosApiMetricsTest.java | 4 +- .../converter/DateTimeConverterTest.java | 109 ------------------ .../converter/LocalDateConverterTest.java | 5 +- .../transaction/JpaTestExtensions.java | 7 +- .../rdap/AbstractJsonableObjectTest.java | 9 +- .../registry/rdap/RdapActionBaseTest.java | 4 +- .../registry/rdap/RdapActionBaseTestCase.java | 6 +- .../rde/PendingDepositCheckerTest.java | 5 +- .../registry/rde/RdeMarshallerTest.java | 21 ++++ ...TransactionsReportingQueryBuilderTest.java | 2 - .../GenerateSpec11ReportActionTest.java | 7 +- .../request/RequestParametersTest.java | 22 ++-- .../schema/registrar/RegistrarDaoTest.java | 5 +- .../registry/testing/CloudTasksHelper.java | 5 - .../testing/ConsoleApiParamsUtils.java | 4 +- .../registry/testing/DomainSubject.java | 18 --- .../registry/testing/HistoryEntrySubject.java | 9 +- .../registry/tmch/SmdrlCsvParserTest.java | 9 +- .../registry/tools/CommandTestCase.java | 4 +- .../GenerateAllocationTokensCommandTest.java | 22 ++-- .../GenerateEscrowDepositCommandTest.java | 7 +- .../tools/GenerateLordnCommandTest.java | 4 +- .../registry/tools/GetDomainCommandTest.java | 1 - .../registry/tools/GetUserCommandTest.java | 1 - .../registry/tools/ShellCommandTest.java | 36 +++--- .../tools/UpdateDomainCommandTest.java | 1 - .../tools/UpdateRegistrarCommandTest.java | 17 ++- .../ValidateLoginCredentialsCommandTest.java | 3 +- ...RecreateBillingRecurrencesCommandTest.java | 1 - .../tools/params/DateParameterTest.java | 24 ++-- .../tools/params/DurationParameterTest.java | 22 ++-- ...terTest.java => InstantParameterTest.java} | 39 +++---- .../tools/params/IntervalParameterTest.java | 71 ------------ .../params/KeyValueMapParameterTest.java | 1 - .../tools/params/YearMonthParameterTest.java | 13 ++- .../tools/server/ListHostsActionTest.java | 4 +- .../tools/server/ListTldsActionTest.java | 4 +- .../console/ConsoleActionBaseTestCase.java | 4 +- .../console/ConsoleHistoryDataActionTest.java | 1 - .../ConsoleRegistryLockVerifyActionTest.java | 4 +- .../PasswordResetVerifyActionTest.java | 6 +- .../console/settings/SecurityActionTest.java | 1 - .../webdriver/ConsoleScreenshotTest.java | 1 - ...erTest.java => UtcInstantAdapterTest.java} | 36 +++--- .../google/registry/xml/XmlTestUtils.java | 20 ++-- .../google/registry/beam/rde/reducer_brda.xml | 2 +- .../google/registry/beam/rde/reducer_rde.xml | 2 +- .../registry/beam/rde/reducer_rde_report.xml | 4 +- ...domain_pending_action_immediate_delete.xml | 1 - .../rde/deposit_full_out_of_order.xml | 2 - db/buildscript-gradle.lockfile | 4 +- db/gradle.lockfile | 5 +- .../flyway/V113__add_host_missing_indexes.sql | 1 - ..._columns_in_billing_cancellation_table.sql | 1 - .../flyway/V125__create_package_promotion.sql | 1 - ...create_allocateId_sequence_alternative.sql | 1 - ...add_login_email_column_to_registrarpoc.sql | 1 - ...2__drop_gae_user_id_from_registrar_poc.sql | 1 - ...me_column_in_dns_refresh_request_table.sql | 3 - .../sql/flyway/V142__drop_request_log_id.sql | 1 - .../flyway/V147__drop_gaia_id_from_user.sql | 1 - .../sql/flyway/V25__rename_vkey_fields.sql | 1 - .../V43__update_relock_duration_type.sql | 1 - .../sql/flyway/V80__defer_bill_event_key.sql | 1 - .../V89__host_history_host_deferred.sql | 1 - .../V95__add_contacts_indexes_on_domain.sql | 1 - dependencies.gradle | 1 - jetty/gradle.lockfile | 4 +- load-testing/build.gradle | 1 - load-testing/gradle.lockfile | 1 - .../google/registry/client/EppClient.java | 36 +++--- .../registry/client/EppClientHandler.java | 13 +-- networking/gradle.lockfile | 1 - .../handler/SslClientInitializerTest.java | 16 ++- .../handler/SslInitializerTestUtils.java | 17 ++- prober/build.gradle | 1 - prober/gradle.lockfile | 1 - .../monitoring/blackbox/ProberModule.java | 4 +- .../monitoring/blackbox/ProbingSequence.java | 12 +- .../monitoring/blackbox/ProbingStep.java | 8 +- .../blackbox/connection/ProbingAction.java | 6 +- .../blackbox/module/CertificateModule.java | 10 +- .../monitoring/blackbox/module/EppModule.java | 2 +- .../monitoring/blackbox/token/EppToken.java | 3 +- .../blackbox/ProbingSequenceTest.java | 14 +-- .../monitoring/blackbox/ProbingStepTest.java | 2 +- .../connection/ProbingActionTest.java | 2 +- proxy/build.gradle | 1 - proxy/gradle.lockfile | 1 - .../google/registry/proxy/ProxyModule.java | 1 - .../verify_deployed_sql_schema.sh | 1 - util/build.gradle | 1 - util/gradle.lockfile | 1 - .../registry/util/DateTimeTypeAdapter.java | 28 ----- .../registry/util/DurationTypeAdapter.java | 2 +- .../google/registry/util/PosixTarHeader.java | 20 ++-- .../google/registry/util/RegistrarUtils.java | 1 - .../registry/util/SafeObjectInputStream.java | 4 +- .../java/google/registry/util/YamlUtils.java | 1 - .../registry/util/DateTimeUtilsTest.java | 48 +++----- .../registry/util/PosixTarHeaderTest.java | 42 ++++--- .../util/SafeObjectInputStreamTest.java | 4 +- 218 files changed, 589 insertions(+), 1390 deletions(-) delete mode 100644 core/src/main/java/google/registry/persistence/converter/DateTimeConverter.java delete mode 100644 core/src/main/java/google/registry/tools/params/DateTimeParameter.java delete mode 100644 core/src/main/java/google/registry/tools/params/IntervalParameter.java delete mode 100644 core/src/main/java/google/registry/tools/params/OptionalIntervalParameter.java delete mode 100644 core/src/main/java/google/registry/xml/UtcDateTimeAdapter.java delete mode 100644 core/src/test/java/google/registry/persistence/converter/DateTimeConverterTest.java rename core/src/test/java/google/registry/tools/params/{DateTimeParameterTest.java => InstantParameterTest.java} (62%) delete mode 100644 core/src/test/java/google/registry/tools/params/IntervalParameterTest.java rename core/src/test/java/google/registry/xml/{UtcDateTimeAdapterTest.java => UtcInstantAdapterTest.java} (50%) delete mode 100644 util/src/main/java/google/registry/util/DateTimeTypeAdapter.java diff --git a/GEMINI.md b/GEMINI.md index f519d0349..fc9702e11 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -13,21 +13,14 @@ This document outlines foundational mandates, architectural patterns, and projec - **Verification**: Before finalizing any change, scan the imports section for redundancy. - **License Headers**: When creating new files, ensure the license header uses the current year (e.g., 2026). Existing files should retain their original year. -## 2. Time and Precision Handling (java.time Migration) +## 2. Time and Precision Handling -- **Idiomatic java.time Usage:** Avoid redundant conversions between `Instant` and `DateTime`. If a field or parameter is an `Instant`, use it directly. Do not convert to `DateTime` just to call a deprecated method if an `Instant` alternative exists or can be easily created. Furthermore, you should not call `toInstant()` or `toDateTime()` conversion methods when not strictly necessary; always prefer to use an alternative method that returns the correct type if one exists (e.g. use `tm().getTxTime()` which returns an `Instant` instead of calling `tm().getTransactionTime().toInstant()`). -- **CRITICAL MISTAKES TO AVOID:** - - NEVER use `toInstant(clock.nowUtc())` or `toInstant(fakeClock.nowUtc())`. Both `Clock` and `FakeClock` have a `now()` method that natively returns a `java.time.Instant`. You MUST use `clock.now()` or `fakeClock.now()` directly. - - NEVER double-wrap conversions like `toInstant(toDateTime(...))` or `toDateTime(toInstant(...))`. - - NEVER mark method parameters or local variables as `final` unnecessarily, as it clutters the codebase. For class fields and constants, use `final` where applicable (i.e. when the field is assigned once and never mutated) to enforce and communicate immutability. - - When using test helpers like `assertThatCommand().atTime(...)` or `ForeignKeyUtils.loadResource(...)`, ALWAYS use the `Instant` overloads. DO NOT wrap `Instant` instances in `toDateTime(...)` just to pass them to deprecated overloads. - **UTC Timezones:** Do not use `ZoneId.of("UTC")`. Use a statically imported `UTC` from `ZoneOffset` instead (`import static java.time.ZoneOffset.UTC;`). -- **Millisecond Precision:** Always truncate `Instant.now()` to milliseconds (using `.truncatedTo(ChronoUnit.MILLIS)`) to maintain consistency with Joda `DateTime` and the PostgreSQL schema (which enforces millisecond precision via JPA converters). - **Clock Injection:** - - Avoid direct calls to `Instant.now()`, `DateTime.now()`, `ZonedDateTime.now()`, or `System.currentTimeMillis()`. + - Avoid direct calls to `Instant.now()`, `OffsetDateTime.now()`, or `System.currentTimeMillis()`. - Inject `google.registry.util.Clock` (production) or `google.registry.testing.FakeClock` (tests). - - Use `clock.nowDate()` to get a `ZonedDateTime` in UTC. - - When defining timestamps for tests, prefer using a fixed, static constant (e.g., `Instant.parse("2024-03-27T10:15:30.105Z")`) over capturing `clock.now()` to prevent flaky tests caused by the passage of real time. Avoid using the Unix epoch (`START_INSTANT`) unless specifically testing epoch-related logic; instead, use realistic dates and vary them across different test suites to ensure logic isn't dependent on a specific "standard" date. + - Use `clock.nowDate()` to get a `LocalDate` in UTC, or `clock.nowDateTime()` to get an `OffsetDateTime` in UTC. + - When defining timestamps for tests, prefer using a fixed, static constant (e.g., `Instant.parse("2024-03-27T10:15:30.105Z")`) over capturing `clock.now()` to prevent flaky tests caused by the passage of real time. - **Beam Pipelines:** - Ensure `Clock` is serializable (it is by default in this project) when used in Beam `DoFn`s. - Pass the `Clock` through the constructor or via Dagger provider methods in the pipeline module. @@ -42,7 +35,6 @@ This document outlines foundational mandates, architectural patterns, and projec - **Test Components:** Use `TestRegistryToolComponent` for command-line tool tests to bridge the gap between `main` and `nonprod/test` source sets. ### 4. Database Consistency -- **JPA Converters:** Be aware that JPA converters (like `DateTimeConverter`) may perform truncation or transformation. Ensure application-level logic matches these transformations to avoid "dirty" state or unexpected diffs. - **Transaction Management:** - **Top-Level:** Define database transactions (`tm().transact(...)`) at the highest possible level in the call chain (e.g., in an Action, a Command, or a Flow). This ensures all operations are atomic and handled by the retry logic. - **DAO Methods:** Avoid declaring transactions inside low-level DAO methods. Use `tm().assertInTransaction()` to ensure that these methods are only called within a valid transactional context. @@ -96,9 +88,8 @@ This document captures high-level architectural patterns, lessons learned from l - **Transaction Management:** The codebase uses a custom wrapper around JPA. Always use `tm()` (from `TransactionManagerFactory`) to interact with the database. - **Dependency Injection:** Dagger 2 is used extensively. If you see "cannot find symbol" errors for classes starting with `Dagger...`, the project is in a state where annotation processing failed. Fix compilation in core models first to restore generated code. - **Value Types:** AutoValue and "ImmutableObject" patterns are dominant. Most models follow a `Buildable` pattern with a nested `Builder`. -- **Temporal Logic:** The project is migrating from Joda-Time to `java.time`. +- **Temporal Logic:** The project uses `java.time` for all temporal representations. - Core boundaries: `DateTimeUtils.START_INSTANT` (Unix Epoch) and `DateTimeUtils.END_INSTANT` (Long.MAX_VALUE / 1000). - - Year Arithmetic: Use `DateTimeUtils.plusYears()` and `DateTimeUtils.minusYears()` to handle February 29th logic correctly. ## Source Control - **Committing:** Always create a new commit on the branch if one hasn't been created yet for the branch's specific work. Only perform amending (`git commit --amend --no-edit`) for subsequent changes once the initial commit has been successfully created. @@ -116,14 +107,11 @@ This document captures high-level architectural patterns, lessons learned from l ## Self-Review Guidelines Before finalizing any PR or declaring a task complete, you MUST perform a thorough, rigorous self-review of your entire diff. Run `git diff HEAD^` (or review the staged changes) and actively verify the following against every modified line: -1. **Imports & FQNs:** Did I leave any fully-qualified class names or static variables inline? Did I add the necessary imports for them? *Crucial Exception:* If the file already imports a class with the identical name (e.g., it uses both `java.time.Duration` and `org.joda.time.Duration`), one MUST remain fully qualified to avoid a compilation conflict. -2. **Redundant Conversions:** Did I use `toDateTime(clock.now())` where `clock.nowUtc()` would suffice? Did I use `toDateTime(END_INSTANT)` instead of `END_OF_TIME`? Did I use `.toInstant()` or `.toDateTime()` on something that could be avoided by using a different method overload (e.g., `tm().getTxTime()`)? -3. **Verbose Math:** Did I write any verbose time conversions inline? Are there `DateTimeUtils` methods I should be using instead? If not, should I abstract this math into `DateTimeUtils`? -4. **Assertion Cleanliness:** Am I polluting test assertions with `toDateTime(...)` wraps? If so, I need to add overloaded assertions to the Truth Subjects instead. -5. **Diff Scope:** Are there any formatting-only changes in files that I did not functionally modify? If so, revert them. Does the total line count of the diff align with the approved scope (e.g., ~1,000 lines for migrations)? -6. **Commit Message:** Does the commit message title fit within 50 characters? Does the body encapsulate the entirety of the changes across the diff cleanly and professionally? -7. **Missing Tests & Coverage:** *Perform a structured check for any new methods or modified behavior.* Did I add a new utility method (like `plusMonths(Instant, int)`) or change core logic? If so, I MUST open the corresponding test file and write tests to cover the new functionality (including edge cases, negative values, and leap years) before considering the task complete. A code review is not thorough if it only checks for compilation. I must actively ensure every new branch of logic has a test. -8. **Package Lock:** Did I include `console-webapp/package-lock.json` in my diff? If so, I MUST revert it (`git checkout console-webapp/package-lock.json`) unless I explicitly intended to modify NPM dependencies. This file is often modified by the build process and should not be committed accidentally. +1. **Imports & FQNs:** Did I leave any fully-qualified class names or static variables inline? Did I add the necessary imports for them? *Crucial Exception:* If the file already imports a class with the identical name (e.g., it uses both `java.util.Date` and `java.sql.Date`), one MUST remain fully qualified to avoid a compilation conflict. +2. **Diff Scope:** Are there any formatting-only changes in files that I did not functionally modify? If so, revert them. Does the total line count of the diff align with the approved scope (e.g., ~1,000 lines for migrations)? +3. **Commit Message:** Does the commit message title fit within 50 characters? Does the body encapsulate the entirety of the changes across the diff cleanly and professionally? +4. **Missing Tests & Coverage:** *Perform a structured check for any new methods or modified behavior.* Did I add a new utility method (like `plusMonths(Instant, int)`) or change core logic? If so, I MUST open the corresponding test file and write tests to cover the new functionality (including edge cases, negative values, and leap years) before considering the task complete. A code review is not thorough if it only checks for compilation. I must actively ensure every new branch of logic has a test. +5. **Package Lock:** Did I include `console-webapp/package-lock.json` in my diff? If so, I MUST revert it (`git checkout console-webapp/package-lock.json`) unless I explicitly intended to modify NPM dependencies. This file is often modified by the build process and should not be committed accidentally. Only after actively confirming these checks against your diff are you permitted to finalize the task. @@ -132,30 +120,16 @@ Only after actively confirming these checks against your diff are you permitted ### 1. Compiler Warnings are Errors (`-Werror`) This project treats Error Prone warnings as errors. -- **`@InlineMeSuggester`**: When creating deprecated Joda-Time bridge methods (e.g., `getTimestamp() -> return toDateTime(getTimestampInstant())`), you **MUST** immediately add `@SuppressWarnings("InlineMeSuggester")`. If you don't, the build will fail. - **Repeatable Annotations**: `@SuppressWarnings` is **NOT** repeatable in this environment. If a method or class already has a suppression (e.g., `@SuppressWarnings("unchecked")`), you must merge them: - - ❌ `@SuppressWarnings("unchecked") @SuppressWarnings("InlineMeSuggester")` - - ✅ `@SuppressWarnings({"unchecked", "InlineMeSuggester"})` + - ❌ `@SuppressWarnings("unchecked") @SuppressWarnings("MustBeClosedChecker")` + - ✅ `@SuppressWarnings({"unchecked", "MustBeClosedChecker"})` -### 2. Resolving Ambiguity -- **Null Overloads**: Adding an `Instant` overload to a method that previously took `DateTime` will break all `create(null)` calls. You must cast them: `create((Instant) null)`. -- **Type Erasure**: Methods taking `Optional` and `Optional` will clash due to erasure. Use distinct names, e.g., `setAutorenewEndTimeInstant(Optional time)`. - -### 3. Build Strategy -- **Surgical Changes**: In large-scale migrations, focus on "leaf" nodes first (Utilities -> Models -> Flows -> Actions). -- **PR Size**: Minimize PR size by retaining Joda-Time bridge methods for high-level "Action" and "Flow" classes unless a full migration is requested. Reverting changes to DNS and Reporting logic while updating the underlying models is a valid strategy to keep PRs reviewable. +### 2. Build Strategy - **Validation**: Always run `./gradlew build -x test` before attempting to run unit tests. Unit tests will not run if there are compilation errors in any part of the `core` module. Before finalizing a PR or declaring a task done, you MUST verify your changes. **Prefer scoped builds** (e.g., `./gradlew :core:build`) if you are only modifying backend Java code. Running the global `./gradlew build` triggers the frontend `console-webapp` build, which unnecessarily runs `npmInstallDeps` and modifies `package-lock.json`. If you must run a global build, you must revert `console-webapp/package-lock.json` afterwards. Do not declare success if formatting checks (e.g., `spotlessCheck` or `javaIncrementalFormatCheck`) or tests fail. If formatting fails, run `./gradlew spotlessApply` and then re-run your build command to verify everything passes. ## 🚫 Common Pitfalls to Avoid -- **Mixing Joda and Java Durations:** Methods like `Tld.get().getRenewGracePeriodLength()` return a **Joda** `Duration`, which cannot be passed directly to `Instant.plus(...)` because it doesn't implement `TemporalAmount`. You MUST use `.plusMillis(duration.getMillis())` instead. - **Serialization Precision (`.000Z`):** When asserting against or generating XML/YAML files, remember that millisecond precision (`.000Z`) is required. Always use `DateTimeUtils.formatInstant(...)` to format `Instant` objects (it preserves the `.000Z` suffix) instead of `Instant.toString()` (which drops it for exact seconds). We have added custom Jackson `InstantKeySerializer`s for this purpose, but you must keep this precision in mind when manually updating `.xml` or `.yaml` test data. -- **Static Imports:** Methods like `toDateTime`, `toInstant`, `plusYears`, `plusMonths`, and `minusDays` from `DateTimeUtils` MUST be statically imported. Do NOT use them fully qualified (e.g., `DateTimeUtils.plusMonths(...)`). - -- **Redundant Parses:** Never write `toDateTime(Instant.parse(...))` or `toInstant(DateTime.parse(...))`. If you need a `DateTime`, use `DateTime.parse(...)` directly. If you need an `Instant`, use `Instant.parse(...)` directly. -- **cloneProjectedAtTime vs cloneProjectedAtTime:** When converting tests and logic that use `clock.now()` to project resource state into the future or past, do not wrap the Java `Instant` in `toDateTime()` just to call `cloneProjectedAtTime()`. Instead, switch the method call to use the native `cloneProjectedAtTime()` method which is available on all `EppResource` models. -- **Do not go in circles with the build:** If you see an `InlineMeSuggester` error, apply the suppression to **ALL** similar methods in that file and related files in one turn. Do not fix them one by one. Furthermore, do not run a global `./gradlew build` when a scoped `./gradlew :core:build` or `./gradlew :core:test` is faster and more appropriate. Run global builds only when doing final verification. -- **Exception Conversion in Tests:** When migrating time types (e.g., from Joda `DateTime` to Java `Instant`), be extremely careful with tests that verify parsing failures (e.g., `assertThrows(IllegalArgumentException.class, ...)`). Joda's `DateTime.parse()` throws an `IllegalArgumentException` on failure, but `Instant.parse()` throws a `java.time.format.DateTimeParseException`. You must update the expected exception type in these tests to ensure they actually test the correct behavior, and verify the tests are not failing prematurely on the first line if it contains invalid data meant to be ignored. - Dagger/AutoValue corruption: If you modify a builder or a component incorrectly, Dagger will fail to generate code, leading to hundreds of "cannot find symbol" errors. If this happens, `git checkout` the last working state of the specific file and re-apply changes more surgically. - **`replace` tool context**: When using `replace` on large files (like `Tld.java` or `DomainBase.java`), provide significant surrounding context. These files have many similar method signatures (getters/setters) that can lead to incorrect replacements. diff --git a/common/build.gradle b/common/build.gradle index 168e06804..6ce5873c6 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -58,7 +58,6 @@ dependencies { implementation deps['com.google.code.findbugs:jsr305'] implementation deps['com.google.guava:guava'] implementation deps['jakarta.inject:jakarta.inject-api'] - implementation deps['joda-time:joda-time'] implementation deps['com.google.flogger:flogger'] implementation deps['io.github.java-diff-utils:java-diff-utils'] implementation deps['com.google.truth:truth'] diff --git a/common/gradle.lockfile b/common/gradle.lockfile index 21bf36b85..eea2bea6b 100644 --- a/common/gradle.lockfile +++ b/common/gradle.lockfile @@ -37,7 +37,6 @@ io.github.java-diff-utils:java-diff-utils:4.12=annotationProcessor,testAnnotatio io.github.java-diff-utils:java-diff-utils:4.16=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath,testing,testingCompileClasspath jakarta.inject:jakarta.inject-api:2.0.1=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath,testing,testingCompileClasspath javax.inject:javax.inject:1=annotationProcessor,testAnnotationProcessor,testingAnnotationProcessor -joda-time:joda-time:2.14.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath,testing,testingCompileClasspath junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath,testing,testingCompileClasspath net.sf.saxon:Saxon-HE:12.5=checkstyle org.antlr:antlr4-runtime:4.13.2=checkstyle diff --git a/common/src/main/java/google/registry/util/Clock.java b/common/src/main/java/google/registry/util/Clock.java index 8deec023c..8b602db48 100644 --- a/common/src/main/java/google/registry/util/Clock.java +++ b/common/src/main/java/google/registry/util/Clock.java @@ -16,15 +16,16 @@ package google.registry.util; import java.io.Serializable; import java.time.Instant; +import java.time.LocalDate; +import java.time.OffsetDateTime; import java.time.ZoneOffset; -import java.time.ZonedDateTime; import javax.annotation.concurrent.ThreadSafe; /** * A clock that tells the current time in milliseconds or nanoseconds. * *

Clocks are technically serializable because they are either a stateless wrapper around the - * system clock, or for testing, are just a wrapper around a DateTime. This means that if you + * system clock, or for testing, are just a wrapper around an Instant. This means that if you * serialize a clock and deserialize it elsewhere, you won't necessarily get the same time or time * zone -- what you will get is a functioning clock. */ @@ -34,8 +35,18 @@ public interface Clock extends Serializable { /** Returns current Instant (which is always in UTC). */ Instant now(); - /** Returns the current time as a {@link ZonedDateTime} in UTC. */ - default ZonedDateTime nowDate() { - return ZonedDateTime.ofInstant(now(), ZoneOffset.UTC); + /** Returns the current time as an {@link OffsetDateTime} in UTC. */ + default OffsetDateTime nowDateTime() { + return OffsetDateTime.ofInstant(now(), ZoneOffset.UTC); + } + + /** Returns the current time as a {@link LocalDate} in UTC. */ + default LocalDate nowDate() { + return LocalDate.ofInstant(now(), ZoneOffset.UTC); + } + + /** Returns the current time in milliseconds since the epoch. */ + default long nowMillis() { + return now().toEpochMilli(); } } diff --git a/common/src/main/java/google/registry/util/DateTimeUtils.java b/common/src/main/java/google/registry/util/DateTimeUtils.java index 95e8cf3aa..769d71421 100644 --- a/common/src/main/java/google/registry/util/DateTimeUtils.java +++ b/common/src/main/java/google/registry/util/DateTimeUtils.java @@ -15,7 +15,6 @@ package google.registry.util; import static com.google.common.base.Preconditions.checkArgument; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -24,14 +23,8 @@ import java.time.Instant; import java.time.LocalDate; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; -import java.time.format.SignStyle; -import java.time.temporal.ChronoField; import java.time.temporal.ChronoUnit; -import javax.annotation.Nullable; -import org.joda.time.DateTime; -import org.joda.time.ReadableDuration; public abstract class DateTimeUtils { @@ -52,15 +45,15 @@ public abstract class DateTimeUtils { * *

Example: {@code 2024-03-27T10:15:30.105Z} * - *

Handles large/negative years by using a sign prefix if necessary, compatible with {@link - * Instant#parse}. + *

Note: We deliberately strip the leading {@code +} sign from the formatted year field if + * present. While standard ISO 8601 specifies that years with more than 4 digits should be + * prefixed with a {@code +} sign, W3C XML Schema 1.0 (which our EPP RDE XSD uses) strictly + * forbids leading plus signs in {@code xsd:dateTime} strings. Suppressing the plus sign ensures + * our generated XML continues to pass strict XSD validation for large years (e.g. {@code + * 294247-01-10T04:00:54.775Z}). */ private static final DateTimeFormatter ISO_8601_FORMATTER = - new DateTimeFormatterBuilder() - .appendValue(ChronoField.YEAR, 4, 10, SignStyle.NOT_NEGATIVE) - .appendPattern("-MM-dd'T'HH:mm:ss.SSS'Z'") - .toFormatter() - .withZone(ZoneOffset.UTC); + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneOffset.UTC); /** A formatter that produces lowercase, filename-safe and job-name-safe timestamps. */ public static final DateTimeFormatter LOWERCASE_TIMESTAMP_FORMATTER = @@ -68,7 +61,8 @@ public abstract class DateTimeUtils { /** Formats an {@link Instant} to an ISO-8601 string. */ public static String formatInstant(Instant instant) { - return ISO_8601_FORMATTER.format(instant); + String formatted = ISO_8601_FORMATTER.format(instant); + return formatted.startsWith("+") ? formatted.substring(1) : formatted; } /** @@ -79,9 +73,15 @@ public abstract class DateTimeUtils { * large years (e.g. {@code 294247-01-10T04:00:54.775Z}). */ public static Instant parseInstant(String timestamp) { + if (!timestamp.startsWith("+") && !timestamp.startsWith("-")) { + int dashIndex = timestamp.indexOf('-'); + if (dashIndex > 4) { + timestamp = "+" + timestamp; + } + } try { // Try the standard millisecond precision format first. - return Instant.from(ISO_8601_FORMATTER.parse(timestamp)); + return Instant.from(DateTimeFormatter.ISO_INSTANT.parse(timestamp)); } catch (DateTimeParseException e) { // Fall back to the standard ISO instant parser which handles varied precision. return Instant.parse(timestamp); @@ -93,7 +93,7 @@ public abstract class DateTimeUtils { return earliestOf(Lists.asList(first, rest)); } - /** Returns the earliest element in a {@link Instant} iterable. */ + /** Returns the earliest element in an {@link Instant} iterable. */ public static Instant earliestOf(Iterable instants) { checkArgument(!Iterables.isEmpty(instants)); return Ordering.natural().min(instants); @@ -104,24 +104,12 @@ public abstract class DateTimeUtils { return latestOf(Lists.asList(first, rest)); } - /** Returns the latest element in a {@link Instant} iterable. */ + /** Returns the latest element in an {@link Instant} iterable. */ public static Instant latestOf(Iterable instants) { checkArgument(!Iterables.isEmpty(instants)); return Ordering.natural().max(instants); } - /** Converts a Joda-Time Duration to a java.time.Duration. */ - @Nullable - public static java.time.Duration toJavaDuration(@Nullable ReadableDuration duration) { - return duration == null ? null : java.time.Duration.ofMillis(duration.getMillis()); - } - - /** Converts a java.time.Duration to a Joda-Time Duration. */ - @Nullable - public static org.joda.time.Duration toJodaDuration(@Nullable java.time.Duration duration) { - return duration == null ? null : org.joda.time.Duration.millis(duration.toMillis()); - } - /** Returns whether the first {@link Instant} is equal to or earlier than the second. */ public static boolean isBeforeOrAt(Instant timeToCheck, Instant timeToCompareTo) { return !timeToCheck.isAfter(timeToCompareTo); @@ -134,7 +122,7 @@ public abstract class DateTimeUtils { /** * Adds years to a date, in the {@code Duration} sense of semantic years. Use this instead of - * {@link java.time.ZonedDateTime#plusYears} to ensure that we never end up on February 29. + * {@link java.time.OffsetDateTime#plusYears} to ensure that we never end up on February 29. */ public static Instant plusYears(Instant now, int years) { checkArgument(years >= 0); @@ -157,7 +145,7 @@ public abstract class DateTimeUtils { /** * Subtracts years from a date, in the {@code Duration} sense of semantic years. Use this instead - * of {@link java.time.ZonedDateTime#minusYears} to ensure that we never end up on February 29. + * of {@link java.time.OffsetDateTime#minusYears} to ensure that we never end up on February 29. */ public static Instant minusYears(Instant now, long years) { checkArgument(years >= 0); @@ -171,24 +159,6 @@ public abstract class DateTimeUtils { return instant.atZone(ZoneOffset.UTC).toLocalDate(); } - /** Convert a joda {@link DateTime} to a java.time {@link Instant}, null-safe. */ - @Nullable - public static Instant toInstant(@Nullable DateTime dateTime) { - return (dateTime == null) ? null : Instant.ofEpochMilli(dateTime.getMillis()); - } - - /** Convert a java.time {@link Instant} to a joda {@link DateTime}, null-safe. */ - @Nullable - public static DateTime toDateTime(@Nullable Instant instant) { - return (instant == null) ? null : new DateTime(instant.toEpochMilli(), UTC); - } - - /** Convert a java.time {@link java.time.Instant} to a joda {@link org.joda.time.Instant}. */ - @Nullable - public static org.joda.time.Instant toJodaInstant(@Nullable java.time.Instant instant) { - return (instant == null) ? null : org.joda.time.Instant.ofEpochMilli(instant.toEpochMilli()); - } - public static Instant plusHours(Instant instant, long hours) { return instant.plus(hours, ChronoUnit.HOURS); } diff --git a/common/src/main/java/google/registry/util/SystemClock.java b/common/src/main/java/google/registry/util/SystemClock.java index ac699d754..1c050734f 100644 --- a/common/src/main/java/google/registry/util/SystemClock.java +++ b/common/src/main/java/google/registry/util/SystemClock.java @@ -31,10 +31,9 @@ public class SystemClock implements Clock { @Override public Instant now() { - // Truncate to milliseconds to match the precision of Joda DateTime and our database schema - // (which uses millisecond precision via DateTimeConverter). This prevents subtle comparison - // bugs where a high-precision Instant would be considered "after" a truncated database - // timestamp. + // Truncate to milliseconds to match the precision of our database schema. + // This prevents subtle comparison bugs where a high-precision Instant would be + // considered "after" a truncated database timestamp. return Instant.now().truncatedTo(MILLIS); } } diff --git a/common/src/testing/java/google/registry/testing/FakeClock.java b/common/src/testing/java/google/registry/testing/FakeClock.java index bbd43fc2a..c64ffcc74 100644 --- a/common/src/testing/java/google/registry/testing/FakeClock.java +++ b/common/src/testing/java/google/registry/testing/FakeClock.java @@ -21,8 +21,6 @@ import java.time.Duration; import java.time.Instant; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.concurrent.ThreadSafe; -import org.joda.time.ReadableDuration; -import org.joda.time.ReadableInstant; /** A mock clock for testing purposes that supports telling, setting, and advancing the time. */ @ThreadSafe @@ -41,12 +39,6 @@ public final class FakeClock implements Clock { this(START_INSTANT); } - /** Creates a FakeClock initialized to a specific time. */ - @Deprecated - public FakeClock(ReadableInstant startTime) { - setTo(startTime); - } - /** Creates a FakeClock initialized to a specific time. */ public FakeClock(Instant startTime) { setTo(startTime); @@ -66,12 +58,6 @@ public final class FakeClock implements Clock { * @param autoIncrementStep the new auto increment duration * @return this */ - @Deprecated - public FakeClock setAutoIncrementStep(ReadableDuration autoIncrementStep) { - this.autoIncrementStepMs = autoIncrementStep.getMillis(); - return this; - } - /** * Sets the increment applied to the clock whenever it is queried. The increment is zero by * default: the clock is left unchanged when queried. @@ -91,23 +77,11 @@ public final class FakeClock implements Clock { advanceBy(Duration.ofMillis(1)); } - /** Advances clock by some duration. */ - @Deprecated - public void advanceBy(ReadableDuration duration) { - currentTimeMillis.addAndGet(duration.getMillis()); - } - /** Advances clock by some duration. */ public void advanceBy(Duration duration) { currentTimeMillis.addAndGet(duration.toMillis()); } - /** Sets the time to the specified instant. */ - @Deprecated - public void setTo(ReadableInstant time) { - currentTimeMillis.set(time.getMillis()); - } - /** Sets the time to the specified instant. */ public void setTo(Instant time) { currentTimeMillis.set(time.toEpochMilli()); diff --git a/config/nom_build.py b/config/nom_build.py index dbaf55839..47cf1a081 100644 --- a/config/nom_build.py +++ b/config/nom_build.py @@ -409,4 +409,3 @@ if __name__ == '__main__': sys.exit(main(sys.argv)) except Abort as ex: sys.exit(1) - diff --git a/config/presubmits.py b/config/presubmits.py index 3cd715992..2b500ad34 100644 --- a/config/presubmits.py +++ b/config/presubmits.py @@ -102,6 +102,22 @@ PRESUBMITS = { {"node_modules/", ".idea"}, REQUIRED): "Source files must end in a newline.", + # Files must not end with extraneous blank lines + PresubmitCheck( + r".*\n\n$", + ("java", "js", "soy", "sql", "py", "sh", "gradle", "ts", "xml"), + {"node_modules/", ".idea", "nomulus.golden.sql"}, + ): + "Source files must not end with extraneous blank lines.", + + # Duplicate empty lines + PresubmitCheck( + r".*\n\n\n.*", + ("java", "js", "soy", "sh", "gradle", "ts", "xml"), + {"node_modules/", ".idea"}, + ): + "Source files must not contain duplicate empty lines.", + # System.(out|err).println should only appear in tools/ or load-testing/ PresubmitCheck( r".*\bSystem\s*\.\s*(?:out|err)\s*\.\s*print.*", "java", { @@ -160,7 +176,8 @@ PRESUBMITS = { "SelfSignedCaCertificate.java", "X509Utils.java", "TmchCertificateAuthority.java", - "DelegatedCredentials.java" + "DelegatedCredentials.java", + "SslInitializerTestUtils.java" }, ): "Do not use java.util.Date. Use classes in java.time package instead.", @@ -202,85 +219,24 @@ PRESUBMITS = { {}, ): "Do not use .isEqualTo(Optional.of(...)). Use Truth's .hasValue(...) instead.", - # TODO: Remove the java.time migration presubmit checks below once the entire codebase has been migrated to java.time. PresubmitCheck( - r".*toDateTime\(\s*toInstant\(.*", - "java", - {"DateTimeUtilsTest.java"}, - ): - "Do not double-wrap toDateTime(toInstant(...)).", - PresubmitCheck( - r".*toInstant\(\s*toDateTime\(.*", - "java", - {"DateTimeUtilsTest.java"}, - ): - "Do not double-wrap toInstant(toDateTime(...)).", - PresubmitCheck( - r".*toInstant\([^;]*[cC]lock\.now\(\).*", + r".*java\.time\.ZonedDateTime.*", "java", {}, ): - "Do not use toInstant(clock.now()). Use clock.now() instead.", - PresubmitCheck( - r".*toDateTime\([^;]*[cC]lock\.now\(\).*", - "java", - {}, - ): - "Do not use toDateTime(clock.now()). Use clock.now() and Instant overloads instead.", - PresubmitCheck( - r".*toInstant\([^;]*tm\(\)\.getTxTime\(\).*", - "java", - {}, - ): - "Do not use toInstant(tm().getTxTime()). Use tm().getTxTime() instead.", - PresubmitCheck( - r".*toDateTime\([^;]*tm\(\)\.getTxTime\(\).*", - "java", - {}, - ): - "Do not use toDateTime(tm().getTxTime()). Use tm().getTxTime() and Instant overloads instead.", - PresubmitCheck( - r".*\(\s*Instant\s*\)\s*(?:this\.)?(?:fakeClock|clock)\.now\(\s*\).*", - "java", - {}, - ): - "Do not unnecessarily cast clock.now() to Instant.", - PresubmitCheck( - r".*toDateTime\(\s*Instant\.now\(.*", - "java", - {}, - ): - "Do not wrap Instant.now() in toDateTime. Use DateTime.now(UTC) directly.", - PresubmitCheck( - r".*toInstant\(\s*DateTime\.now\(.*", - "java", - {}, - ): - "Do not wrap DateTime.now() in toInstant. Use Instant.now().truncatedTo(ChronoUnit.MILLIS) directly.", - PresubmitCheck( - r".*toDateTime\(\s*Instant\.parse\(.*", - "java", - {"DateTimeUtilsTest.java"}, - ): - "Do not wrap Instant.parse in toDateTime. Use DateTime.parse directly.", - PresubmitCheck( - r".*toInstant\(\s*DateTime\.parse\(.*", - "java", - {"DateTimeUtilsTest.java"}, - ): - "Do not wrap DateTime.parse in toInstant. Use Instant.parse directly.", - PresubmitCheck( - r".*cloneProjectedAtTime\(\s*toDateTime\(.*", - "java", - {}, - ): - "Do not use cloneProjectedAtTime(toDateTime(...)). Use cloneProjectedAtTime(...) instead.", + "Do not use java.time.ZonedDateTime. Use java.time.OffsetDateTime per go/avoid-zdt.", PresubmitCheck( r".*ZoneId\.of\(\s*\"UTC\"\s*\).*", "java", {}, ): - "Do not use ZoneId.of(\"UTC\"). Use java.time.ZoneOffset.UTC." + "Do not use ZoneId.of(\"UTC\"). Use java.time.ZoneOffset.UTC.", + PresubmitCheck( + r".*org\.joda\.time.*", + "java", + {"SafeBrowsingTransforms.java"}, + ): + "Do not use Joda-Time. Use java.time instead.", } # Note that this regex only works for one kind of Flyway file. If we want to diff --git a/core/build.gradle b/core/build.gradle index 2f288fb48..3cb8cbaea 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -198,7 +198,6 @@ dependencies { implementation deps['jakarta.persistence:jakarta.persistence-api'] implementation deps['jakarta.servlet:jakarta.servlet-api'] implementation deps['jakarta.xml.bind:jakarta.xml.bind-api'] - implementation deps['joda-time:joda-time'] implementation deps['org.antlr:antlr4'] implementation deps['org.antlr:antlr4-runtime'] implementation deps['org.apache.avro:avro'] @@ -479,7 +478,6 @@ Optional> getToolArgsList() { return Optional.empty() } - // To run the nomulus tools with these command line tokens: // "--foo", "bar baz", "--qux=quz" // gradle core:registryTool --args="--foo 'bar baz' --qux=quz" @@ -819,7 +817,6 @@ test { // TODO(weiminyu): Remove dependency on sqlIntegrationTest }.dependsOn(fragileTest, standardTest, registryToolIntegrationTest, sqlIntegrationTest) - // When we override tests, we also break the cleanTest command. cleanTest.dependsOn(cleanFragileTest, cleanStandardTest, cleanRegistryToolIntegrationTest, cleanSqlIntegrationTest) diff --git a/core/gradle.lockfile b/core/gradle.lockfile index f4a4aff89..a86c04e04 100644 --- a/core/gradle.lockfile +++ b/core/gradle.lockfile @@ -321,26 +321,26 @@ io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-incubator:2.1 io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:2.1.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.opentelemetry.semconv:opentelemetry-semconv:1.29.0-alpha=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-api:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-api:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-api:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-bom:1.42.1=deploy_jar,nonprodRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.opentelemetry:opentelemetry-common:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-common:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-context:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-context:1.60.1=testCompileClasspath,testRuntimeClasspath -io.opentelemetry:opentelemetry-exporter-logging:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-context:1.62.0=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-exporter-logging:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-extension-incubator:1.35.0-alpha=deploy_jar,nonprodRuntimeClasspath,runtimeClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-sdk-common:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-sdk-common:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-common:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.47.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.60.1=testCompileClasspath,testRuntimeClasspath -io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.62.0=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-sdk-logs:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-sdk-logs:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-logs:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-sdk-metrics:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-sdk-metrics:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-metrics:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-sdk-trace:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-sdk-trace:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-trace:1.62.0=testCompileClasspath,testRuntimeClasspath io.opentelemetry:opentelemetry-sdk:1.51.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath -io.opentelemetry:opentelemetry-sdk:1.60.1=testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk:1.62.0=testCompileClasspath,testRuntimeClasspath io.outfoxx:swiftpoet:1.3.1=deploy_jar,nonprodRuntimeClasspath,runtimeClasspath,testRuntimeClasspath io.perfmark:perfmark-api:0.27.0=deploy_jar,nonprodRuntimeClasspath,runtimeClasspath,testRuntimeClasspath io.protostuff:protostuff-api:1.8.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -465,8 +465,8 @@ org.eclipse.jetty:jetty-server:12.1.9=testCompileClasspath,testRuntimeClasspath org.eclipse.jetty:jetty-session:12.1.9=testCompileClasspath,testRuntimeClasspath org.eclipse.jetty:jetty-util:12.1.9=testCompileClasspath,testRuntimeClasspath org.eclipse.jetty:jetty-xml:12.1.9=testCompileClasspath,testRuntimeClasspath -org.flywaydb:flyway-core:12.6.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.flywaydb:flyway-database-postgresql:12.6.0=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.flywaydb:flyway-core:12.6.1=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.flywaydb:flyway-database-postgresql:12.6.1=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.glassfish.jaxb:codemodel:4.0.8=jaxb org.glassfish.jaxb:jaxb-core:4.0.6=deploy_jar,nonprodRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.glassfish.jaxb:jaxb-core:4.0.8=jaxb @@ -553,23 +553,23 @@ org.pcollections:pcollections:4.0.1=annotationProcessor,nonprodAnnotationProcess org.postgresql:postgresql:42.7.11=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.reflections:reflections:0.10.2=checkstyle org.rnorth.duct-tape:duct-tape:1.0.8=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-api:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-chrome-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-chromium-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-devtools-v145:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-devtools-v146:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-devtools-v147:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-edge-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-firefox-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-http:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-ie-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-java:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-json:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-manager:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-os:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-remote-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-safari-driver:4.43.0=testCompileClasspath,testRuntimeClasspath -org.seleniumhq.selenium:selenium-support:4.43.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-api:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-chrome-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-chromium-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-devtools-v146:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-devtools-v147:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-devtools-v148:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-edge-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-firefox-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-http:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-ie-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-java:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-json:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-manager:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-os:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-remote-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-safari-driver:4.44.0=testCompileClasspath,testRuntimeClasspath +org.seleniumhq.selenium:selenium-support:4.44.0=testCompileClasspath,testRuntimeClasspath org.slf4j:jcl-over-slf4j:1.7.36=testCompileClasspath,testRuntimeClasspath org.slf4j:jul-to-slf4j:1.7.30=testRuntimeClasspath org.slf4j:slf4j-api:2.0.17=compileClasspath,deploy_jar,nonprodCompileClasspath,nonprodRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath diff --git a/core/src/main/java/google/registry/batch/DeleteProberDataAction.java b/core/src/main/java/google/registry/batch/DeleteProberDataAction.java index 71ec09223..55c3058c3 100644 --- a/core/src/main/java/google/registry/batch/DeleteProberDataAction.java +++ b/core/src/main/java/google/registry/batch/DeleteProberDataAction.java @@ -92,7 +92,7 @@ public class DeleteProberDataAction implements Runnable { // prevents accidental double-map with the same key from immediately deleting active domains) // // Note: creationTime must be compared to a Java object (CreateAutoTimestamp) but deletionTime can - // be compared directly to the SQL timestamp (it's a DateTime) + // be compared directly to the SQL timestamp (it's an Instant) private static final String DOMAIN_QUERY_STRING = "FROM Domain d WHERE d.tld IN :tlds AND d.domainName NOT LIKE 'nic.%%' AND" + " (d.subordinateHosts IS NULL OR array_length(d.subordinateHosts) = 0) AND" diff --git a/core/src/main/java/google/registry/beam/billing/BillingEvent.java b/core/src/main/java/google/registry/beam/billing/BillingEvent.java index 47b52bc71..31af1179a 100644 --- a/core/src/main/java/google/registry/beam/billing/BillingEvent.java +++ b/core/src/main/java/google/registry/beam/billing/BillingEvent.java @@ -39,8 +39,8 @@ import org.jetbrains.annotations.NotNull; * A record representing a single billable event, parsed from a {@code SchemaAndRecord}. * * @param id The unique ID for the {@code BillingEvent} associated with this event. - * @param billingTime The DateTime (in UTC) this event becomes billable. - * @param eventTime The DateTime (in UTC) this event was generated. + * @param billingTime The Instant (in UTC) this event becomes billable. + * @param eventTime The Instant (in UTC) this event was generated. * @param registrarId The billed registrar's name. * @param billingId The billed registrar's billing account key. * @param poNumber The Purchase Order number. @@ -225,7 +225,6 @@ public record BillingEvent( "UnitPriceCurrency", "PONumber"); - /** Generates the CSV header for the overall invoice. */ static String invoiceHeader() { return Joiner.on(",").join(INVOICE_HEADERS); diff --git a/core/src/main/java/google/registry/beam/common/RegistryQuery.java b/core/src/main/java/google/registry/beam/common/RegistryQuery.java index 5fb8f45c5..189383092 100644 --- a/core/src/main/java/google/registry/beam/common/RegistryQuery.java +++ b/core/src/main/java/google/registry/beam/common/RegistryQuery.java @@ -22,12 +22,10 @@ import jakarta.persistence.Query; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaQuery; import java.io.Serializable; -import java.time.Instant; import java.util.Map; import java.util.function.Supplier; import java.util.stream.Stream; import javax.annotation.Nullable; -import org.joda.time.DateTime; /** Interface for query instances used by {@link RegistryJpaIO.Read}. */ public interface RegistryQuery extends Serializable { @@ -61,11 +59,7 @@ public interface RegistryQuery extends Serializable { if (parameters != null) { parameters.forEach( (key, value) -> { - if (value instanceof DateTime dt) { - query.setParameter(key, Instant.ofEpochMilli(dt.getMillis())); - } else { - query.setParameter(key, value); - } + query.setParameter(key, value); }); } JpaTransactionManager.setQueryFetchSize(query, QUERY_FETCH_SIZE); diff --git a/core/src/main/java/google/registry/beam/spec11/SafeBrowsingTransforms.java b/core/src/main/java/google/registry/beam/spec11/SafeBrowsingTransforms.java index 2a177679c..430fe9442 100644 --- a/core/src/main/java/google/registry/beam/spec11/SafeBrowsingTransforms.java +++ b/core/src/main/java/google/registry/beam/spec11/SafeBrowsingTransforms.java @@ -14,7 +14,6 @@ package google.registry.beam.spec11; -import static google.registry.util.DateTimeUtils.toJodaInstant; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.http.HttpStatus.SC_OK; @@ -132,7 +131,13 @@ public class SafeBrowsingTransforms { if (!domainNameInfoBuffer.isEmpty()) { ImmutableSet> results = evaluateAndFlush(); results.forEach( - (kv) -> context.output(kv, toJodaInstant(clock.now()), GlobalWindow.INSTANCE)); + kv -> { + // The Apache Beam API requires org.joda.time.Instant here. + @SuppressWarnings("UnnecessarilyFullyQualified") + org.joda.time.Instant timestamp = + org.joda.time.Instant.ofEpochMilli(clock.nowMillis()); + context.output(kv, timestamp, GlobalWindow.INSTANCE); + }); } } diff --git a/core/src/main/java/google/registry/bsa/persistence/DownloadScheduler.java b/core/src/main/java/google/registry/bsa/persistence/DownloadScheduler.java index 88cf3918f..8710aef38 100644 --- a/core/src/main/java/google/registry/bsa/persistence/DownloadScheduler.java +++ b/core/src/main/java/google/registry/bsa/persistence/DownloadScheduler.java @@ -114,11 +114,7 @@ public final class DownloadScheduler { } private boolean isTimeAgain(BsaDownload mostRecent, Duration interval) { - return mostRecent - .getCreationTime() - .plusMillis(interval.toMillis()) - .minusMillis(CRON_JITTER.toMillis()) - .isBefore(clock.now()); + return mostRecent.getCreationTime().plus(interval).minus(CRON_JITTER).isBefore(clock.now()); } /** diff --git a/core/src/main/java/google/registry/config/DelegatedCredentials.java b/core/src/main/java/google/registry/config/DelegatedCredentials.java index cf3882e4a..c15c6e9c8 100644 --- a/core/src/main/java/google/registry/config/DelegatedCredentials.java +++ b/core/src/main/java/google/registry/config/DelegatedCredentials.java @@ -155,7 +155,7 @@ public class DelegatedCredentials extends GoogleCredentials { @Override public AccessToken refreshAccessToken() throws IOException { JsonFactory jsonFactory = JSON_FACTORY; - long currentTime = clock.now().toEpochMilli(); + long currentTime = clock.nowMillis(); String assertion = createAssertion(jsonFactory, currentTime); GenericData tokenRequest = new GenericData(); diff --git a/core/src/main/java/google/registry/config/RegistryConfig.java b/core/src/main/java/google/registry/config/RegistryConfig.java index aecef3ea3..7c7b9448d 100644 --- a/core/src/main/java/google/registry/config/RegistryConfig.java +++ b/core/src/main/java/google/registry/config/RegistryConfig.java @@ -50,6 +50,7 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.net.URI; import java.net.URL; +import java.time.DayOfWeek; import java.time.Duration; import java.time.Instant; import java.util.Map.Entry; @@ -57,7 +58,6 @@ import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.joda.time.DateTimeConstants; /** * Central clearing-house for all configuration. @@ -271,7 +271,7 @@ public final class RegistryConfig { @Provides @Config("brdaDayOfWeek") public static int provideBrdaDayOfWeek() { - return DateTimeConstants.TUESDAY; + return DayOfWeek.TUESDAY.getValue(); } /** @@ -1637,7 +1637,6 @@ public final class RegistryConfig { return CONFIG_SETTINGS.get().registryPolicy.contactAndHostRoidSuffix; } - /** A discount for all sunrise domain creates, between 0.0 (no discount) and 1.0 (free). */ public static double getSunriseDomainCreateDiscount() { return CONFIG_SETTINGS.get().registryPolicy.sunriseDomainCreateDiscount; diff --git a/core/src/main/java/google/registry/config/files/cloud-tasks-queue.xml b/core/src/main/java/google/registry/config/files/cloud-tasks-queue.xml index 833edc5ca..c4305753a 100644 --- a/core/src/main/java/google/registry/config/files/cloud-tasks-queue.xml +++ b/core/src/main/java/google/registry/config/files/cloud-tasks-queue.xml @@ -71,7 +71,6 @@ 180s - marksdb diff --git a/core/src/main/java/google/registry/flows/EppTlsAction.java b/core/src/main/java/google/registry/flows/EppTlsAction.java index 6462a84ec..f15495c34 100644 --- a/core/src/main/java/google/registry/flows/EppTlsAction.java +++ b/core/src/main/java/google/registry/flows/EppTlsAction.java @@ -49,4 +49,3 @@ public class EppTlsAction implements Runnable { inputXmlBytes); } } - diff --git a/core/src/main/java/google/registry/flows/StatelessRequestSessionMetadata.java b/core/src/main/java/google/registry/flows/StatelessRequestSessionMetadata.java index 758d2ebb8..9c76722a9 100644 --- a/core/src/main/java/google/registry/flows/StatelessRequestSessionMetadata.java +++ b/core/src/main/java/google/registry/flows/StatelessRequestSessionMetadata.java @@ -71,6 +71,4 @@ public class StatelessRequestSessionMetadata extends SessionMetadata { throw new UnsupportedOperationException(); } - } - diff --git a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java index 6cd35611b..6879b00a5 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java index b360c846e..4203ccb63 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java index 32cc74c90..ca4358511 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java index 20ee4afcc..220763aec 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java index 9b85caffc..7d2955936 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java index 8f7d5a833..59825f29e 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java index 1894ecd3d..13b8da43f 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java index 3eb7d0564..2145f4663 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java index 18f1436ce..1580153da 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java index 726f11028..15a6f7e13 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java @@ -14,7 +14,6 @@ package google.registry.flows.contact; - import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ContactsProhibitedException; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; diff --git a/core/src/main/java/google/registry/keyring/api/KeySerializer.java b/core/src/main/java/google/registry/keyring/api/KeySerializer.java index 2b37a31e7..e2266ff4f 100644 --- a/core/src/main/java/google/registry/keyring/api/KeySerializer.java +++ b/core/src/main/java/google/registry/keyring/api/KeySerializer.java @@ -41,7 +41,6 @@ import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBu */ public final class KeySerializer { - private KeySerializer() {} /** diff --git a/core/src/main/java/google/registry/loadtest/LoadTestModule.java b/core/src/main/java/google/registry/loadtest/LoadTestModule.java index f727404a4..4601a2aed 100644 --- a/core/src/main/java/google/registry/loadtest/LoadTestModule.java +++ b/core/src/main/java/google/registry/loadtest/LoadTestModule.java @@ -21,7 +21,6 @@ import dagger.Module; import dagger.Provides; import google.registry.request.Parameter; import jakarta.servlet.http.HttpServletRequest; -import org.joda.time.Minutes; /** * Dagger module for loadtest package. @@ -42,15 +41,13 @@ public final class LoadTestModule { @Provides @Parameter("delaySeconds") static int provideDelaySeconds(HttpServletRequest req) { - return extractOptionalIntParameter(req, "delaySeconds") - .orElse(Minutes.ONE.toStandardSeconds().getSeconds()); + return extractOptionalIntParameter(req, "delaySeconds").orElse(60); } @Provides @Parameter("runSeconds") static int provideRunSeconds(HttpServletRequest req) { - return extractOptionalIntParameter(req, "runSeconds") - .orElse(Minutes.ONE.toStandardSeconds().getSeconds()); + return extractOptionalIntParameter(req, "runSeconds").orElse(60); } @Provides diff --git a/core/src/main/java/google/registry/model/common/Cursor.java b/core/src/main/java/google/registry/model/common/Cursor.java index de2765ad9..db0bfecf9 100644 --- a/core/src/main/java/google/registry/model/common/Cursor.java +++ b/core/src/main/java/google/registry/model/common/Cursor.java @@ -90,9 +90,9 @@ public class Cursor extends UpdateAutoTimestampEntity { RECURRING_BILLING(false), /** - * Cursor for {@link google.registry.export.sheet.SyncRegistrarsSheetAction}. The DateTime - * stored is the last time that registrar changes were successfully synced to the sheet. If - * there were no changes since the last time the action run, the cursor is not updated. + * Cursor for {@link google.registry.export.sheet.SyncRegistrarsSheetAction}. The Instant stored + * is the last time that registrar changes were successfully synced to the sheet. If there were + * no changes since the last time the action run, the cursor is not updated. */ SYNC_REGISTRAR_SHEET(false), diff --git a/core/src/main/java/google/registry/model/common/TimeOfYear.java b/core/src/main/java/google/registry/model/common/TimeOfYear.java index 71fa4cb6b..3bd9a6173 100644 --- a/core/src/main/java/google/registry/model/common/TimeOfYear.java +++ b/core/src/main/java/google/registry/model/common/TimeOfYear.java @@ -33,7 +33,7 @@ import jakarta.persistence.Embeddable; import java.time.Instant; import java.time.LocalDate; import java.time.LocalTime; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import java.util.List; /** @@ -63,7 +63,7 @@ public class TimeOfYear extends ImmutableObject implements UnsafeSerializable { * February 28. It is impossible to construct a {@link TimeOfYear} for February 29th. */ public static TimeOfYear fromInstant(Instant instant) { - ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, UTC); + OffsetDateTime zdt = OffsetDateTime.ofInstant(instant, UTC); int month = zdt.getMonthValue(); int day = zdt.getDayOfMonth(); if (month == 2 && day == 29) { @@ -88,8 +88,8 @@ public class TimeOfYear extends ImmutableObject implements UnsafeSerializable { Range normalizedRange = range.intersection(Range.closed(START_INSTANT, END_INSTANT)); Range yearRange = Range.closed( - ZonedDateTime.ofInstant(normalizedRange.lowerEndpoint(), UTC).getYear(), - ZonedDateTime.ofInstant(normalizedRange.upperEndpoint(), UTC).getYear()); + OffsetDateTime.ofInstant(normalizedRange.lowerEndpoint(), UTC).getYear(), + OffsetDateTime.ofInstant(normalizedRange.upperEndpoint(), UTC).getYear()); return ContiguousSet.create(yearRange, integers()).stream() .map(this::toInstantWithYear) .filter(normalizedRange) @@ -112,13 +112,13 @@ public class TimeOfYear extends ImmutableObject implements UnsafeSerializable { /** Get the first {@link Instant} with this month/day/millis that is at or after the start. */ public Instant getNextInstanceAtOrAfter(Instant start) { - Instant withSameYear = toInstantWithYear(ZonedDateTime.ofInstant(start, UTC).getYear()); + Instant withSameYear = toInstantWithYear(OffsetDateTime.ofInstant(start, UTC).getYear()); return isAtOrAfter(withSameYear, start) ? withSameYear : plusYears(withSameYear, 1); } /** Get the first {@link Instant} with this month/day/millis that is at or before the end. */ public Instant getLastInstanceBeforeOrAt(Instant end) { - Instant withSameYear = toInstantWithYear(ZonedDateTime.ofInstant(end, UTC).getYear()); + Instant withSameYear = toInstantWithYear(OffsetDateTime.ofInstant(end, UTC).getYear()); return isBeforeOrAt(withSameYear, end) ? withSameYear : minusYears(withSameYear, 1); } diff --git a/core/src/main/java/google/registry/model/contact/package-info.java b/core/src/main/java/google/registry/model/contact/package-info.java index ba85e2d36..7736f7447 100644 --- a/core/src/main/java/google/registry/model/contact/package-info.java +++ b/core/src/main/java/google/registry/model/contact/package-info.java @@ -17,9 +17,7 @@ xmlns = @XmlNs(prefix = "contact", namespaceURI = "urn:ietf:params:xml:ns:contact-1.0"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapters({ - @XmlJavaTypeAdapter(UtcInstantAdapter.class) -}) +@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)}) package google.registry.model.contact; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/model/domain/Domain.java b/core/src/main/java/google/registry/model/domain/Domain.java index 7458053db..6aecfb32e 100644 --- a/core/src/main/java/google/registry/model/domain/Domain.java +++ b/core/src/main/java/google/registry/model/domain/Domain.java @@ -14,7 +14,6 @@ package google.registry.model.domain; - import google.registry.model.EppResource; import google.registry.model.EppResource.ForeignKeyedEppResource; import google.registry.model.annotations.ExternalMessagingName; diff --git a/core/src/main/java/google/registry/model/domain/DomainBase.java b/core/src/main/java/google/registry/model/domain/DomainBase.java index 6ee5b0461..09fcd2eeb 100644 --- a/core/src/main/java/google/registry/model/domain/DomainBase.java +++ b/core/src/main/java/google/registry/model/domain/DomainBase.java @@ -246,7 +246,7 @@ public class DomainBase extends EppResource { * *

When a domain is scheduled to not autorenew, this field is set to the current value of its * {@link #registrationExpirationTime}, after which point the next invocation of a periodic - * cronjob will explicitly delete the domain. This field is a DateTime and not a boolean because + * cronjob will explicitly delete the domain. This field is an Instant and not a boolean because * of edge cases that occur during the autorenew grace period. We need to be able to tell the * difference domains that have reached their life and must be deleted now, and domains that * happen to be in the autorenew grace period now but should be deleted in roughly a year. diff --git a/core/src/main/java/google/registry/model/domain/DomainRenewData.java b/core/src/main/java/google/registry/model/domain/DomainRenewData.java index 259e43723..b4aebe345 100644 --- a/core/src/main/java/google/registry/model/domain/DomainRenewData.java +++ b/core/src/main/java/google/registry/model/domain/DomainRenewData.java @@ -14,7 +14,6 @@ package google.registry.model.domain; - import google.registry.model.eppoutput.EppResponse.ResponseData; import google.registry.xml.UtcInstantAdapter; import jakarta.xml.bind.annotation.XmlElement; diff --git a/core/src/main/java/google/registry/model/domain/GracePeriodBase.java b/core/src/main/java/google/registry/model/domain/GracePeriodBase.java index a35b5ff34..3d67eb501 100644 --- a/core/src/main/java/google/registry/model/domain/GracePeriodBase.java +++ b/core/src/main/java/google/registry/model/domain/GracePeriodBase.java @@ -14,7 +14,6 @@ package google.registry.model.domain; - import google.registry.model.ImmutableObject; import google.registry.model.UnsafeSerializable; import google.registry.model.billing.BillingEvent; diff --git a/core/src/main/java/google/registry/model/domain/fee/BaseFee.java b/core/src/main/java/google/registry/model/domain/fee/BaseFee.java index bd5304719..aaa84ad2b 100644 --- a/core/src/main/java/google/registry/model/domain/fee/BaseFee.java +++ b/core/src/main/java/google/registry/model/domain/fee/BaseFee.java @@ -31,8 +31,8 @@ import jakarta.xml.bind.annotation.XmlValue; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.math.BigDecimal; import java.time.Instant; +import java.time.Period; import java.util.stream.Stream; -import org.joda.time.Period; /** Base class for the fee and credit types. */ @XmlTransient diff --git a/core/src/main/java/google/registry/model/domain/fee/FeeCheckResponseExtensionItem.java b/core/src/main/java/google/registry/model/domain/fee/FeeCheckResponseExtensionItem.java index 823743ec4..0b047d581 100644 --- a/core/src/main/java/google/registry/model/domain/fee/FeeCheckResponseExtensionItem.java +++ b/core/src/main/java/google/registry/model/domain/fee/FeeCheckResponseExtensionItem.java @@ -34,4 +34,3 @@ public abstract class FeeCheckResponseExtensionItem extends FeeQueryResponseExte } } } - diff --git a/core/src/main/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java b/core/src/main/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java index ccc6fe67f..cdd30767d 100644 --- a/core/src/main/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java +++ b/core/src/main/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java @@ -69,4 +69,3 @@ public class FeeInfoCommandExtensionV06 return Optional.empty(); } } - diff --git a/core/src/main/java/google/registry/model/domain/fee06/FeeInfoResponseExtensionV06.java b/core/src/main/java/google/registry/model/domain/fee06/FeeInfoResponseExtensionV06.java index 71693cd74..4f6beecaf 100644 --- a/core/src/main/java/google/registry/model/domain/fee06/FeeInfoResponseExtensionV06.java +++ b/core/src/main/java/google/registry/model/domain/fee06/FeeInfoResponseExtensionV06.java @@ -36,7 +36,6 @@ public class FeeInfoResponseExtensionV06 /** The command that was checked. */ FeeExtensionCommandDescriptor command; - /** Builder for {@link FeeInfoResponseExtensionV06}. */ public static class Builder extends FeeQueryResponseExtensionItem.Builder { diff --git a/core/src/main/java/google/registry/model/domain/fee11/FeeCheckResponseExtensionV11.java b/core/src/main/java/google/registry/model/domain/fee11/FeeCheckResponseExtensionV11.java index 75f5f9819..6262639f0 100644 --- a/core/src/main/java/google/registry/model/domain/fee11/FeeCheckResponseExtensionV11.java +++ b/core/src/main/java/google/registry/model/domain/fee11/FeeCheckResponseExtensionV11.java @@ -34,7 +34,6 @@ public class FeeCheckResponseExtensionV11 @XmlElement(name = "cd") ImmutableList items; - @Override public void setCurrencyIfSupported(CurrencyUnit currency) {} diff --git a/core/src/main/java/google/registry/model/domain/launch/package-info.java b/core/src/main/java/google/registry/model/domain/launch/package-info.java index 0ded8770a..1b40f3e20 100644 --- a/core/src/main/java/google/registry/model/domain/launch/package-info.java +++ b/core/src/main/java/google/registry/model/domain/launch/package-info.java @@ -17,9 +17,7 @@ xmlns = @XmlNs(prefix = "launch", namespaceURI = "urn:ietf:params:xml:ns:launch-1.0"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapters({ - @XmlJavaTypeAdapter(UtcInstantAdapter.class) -}) +@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)}) package google.registry.model.domain.launch; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/model/domain/token/AllocationToken.java b/core/src/main/java/google/registry/model/domain/token/AllocationToken.java index afba77c08..cf629cd31 100644 --- a/core/src/main/java/google/registry/model/domain/token/AllocationToken.java +++ b/core/src/main/java/google/registry/model/domain/token/AllocationToken.java @@ -335,8 +335,6 @@ public class AllocationToken extends UpdateAutoTimestampEntity implements Builda return tokenType; } - - @JsonIgnore public TimedTransitionProperty getTokenStatusTransitions() { return tokenStatusTransitions; diff --git a/core/src/main/java/google/registry/model/eppinput/package-info.java b/core/src/main/java/google/registry/model/eppinput/package-info.java index 52d6b0937..6c6e6b3d4 100644 --- a/core/src/main/java/google/registry/model/eppinput/package-info.java +++ b/core/src/main/java/google/registry/model/eppinput/package-info.java @@ -17,9 +17,7 @@ xmlns = @XmlNs(prefix = "", namespaceURI = "urn:ietf:params:xml:ns:epp-1.0"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapters({ - @XmlJavaTypeAdapter(UtcInstantAdapter.class) -}) +@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)}) package google.registry.model.eppinput; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/model/eppoutput/package-info.java b/core/src/main/java/google/registry/model/eppoutput/package-info.java index d10997047..09dd2a2f3 100644 --- a/core/src/main/java/google/registry/model/eppoutput/package-info.java +++ b/core/src/main/java/google/registry/model/eppoutput/package-info.java @@ -17,9 +17,7 @@ xmlns = @XmlNs(prefix = "", namespaceURI = "urn:ietf:params:xml:ns:epp-1.0"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapters({ - @XmlJavaTypeAdapter(UtcInstantAdapter.class) -}) +@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)}) package google.registry.model.eppoutput; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java b/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java index f94cd9686..98c7caf60 100644 --- a/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java +++ b/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java @@ -18,7 +18,7 @@ import static java.time.ZoneOffset.UTC; import com.google.common.base.Splitter; import google.registry.persistence.VKey; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import java.util.List; /** @@ -46,7 +46,7 @@ public final class PollMessageExternalKeyConverter { public static String makePollMessageExternalId(PollMessage pollMessage) { return String.format( "%d-%d", - pollMessage.getId(), ZonedDateTime.ofInstant(pollMessage.getEventTime(), UTC).getYear()); + pollMessage.getId(), OffsetDateTime.ofInstant(pollMessage.getEventTime(), UTC).getYear()); } /** diff --git a/core/src/main/java/google/registry/model/poll/package-info.java b/core/src/main/java/google/registry/model/poll/package-info.java index 30d132a13..cce7ce6ba 100644 --- a/core/src/main/java/google/registry/model/poll/package-info.java +++ b/core/src/main/java/google/registry/model/poll/package-info.java @@ -17,9 +17,7 @@ xmlns = @XmlNs(prefix = "", namespaceURI = "urn:ietf:params:xml:ns:epp-1.0"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapters({ - @XmlJavaTypeAdapter(UtcInstantAdapter.class) -}) +@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)}) package google.registry.model.poll; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/model/transfer/BaseTransferObject.java b/core/src/main/java/google/registry/model/transfer/BaseTransferObject.java index 5118093b3..5aba08585 100644 --- a/core/src/main/java/google/registry/model/transfer/BaseTransferObject.java +++ b/core/src/main/java/google/registry/model/transfer/BaseTransferObject.java @@ -14,7 +14,6 @@ package google.registry.model.transfer; - import google.registry.model.Buildable.GenericBuilder; import google.registry.model.ImmutableObject; import google.registry.model.UnsafeSerializable; diff --git a/core/src/main/java/google/registry/model/transfer/TransferResponse.java b/core/src/main/java/google/registry/model/transfer/TransferResponse.java index 57bd5ede7..fe82ce6e3 100644 --- a/core/src/main/java/google/registry/model/transfer/TransferResponse.java +++ b/core/src/main/java/google/registry/model/transfer/TransferResponse.java @@ -14,7 +14,6 @@ package google.registry.model.transfer; - import google.registry.model.EppResource; import google.registry.model.eppoutput.EppResponse.ResponseData; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/model/transfer/package-info.java b/core/src/main/java/google/registry/model/transfer/package-info.java index 0353ffa0b..364bc8672 100644 --- a/core/src/main/java/google/registry/model/transfer/package-info.java +++ b/core/src/main/java/google/registry/model/transfer/package-info.java @@ -17,9 +17,7 @@ xmlns = @XmlNs(prefix = "", namespaceURI = "urn:ietf:params:xml:ns:epp-1.0"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapters({ - @XmlJavaTypeAdapter(UtcInstantAdapter.class) -}) +@XmlJavaTypeAdapters({@XmlJavaTypeAdapter(UtcInstantAdapter.class)}) package google.registry.model.transfer; import google.registry.xml.UtcInstantAdapter; diff --git a/core/src/main/java/google/registry/monitoring/whitebox/CheckApiMetric.java b/core/src/main/java/google/registry/monitoring/whitebox/CheckApiMetric.java index 644a018e0..8a0af84a7 100644 --- a/core/src/main/java/google/registry/monitoring/whitebox/CheckApiMetric.java +++ b/core/src/main/java/google/registry/monitoring/whitebox/CheckApiMetric.java @@ -81,7 +81,6 @@ public record CheckApiMetric( } } - public static Builder builder(Clock clock) { return new AutoBuilder_CheckApiMetric_Builder().startTimestamp(clock.now()).setClock(clock); } diff --git a/core/src/main/java/google/registry/persistence/converter/DateTimeConverter.java b/core/src/main/java/google/registry/persistence/converter/DateTimeConverter.java deleted file mode 100644 index 257aea563..000000000 --- a/core/src/main/java/google/registry/persistence/converter/DateTimeConverter.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2019 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.persistence.converter; -import static org.joda.time.DateTimeZone.UTC; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; -import java.time.Instant; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import javax.annotation.Nullable; -import org.joda.time.DateTime; - -/** JPA converter to for storing/retrieving {@link org.joda.time.DateTime} objects. */ -@Converter(autoApply = true) -public class DateTimeConverter implements AttributeConverter { - - @Override - @Nullable - public ZonedDateTime convertToDatabaseColumn(@Nullable DateTime attribute) { - return attribute == null - ? null - : ZonedDateTime.ofInstant(Instant.ofEpochMilli(attribute.getMillis()), ZoneOffset.UTC); - } - - @Override - @Nullable - public DateTime convertToEntityAttribute(@Nullable ZonedDateTime dbData) { - return (dbData == null) ? null : new DateTime(dbData.toInstant().toEpochMilli(), UTC); - } -} diff --git a/core/src/main/java/google/registry/persistence/converter/MapUserType.java b/core/src/main/java/google/registry/persistence/converter/MapUserType.java index 2ce68d8e7..8f2923ff8 100644 --- a/core/src/main/java/google/registry/persistence/converter/MapUserType.java +++ b/core/src/main/java/google/registry/persistence/converter/MapUserType.java @@ -14,7 +14,6 @@ package google.registry.persistence.converter; - import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; diff --git a/core/src/main/java/google/registry/privileges/secretmanager/SecretManagerModule.java b/core/src/main/java/google/registry/privileges/secretmanager/SecretManagerModule.java index 761c6726a..34fdac17c 100644 --- a/core/src/main/java/google/registry/privileges/secretmanager/SecretManagerModule.java +++ b/core/src/main/java/google/registry/privileges/secretmanager/SecretManagerModule.java @@ -14,7 +14,6 @@ package google.registry.privileges.secretmanager; - import com.google.cloud.secretmanager.v1.SecretManagerServiceClient; import com.google.cloud.secretmanager.v1.SecretManagerServiceSettings; import dagger.Module; diff --git a/core/src/main/java/google/registry/rdap/AbstractJsonableObject.java b/core/src/main/java/google/registry/rdap/AbstractJsonableObject.java index 743d2b163..46fdd8b81 100644 --- a/core/src/main/java/google/registry/rdap/AbstractJsonableObject.java +++ b/core/src/main/java/google/registry/rdap/AbstractJsonableObject.java @@ -40,7 +40,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Optional; import javax.annotation.Nullable; -import org.joda.time.DateTime; /** * An Jsonable that can turn itself into a JSON object using reflection. @@ -53,16 +52,12 @@ import org.joda.time.DateTime; * will be "JSONified" and added to the generated JSON object. * *

This implementation is geared towards RDAP replies, and hence has RDAP-specific quirks. - * Specifically: - * - Fields with empty arrays are not shown at all - * - VCards are a built-in special case (Not implemented yet) - * - DateTime conversion is specifically supported as if it were a primitive - * - Arrays are considered to be SETS rather than lists, meaning repeated values are removed and the - * order isn't guaranteed + * Specifically: - Fields with empty arrays are not shown at all - VCards are a built-in special + * case (Not implemented yet) - Instant conversion is specifically supported as if it were a + * primitive - Arrays are considered to be SETS rather than lists, meaning repeated values are + * removed and the order isn't guaranteed * - * Usage: - * {@link JsonableElement} - * ----------------------- + *

Usage: {@link JsonableElement} ----------------------- * *

  * - JsonableElement annotates Members that become JSON object fields:
@@ -90,7 +85,7 @@ import org.joda.time.DateTime;
  *   "b": "value1"
  * }
  *
- * - the supported object types are String, Boolean, Number, DateTime, Jsonable. In addition,
+ * - the supported object types are String, Boolean, Number, Instant, Jsonable. In addition,
  *   Iterable and Optional are respected.
  *
  * - An Optional that's empty is skipped, while a present Optional acts exactly like the object it
@@ -134,8 +129,7 @@ import org.joda.time.DateTime;
  * }
  * 
* - * {@link RestrictJsonNames} - * ------------------------- + * {@link RestrictJsonNames} ------------------------- * *
  * - RestrictJsonNames is a way to prevent typos in the JsonableElement names.
@@ -334,12 +328,6 @@ abstract class AbstractJsonableObject implements Jsonable {
     if (object instanceof Boolean b) {
       return new JsonPrimitive(b);
     }
-    if (object instanceof DateTime) {
-      // According to RFC 9083 section 3, the syntax of dates and times is defined in RFC3339.
-      //
-      // According to RFC3339, we should use ISO8601, which is what DateTime.toString does!
-      return new JsonPrimitive(object.toString());
-    }
     if (object instanceof Instant instant) {
       // According to RFC 9083 section 3, the syntax of dates and times is defined in RFC3339.
       //
diff --git a/core/src/main/java/google/registry/rdap/RdapDataStructures.java b/core/src/main/java/google/registry/rdap/RdapDataStructures.java
index f1445a452..4f514c87f 100644
--- a/core/src/main/java/google/registry/rdap/RdapDataStructures.java
+++ b/core/src/main/java/google/registry/rdap/RdapDataStructures.java
@@ -244,7 +244,6 @@ final class RdapDataStructures {
 
     @JsonableElement abstract ImmutableList links();
 
-
     abstract static class Builder> {
       abstract B setEventAction(EventAction eventAction);
 
@@ -304,7 +303,6 @@ final class RdapDataStructures {
       return new AutoValue_RdapDataStructures_EventWithoutActor.Builder();
     }
 
-
     @AutoValue.Builder
     abstract static class Builder extends EventBase.Builder {
       abstract EventWithoutActor build();
@@ -321,7 +319,6 @@ final class RdapDataStructures {
       return new AutoValue_RdapDataStructures_Event.Builder();
     }
 
-
     @AutoValue.Builder
     abstract static class Builder extends EventBase.Builder {
       abstract Builder setEventActor(String eventActor);
diff --git a/core/src/main/java/google/registry/rdap/RdapMetrics.java b/core/src/main/java/google/registry/rdap/RdapMetrics.java
index b845df842..899e52303 100644
--- a/core/src/main/java/google/registry/rdap/RdapMetrics.java
+++ b/core/src/main/java/google/registry/rdap/RdapMetrics.java
@@ -272,7 +272,6 @@ public class RdapMetrics {
       RdapMetricInformation build();
     }
 
-
     static Builder builder() {
       return new AutoBuilder_RdapMetrics_RdapMetricInformation_Builder()
           .setSearchType(SearchType.NONE)
diff --git a/core/src/main/java/google/registry/rdap/RdapObjectClasses.java b/core/src/main/java/google/registry/rdap/RdapObjectClasses.java
index fc0e5a7c4..80f571a2c 100644
--- a/core/src/main/java/google/registry/rdap/RdapObjectClasses.java
+++ b/core/src/main/java/google/registry/rdap/RdapObjectClasses.java
@@ -235,7 +235,6 @@ final class RdapObjectClasses {
       this.objectClassName = objectClassName;
     }
 
-
     abstract static class Builder> {
       abstract B setHandle(String handle);
       abstract ImmutableList.Builder publicIdsBuilder();
diff --git a/core/src/main/java/google/registry/rdap/RdapSearchPattern.java b/core/src/main/java/google/registry/rdap/RdapSearchPattern.java
index 1b25292e3..cace7a4f8 100644
--- a/core/src/main/java/google/registry/rdap/RdapSearchPattern.java
+++ b/core/src/main/java/google/registry/rdap/RdapSearchPattern.java
@@ -14,7 +14,6 @@
 
 package google.registry.rdap;
 
-
 import com.google.common.base.Strings;
 import google.registry.request.HttpException.BadRequestException;
 import google.registry.request.HttpException.UnprocessableEntityException;
diff --git a/core/src/main/java/google/registry/rde/BrdaCopyAction.java b/core/src/main/java/google/registry/rde/BrdaCopyAction.java
index 6a8c4c248..3ad54e77f 100644
--- a/core/src/main/java/google/registry/rde/BrdaCopyAction.java
+++ b/core/src/main/java/google/registry/rde/BrdaCopyAction.java
@@ -14,7 +14,6 @@
 
 package google.registry.rde;
 
-
 import static google.registry.model.common.Cursor.CursorType.BRDA;
 import static google.registry.model.common.Cursor.getCursorTimeOrStartOfTime;
 import static google.registry.model.rde.RdeMode.THIN;
diff --git a/core/src/main/java/google/registry/rde/PendingDeposit.java b/core/src/main/java/google/registry/rde/PendingDeposit.java
index 4b41e8e93..73102f3b4 100644
--- a/core/src/main/java/google/registry/rde/PendingDeposit.java
+++ b/core/src/main/java/google/registry/rde/PendingDeposit.java
@@ -14,7 +14,6 @@
 
 package google.registry.rde;
 
-
 import google.registry.model.common.Cursor.CursorType;
 import google.registry.model.rde.RdeMode;
 import java.io.IOException;
diff --git a/core/src/main/java/google/registry/rde/RdeReportAction.java b/core/src/main/java/google/registry/rde/RdeReportAction.java
index 506fce860..fde27f6b5 100644
--- a/core/src/main/java/google/registry/rde/RdeReportAction.java
+++ b/core/src/main/java/google/registry/rde/RdeReportAction.java
@@ -14,7 +14,6 @@
 
 package google.registry.rde;
 
-
 import static com.google.common.base.Verify.verify;
 import static com.google.common.net.MediaType.PLAIN_TEXT_UTF_8;
 import static google.registry.model.common.Cursor.getCursorTimeOrStartOfTime;
diff --git a/core/src/main/java/google/registry/rde/RdeUploadAction.java b/core/src/main/java/google/registry/rde/RdeUploadAction.java
index 942de8247..e3ecf0689 100644
--- a/core/src/main/java/google/registry/rde/RdeUploadAction.java
+++ b/core/src/main/java/google/registry/rde/RdeUploadAction.java
@@ -14,7 +14,6 @@
 
 package google.registry.rde;
 
-
 import static com.google.common.base.Verify.verify;
 import static com.google.common.net.MediaType.PLAIN_TEXT_UTF_8;
 import static com.jcraft.jsch.ChannelSftp.OVERWRITE;
diff --git a/core/src/main/java/google/registry/rde/RydeTar.java b/core/src/main/java/google/registry/rde/RydeTar.java
index c2e8ee5c8..3c5e71b71 100644
--- a/core/src/main/java/google/registry/rde/RydeTar.java
+++ b/core/src/main/java/google/registry/rde/RydeTar.java
@@ -16,8 +16,6 @@ package google.registry.rde;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
-import static google.registry.util.DateTimeUtils.toDateTime;
-import static google.registry.util.DateTimeUtils.toInstant;
 
 import com.google.common.io.ByteStreams;
 import google.registry.util.ImprovedInputStream;
@@ -53,7 +51,7 @@ final class RydeTar {
           new PosixTarHeader.Builder()
               .setName(filename)
               .setSize(expectedSize)
-              .setMtime(toDateTime(modified))
+              .setMtime(modified)
               .build()
               .getBytes());
       return new ImprovedOutputStream("RydeTarWriter", os) {
@@ -96,7 +94,7 @@ final class RydeTar {
 
     /** Returns the creation/modification time of the file archived in this TAR. */
     Instant getModified() {
-      return toInstant(header.getMtime());
+      return header.getMtime();
     }
   }
 
diff --git a/core/src/main/java/google/registry/reporting/ReportingModule.java b/core/src/main/java/google/registry/reporting/ReportingModule.java
index d93b263fd..62959cfeb 100644
--- a/core/src/main/java/google/registry/reporting/ReportingModule.java
+++ b/core/src/main/java/google/registry/reporting/ReportingModule.java
@@ -17,7 +17,6 @@ package google.registry.reporting;
 import static google.registry.request.RequestParameters.extractOptionalBooleanParameter;
 import static google.registry.request.RequestParameters.extractOptionalParameter;
 import static google.registry.request.RequestParameters.extractRequiredParameter;
-import static java.time.ZoneOffset.UTC;
 
 import com.google.api.services.dataflow.Dataflow;
 import dagger.Module;
@@ -129,7 +128,7 @@ public class ReportingModule {
   @Provides
   @Parameter(PARAM_DATE)
   static LocalDate provideDate(HttpServletRequest req, Clock clock) {
-    return provideDateOptional(req).orElseGet(() -> LocalDate.ofInstant(clock.now(), UTC));
+    return provideDateOptional(req).orElseGet(() -> clock.nowDate());
   }
 
   /** Constructs a {@link Dataflow} API client with default settings. */
diff --git a/core/src/main/java/google/registry/reporting/billing/BillingModule.java b/core/src/main/java/google/registry/reporting/billing/BillingModule.java
index 01f0c90af..e60939d95 100644
--- a/core/src/main/java/google/registry/reporting/billing/BillingModule.java
+++ b/core/src/main/java/google/registry/reporting/billing/BillingModule.java
@@ -37,7 +37,6 @@ public final class BillingModule {
   static final String PARAM_SHOULD_PUBLISH = "shouldPublish";
   static final String CRON_QUEUE = "retryable-cron-tasks";
 
-
   @Provides
   @Parameter(PARAM_SHOULD_PUBLISH)
   static boolean provideShouldPublish(
diff --git a/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java b/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java
index 8882449ea..29175f70b 100644
--- a/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java
+++ b/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java
@@ -100,7 +100,7 @@ public final class IcannReportingUploadAction implements Runnable {
   IcannReportingUploadAction() {}
 
   /**
-   * Get the scheduled time for the next month of the given {@link DateTime}.
+   * Get the scheduled time for the next month of the given {@link Instant}.
    *
    * 

The scheduled time is always the second day of next month at 10AM UTC. This is because the * staging action is scheduled to run at 9AM UTC on that day, and there is no reason to run the diff --git a/core/src/main/java/google/registry/request/Action.java b/core/src/main/java/google/registry/request/Action.java index ba6dcc4c2..e9c5a0bab 100644 --- a/core/src/main/java/google/registry/request/Action.java +++ b/core/src/main/java/google/registry/request/Action.java @@ -14,7 +14,6 @@ package google.registry.request; - import google.registry.config.RegistryConfig; import google.registry.request.auth.Auth; import java.lang.annotation.ElementType; diff --git a/core/src/main/java/google/registry/request/RequestParameters.java b/core/src/main/java/google/registry/request/RequestParameters.java index bf6fd0c01..ac46555e3 100644 --- a/core/src/main/java/google/registry/request/RequestParameters.java +++ b/core/src/main/java/google/registry/request/RequestParameters.java @@ -30,7 +30,6 @@ import java.time.Instant; import java.time.format.DateTimeParseException; import java.util.Optional; import javax.annotation.Nullable; -import org.joda.time.DateTime; /** Utilities for extracting parameters from HTTP requests. */ public final class RequestParameters { @@ -298,33 +297,6 @@ public final class RequestParameters { * @throws BadRequestException if request parameter named {@code name} is absent, empty, or could * not be parsed as an ISO 8601 timestamp */ - public static DateTime extractRequiredDatetimeParameter(HttpServletRequest req, String name) { - String stringValue = extractRequiredParameter(req, name); - try { - return DateTime.parse(stringValue); - } catch (IllegalArgumentException e) { - throw new BadRequestException("Bad ISO 8601 timestamp: " + name); - } - } - - /** - * Returns first request parameter associated with {@code name} parsed as an ISO 8601 timestamp, e.g. {@code 1984-12-18TZ}, {@code - * 2000-01-01T16:20:00Z}. - * - * @throws BadRequestException if request parameter is present but not a valid {@link DateTime}. - */ - public static Optional extractOptionalDatetimeParameter( - HttpServletRequest req, String name) { - String stringParam = req.getParameter(name); - try { - return isNullOrEmpty(stringParam) - ? Optional.empty() - : Optional.of(DateTime.parse(stringParam)); - } catch (IllegalArgumentException e) { - throw new BadRequestException("Bad ISO 8601 timestamp: " + name); - } - } public static ImmutableSet extractSetOfInstantParameters( HttpServletRequest req, String name) { @@ -338,26 +310,6 @@ public final class RequestParameters { } } - /** - * Returns all GET or POST date parameters associated with {@code name}, or an empty set if none. - * - *

Dates are parsed as an ISO 8601 timestamp, e.g. {@code - * 1984-12-18TZ}, {@code 2000-01-01T16:20:00Z}. - * - * @throws BadRequestException if one of the parameter values is not a valid {@link DateTime}. - */ - public static ImmutableSet extractSetOfDatetimeParameters( - HttpServletRequest req, String name) { - try { - return extractSetOfParameters(req, name).stream() - .filter(not(String::isEmpty)) - .map(DateTime::parse) - .collect(toImmutableSet()); - } catch (IllegalArgumentException e) { - throw new BadRequestException("Bad ISO 8601 timestamp: " + name); - } - } - private static boolean equalsFalse(@Nullable String value) { return nullToEmpty(value).equalsIgnoreCase("false"); } diff --git a/core/src/main/java/google/registry/security/XsrfTokenManager.java b/core/src/main/java/google/registry/security/XsrfTokenManager.java index 936d82072..d63406c05 100644 --- a/core/src/main/java/google/registry/security/XsrfTokenManager.java +++ b/core/src/main/java/google/registry/security/XsrfTokenManager.java @@ -56,7 +56,7 @@ public final class XsrfTokenManager { /** Generates an XSRF token for a given user based on email address. */ public String generateToken(String email) { checkArgumentNotNull(email); - long timestampMillis = clock.now().toEpochMilli(); + long timestampMillis = clock.nowMillis(); return encodeToken(ServerSecret.get().asBytes(), email, timestampMillis); } diff --git a/core/src/main/java/google/registry/tools/CreateOrUpdateBulkPricingPackageCommand.java b/core/src/main/java/google/registry/tools/CreateOrUpdateBulkPricingPackageCommand.java index b368c9241..6e36af254 100644 --- a/core/src/main/java/google/registry/tools/CreateOrUpdateBulkPricingPackageCommand.java +++ b/core/src/main/java/google/registry/tools/CreateOrUpdateBulkPricingPackageCommand.java @@ -16,20 +16,18 @@ package google.registry.tools; import static com.google.common.base.Preconditions.checkArgument; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; -import static google.registry.util.DateTimeUtils.toInstant; import com.beust.jcommander.Parameter; import google.registry.model.domain.token.AllocationToken; import google.registry.model.domain.token.AllocationToken.TokenType; import google.registry.model.domain.token.BulkPricingPackage; import google.registry.persistence.VKey; -import google.registry.tools.params.DateTimeParameter; +import google.registry.tools.params.InstantParameter; import java.time.Instant; import java.util.List; import java.util.Optional; import javax.annotation.Nullable; import org.joda.money.Money; -import org.joda.time.DateTime; /** Shared base class for commands to create or update a {@link BulkPricingPackage} object. */ abstract class CreateOrUpdateBulkPricingPackageCommand extends MutatingCommand { @@ -58,10 +56,10 @@ abstract class CreateOrUpdateBulkPricingPackageCommand extends MutatingCommand { @Nullable @Parameter( names = "--next_billing_date", - validateWith = DateTimeParameter.class, + validateWith = InstantParameter.class, description = "The next date that the bulk pricing package should be billed for its annual fee") - DateTime nextBillingDate; + Instant nextBillingDate; /** Returns the existing BulkPricingPackage or null if it does not exist. */ @Nullable @@ -108,8 +106,7 @@ abstract class CreateOrUpdateBulkPricingPackageCommand extends MutatingCommand { Optional.ofNullable(maxCreates).ifPresent(builder::setMaxCreates); Optional.ofNullable(price).ifPresent(builder::setBulkPrice); Optional.ofNullable(nextBillingDate) - .ifPresent( - nextBillingDate -> builder.setNextBillingDate(toInstant(nextBillingDate))); + .ifPresent(nextBillingDate -> builder.setNextBillingDate(nextBillingDate)); if (clearLastNotificationSent()) { builder.setLastNotificationSent((Instant) null); } diff --git a/core/src/main/java/google/registry/tools/CreateRegistrarGroupsCommand.java b/core/src/main/java/google/registry/tools/CreateRegistrarGroupsCommand.java index a7115b2b6..7a5f87d62 100644 --- a/core/src/main/java/google/registry/tools/CreateRegistrarGroupsCommand.java +++ b/core/src/main/java/google/registry/tools/CreateRegistrarGroupsCommand.java @@ -88,4 +88,3 @@ public class CreateRegistrarGroupsCommand extends ConfirmingCommand return "Success!"; } } - diff --git a/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java b/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java index c44f0f36c..2f536eb12 100644 --- a/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java +++ b/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java @@ -32,10 +32,12 @@ import com.google.common.collect.ImmutableMultimap; import google.registry.batch.CloudTasksUtils; import google.registry.model.rde.RdeMode; import google.registry.rde.RdeStagingAction; +import google.registry.util.DateTimeUtils; import jakarta.inject.Inject; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.stream.Collectors; -import org.joda.time.DateTime; /** * Command to kick off the server-side generation of an XML RDE or BRDA escrow deposit, which will @@ -54,7 +56,7 @@ final class GenerateEscrowDepositCommand implements Command { names = {"-w", "--watermark"}, description = "Point-in-time timestamp(s) for which time the deposit should be generated", required = true) - private List watermarks; + private List watermarks; @Parameter( names = {"-m", "--mode"}, @@ -88,14 +90,14 @@ final class GenerateEscrowDepositCommand implements Command { } // We need to test for cases where "--watermark=" is passed in as a parameter, because it would - // first be converted to an empty list, and as such the DateTime converter would not be called. + // first be converted to an empty list, and as such the Instant converter would not be called. if (tlds.isEmpty()) { throw new ParameterException("At least one TLD must be specified"); } assertTldsExist(tlds); - for (DateTime watermark : watermarks) { - if (!watermark.withTimeAtStartOfDay().equals(watermark)) { + for (Instant watermark : watermarks) { + if (!watermark.truncatedTo(ChronoUnit.DAYS).equals(watermark)) { throw new ParameterException("Each watermark date must be the start of a day"); } } @@ -117,7 +119,9 @@ final class GenerateEscrowDepositCommand implements Command { .put(PARAM_TLDS, tlds.stream().collect(Collectors.joining(","))) .put( PARAM_WATERMARKS, - watermarks.stream().map(DateTime::toString).collect(Collectors.joining(","))); + watermarks.stream() + .map(DateTimeUtils::formatInstant) + .collect(Collectors.joining(","))); if (revision != null) { paramsBuilder.put(PARAM_REVISION, String.valueOf(revision)); @@ -126,5 +130,4 @@ final class GenerateEscrowDepositCommand implements Command { RDE_REPORT_QUEUE, cloudTasksUtils.createTask(RdeStagingAction.class, POST, paramsBuilder.build())); } - } diff --git a/core/src/main/java/google/registry/tools/GenerateZoneFilesCommand.java b/core/src/main/java/google/registry/tools/GenerateZoneFilesCommand.java index 6219f6463..ac862fd03 100644 --- a/core/src/main/java/google/registry/tools/GenerateZoneFilesCommand.java +++ b/core/src/main/java/google/registry/tools/GenerateZoneFilesCommand.java @@ -15,8 +15,6 @@ package google.registry.tools; import static google.registry.model.tld.Tlds.assertTldsExist; -import static google.registry.util.DateTimeUtils.toLocalDate; -import static java.time.ZoneOffset.UTC; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; @@ -28,6 +26,7 @@ import jakarta.inject.Inject; import java.io.IOException; import java.time.Duration; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Map; @@ -61,8 +60,7 @@ final class GenerateZoneFilesCommand implements CommandWithConnection { @Override public void run() throws IOException { if (exportDate == null) { - exportDate = - toLocalDate(clock.now().minus(Duration.ofMinutes(2))).atStartOfDay(UTC).toInstant(); + exportDate = clock.now().minus(Duration.ofMinutes(2)).truncatedTo(ChronoUnit.DAYS); } assertTldsExist(mainParameters); ImmutableMap params = ImmutableMap.of( diff --git a/core/src/main/java/google/registry/tools/GetKeyringSecretCommand.java b/core/src/main/java/google/registry/tools/GetKeyringSecretCommand.java index e415a464c..e4c8d335b 100644 --- a/core/src/main/java/google/registry/tools/GetKeyringSecretCommand.java +++ b/core/src/main/java/google/registry/tools/GetKeyringSecretCommand.java @@ -14,7 +14,6 @@ package google.registry.tools; - import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; import google.registry.keyring.api.KeySerializer; diff --git a/core/src/main/java/google/registry/tools/GsonUtils.java b/core/src/main/java/google/registry/tools/GsonUtils.java index a5525898b..f50ad8e50 100644 --- a/core/src/main/java/google/registry/tools/GsonUtils.java +++ b/core/src/main/java/google/registry/tools/GsonUtils.java @@ -26,7 +26,6 @@ import google.registry.model.adapters.CurrencyJsonAdapter; import google.registry.model.adapters.SerializableJsonTypeAdapter; import google.registry.util.CidrAddressBlock; import google.registry.util.CidrAddressBlock.CidrAddressBlockAdapter; -import google.registry.util.DateTimeTypeAdapter; import google.registry.util.DurationTypeAdapter; import google.registry.util.InstantTypeAdapter; import java.io.IOException; @@ -34,7 +33,6 @@ import java.io.Serializable; import java.time.Duration; import java.time.Instant; import org.joda.money.CurrencyUnit; -import org.joda.time.DateTime; /** Utility class for methods related to GSON and necessary GSON processing. */ public class GsonUtils { @@ -78,7 +76,7 @@ public class GsonUtils { return new GsonBuilder() .registerTypeAdapter(CidrAddressBlock.class, new CidrAddressBlockAdapter()) .registerTypeAdapter(CurrencyUnit.class, new CurrencyJsonAdapter()) - .registerTypeAdapter(DateTime.class, new DateTimeTypeAdapter()) + .registerTypeAdapter(Instant.class, new InstantTypeAdapter()) .registerTypeAdapter(Duration.class, new DurationTypeAdapter()) .registerTypeAdapter(Instant.class, new InstantTypeAdapter()) .registerTypeAdapter(Serializable.class, new SerializableJsonTypeAdapter()) diff --git a/core/src/main/java/google/registry/tools/SetupOteCommand.java b/core/src/main/java/google/registry/tools/SetupOteCommand.java index 1cfc38be3..13584c23c 100644 --- a/core/src/main/java/google/registry/tools/SetupOteCommand.java +++ b/core/src/main/java/google/registry/tools/SetupOteCommand.java @@ -126,7 +126,6 @@ final class SetupOteCommand extends ConfirmingCommand { String.format( """ - WARNING: Running against %s environment. Are \ you sure you didn't mean to run this against sandbox (e.g. "-e SANDBOX")?\ """, diff --git a/core/src/main/java/google/registry/tools/UpdateKeyringSecretCommand.java b/core/src/main/java/google/registry/tools/UpdateKeyringSecretCommand.java index 3561a435f..f6fc16276 100644 --- a/core/src/main/java/google/registry/tools/UpdateKeyringSecretCommand.java +++ b/core/src/main/java/google/registry/tools/UpdateKeyringSecretCommand.java @@ -107,4 +107,3 @@ final class UpdateKeyringSecretCommand implements Command { secretManagerKeyringUpdater.update(); } } - diff --git a/core/src/main/java/google/registry/tools/params/DateParameter.java b/core/src/main/java/google/registry/tools/params/DateParameter.java index 6fee29e3e..035bb885e 100644 --- a/core/src/main/java/google/registry/tools/params/DateParameter.java +++ b/core/src/main/java/google/registry/tools/params/DateParameter.java @@ -13,32 +13,32 @@ // limitations under the License. package google.registry.tools.params; -import static org.joda.time.DateTimeZone.UTC; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; +import static java.time.ZoneOffset.UTC; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; /** - * {@link DateTime} CLI parameter converter/validator restricted to dates. The {@link DateTime}s - * produced by this class will always have a time zone of {@link DateTimeZone#UTC}. + * {@link Instant} CLI parameter converter/validator restricted to dates. The {@link Instant}s + * produced by this class will always have a time zone of {@link ZoneOffset#UTC}. */ -public final class DateParameter extends ParameterConverterValidator { +public final class DateParameter extends ParameterConverterValidator { public DateParameter() { super("not an ISO-8601 date"); } /** - * Parser for DateTimes that permits only a restricted subset of ISO 8601 datetime syntax. - * The supported format is "YYYY-MM-DD", i.e. there must only be a complete date. + * Parser for Instants that permits only a restricted subset of ISO 8601 datetime syntax. The + * supported format is "YYYY-MM-DD", i.e. there must only be a complete date. */ - private static final DateTimeFormatter STRICT_DATE_PARSER = - new DateTimeFormatter(null, ISODateTimeFormat.date().getParser()); + private static final DateTimeFormatter STRICT_DATE_PARSER = DateTimeFormatter.ISO_LOCAL_DATE; @Override - public DateTime convert(String value) { - return DateTime.parse(value, STRICT_DATE_PARSER).withZoneRetainFields(UTC); + public Instant convert(String value) { + return LocalDate.parse(value, STRICT_DATE_PARSER).atStartOfDay(UTC).toInstant(); } } diff --git a/core/src/main/java/google/registry/tools/params/DateTimeParameter.java b/core/src/main/java/google/registry/tools/params/DateTimeParameter.java deleted file mode 100644 index a20d1b984..000000000 --- a/core/src/main/java/google/registry/tools/params/DateTimeParameter.java +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2017 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.tools.params; -import static org.joda.time.DateTimeZone.UTC; - -import com.google.common.primitives.Longs; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.DateTimeFormatterBuilder; -import org.joda.time.format.DateTimeParser; -import org.joda.time.format.ISODateTimeFormat; - -/** {@linkplain DateTime} CLI parameter converter/validator. Can be ISO or millis from epoch. */ -public final class DateTimeParameter extends ParameterConverterValidator { - - public DateTimeParameter() { - super("not an ISO-8601 timestamp (or millis from epoch)"); - } - - /** - * Parser for DateTimes that permits only a restricted subset of ISO 8601 datetime syntax. - * The supported format is "YYYY-MM-DD'T'HH:MM:SS[.SSS]ZZ", i.e. there must be a complete date - * and at least hours, minutes, seconds, and time zone; milliseconds are optional. - * - *

We use this instead of the default {@link ISODateTimeFormat#dateTimeParser()} because that - * parser is very flexible and accepts date times with missing dates, missing dates, and various - * other unspecified fields that can lead to confusion and ambiguity. - */ - private static final DateTimeFormatter STRICT_DATE_TIME_PARSER = new DateTimeFormatterBuilder() - .append(null, new DateTimeParser[] { - // The formatter will try the following parsers in order until one succeeds. - ISODateTimeFormat.dateTime().getParser(), - ISODateTimeFormat.dateTimeNoMillis().getParser()}) - .toFormatter(); - - @Override - public DateTime convert(String value) { - Long millis = Longs.tryParse(value); - if (millis != null) { - return new DateTime(millis.longValue(), UTC); - } - return DateTime.parse(value, STRICT_DATE_TIME_PARSER).withZone(UTC); - } -} diff --git a/core/src/main/java/google/registry/tools/params/DurationParameter.java b/core/src/main/java/google/registry/tools/params/DurationParameter.java index 3f7680757..1991fca1f 100644 --- a/core/src/main/java/google/registry/tools/params/DurationParameter.java +++ b/core/src/main/java/google/registry/tools/params/DurationParameter.java @@ -14,8 +14,7 @@ package google.registry.tools.params; -import org.joda.time.Duration; -import org.joda.time.Period; +import java.time.Duration; /** Duration CLI parameter converter/validator. */ public final class DurationParameter extends ParameterConverterValidator { @@ -26,6 +25,6 @@ public final class DurationParameter extends ParameterConverterValidator { - private static final DateTimeParameter DATE_TIME_CONVERTER = new DateTimeParameter(); - public InstantParameter() { super("not an ISO-8601 timestamp (or millis from epoch)"); } - /** - * Converts the given string to an {@link Instant}. - * - *

Delegates to {@link DateTimeParameter} for parsing, then converts to {@link Instant}. - */ @Override public Instant convert(String value) { - return toInstant(DATE_TIME_CONVERTER.convert(value)); + Long millis = Longs.tryParse(value); + if (millis != null) { + return Instant.ofEpochMilli(millis); + } + return OffsetDateTime.parse(value).toInstant(); } } diff --git a/core/src/main/java/google/registry/tools/params/IntervalParameter.java b/core/src/main/java/google/registry/tools/params/IntervalParameter.java deleted file mode 100644 index 951bb28bd..000000000 --- a/core/src/main/java/google/registry/tools/params/IntervalParameter.java +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2017 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.tools.params; - -import org.joda.time.DateTimeZone; -import org.joda.time.Interval; - -/** Interval CLI parameter converter/validator. */ -public final class IntervalParameter extends ParameterConverterValidator { - - public IntervalParameter() { - super("not an ISO-8601 interval (e.g. 2004-06-09T12:30:00Z/2004-07-10T13:30:00Z)"); - } - - @Override - public Interval convert(String value) { - // Interval.parse(null) creates an interval with both start and end times set to now. - // Do something a little more reasonable. - if (value == null) { - throw new NullPointerException(); - } - Interval interval = Interval.parse(value); - // Interval does not have a way to set the time zone, so create a new interval with the - // start and end times of the parsed interval converted to UTC. - return new Interval( - interval.getStart().withZone(DateTimeZone.UTC), - interval.getEnd().withZone(DateTimeZone.UTC)); - } -} diff --git a/core/src/main/java/google/registry/tools/params/LocalDateParameter.java b/core/src/main/java/google/registry/tools/params/LocalDateParameter.java index 213cc25f5..6595b8281 100644 --- a/core/src/main/java/google/registry/tools/params/LocalDateParameter.java +++ b/core/src/main/java/google/registry/tools/params/LocalDateParameter.java @@ -14,8 +14,8 @@ package google.registry.tools.params; -import org.joda.time.LocalDate; -import org.joda.time.format.ISODateTimeFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; /** {@linkplain LocalDate} CLI parameter converter/validator. */ public final class LocalDateParameter extends ParameterConverterValidator { @@ -26,6 +26,6 @@ public final class LocalDateParameter extends ParameterConverterValidator {} diff --git a/core/src/main/java/google/registry/tools/params/ParameterConverterValidator.java b/core/src/main/java/google/registry/tools/params/ParameterConverterValidator.java index 6b59efcef..5ca564ace 100644 --- a/core/src/main/java/google/registry/tools/params/ParameterConverterValidator.java +++ b/core/src/main/java/google/registry/tools/params/ParameterConverterValidator.java @@ -17,6 +17,7 @@ package google.registry.tools.params; import com.beust.jcommander.IParameterValidator; import com.beust.jcommander.IStringConverter; import com.beust.jcommander.ParameterException; +import java.time.DateTimeException; /** Base class for parameters that do both conversion and validation (reduces boilerplate). */ public abstract class ParameterConverterValidator @@ -39,7 +40,7 @@ public abstract class ParameterConverterValidator public void validate(String name, String value) throws ParameterException { try { convert(value); - } catch (IllegalArgumentException e) { + } catch (IllegalArgumentException | DateTimeException e) { throw new ParameterException(String.format("%s=%s %s", name, value, messageForInvalid), e); } } diff --git a/core/src/main/java/google/registry/tools/params/ParameterFactory.java b/core/src/main/java/google/registry/tools/params/ParameterFactory.java index 53dc61be0..ea0adad65 100644 --- a/core/src/main/java/google/registry/tools/params/ParameterFactory.java +++ b/core/src/main/java/google/registry/tools/params/ParameterFactory.java @@ -20,14 +20,13 @@ import com.google.common.collect.ImmutableMap; import com.google.common.net.HostAndPort; import com.google.common.net.InternetDomainName; import java.nio.file.Path; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.YearMonth; import java.util.logging.Level; import javax.annotation.Nullable; import org.joda.money.Money; -import org.joda.time.DateTime; -import org.joda.time.Duration; -import org.joda.time.Interval; -import org.joda.time.LocalDate; -import org.joda.time.YearMonth; /** JCommander converter factory that works for non-internal converters. */ public final class ParameterFactory implements IStringConverterFactory { @@ -41,17 +40,14 @@ public final class ParameterFactory implements IStringConverterFactory { private static final ImmutableMap, Class>> CONVERTERS = new ImmutableMap.Builder, Class>>() - .put(DateTime.class, DateTimeParameter.class) + .put(Instant.class, InstantParameter.class) .put(Duration.class, DurationParameter.class) .put(HostAndPort.class, HostAndPortParameter.class) .put(InternetDomainName.class, InternetDomainNameParameter.class) - .put(Interval.class, IntervalParameter.class) .put(Level.class, LoggingLevelParameter.class) .put(LocalDate.class, LocalDateParameter.class) .put(Money.class, MoneyParameter.class) .put(Path.class, PathParameter.class) .put(YearMonth.class, YearMonthParameter.class) .build(); - - } diff --git a/core/src/main/java/google/registry/tools/params/TransitionListParameter.java b/core/src/main/java/google/registry/tools/params/TransitionListParameter.java index 7941af553..883867d85 100644 --- a/core/src/main/java/google/registry/tools/params/TransitionListParameter.java +++ b/core/src/main/java/google/registry/tools/params/TransitionListParameter.java @@ -29,7 +29,7 @@ import org.joda.money.Money; // TODO(b/19031334): Investigate making this complex generic type work with the factory. public abstract class TransitionListParameter extends KeyValueMapParameter { - private static final InstantParameter DATE_TIME_CONVERTER = new InstantParameter(); + private static final InstantParameter INSTANT_CONVERTER = new InstantParameter(); public TransitionListParameter() { // This is not sentence-capitalized like most exception messages because it is appended to the @@ -39,7 +39,7 @@ public abstract class TransitionListParameter extends KeyValueMapParameter { @@ -26,6 +25,6 @@ public final class YearMonthParameter extends ParameterConverterValidator 2 minutes ago"); } - if (exportTime.isBefore(now.minusMillis(databaseRetention.toMillis()))) { + if (exportTime.isBefore(now.minus(databaseRetention))) { throw new BadRequestException( String.format("Invalid export time: must be < %d days ago", databaseRetention.toDays())); } diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleDumDownloadAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleDumDownloadAction.java index 4af134206..4a1dd5ec5 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleDumDownloadAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleDumDownloadAction.java @@ -16,7 +16,6 @@ package google.registry.ui.server.console; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.request.Action.Method.GET; -import static google.registry.util.DateTimeUtils.toLocalDate; import static java.time.ZoneOffset.UTC; import com.google.common.collect.ImmutableList; @@ -86,8 +85,7 @@ public class ConsoleDumDownloadAction extends ConsoleApiAction { .setHeader("Cache-Control", "max-age=86400"); // 86400 seconds = 1 day consoleApiParams .response() - .setDateHeader( - "Expires", toLocalDate(clock.now()).atStartOfDay(UTC).plusDays(1).toInstant()); + .setDateHeader("Expires", clock.nowDate().atStartOfDay(UTC).plusDays(1).toInstant()); try (var writer = consoleApiParams.response().getWriter()) { CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT); diff --git a/core/src/main/java/google/registry/xml/PeriodAdapter.java b/core/src/main/java/google/registry/xml/PeriodAdapter.java index a9bdf7cda..e40953b8c 100644 --- a/core/src/main/java/google/registry/xml/PeriodAdapter.java +++ b/core/src/main/java/google/registry/xml/PeriodAdapter.java @@ -17,8 +17,8 @@ package google.registry.xml; import static com.google.common.base.Strings.isNullOrEmpty; import jakarta.xml.bind.annotation.adapters.XmlAdapter; +import java.time.Period; import javax.annotation.Nullable; -import org.joda.time.Period; /** Adapter to use Joda {@link Period} when marshalling XML. */ public class PeriodAdapter extends XmlAdapter { diff --git a/core/src/main/java/google/registry/xml/UtcDateTimeAdapter.java b/core/src/main/java/google/registry/xml/UtcDateTimeAdapter.java deleted file mode 100644 index d1da1622c..000000000 --- a/core/src/main/java/google/registry/xml/UtcDateTimeAdapter.java +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 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.xml; - -import static com.google.common.base.Strings.isNullOrEmpty; -import static org.joda.time.DateTimeZone.UTC; - -import jakarta.xml.bind.annotation.adapters.XmlAdapter; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; - -/** - * Adapter to use Joda {@link DateTime} when marshalling XML timestamps. - * - *

These fields shall contain timestamps indicating the date and time in UTC as specified in - * RFC3339, with no offset from the zero meridian. For example: {@code 2010-10-17T00:00:00Z}. - */ -public class UtcDateTimeAdapter extends XmlAdapter { - - /** @see ISODateTimeFormat#dateTimeNoMillis */ - private static final DateTimeFormatter MARSHAL_FORMAT = ISODateTimeFormat.dateTimeNoMillis(); - - /** @see ISODateTimeFormat#dateTimeParser */ - private static final DateTimeFormatter UNMARSHAL_FORMAT = ISODateTimeFormat.dateTimeParser(); - - /** Same as {@link #marshal(DateTime)}, but in a convenient static format. */ - public static String getFormattedString(@Nullable DateTime timestamp) { - return (timestamp == null) ? "" : MARSHAL_FORMAT.print(timestamp.toDateTime(UTC)); - } - - /** - * Parses an ISO timestamp string into a UTC {@link DateTime} object, converting timezones if - * necessary. If {@code timestamp} is empty or {@code null} then {@code null} is returned. - */ - @Nullable - @CheckForNull - @Override - public DateTime unmarshal(@Nullable String timestamp) { - if (isNullOrEmpty(timestamp)) { - return null; - } - return UNMARSHAL_FORMAT.parseDateTime(timestamp).withZone(UTC); - } - - /** - * Converts {@link DateTime} to UTC and returns it as an RFC3339 string. If {@code timestamp} is - * {@code null} then an empty string is returned. - */ - @Override - public String marshal(@Nullable DateTime timestamp) { - return getFormattedString(timestamp); - } -} diff --git a/core/src/main/java/google/registry/xml/UtcInstantAdapter.java b/core/src/main/java/google/registry/xml/UtcInstantAdapter.java index 1613ce797..b0ed85d83 100644 --- a/core/src/main/java/google/registry/xml/UtcInstantAdapter.java +++ b/core/src/main/java/google/registry/xml/UtcInstantAdapter.java @@ -1,4 +1,4 @@ -// Copyright 2026 The Nomulus Authors. All Rights Reserved. +// Copyright 2017 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. @@ -15,41 +15,34 @@ package google.registry.xml; import static com.google.common.base.Strings.isNullOrEmpty; +import static google.registry.util.DateTimeUtils.formatInstant; import static google.registry.util.DateTimeUtils.parseInstant; -import static java.time.ZoneOffset.UTC; import jakarta.xml.bind.annotation.adapters.XmlAdapter; import java.time.Instant; -import java.time.format.DateTimeFormatter; import javax.annotation.CheckForNull; import javax.annotation.Nullable; /** - * Adapter to use java.time {@link Instant} when marshalling XML timestamps. + * Adapter to use an {@link Instant} when marshalling XML timestamps. * *

These fields shall contain timestamps indicating the date and time in UTC as specified in - * RFC3339, with no offset from the zero meridian. For example: {@code 2010-10-17T00:00:00Z}. + * RFC3339. + * + * @see RFC3339 */ public class UtcInstantAdapter extends XmlAdapter { - private static final DateTimeFormatter MARSHAL_FORMAT = - DateTimeFormatter.ofPattern("u-MM-dd'T'HH:mm:ss'Z'").withZone(UTC); - - /** Same as {@link #marshal(Instant)}, but in a convenient static format. */ public static String getFormattedString(@Nullable Instant timestamp) { - if (timestamp == null) { - return ""; - } - return MARSHAL_FORMAT.format(timestamp); + return (timestamp == null) ? "" : formatInstant(timestamp); } /** - * Parses an ISO timestamp string into a UTC {@link Instant} object. If {@code timestamp} is empty - * or {@code null} then {@code null} is returned. + * Parses an ISO timestamp string into a UTC {@link Instant} object, converting timezones if + * necessary. If {@code timestamp} is empty or {@code null} then {@code null} is returned. */ - @Nullable - @CheckForNull @Override + @CheckForNull public Instant unmarshal(@Nullable String timestamp) { if (isNullOrEmpty(timestamp)) { return null; diff --git a/core/src/main/resources/META-INF/persistence.xml b/core/src/main/resources/META-INF/persistence.xml index 438e7ddae..322ce06f8 100644 --- a/core/src/main/resources/META-INF/persistence.xml +++ b/core/src/main/resources/META-INF/persistence.xml @@ -83,7 +83,6 @@ google.registry.persistence.converter.BloomFilterConverter google.registry.persistence.converter.CurrencyUnitConverter - google.registry.persistence.converter.DateTimeConverter google.registry.model.billing.VKeyConverter_BillingCancellation diff --git a/core/src/test/java/google/registry/batch/CloudTasksUtilsTest.java b/core/src/test/java/google/registry/batch/CloudTasksUtilsTest.java index a58a0bcde..447a66d14 100644 --- a/core/src/test/java/google/registry/batch/CloudTasksUtilsTest.java +++ b/core/src/test/java/google/registry/batch/CloudTasksUtilsTest.java @@ -216,8 +216,8 @@ public class CloudTasksUtilsTest { assertThat(task.getScheduleTime().getSeconds()).isNotEqualTo(0); Instant scheduleTime = Instant.ofEpochSecond(task.getScheduleTime().getSeconds()); - Instant lowerBoundTime = Instant.ofEpochMilli(clock.now().toEpochMilli()); - Instant upperBound = Instant.ofEpochMilli(clock.now().plusSeconds(100).toEpochMilli()); + Instant lowerBoundTime = clock.now(); + Instant upperBound = clock.now().plusSeconds(100); assertThat(scheduleTime.isBefore(lowerBoundTime)).isFalse(); assertThat(upperBound.isBefore(scheduleTime)).isFalse(); @@ -253,7 +253,7 @@ public class CloudTasksUtilsTest { .isEqualTo("https://backend.registry.test/the/path?key1=val1&key2=val2&key1=val3"); verifyOidcToken(task); assertThat(Instant.ofEpochSecond(task.getScheduleTime().getSeconds())) - .isEqualTo(Instant.ofEpochMilli(clock.now().plus(Duration.ofMinutes(10)).toEpochMilli())); + .isEqualTo(clock.now().plus(Duration.ofMinutes(10))); } @Test diff --git a/core/src/test/java/google/registry/batch/ResaveEntityActionTest.java b/core/src/test/java/google/registry/batch/ResaveEntityActionTest.java index da3e0fe2c..62843d019 100644 --- a/core/src/test/java/google/registry/batch/ResaveEntityActionTest.java +++ b/core/src/test/java/google/registry/batch/ResaveEntityActionTest.java @@ -25,7 +25,6 @@ import static google.registry.testing.DatabaseHelper.persistDomainWithDependentR import static google.registry.testing.DatabaseHelper.persistDomainWithPendingTransfer; import static google.registry.testing.DatabaseHelper.persistResource; import static google.registry.util.DateTimeUtils.plusDays; -import static org.joda.time.Duration.standardDays; import static org.mockito.Mockito.verify; import com.google.cloud.tasks.v2.HttpMethod; @@ -41,6 +40,7 @@ import google.registry.request.Response; import google.registry.testing.CloudTasksHelper; import google.registry.testing.CloudTasksHelper.TaskMatcher; import google.registry.testing.FakeClock; +import java.time.Duration; import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -121,7 +121,7 @@ public class ResaveEntityActionTest { plusDays(clock.now(), 30), "TheRegistrar"))) .build()); - clock.advanceBy(standardDays(30)); + clock.advanceBy(Duration.ofDays(30)); Instant requestedTime = clock.now(); assertThat(domain.getGracePeriods()).isNotEmpty(); diff --git a/core/src/test/java/google/registry/beam/common/RegistryJpaReadTest.java b/core/src/test/java/google/registry/beam/common/RegistryJpaReadTest.java index a4d8f1a04..281aa4ff6 100644 --- a/core/src/test/java/google/registry/beam/common/RegistryJpaReadTest.java +++ b/core/src/test/java/google/registry/beam/common/RegistryJpaReadTest.java @@ -44,10 +44,10 @@ import google.registry.persistence.transaction.CriteriaQueryBuilder; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.testing.FakeClock; +import java.time.Instant; import org.apache.beam.sdk.coders.StringUtf8Coder; import org.apache.beam.sdk.testing.PAssert; import org.apache.beam.sdk.values.PCollection; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -55,7 +55,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; /** Unit tests for {@link RegistryJpaIO.Read}. */ public class RegistryJpaReadTest { - private static final DateTime START_TIME = DateTime.parse("2000-01-01T00:00:00.0Z"); + private static final Instant START_TIME = Instant.parse("2000-01-01T00:00:00.0Z"); private final FakeClock fakeClock = new FakeClock(START_TIME); diff --git a/core/src/test/java/google/registry/beam/common/RegistryJpaWriteTest.java b/core/src/test/java/google/registry/beam/common/RegistryJpaWriteTest.java index e3d6c05bd..d43fd6fc9 100644 --- a/core/src/test/java/google/registry/beam/common/RegistryJpaWriteTest.java +++ b/core/src/test/java/google/registry/beam/common/RegistryJpaWriteTest.java @@ -28,15 +28,15 @@ import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationT import google.registry.persistence.transaction.JpaTransactionManagerExtension; import google.registry.testing.FakeClock; import java.io.Serializable; +import java.time.Instant; import org.apache.beam.sdk.transforms.Create; -import org.joda.time.DateTime; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; /** Unit test for {@link RegistryJpaIO.Write}. */ class RegistryJpaWriteTest implements Serializable { - private final FakeClock fakeClock = new FakeClock(DateTime.parse("2000-01-01T00:00:00.0Z")); + private final FakeClock fakeClock = new FakeClock(Instant.parse("2000-01-01T00:00:00.0Z")); @RegisterExtension final transient JpaIntegrationTestExtension jpa = diff --git a/core/src/test/java/google/registry/beam/rde/RdePipelineTest.java b/core/src/test/java/google/registry/beam/rde/RdePipelineTest.java index a77412883..bd8fa1314 100644 --- a/core/src/test/java/google/registry/beam/rde/RdePipelineTest.java +++ b/core/src/test/java/google/registry/beam/rde/RdePipelineTest.java @@ -96,7 +96,6 @@ import org.apache.beam.sdk.values.KV; import org.apache.beam.sdk.values.PCollection; import org.bouncycastle.openpgp.PGPPrivateKey; import org.bouncycastle.openpgp.PGPPublicKey; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -113,9 +112,9 @@ public class RdePipelineTest { private static final String HOST_NAME_PATTERN = "(.*)"; // This is the default creation time for test data. - private final FakeClock clock = new FakeClock(DateTime.parse("1999-12-31TZ")); + private final FakeClock clock = new FakeClock(Instant.parse("1999-12-31T00:00:00Z")); - // This is teh default as-of time the RDE/BRDA job. + // This is the default as-of time the RDE/BRDA job. private final Instant now = Instant.parse("2000-01-01T00:00:00.000Z"); private final ImmutableSet pendings = @@ -352,8 +351,8 @@ public class RdePipelineTest { TheRegistrar TheRegistrar - 1970-01-01T00:00:00Z - 294247-01-10T04:00:54Z + 1970-01-01T00:00:00.000Z + 294247-01-10T04:00:54.775Z \ """); } @@ -381,8 +380,8 @@ public class RdePipelineTest { TheRegistrar TheRegistrar - 1970-01-01T00:00:00Z - 294247-01-10T04:00:54Z + 1970-01-01T00:00:00.000Z + 294247-01-10T04:00:54.775Z \ """); } else { @@ -415,8 +414,8 @@ public class RdePipelineTest { TheRegistrar TheRegistrar - 1970-01-01T00:00:00Z - 294247-01-10T04:00:54Z + 1970-01-01T00:00:00.000Z + 294247-01-10T04:00:54.775Z \ """); } diff --git a/core/src/test/java/google/registry/beam/spec11/Spec11PipelineTest.java b/core/src/test/java/google/registry/beam/spec11/Spec11PipelineTest.java index 4de36e2df..b618bc483 100644 --- a/core/src/test/java/google/registry/beam/spec11/Spec11PipelineTest.java +++ b/core/src/test/java/google/registry/beam/spec11/Spec11PipelineTest.java @@ -53,6 +53,7 @@ import google.registry.util.Retrier; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; +import java.time.Instant; import java.time.LocalDate; import org.apache.beam.sdk.coders.KvCoder; import org.apache.beam.sdk.coders.SerializableCoder; @@ -64,7 +65,6 @@ import org.apache.beam.sdk.values.PCollection; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.checkerframework.checker.nullness.qual.Nullable; -import org.joda.time.DateTime; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -80,7 +80,7 @@ import org.junit.jupiter.api.io.TempDir; */ class Spec11PipelineTest { - private static final DateTime START_TIME = DateTime.parse("2020-01-27T00:00:00.0Z"); + private static final Instant START_TIME = Instant.parse("2020-01-27T00:00:00.0Z"); private final FakeClock fakeClock = new FakeClock(START_TIME); private static final String DATE = "2020-01-27"; diff --git a/core/src/test/java/google/registry/export/sheet/SyncRegistrarsSheetTest.java b/core/src/test/java/google/registry/export/sheet/SyncRegistrarsSheetTest.java index b9de16b6c..0ef69e714 100644 --- a/core/src/test/java/google/registry/export/sheet/SyncRegistrarsSheetTest.java +++ b/core/src/test/java/google/registry/export/sheet/SyncRegistrarsSheetTest.java @@ -28,7 +28,6 @@ import static google.registry.util.DateTimeUtils.minusHours; import static google.registry.util.DateTimeUtils.plusHours; import static org.joda.money.CurrencyUnit.JPY; import static org.joda.money.CurrencyUnit.USD; -import static org.joda.time.Duration.standardMinutes; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; @@ -43,6 +42,7 @@ import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.testing.DatabaseHelper; import google.registry.testing.FakeClock; +import java.time.Duration; import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -182,7 +182,7 @@ public class SyncRegistrarsSheetTest { Instant registrarCreationTime = persistResource(registrar).getCreationTime(); persistResources(contacts); - clock.advanceBy(standardMinutes(1)); + clock.advanceBy(Duration.ofMinutes(1)); newSyncRegistrarsSheet().run("foobar"); verify(sheetSynchronizer).synchronize(eq("foobar"), rowsCaptor.capture()); diff --git a/core/src/test/java/google/registry/flows/EppControllerTest.java b/core/src/test/java/google/registry/flows/EppControllerTest.java index 03a836301..1b53d7efb 100644 --- a/core/src/test/java/google/registry/flows/EppControllerTest.java +++ b/core/src/test/java/google/registry/flows/EppControllerTest.java @@ -45,11 +45,11 @@ import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationT import google.registry.testing.FakeClock; import google.registry.util.Clock; import google.registry.xml.ValidationMode; +import java.time.Instant; import java.util.List; import java.util.Map; import java.util.logging.LogRecord; import java.util.logging.Logger; -import org.joda.time.DateTime; import org.json.simple.JSONValue; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -81,7 +81,7 @@ class EppControllerTest { @Mock EppResponse eppResponse; @Mock Result result; - private static final DateTime START_TIME = DateTime.parse("2016-09-01T00:00:00Z"); + private static final Instant START_TIME = Instant.parse("2016-09-01T00:00:00Z"); private final Clock clock = new FakeClock(START_TIME); private final TestLogHandler logHandler = new TestLogHandler(); diff --git a/core/src/test/java/google/registry/flows/EppLoggedOutTest.java b/core/src/test/java/google/registry/flows/EppLoggedOutTest.java index 63758c6f5..66b3fccd4 100644 --- a/core/src/test/java/google/registry/flows/EppLoggedOutTest.java +++ b/core/src/test/java/google/registry/flows/EppLoggedOutTest.java @@ -14,7 +14,6 @@ package google.registry.flows; - import com.google.common.collect.ImmutableMap; import java.time.Instant; import java.time.temporal.ChronoUnit; diff --git a/core/src/test/java/google/registry/flows/EppTestComponent.java b/core/src/test/java/google/registry/flows/EppTestComponent.java index 3298a7521..1a4d621ee 100644 --- a/core/src/test/java/google/registry/flows/EppTestComponent.java +++ b/core/src/test/java/google/registry/flows/EppTestComponent.java @@ -150,4 +150,3 @@ public interface EppTestComponent { FlowComponent.Builder flowComponentBuilder(); } } - diff --git a/core/src/test/java/google/registry/flows/FlowTestCase.java b/core/src/test/java/google/registry/flows/FlowTestCase.java index 5777c84be..d053ba4b3 100644 --- a/core/src/test/java/google/registry/flows/FlowTestCase.java +++ b/core/src/test/java/google/registry/flows/FlowTestCase.java @@ -27,7 +27,6 @@ import static google.registry.util.DateTimeUtils.END_INSTANT; import static google.registry.util.DateTimeUtils.START_INSTANT; import static google.registry.xml.XmlTestUtils.assertXmlEquals; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -53,12 +52,12 @@ import google.registry.testing.FakeHttpSession; import google.registry.testing.TestDataHelper; import google.registry.util.TypeUtils.TypeInstantiator; import google.registry.xml.ValidationMode; +import java.time.Instant; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import javax.annotation.Nullable; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.RegisterExtension; @@ -83,7 +82,7 @@ public abstract class FlowTestCase { protected EppLoader eppLoader; protected SessionMetadata sessionMetadata; - protected FakeClock clock = new FakeClock(DateTime.now(UTC)); + protected FakeClock clock = new FakeClock(Instant.now()); protected TransportCredentials credentials = new PasswordOnlyTransportCredentials(); protected EppRequestSource eppRequestSource = EppRequestSource.UNIT_TEST; protected CloudTasksHelper cloudTasksHelper; diff --git a/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java b/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java index 8a7bb8d88..584820575 100644 --- a/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java +++ b/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java @@ -1437,4 +1437,3 @@ class HostUpdateFlowTest extends ResourceFlowTestCase { assertIcannReportingActivityFieldLogged("srs-host-update"); } } - diff --git a/core/src/test/java/google/registry/model/EntityTestCase.java b/core/src/test/java/google/registry/model/EntityTestCase.java index 8ea9acf61..ee6423eb7 100644 --- a/core/src/test/java/google/registry/model/EntityTestCase.java +++ b/core/src/test/java/google/registry/model/EntityTestCase.java @@ -13,13 +13,12 @@ // limitations under the License. package google.registry.model; -import static org.joda.time.DateTimeZone.UTC; import google.registry.persistence.transaction.JpaEntityCoverageExtension; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.testing.FakeClock; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.RegisterExtension; @@ -37,7 +36,7 @@ public abstract class EntityTestCase { DISABLED } - protected FakeClock fakeClock = new FakeClock(DateTime.now(UTC)); + protected FakeClock fakeClock = new FakeClock(Instant.now()); @Order(Order.DEFAULT) @RegisterExtension diff --git a/core/src/test/java/google/registry/model/reporting/HistoryEntryDaoTest.java b/core/src/test/java/google/registry/model/reporting/HistoryEntryDaoTest.java index d197dba01..b9a0b8b65 100644 --- a/core/src/test/java/google/registry/model/reporting/HistoryEntryDaoTest.java +++ b/core/src/test/java/google/registry/model/reporting/HistoryEntryDaoTest.java @@ -32,7 +32,7 @@ import google.registry.model.domain.Period; import google.registry.model.eppcommon.Trid; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField; import google.registry.testing.DatabaseHelper; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,7 +43,7 @@ class HistoryEntryDaoTest extends EntityTestCase { @BeforeEach void beforeEach() { - fakeClock.setTo(DateTime.parse("2020-10-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-10-01T00:00:00Z")); createTld("foobar"); domain = persistActiveDomain("foo.foobar"); DomainTransactionRecord transactionRecord = diff --git a/core/src/test/java/google/registry/model/smd/SignedMarkRevocationListTest.java b/core/src/test/java/google/registry/model/smd/SignedMarkRevocationListTest.java index 1342f2932..5d861ffc0 100644 --- a/core/src/test/java/google/registry/model/smd/SignedMarkRevocationListTest.java +++ b/core/src/test/java/google/registry/model/smd/SignedMarkRevocationListTest.java @@ -16,13 +16,13 @@ package google.registry.model.smd; import static com.google.common.truth.Truth.assertThat; import static google.registry.util.DateTimeUtils.START_INSTANT; -import static org.joda.time.Duration.standardDays; import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.collect.ImmutableMap; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.testing.FakeClock; +import java.time.Duration; import java.time.Instant; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -77,7 +77,7 @@ public class SignedMarkRevocationListTest { createSaveGetHelper(5); assertThat(SignedMarkRevocationList.get().getCreationTime()) .isEqualTo(Instant.parse("2000-01-01T00:00:00Z")); - clock.advanceBy(standardDays(1)); + clock.advanceBy(Duration.ofDays(1)); assertThat(SignedMarkRevocationList.get().getCreationTime()) .isEqualTo(Instant.parse("2000-01-01T00:00:00Z")); } diff --git a/core/src/test/java/google/registry/model/tld/label/ReservedListTest.java b/core/src/test/java/google/registry/model/tld/label/ReservedListTest.java index 7d3f38fa0..dcc07096e 100644 --- a/core/src/test/java/google/registry/model/tld/label/ReservedListTest.java +++ b/core/src/test/java/google/registry/model/tld/label/ReservedListTest.java @@ -37,7 +37,7 @@ import google.registry.model.tld.Tld; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.testing.FakeClock; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -45,7 +45,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; /** Unit tests for {@link ReservedList}. */ class ReservedListTest { - private FakeClock clock = new FakeClock(DateTime.parse("2010-01-01T10:00:00Z")); + private FakeClock clock = new FakeClock(Instant.parse("2010-01-01T10:00:00Z")); @RegisterExtension final JpaIntegrationTestExtension jpa = diff --git a/core/src/test/java/google/registry/model/transfer/DomainTransferDataTest.java b/core/src/test/java/google/registry/model/transfer/DomainTransferDataTest.java index 76859e3ee..52f4c6957 100644 --- a/core/src/test/java/google/registry/model/transfer/DomainTransferDataTest.java +++ b/core/src/test/java/google/registry/model/transfer/DomainTransferDataTest.java @@ -15,8 +15,6 @@ package google.registry.model.transfer; import static com.google.common.truth.Truth.assertThat; -import static google.registry.util.DateTimeUtils.toInstant; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.ImmutableSet; import google.registry.model.billing.BillingCancellation; @@ -26,14 +24,14 @@ import google.registry.model.domain.Period; import google.registry.model.eppcommon.Trid; import google.registry.model.poll.PollMessage; import google.registry.persistence.VKey; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; /** Unit tests for {@link DomainTransferData}. */ public class DomainTransferDataTest { - private final DateTime now = DateTime.now(UTC); + private final Instant now = Instant.parse("2024-03-27T10:15:30.105Z"); private VKey transferBillingEventKey; private VKey otherServerApproveBillingEventKey; @@ -55,7 +53,7 @@ public class DomainTransferDataTest { DomainTransferData constantTransferData = new DomainTransferData.Builder() .setTransferRequestTrid(Trid.create("server-trid", "client-trid")) - .setTransferRequestTime(toInstant(now)) + .setTransferRequestTime(now) .setGainingRegistrarId("NewRegistrar") .setLosingRegistrarId("TheRegistrar") // Test must use a non-1-year period, since that's the default value. @@ -64,7 +62,7 @@ public class DomainTransferDataTest { DomainTransferData fullTransferData = constantTransferData .asBuilder() - .setPendingTransferExpirationTime(toInstant(now)) + .setPendingTransferExpirationTime(now) .setTransferStatus(TransferStatus.PENDING) .setServerApproveEntities( "4-TLD", diff --git a/core/src/test/java/google/registry/mosapi/MosApiMetricsTest.java b/core/src/test/java/google/registry/mosapi/MosApiMetricsTest.java index 87d24410b..0d1bfb69b 100644 --- a/core/src/test/java/google/registry/mosapi/MosApiMetricsTest.java +++ b/core/src/test/java/google/registry/mosapi/MosApiMetricsTest.java @@ -34,10 +34,10 @@ import google.registry.mosapi.MosApiModels.TldServiceState; import google.registry.request.lock.LockHandler; import google.registry.testing.FakeClock; import java.io.IOException; +import java.time.Instant; import java.util.List; import java.util.concurrent.Callable; import java.util.stream.IntStream; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -61,7 +61,7 @@ public class MosApiMetricsTest { mock(Monitoring.Projects.MetricDescriptors.Create.class); // Fixed Clock for deterministic testing - private final FakeClock clock = new FakeClock(DateTime.parse("2026-01-01T12:00:00Z")); + private final FakeClock clock = new FakeClock(Instant.parse("2026-01-01T12:00:00Z")); private MosApiMetrics mosApiMetrics; @BeforeEach diff --git a/core/src/test/java/google/registry/persistence/converter/DateTimeConverterTest.java b/core/src/test/java/google/registry/persistence/converter/DateTimeConverterTest.java deleted file mode 100644 index a6c036038..000000000 --- a/core/src/test/java/google/registry/persistence/converter/DateTimeConverterTest.java +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2019 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.persistence.converter; - -import static com.google.common.truth.Truth.assertThat; -import static google.registry.persistence.transaction.TransactionManagerFactory.tm; -import static google.registry.testing.DatabaseHelper.persistResource; -import static java.time.ZoneOffset.UTC; - -import google.registry.model.ImmutableObject; -import google.registry.persistence.transaction.JpaTestExtensions; -import google.registry.persistence.transaction.JpaTestExtensions.JpaUnitTestExtension; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import java.time.Instant; -import java.time.ZonedDateTime; -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; - -/** Unit tests for {@link DateTimeConverter}. */ -public class DateTimeConverterTest { - - @RegisterExtension - public final JpaUnitTestExtension jpaExtension = - new JpaTestExtensions.Builder().withEntityClass(TestEntity.class).buildUnitTestExtension(); - - private final DateTimeConverter converter = new DateTimeConverter(); - - @Test - void convertToDatabaseColumn_returnsNullIfInputIsNull() { - assertThat(converter.convertToDatabaseColumn(null)).isNull(); - } - - @Test - void convertToDatabaseColumn_convertsCorrectly() { - DateTime dateTime = DateTime.parse("2019-09-01T01:01:01"); - assertThat(converter.convertToDatabaseColumn(dateTime).toInstant().toEpochMilli()) - .isEqualTo(dateTime.getMillis()); - } - - @Test - void convertToEntityAttribute_returnsNullIfInputIsNull() { - assertThat(converter.convertToEntityAttribute(null)).isNull(); - } - - @Test - void convertToEntityAttribute_convertsCorrectly() { - DateTime dateTime = DateTime.parse("2019-09-01T01:01:01Z"); - long millis = dateTime.getMillis(); - assertThat( - converter.convertToEntityAttribute( - ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), UTC))) - .isEqualTo(dateTime); - } - - static DateTime parseDateTime(String value) { - return ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed().parseDateTime(value); - } - - @Test - void converter_generatesTimestampWithNormalizedZone() { - DateTime dt = parseDateTime("2019-09-01T01:01:01Z"); - TestEntity entity = new TestEntity("normalized_utc_time", dt); - persistResource(entity); - TestEntity retrievedEntity = - tm().transact(() -> tm().getEntityManager().find(TestEntity.class, "normalized_utc_time")); - assertThat(retrievedEntity.dt.toString()).isEqualTo("2019-09-01T01:01:01.000Z"); - } - - @Test - void converter_convertsNonUtcZoneCorrectly() { - DateTime dt = parseDateTime("2019-09-01T01:01:01-05:00"); - TestEntity entity = new TestEntity("new_york_time", dt); - - persistResource(entity); - TestEntity retrievedEntity = - tm().transact(() -> tm().getEntityManager().find(TestEntity.class, "new_york_time")); - assertThat(retrievedEntity.dt.toString()).isEqualTo("2019-09-01T06:01:01.000Z"); - } - - @Entity(name = "TestEntity") // Override entity name to avoid the nested class reference. - private static class TestEntity extends ImmutableObject { - - @Id String name; - - DateTime dt; - - TestEntity() {} - - TestEntity(String name, DateTime dt) { - this.name = name; - this.dt = dt; - } - } -} diff --git a/core/src/test/java/google/registry/persistence/converter/LocalDateConverterTest.java b/core/src/test/java/google/registry/persistence/converter/LocalDateConverterTest.java index fe8548f0b..12bec7fda 100644 --- a/core/src/test/java/google/registry/persistence/converter/LocalDateConverterTest.java +++ b/core/src/test/java/google/registry/persistence/converter/LocalDateConverterTest.java @@ -24,8 +24,7 @@ import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaUnitTestExtension; import jakarta.persistence.Entity; import jakarta.persistence.Id; -import org.joda.time.LocalDate; -import org.joda.time.format.ISODateTimeFormat; +import java.time.LocalDate; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -38,7 +37,7 @@ public class LocalDateConverterTest { .withEntityClass(LocalDateConverterTestEntity.class) .buildUnitTestExtension(); - private final LocalDate exampleDate = LocalDate.parse("2020-06-10", ISODateTimeFormat.date()); + private final LocalDate exampleDate = LocalDate.parse("2020-06-10"); @Test void testNullInput() { diff --git a/core/src/test/java/google/registry/persistence/transaction/JpaTestExtensions.java b/core/src/test/java/google/registry/persistence/transaction/JpaTestExtensions.java index 74ad800db..c6939cd0a 100644 --- a/core/src/test/java/google/registry/persistence/transaction/JpaTestExtensions.java +++ b/core/src/test/java/google/registry/persistence/transaction/JpaTestExtensions.java @@ -15,13 +15,13 @@ package google.registry.persistence.transaction; import static com.google.common.base.Preconditions.checkState; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import google.registry.testing.FakeClock; import google.registry.util.Clock; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -29,7 +29,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import org.hibernate.cfg.Environment; -import org.joda.time.DateTime; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -166,7 +165,7 @@ public class JpaTestExtensions { /** Builds a {@link JpaIntegrationTestExtension} instance. */ public JpaIntegrationTestExtension buildIntegrationTestExtension() { return new JpaIntegrationTestExtension( - clock == null ? new FakeClock(DateTime.now(UTC)) : clock, + clock == null ? new FakeClock(Instant.now()) : clock, ImmutableList.copyOf(extraEntityClasses), ImmutableMap.copyOf(userProperties), !withoutCannedData); @@ -190,7 +189,7 @@ public class JpaTestExtensions { !Objects.equals(GOLDEN_SCHEMA_SQL_PATH, initScript), "Unit tests must not depend on the Nomulus schema."); return new JpaUnitTestExtension( - clock == null ? new FakeClock(DateTime.now(UTC)) : clock, + clock == null ? new FakeClock(Instant.now()) : clock, // Use the hstore extension by default so we can save the migration schedule Optional.of(initScript == null ? HSTORE_EXTENSION_SQL_PATH : initScript), ImmutableList.copyOf(extraEntityClasses), diff --git a/core/src/test/java/google/registry/rdap/AbstractJsonableObjectTest.java b/core/src/test/java/google/registry/rdap/AbstractJsonableObjectTest.java index 9f5205626..1aeaa3775 100644 --- a/core/src/test/java/google/registry/rdap/AbstractJsonableObjectTest.java +++ b/core/src/test/java/google/registry/rdap/AbstractJsonableObjectTest.java @@ -24,8 +24,8 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; import google.registry.rdap.AbstractJsonableObject.JsonableException; import google.registry.rdap.AbstractJsonableObject.RestrictJsonNames; +import java.time.Instant; import java.util.Optional; -import org.joda.time.DateTime; import org.junit.jupiter.api.Test; /** Unit tests for {@link AbstractJsonableObject}. */ @@ -53,9 +53,10 @@ final class AbstractJsonableObjectTest { @Test void testDateTime() { - Jsonable jsonable = new AbstractJsonableObject() { - @JsonableElement DateTime dateTime = DateTime.parse("2019-01-02T13:53Z"); - }; + Jsonable jsonable = + new AbstractJsonableObject() { + @JsonableElement Instant dateTime = Instant.parse("2019-01-02T13:53:00Z"); + }; assertThat(jsonable.toJson()).isEqualTo(createJson("{'dateTime':'2019-01-02T13:53:00.000Z'}")); } diff --git a/core/src/test/java/google/registry/rdap/RdapActionBaseTest.java b/core/src/test/java/google/registry/rdap/RdapActionBaseTest.java index ad5d9e440..3ccb2836f 100644 --- a/core/src/test/java/google/registry/rdap/RdapActionBaseTest.java +++ b/core/src/test/java/google/registry/rdap/RdapActionBaseTest.java @@ -21,7 +21,6 @@ import static google.registry.rdap.RdapTestHelper.parseJsonObject; import static google.registry.request.Action.Method.GET; import static google.registry.request.Action.Method.HEAD; import static google.registry.testing.DatabaseHelper.createTld; -import static org.joda.time.Duration.millis; import static org.mockito.Mockito.verify; import google.registry.rdap.RdapMetrics.EndpointType; @@ -33,6 +32,7 @@ import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.request.Action; import google.registry.request.auth.Auth; import google.registry.testing.FakeClock; +import java.time.Duration; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -66,7 +66,7 @@ class RdapActionBaseTest extends RdapActionBaseTestCase { - protected final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ")); + protected final FakeClock clock = new FakeClock(Instant.parse("2000-01-01T00:00:00Z")); static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); @RegisterExtension @@ -96,7 +96,7 @@ abstract class RdapActionBaseTestCase { action.requestMethod = GET; action.domainCache = (domainName) -> ForeignKeyUtils.loadResourceByCache(Domain.class, domainName, clock.now()); - action.clock = new FakeClock(DateTime.parse("2025-01-01T00:00:00.000Z")); + action.clock = new FakeClock(Instant.parse("2025-01-01T00:00:00.000Z")); logout(); } diff --git a/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java b/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java index 30dd36849..6d9d426ca 100644 --- a/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java +++ b/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java @@ -24,7 +24,6 @@ import static google.registry.testing.DatabaseHelper.createTld; import static google.registry.testing.DatabaseHelper.loadByKey; import static google.registry.testing.DatabaseHelper.loadByKeyIfPresent; import static google.registry.testing.DatabaseHelper.persistResource; -import static org.joda.time.DateTimeConstants.TUESDAY; import com.google.common.collect.ImmutableSetMultimap; import google.registry.model.common.Cursor; @@ -33,6 +32,7 @@ import google.registry.model.tld.Tld; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.testing.FakeClock; +import java.time.DayOfWeek; import java.time.Duration; import java.time.Instant; import org.junit.jupiter.api.BeforeEach; @@ -51,7 +51,7 @@ public class PendingDepositCheckerTest { @BeforeEach void beforeEach() { - checker.brdaDayOfWeek = TUESDAY; + checker.brdaDayOfWeek = DayOfWeek.TUESDAY.getValue(); checker.brdaInterval = Duration.ofDays(7); checker.clock = clock; checker.rdeInterval = Duration.ofDays(1); @@ -198,4 +198,3 @@ public class PendingDepositCheckerTest { persistResource(Tld.get(tld).asBuilder().setEscrowEnabled(true).build()); } } - diff --git a/core/src/test/java/google/registry/rde/RdeMarshallerTest.java b/core/src/test/java/google/registry/rde/RdeMarshallerTest.java index b242d69bd..4880dc91a 100644 --- a/core/src/test/java/google/registry/rde/RdeMarshallerTest.java +++ b/core/src/test/java/google/registry/rde/RdeMarshallerTest.java @@ -15,12 +15,17 @@ package google.registry.rde; import static com.google.common.truth.Truth.assertThat; +import static google.registry.testing.DatabaseHelper.createTld; import static google.registry.testing.DatabaseHelper.loadRegistrar; +import static google.registry.testing.DatabaseHelper.newDomain; import static google.registry.xml.ValidationMode.STRICT; +import google.registry.model.domain.Domain; +import google.registry.model.rde.RdeMode; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.xml.XmlTestUtils; +import java.time.Instant; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -86,4 +91,20 @@ public class RdeMarshallerTest { new RdeMarshaller(STRICT).marshalRegistrar(loadRegistrar("TheRegistrar")); assertThat(fragment.xml()).contains("123 Example Bőulevard"); } + + @Test + void testMarshalDomain_largeYear_validatesAgainstXsd() throws Exception { + createTld("tld"); + Domain initialDomain = newDomain("example.tld"); + Domain domain = + initialDomain + .asBuilder() + .setRegistrationExpirationTime(Instant.parse("+294247-01-10T04:00:54Z")) + .build(); + + DepositFragment fragment = new RdeMarshaller(STRICT).marshalDomain(domain, RdeMode.FULL); + assertThat(fragment.error()).isEmpty(); + assertThat(fragment.xml()) + .contains("294247-01-10T04:00:54.000Z"); + } } diff --git a/core/src/test/java/google/registry/reporting/icann/TransactionsReportingQueryBuilderTest.java b/core/src/test/java/google/registry/reporting/icann/TransactionsReportingQueryBuilderTest.java index f99257023..13a8b3ad2 100644 --- a/core/src/test/java/google/registry/reporting/icann/TransactionsReportingQueryBuilderTest.java +++ b/core/src/test/java/google/registry/reporting/icann/TransactionsReportingQueryBuilderTest.java @@ -67,5 +67,3 @@ class TransactionsReportingQueryBuilderTest { } } } - - diff --git a/core/src/test/java/google/registry/reporting/spec11/GenerateSpec11ReportActionTest.java b/core/src/test/java/google/registry/reporting/spec11/GenerateSpec11ReportActionTest.java index 50368458b..a7e8fd8a9 100644 --- a/core/src/test/java/google/registry/reporting/spec11/GenerateSpec11ReportActionTest.java +++ b/core/src/test/java/google/registry/reporting/spec11/GenerateSpec11ReportActionTest.java @@ -15,7 +15,6 @@ package google.registry.reporting.spec11; import static com.google.common.truth.Truth.assertThat; -import static google.registry.util.DateTimeUtils.toLocalDate; import static jakarta.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; import static org.apache.http.HttpStatus.SC_OK; import static org.mockito.Mockito.when; @@ -50,7 +49,7 @@ class GenerateSpec11ReportActionTest extends BeamActionTestBase { "gs://staging-project/staging-bucket/", "gs://reporting-project/reporting-bucket/", "api_key/a", - toLocalDate(clock.now()), + clock.nowDate(), true, clock, response, @@ -73,7 +72,7 @@ class GenerateSpec11ReportActionTest extends BeamActionTestBase { "gs://staging-project/staging-bucket/", "gs://reporting-project/reporting-bucket/", "api_key/a", - toLocalDate(clock.now()), + clock.nowDate(), true, clock, response, @@ -104,7 +103,7 @@ class GenerateSpec11ReportActionTest extends BeamActionTestBase { "gs://staging-project/staging-bucket/", "gs://reporting-project/reporting-bucket/", "api_key/a", - toLocalDate(clock.now()), + clock.nowDate(), false, clock, response, diff --git a/core/src/test/java/google/registry/request/RequestParametersTest.java b/core/src/test/java/google/registry/request/RequestParametersTest.java index c5c105b20..8ec70c91b 100644 --- a/core/src/test/java/google/registry/request/RequestParametersTest.java +++ b/core/src/test/java/google/registry/request/RequestParametersTest.java @@ -17,10 +17,10 @@ package google.registry.request; import static com.google.common.truth.Truth.assertThat; import static google.registry.request.RequestParameters.extractBooleanParameter; import static google.registry.request.RequestParameters.extractEnumParameter; -import static google.registry.request.RequestParameters.extractOptionalDatetimeParameter; import static google.registry.request.RequestParameters.extractOptionalEnumParameter; +import static google.registry.request.RequestParameters.extractOptionalInstantParameter; import static google.registry.request.RequestParameters.extractOptionalParameter; -import static google.registry.request.RequestParameters.extractRequiredDatetimeParameter; +import static google.registry.request.RequestParameters.extractRequiredInstantParameter; import static google.registry.request.RequestParameters.extractRequiredParameter; import static google.registry.request.RequestParameters.extractSetOfEnumParameters; import static google.registry.request.RequestParameters.extractSetOfParameters; @@ -31,7 +31,7 @@ import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; import google.registry.request.HttpException.BadRequestException; import jakarta.servlet.http.HttpServletRequest; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.Test; /** Unit tests for {@link RequestParameters}. */ @@ -257,8 +257,8 @@ class RequestParametersTest { @Test void testExtractRequiredDatetimeParameter_correctValue_works() { when(req.getParameter("timeParam")).thenReturn("2015-08-27T13:25:34.123Z"); - assertThat(extractRequiredDatetimeParameter(req, "timeParam")) - .isEqualTo(DateTime.parse("2015-08-27T13:25:34.123Z")); + assertThat(extractRequiredInstantParameter(req, "timeParam")) + .isEqualTo(Instant.parse("2015-08-27T13:25:34.123Z")); } @Test @@ -266,15 +266,15 @@ class RequestParametersTest { when(req.getParameter("timeParam")).thenReturn("Tuesday at three o'clock"); BadRequestException thrown = assertThrows( - BadRequestException.class, () -> extractRequiredDatetimeParameter(req, "timeParam")); + BadRequestException.class, () -> extractRequiredInstantParameter(req, "timeParam")); assertThat(thrown).hasMessageThat().contains("timeParam"); } @Test void testExtractOptionalDatetimeParameter_correctValue_works() { when(req.getParameter("timeParam")).thenReturn("2015-08-27T13:25:34.123Z"); - assertThat(extractOptionalDatetimeParameter(req, "timeParam")) - .hasValue(DateTime.parse("2015-08-27T13:25:34.123Z")); + assertThat(extractOptionalInstantParameter(req, "timeParam")) + .hasValue(Instant.parse("2015-08-27T13:25:34.123Z")); } @Test @@ -282,21 +282,21 @@ class RequestParametersTest { when(req.getParameter("timeParam")).thenReturn("Tuesday at three o'clock"); BadRequestException thrown = assertThrows( - BadRequestException.class, () -> extractOptionalDatetimeParameter(req, "timeParam")); + BadRequestException.class, () -> extractOptionalInstantParameter(req, "timeParam")); assertThat(thrown).hasMessageThat().contains("timeParam"); } @Test void testExtractOptionalDatetimeParameter_empty_returnsEmpty() { when(req.getParameter("timeParam")).thenReturn(""); - assertThat(extractOptionalDatetimeParameter(req, "timeParam")).isEmpty(); + assertThat(extractOptionalInstantParameter(req, "timeParam")).isEmpty(); } @Test void testExtractRequiredDatetimeParameter_noValue_throwsBadRequest() { BadRequestException thrown = assertThrows( - BadRequestException.class, () -> extractRequiredDatetimeParameter(req, "timeParam")); + BadRequestException.class, () -> extractRequiredInstantParameter(req, "timeParam")); assertThat(thrown).hasMessageThat().contains("timeParam"); } } diff --git a/core/src/test/java/google/registry/schema/registrar/RegistrarDaoTest.java b/core/src/test/java/google/registry/schema/registrar/RegistrarDaoTest.java index 49b0654e7..fcec4726e 100644 --- a/core/src/test/java/google/registry/schema/registrar/RegistrarDaoTest.java +++ b/core/src/test/java/google/registry/schema/registrar/RegistrarDaoTest.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import static google.registry.testing.DatabaseHelper.existsInDb; import static google.registry.testing.DatabaseHelper.loadByKey; import static google.registry.testing.DatabaseHelper.persistResource; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.ImmutableList; import google.registry.model.registrar.Registrar; @@ -27,7 +26,7 @@ import google.registry.persistence.VKey; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationWithCoverageExtension; import google.registry.testing.FakeClock; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -35,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; /** Unit tests for persisting {@link Registrar} entities. */ public class RegistrarDaoTest { - protected FakeClock fakeClock = new FakeClock(DateTime.now(UTC)); + protected FakeClock fakeClock = new FakeClock(Instant.now()); @RegisterExtension JpaIntegrationWithCoverageExtension jpa = diff --git a/core/src/test/java/google/registry/testing/CloudTasksHelper.java b/core/src/test/java/google/registry/testing/CloudTasksHelper.java index e4604ea95..abf878386 100644 --- a/core/src/test/java/google/registry/testing/CloudTasksHelper.java +++ b/core/src/test/java/google/registry/testing/CloudTasksHelper.java @@ -70,7 +70,6 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nonnull; -import org.joda.time.DateTime; /** * Static utility functions for testing task queues. @@ -361,10 +360,6 @@ public class CloudTasksHelper implements Serializable { return scheduleTime(Timestamps.fromMillis(scheduleTime.toEpochMilli())); } - public TaskMatcher scheduleTime(DateTime scheduleTime) { - return scheduleTime(Timestamps.fromMillis(scheduleTime.getMillis())); - } - public TaskMatcher param(String key, String value) { checkNotNull(value, "Test error: A param can never have a null value, so don't assert it"); expected.params.put(key, value); diff --git a/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java b/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java index ece5a905e..31219ef1b 100644 --- a/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java +++ b/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java @@ -27,7 +27,7 @@ import google.registry.ui.server.SendEmailUtils; import google.registry.ui.server.console.ConsoleApiParams; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; -import org.joda.time.DateTime; +import java.time.Instant; public final class ConsoleApiParamsUtils { @@ -37,7 +37,7 @@ public final class ConsoleApiParamsUtils { SendEmailUtils sendEmailUtils = new SendEmailUtils(ImmutableList.of("notification@test.example"), gmailClient); XsrfTokenManager xsrfTokenManager = - new XsrfTokenManager(new FakeClock(DateTime.parse("2020-02-02T01:23:45Z"))); + new XsrfTokenManager(new FakeClock(Instant.parse("2020-02-02T01:23:45Z"))); when(request.getCookies()) .thenReturn( new Cookie[] { diff --git a/core/src/test/java/google/registry/testing/DomainSubject.java b/core/src/test/java/google/registry/testing/DomainSubject.java index e624f444b..066d1d9eb 100644 --- a/core/src/test/java/google/registry/testing/DomainSubject.java +++ b/core/src/test/java/google/registry/testing/DomainSubject.java @@ -17,7 +17,6 @@ package google.registry.testing; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.truth.Fact.simpleFact; import static com.google.common.truth.Truth.assertAbout; -import static google.registry.util.DateTimeUtils.toInstant; import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import com.google.common.collect.ImmutableSet; @@ -32,7 +31,6 @@ import google.registry.tmch.LordnTaskUtils.LordnPhase; import java.time.Instant; import java.util.Set; import javax.annotation.Nullable; -import org.joda.time.DateTime; /** Truth subject for asserting things about {@link Domain} instances. */ public final class DomainSubject extends AbstractEppResourceSubject { @@ -78,27 +76,15 @@ public final class DomainSubject extends AbstractEppResourceSubject hasRegistrationExpirationTime(DateTime expiration) { - return hasRegistrationExpirationTime(toInstant(expiration)); - } - public And hasRegistrationExpirationTime(Instant expiration) { return hasValue( expiration, actual.getRegistrationExpirationTime(), "getRegistrationExpirationTime()"); } - public And hasLastTransferTime(DateTime lastTransferTime) { - return hasLastTransferTime(toInstant(lastTransferTime)); - } - public And hasLastTransferTime(Instant lastTransferTime) { return hasValue(lastTransferTime, actual.getLastTransferTime(), "getLastTransferTime()"); } - public And hasLastTransferTimeNotEqualTo(DateTime lastTransferTime) { - return hasLastTransferTimeNotEqualTo(toInstant(lastTransferTime)); - } - public And hasLastTransferTimeNotEqualTo(Instant lastTransferTime) { return doesNotHaveValue( lastTransferTime, actual.getLastTransferTime(), "getLastTransferTime()"); @@ -122,10 +108,6 @@ public final class DomainSubject extends AbstractEppResourceSubject hasAutorenewEndTime(DateTime autorenewEndTime) { - return hasAutorenewEndTime(toInstant(autorenewEndTime)); - } - public And hasAutorenewEndTime(Instant autorenewEndTime) { checkArgumentNotNull(autorenewEndTime, "Use hasNoAutorenewEndTime() instead"); return hasValue( diff --git a/core/src/test/java/google/registry/testing/HistoryEntrySubject.java b/core/src/test/java/google/registry/testing/HistoryEntrySubject.java index e48b8dd8d..8f42bbe42 100644 --- a/core/src/test/java/google/registry/testing/HistoryEntrySubject.java +++ b/core/src/test/java/google/registry/testing/HistoryEntrySubject.java @@ -16,7 +16,6 @@ package google.registry.testing; import static com.google.common.truth.Fact.simpleFact; import static com.google.common.truth.Truth.assertAbout; -import static google.registry.util.DateTimeUtils.toInstant; import com.google.common.truth.FailureMetadata; import com.google.common.truth.SimpleSubjectBuilder; @@ -27,7 +26,6 @@ import google.registry.model.reporting.HistoryEntry; import google.registry.testing.TruthChainer.And; import java.time.Instant; import java.util.Optional; -import org.joda.time.DateTime; /** Utility methods for asserting things about {@link HistoryEntry} instances. */ public class HistoryEntrySubject extends Subject { @@ -66,11 +64,6 @@ public class HistoryEntrySubject extends Subject { otherRegistrarId, ((DomainHistory) actual).getOtherRegistrarId(), "getOtherRegistrarId()"); } - public And hasModificationTime(DateTime modificationTime) { - return hasValue( - toInstant(modificationTime), actual.getModificationTime(), "getModificationTime()"); - } - public And hasModificationTime(Instant modificationTime) { return hasValue(modificationTime, actual.getModificationTime(), "getModificationTime()"); } @@ -127,7 +120,7 @@ public class HistoryEntrySubject extends Subject { return assertAbout(historyEntries()); } - public static Factory historyEntries() { + public static Subject.Factory historyEntries() { return HistoryEntrySubject::new; } } diff --git a/core/src/test/java/google/registry/tmch/SmdrlCsvParserTest.java b/core/src/test/java/google/registry/tmch/SmdrlCsvParserTest.java index 1e1d390ae..050826367 100644 --- a/core/src/test/java/google/registry/tmch/SmdrlCsvParserTest.java +++ b/core/src/test/java/google/registry/tmch/SmdrlCsvParserTest.java @@ -16,14 +16,13 @@ package google.registry.tmch; import static com.google.common.truth.Truth.assertThat; import static java.nio.charset.StandardCharsets.US_ASCII; -import static org.joda.time.Duration.millis; -import static org.joda.time.Duration.standardDays; import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.collect.ImmutableList; import com.google.common.io.CharSource; import google.registry.model.smd.SignedMarkRevocationList; import google.registry.testing.FakeClock; +import java.time.Duration; import java.time.Instant; import java.time.format.DateTimeParseException; import org.junit.jupiter.api.Test; @@ -50,7 +49,7 @@ class SmdrlCsvParserTest { assertThat(smdrl.isSmdRevoked("0000001681375789102250-65535", clock.now())).isTrue(); clock.setTo(clock.now().minusMillis(1)); assertThat(smdrl.isSmdRevoked("0000001681375789102250-65535", clock.now())).isFalse(); - clock.advanceBy(millis(2)); + clock.advanceBy(Duration.ofMillis(2)); assertThat(smdrl.isSmdRevoked("0000001681375789102250-65535", clock.now())).isTrue(); } @@ -61,7 +60,7 @@ class SmdrlCsvParserTest { assertThat(smdrl.isSmdRevoked("0000002211373633641407-65535", clock.now())).isTrue(); clock.setTo(clock.now().minusMillis(1)); assertThat(smdrl.isSmdRevoked("0000002211373633641407-65535", clock.now())).isFalse(); - clock.advanceBy(millis(2)); + clock.advanceBy(Duration.ofMillis(2)); assertThat(smdrl.isSmdRevoked("0000002211373633641407-65535", clock.now())).isTrue(); } @@ -70,7 +69,7 @@ class SmdrlCsvParserTest { SignedMarkRevocationList smdrl = SmdrlCsvParser.parse(SMDRL_LATEST_CSV.readLines()); clock.setTo(Instant.parse("2013-08-09T12:00:00.0Z")); assertThat(smdrl.isSmdRevoked("0000002101376042766438-65535", clock.now())).isFalse(); - clock.advanceBy(standardDays(1)); + clock.advanceBy(Duration.ofDays(1)); assertThat(smdrl.isSmdRevoked("0000002101376042766438-65535", clock.now())).isTrue(); } diff --git a/core/src/test/java/google/registry/tools/CommandTestCase.java b/core/src/test/java/google/registry/tools/CommandTestCase.java index 809cc1a9f..5075869f0 100644 --- a/core/src/test/java/google/registry/tools/CommandTestCase.java +++ b/core/src/test/java/google/registry/tools/CommandTestCase.java @@ -41,8 +41,8 @@ import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.nio.file.Path; +import java.time.Instant; import java.util.List; -import org.joda.time.DateTime; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -64,7 +64,7 @@ public abstract class CommandTestCase { protected C command; - protected final FakeClock fakeClock = new FakeClock(DateTime.parse("2022-09-01T00:00:00.000Z")); + protected final FakeClock fakeClock = new FakeClock(Instant.parse("2022-09-01T00:00:00.000Z")); @RegisterExtension final JpaIntegrationTestExtension jpa = diff --git a/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java b/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java index cc8b81398..ba789836d 100644 --- a/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java +++ b/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java @@ -25,9 +25,7 @@ import static google.registry.testing.DatabaseHelper.createTlds; import static google.registry.testing.DatabaseHelper.loadAllOf; import static google.registry.testing.DatabaseHelper.persistResource; import static google.registry.util.DateTimeUtils.START_INSTANT; -import static google.registry.util.DateTimeUtils.toInstant; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.joda.time.DateTimeZone.UTC; import static org.junit.jupiter.api.Assertions.assertThrows; import com.beust.jcommander.ParameterException; @@ -47,11 +45,11 @@ import google.registry.util.StringGenerator.Alphabets; import java.io.File; import java.time.Duration; import java.time.Instant; +import java.time.ZoneOffset; import java.util.Collection; import javax.annotation.Nullable; import org.joda.money.CurrencyUnit; import org.joda.money.Money; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -136,8 +134,8 @@ class GenerateAllocationTokensCommandTest extends CommandTestCasenaturalOrder() .put(START_INSTANT, TokenStatus.NOT_STARTED) - .put(toInstant(promoStart), TokenStatus.VALID) - .put(toInstant(promoEnd), TokenStatus.ENDED) + .put(promoStart, TokenStatus.VALID) + .put(promoEnd, TokenStatus.ENDED) .build()) .build()); } @Test void testSuccess_promotionToken_withDiscountPrice() throws Exception { - DateTime promoStart = DateTime.now(UTC); - DateTime promoEnd = promoStart.plusMonths(1); + Instant promoStart = fakeClock.now(); + Instant promoEnd = promoStart.atZone(ZoneOffset.UTC).plusMonths(1).toInstant(); runCommand( "--number", "1", @@ -205,8 +203,8 @@ class GenerateAllocationTokensCommandTest extends CommandTestCasenaturalOrder() .put(START_INSTANT, TokenStatus.NOT_STARTED) - .put(toInstant(promoStart), TokenStatus.VALID) - .put(toInstant(promoEnd), TokenStatus.ENDED) + .put(promoStart, TokenStatus.VALID) + .put(promoEnd, TokenStatus.ENDED) .build()) .build()); } @@ -479,7 +477,7 @@ class GenerateAllocationTokensCommandTest extends CommandTestCase runCommand("--tld=tld", "--watermark=blah", "--mode=full", "-r 42", "-o test")); - assertThat(thrown).hasMessageThat().contains("Invalid format: \"blah\""); + assertThat(thrown).hasMessageThat().contains("could not be parsed"); } @Test diff --git a/core/src/test/java/google/registry/tools/GenerateLordnCommandTest.java b/core/src/test/java/google/registry/tools/GenerateLordnCommandTest.java index 9b024887d..feb87c9c2 100644 --- a/core/src/test/java/google/registry/tools/GenerateLordnCommandTest.java +++ b/core/src/test/java/google/registry/tools/GenerateLordnCommandTest.java @@ -24,7 +24,7 @@ import google.registry.model.domain.launch.LaunchNotice; import google.registry.testing.DatabaseHelper; import java.nio.file.Files; import java.nio.file.Path; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -35,7 +35,7 @@ class GenerateLordnCommandTest extends CommandTestCase { @BeforeEach void beforeEach() { - fakeClock.setTo(DateTime.parse("2021-04-16T10:04:00.000Z")); + fakeClock.setTo(Instant.parse("2021-04-16T10:04:00.000Z")); command.clock = fakeClock; } diff --git a/core/src/test/java/google/registry/tools/GetDomainCommandTest.java b/core/src/test/java/google/registry/tools/GetDomainCommandTest.java index e203d58da..8657cf536 100644 --- a/core/src/test/java/google/registry/tools/GetDomainCommandTest.java +++ b/core/src/test/java/google/registry/tools/GetDomainCommandTest.java @@ -137,4 +137,3 @@ class GetDomainCommandTest extends CommandTestCase { assertInStdout("Websafe key: kind:Domain@sql:rO0ABXQABTMtVExE"); } } - diff --git a/core/src/test/java/google/registry/tools/GetUserCommandTest.java b/core/src/test/java/google/registry/tools/GetUserCommandTest.java index 86a9455e7..6dea3a1dd 100644 --- a/core/src/test/java/google/registry/tools/GetUserCommandTest.java +++ b/core/src/test/java/google/registry/tools/GetUserCommandTest.java @@ -14,7 +14,6 @@ package google.registry.tools; - import com.google.common.collect.ImmutableMap; import google.registry.model.console.GlobalRole; import google.registry.model.console.RegistrarRole; diff --git a/core/src/test/java/google/registry/tools/ShellCommandTest.java b/core/src/test/java/google/registry/tools/ShellCommandTest.java index b9e4288a2..a2a7fdad3 100644 --- a/core/src/test/java/google/registry/tools/ShellCommandTest.java +++ b/core/src/test/java/google/registry/tools/ShellCommandTest.java @@ -33,6 +33,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -41,8 +43,6 @@ import org.jline.reader.LineReaderBuilder; import org.jline.reader.impl.DefaultParser; import org.jline.terminal.Terminal; import org.jline.terminal.impl.DumbTerminal; -import org.joda.time.DateTime; -import org.joda.time.Duration; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -55,7 +55,7 @@ class ShellCommandTest { final SystemPropertyExtension systemPropertyExtension = new SystemPropertyExtension(); CommandRunner cli = mock(CommandRunner.class); - private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ")); + private final FakeClock clock = new FakeClock(Instant.parse("2000-01-01T00:00:00Z")); private final DelayingByteArrayInputStream input = new DelayingByteArrayInputStream(clock); private PrintStream orgStdout; @@ -112,7 +112,7 @@ class ShellCommandTest { RegistryToolEnvironment.ALPHA.setup(systemPropertyExtension); FakeCli cli = new FakeCli(); ShellCommand shellCommand = - createShellCommand(cli, Duration.standardDays(1), "test1 foo bar", "test2 foo bar"); + createShellCommand(cli, Duration.ofDays(1), "test1 foo bar", "test2 foo bar"); shellCommand.run(); } @@ -121,7 +121,7 @@ class ShellCommandTest { RegistryToolEnvironment.SANDBOX.setup(systemPropertyExtension); FakeCli cli = new FakeCli(); ShellCommand shellCommand = - createShellCommand(cli, Duration.standardDays(1), "test1 foo bar", "test2 foo bar"); + createShellCommand(cli, Duration.ofDays(1), "test1 foo bar", "test2 foo bar"); shellCommand.run(); } @@ -130,7 +130,7 @@ class ShellCommandTest { RegistryToolEnvironment.PRODUCTION.setup(systemPropertyExtension); FakeCli cli = new FakeCli(); ShellCommand shellCommand = - createShellCommand(cli, Duration.standardMinutes(61), "test1 foo bar", "test2 foo bar"); + createShellCommand(cli, Duration.ofMinutes(61), "test1 foo bar", "test2 foo bar"); RuntimeException exception = assertThrows(RuntimeException.class, shellCommand::run); assertThat(exception).hasMessageThat().contains("Been idle for too long"); } @@ -140,7 +140,7 @@ class ShellCommandTest { RegistryToolEnvironment.PRODUCTION.setup(systemPropertyExtension); FakeCli cli = new FakeCli(); ShellCommand shellCommand = - createShellCommand(cli, Duration.standardMinutes(59), "test1 foo bar", "test2 foo bar"); + createShellCommand(cli, Duration.ofMinutes(59), "test1 foo bar", "test2 foo bar"); shellCommand.run(); } @@ -276,13 +276,13 @@ class ShellCommandTest { assertThat(stdout.toString(US_ASCII)) .isEqualTo( """ - RUNNING "command1" - out: first line - err: second line - err: surprise! - out: fragmented line - SUCCESS - """); + RUNNING "command1" + out: first line + err: second line + err: surprise! + out: fragmented line + SUCCESS + """); } @Test @@ -302,10 +302,10 @@ class ShellCommandTest { assertThat(stdout.toString(US_ASCII)) .isEqualTo( """ - RUNNING "command1" - out: first line - FAILURE java.lang.Exception some error! - """); + RUNNING "command1" + out: first line + FAILURE java.lang.Exception some error! + """); } @Test diff --git a/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java b/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java index 2177edd92..a73e333b3 100644 --- a/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java +++ b/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java @@ -14,7 +14,6 @@ package google.registry.tools; - import static com.google.common.truth.Truth.assertThat; import static google.registry.model.domain.rgp.GracePeriodStatus.AUTO_RENEW; import static google.registry.model.eppcommon.StatusValue.PENDING_DELETE; diff --git a/core/src/test/java/google/registry/tools/UpdateRegistrarCommandTest.java b/core/src/test/java/google/registry/tools/UpdateRegistrarCommandTest.java index e35cdff14..213cd874c 100644 --- a/core/src/test/java/google/registry/tools/UpdateRegistrarCommandTest.java +++ b/core/src/test/java/google/registry/tools/UpdateRegistrarCommandTest.java @@ -44,7 +44,6 @@ import java.math.BigDecimal; import java.time.Instant; import java.util.Optional; import org.joda.money.Money; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -255,7 +254,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testSuccess_certFile() throws Exception { - fakeClock.setTo(DateTime.parse("2020-11-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-11-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getClientCertificate()).isEmpty(); assertThat(registrar.getClientCertificateHash()).isEmpty(); @@ -271,7 +270,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testSuccess_rotatePrimaryCert() throws Exception { - fakeClock.setTo(DateTime.parse("2020-11-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-11-01T00:00:00Z")); persistResource( loadRegistrar("NewRegistrar") .asBuilder() @@ -295,7 +294,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void test_rotatePrimaryCert_noPrimaryCert() throws Exception { - fakeClock.setTo(DateTime.parse("2020-11-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-11-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getClientCertificate()).isEmpty(); assertThat(registrar.getClientCertificateHash()).isEmpty(); @@ -327,7 +326,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testFail_certFileWithViolation() throws Exception { - fakeClock.setTo(DateTime.parse("2020-11-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-11-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getClientCertificate()).isEmpty(); assertThat(registrar.getClientCertificateHash()).isEmpty(); @@ -344,7 +343,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testFail_certFileWithMultipleViolations() throws Exception { - fakeClock.setTo(DateTime.parse("2055-10-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2055-10-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getClientCertificate()).isEmpty(); assertThat(registrar.getClientCertificateHash()).isEmpty(); @@ -361,7 +360,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testFail_failoverCertFileWithViolation() throws Exception { - fakeClock.setTo(DateTime.parse("2020-11-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-11-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getFailoverClientCertificate()).isEmpty(); InsecureCertificateException thrown = @@ -378,7 +377,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testFail_failoverCertFileWithMultipleViolations() throws Exception { - fakeClock.setTo(DateTime.parse("2055-10-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2055-10-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getFailoverClientCertificate()).isEmpty(); InsecureCertificateException thrown = @@ -395,7 +394,7 @@ class UpdateRegistrarCommandTest extends CommandTestCase @Test void testSuccess_failoverCertFile() throws Exception { - fakeClock.setTo(DateTime.parse("2020-11-01T00:00:00Z")); + fakeClock.setTo(Instant.parse("2020-11-01T00:00:00Z")); Registrar registrar = loadRegistrar("NewRegistrar"); assertThat(registrar.getFailoverClientCertificate()).isEmpty(); runCommand("--failover_cert_file=" + getCertFilename(SAMPLE_CERT3), "--force", "NewRegistrar"); diff --git a/core/src/test/java/google/registry/tools/ValidateLoginCredentialsCommandTest.java b/core/src/test/java/google/registry/tools/ValidateLoginCredentialsCommandTest.java index f7769246c..c1fe01401 100644 --- a/core/src/test/java/google/registry/tools/ValidateLoginCredentialsCommandTest.java +++ b/core/src/test/java/google/registry/tools/ValidateLoginCredentialsCommandTest.java @@ -37,7 +37,6 @@ import google.registry.util.CidrAddressBlock; import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -61,7 +60,7 @@ class ValidateLoginCredentialsCommandTest extends CommandTestCase runCommandForced("foo.tld"))) diff --git a/core/src/test/java/google/registry/tools/params/DateParameterTest.java b/core/src/test/java/google/registry/tools/params/DateParameterTest.java index 3e1b7d911..19085624f 100644 --- a/core/src/test/java/google/registry/tools/params/DateParameterTest.java +++ b/core/src/test/java/google/registry/tools/params/DateParameterTest.java @@ -17,7 +17,8 @@ package google.registry.tools.params; import static com.google.common.truth.Truth.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import org.joda.time.DateTime; +import java.time.Instant; +import java.time.format.DateTimeParseException; import org.junit.jupiter.api.Test; /** Unit tests for {@link DateParameter}. */ @@ -28,23 +29,22 @@ class DateParameterTest { @Test void testConvert_onlyDate() { String exampleDate = "2014-01-01"; - assertThat(instance.convert(exampleDate)).isEqualTo(DateTime.parse("2014-01-01T00:00:00Z")); + assertThat(instance.convert(exampleDate)).isEqualTo(Instant.parse("2014-01-01T00:00:00Z")); } @Test void testConvert_numeric_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("1234")); + assertThrows(DateTimeParseException.class, () -> instance.convert("1234")); } @Test void testConvert_validDateAndTime_throwsException() { - assertThrows( - IllegalArgumentException.class, () -> instance.convert("2014-01-01T01:02:03.004Z")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01-01T01:02:03.004Z")); } @Test void testConvert_invalidDate_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-13-33")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-13-33")); } @Test @@ -54,31 +54,31 @@ class DateParameterTest { @Test void testConvert_empty_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("")); + assertThrows(DateTimeParseException.class, () -> instance.convert("")); } @Test void testConvert_sillyString_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("foo")); + assertThrows(DateTimeParseException.class, () -> instance.convert("foo")); } @Test void testConvert_partialDate_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-01")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01")); } @Test void testConvert_onlyTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("T01:02:03")); + assertThrows(DateTimeParseException.class, () -> instance.convert("T01:02:03")); } @Test void testConvert_partialDateAndPartialTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("9T9")); + assertThrows(DateTimeParseException.class, () -> instance.convert("9T9")); } @Test void testConvert_dateAndPartialTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-01-01T01:02")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01-01T01:02")); } } diff --git a/core/src/test/java/google/registry/tools/params/DurationParameterTest.java b/core/src/test/java/google/registry/tools/params/DurationParameterTest.java index f42233fda..f1ddc3f5a 100644 --- a/core/src/test/java/google/registry/tools/params/DurationParameterTest.java +++ b/core/src/test/java/google/registry/tools/params/DurationParameterTest.java @@ -18,8 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import com.beust.jcommander.ParameterException; -import org.joda.time.Duration; -import org.joda.time.Period; +import java.time.Duration; +import java.time.format.DateTimeParseException; import org.junit.jupiter.api.Test; /** Unit tests for {@link DurationParameter}. */ @@ -29,32 +29,32 @@ class DurationParameterTest { @Test void testConvert_isoHours() { - assertThat(instance.convert("PT36H")).isEqualTo(Duration.standardHours(36)); + assertThat(instance.convert("PT36H")).isEqualTo(Duration.ofHours(36)); } @Test void testConvert_isoDaysAndHours() { - assertThat(instance.convert("P1DT12H")).isEqualTo(Duration.standardHours(36)); + assertThat(instance.convert("P1DT12H")).isEqualTo(Duration.ofHours(36)); } @Test void testConvert_isoLowercase_isAllowed() { - assertThat(instance.convert("pt36h")).isEqualTo(Duration.standardHours(36)); + assertThat(instance.convert("pt36h")).isEqualTo(Duration.ofHours(36)); } @Test void testIsoMissingP_notAllowed() { - assertThrows(IllegalArgumentException.class, () -> Period.parse("T36H")); + assertThrows(DateTimeParseException.class, () -> instance.convert("T36H")); } @Test void testIsoMissingPT_notAllowed() { - assertThrows(IllegalArgumentException.class, () -> Period.parse("36H")); + assertThrows(DateTimeParseException.class, () -> instance.convert("36H")); } @Test void testConvert_isoMissingP_notAllowed() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("T36H")); + assertThrows(DateTimeParseException.class, () -> instance.convert("T36H")); } @Test @@ -64,17 +64,17 @@ class DurationParameterTest { @Test void testConvert_empty_throws() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("")); + assertThrows(DateTimeParseException.class, () -> instance.convert("")); } @Test void testConvert_numeric_throws() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("1234")); + assertThrows(DateTimeParseException.class, () -> instance.convert("1234")); } @Test void testConvert_sillyString_throws() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("foo")); + assertThrows(DateTimeParseException.class, () -> instance.convert("foo")); } @Test diff --git a/core/src/test/java/google/registry/tools/params/DateTimeParameterTest.java b/core/src/test/java/google/registry/tools/params/InstantParameterTest.java similarity index 62% rename from core/src/test/java/google/registry/tools/params/DateTimeParameterTest.java rename to core/src/test/java/google/registry/tools/params/InstantParameterTest.java index 41da7728d..dfca1474a 100644 --- a/core/src/test/java/google/registry/tools/params/DateTimeParameterTest.java +++ b/core/src/test/java/google/registry/tools/params/InstantParameterTest.java @@ -15,40 +15,39 @@ package google.registry.tools.params; import static com.google.common.truth.Truth.assertThat; -import static org.joda.time.DateTimeZone.UTC; import static org.junit.jupiter.api.Assertions.assertThrows; import com.beust.jcommander.ParameterException; -import org.joda.time.DateTime; +import java.time.Instant; +import java.time.format.DateTimeParseException; import org.junit.jupiter.api.Test; -/** Unit tests for {@link DateTimeParameter}. */ -class DateTimeParameterTest { +/** Unit tests for {@link InstantParameter}. */ +class InstantParameterTest { - private final DateTimeParameter instance = new DateTimeParameter(); + private final InstantParameter instance = new InstantParameter(); @Test void testConvert_numeric_returnsMillisFromEpochUtc() { - assertThat(instance.convert("1234")).isEqualTo(new DateTime(1234L, UTC)); + assertThat(instance.convert("1234")).isEqualTo(Instant.ofEpochMilli(1234L)); } @Test void testConvert_iso8601_returnsSameAsDateTimeParse() { String exampleDate = "2014-01-01T01:02:03.004Z"; - assertThat(instance.convert(exampleDate)) - .isEqualTo(DateTime.parse(exampleDate)); + assertThat(instance.convert(exampleDate)).isEqualTo(Instant.parse(exampleDate)); } @Test void testConvert_isoDateTimeWithMillis_returnsSameAsDateTimeParse() { String exampleDate = "2014-01-01T01:02:03.004Z"; - assertThat(instance.convert(exampleDate)).isEqualTo(DateTime.parse(exampleDate)); + assertThat(instance.convert(exampleDate)).isEqualTo(Instant.parse(exampleDate)); } @Test void testConvert_weirdTimezone_convertsToUtc() { - assertThat(instance.convert("1984-12-18T00:00:00-0520")) - .isEqualTo(DateTime.parse("1984-12-18T05:20:00Z")); + assertThat(instance.convert("1984-12-18T00:00:00-05:20")) + .isEqualTo(Instant.parse("1984-12-18T05:20:00Z")); } @Test @@ -58,47 +57,47 @@ class DateTimeParameterTest { @Test void testConvert_empty_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("")); + assertThrows(DateTimeParseException.class, () -> instance.convert("")); } @Test void testConvert_sillyString_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("foo")); + assertThrows(DateTimeParseException.class, () -> instance.convert("foo")); } @Test void testConvert_partialDate_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-01")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01")); } @Test void testConvert_onlyDate_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-01-01")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01-01")); } @Test void testConvert_partialTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("T01:02")); + assertThrows(DateTimeParseException.class, () -> instance.convert("T01:02")); } @Test void testConvert_onlyTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("T01:02:03")); + assertThrows(DateTimeParseException.class, () -> instance.convert("T01:02:03")); } @Test void testConvert_partialDateAndPartialTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("9T9")); + assertThrows(DateTimeParseException.class, () -> instance.convert("9T9")); } @Test void testConvert_dateAndPartialTime_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-01-01T01:02")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01-01T01:02")); } @Test void testConvert_noTimeZone_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2014-01-01T01:02:03")); + assertThrows(DateTimeParseException.class, () -> instance.convert("2014-01-01T01:02:03")); } @Test diff --git a/core/src/test/java/google/registry/tools/params/IntervalParameterTest.java b/core/src/test/java/google/registry/tools/params/IntervalParameterTest.java deleted file mode 100644 index ea50681b4..000000000 --- a/core/src/test/java/google/registry/tools/params/IntervalParameterTest.java +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2017 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.tools.params; - -import static com.google.common.truth.Truth.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import com.beust.jcommander.ParameterException; -import org.joda.time.DateTime; -import org.joda.time.Interval; -import org.junit.jupiter.api.Test; - -/** Unit tests for {@link IntervalParameter}. */ -class IntervalParameterTest { - - private final IntervalParameter instance = new IntervalParameter(); - - @Test - void testConvert() { - assertThat(instance.convert("2004-06-09T12:30:00Z/2004-07-10T13:30:00Z")) - .isEqualTo(new Interval( - DateTime.parse("2004-06-09T12:30:00Z"), - DateTime.parse("2004-07-10T13:30:00Z"))); - } - - @Test - void testConvert_singleDate() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("2004-06-09T12:30:00Z")); - } - - @Test - void testConvert_backwardsInterval() { - assertThrows( - IllegalArgumentException.class, - () -> instance.convert("2004-07-10T13:30:00Z/2004-06-09T12:30:00Z")); - } - - @Test - void testConvert_empty_throws() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("")); - } - - @Test - void testConvert_null_throws() { - assertThrows(NullPointerException.class, () -> instance.convert(null)); - } - - @Test - void testConvert_sillyString_throws() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("foo")); - } - - @Test - void testValidate_sillyString_throws() { - ParameterException thrown = - assertThrows(ParameterException.class, () -> instance.validate("--time", "foo")); - assertThat(thrown).hasMessageThat().contains("--time=foo not an"); - } -} diff --git a/core/src/test/java/google/registry/tools/params/KeyValueMapParameterTest.java b/core/src/test/java/google/registry/tools/params/KeyValueMapParameterTest.java index 6b49a728d..b008de833 100644 --- a/core/src/test/java/google/registry/tools/params/KeyValueMapParameterTest.java +++ b/core/src/test/java/google/registry/tools/params/KeyValueMapParameterTest.java @@ -132,4 +132,3 @@ class KeyValueMapParameterTest { assertThrows(IllegalArgumentException.class, () -> currencyUnitToStringMap.convert("foo")); } } - diff --git a/core/src/test/java/google/registry/tools/params/YearMonthParameterTest.java b/core/src/test/java/google/registry/tools/params/YearMonthParameterTest.java index 1924e9feb..f2d419a6b 100644 --- a/core/src/test/java/google/registry/tools/params/YearMonthParameterTest.java +++ b/core/src/test/java/google/registry/tools/params/YearMonthParameterTest.java @@ -18,7 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import com.beust.jcommander.ParameterException; -import org.joda.time.YearMonth; +import java.time.YearMonth; +import java.time.format.DateTimeParseException; import org.junit.jupiter.api.Test; /** Unit tests for {@link YearMonthParameter}. */ @@ -28,7 +29,7 @@ class YearMonthParameterTest { @Test void testConvert_awfulMonth() { - assertThat(instance.convert("1984-12")).isEqualTo(new YearMonth(1984, 12)); + assertThat(instance.convert("1984-12")).isEqualTo(YearMonth.of(1984, 12)); } @Test @@ -38,22 +39,22 @@ class YearMonthParameterTest { @Test void testConvert_empty_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("")); + assertThrows(DateTimeParseException.class, () -> instance.convert("")); } @Test void testConvert_sillyString_throwsException() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("foo")); + assertThrows(DateTimeParseException.class, () -> instance.convert("foo")); } @Test void testConvert_wrongOrder() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("12-1984")); + assertThrows(DateTimeParseException.class, () -> instance.convert("12-1984")); } @Test void testConvert_noHyphen() { - assertThrows(IllegalArgumentException.class, () -> instance.convert("198412")); + assertThrows(DateTimeParseException.class, () -> instance.convert("198412")); } @Test diff --git a/core/src/test/java/google/registry/tools/server/ListHostsActionTest.java b/core/src/test/java/google/registry/tools/server/ListHostsActionTest.java index 32b64536c..d2c840135 100644 --- a/core/src/test/java/google/registry/tools/server/ListHostsActionTest.java +++ b/core/src/test/java/google/registry/tools/server/ListHostsActionTest.java @@ -18,8 +18,8 @@ import static google.registry.testing.DatabaseHelper.createTld; import static google.registry.testing.DatabaseHelper.persistActiveHost; import google.registry.testing.FakeClock; +import java.time.Instant; import java.util.Optional; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -32,7 +32,7 @@ class ListHostsActionTest extends ListActionTestCase { void beforeEach() { createTld("foo"); action = new ListHostsAction(); - action.clock = new FakeClock(DateTime.parse("2000-01-01TZ")); + action.clock = new FakeClock(Instant.parse("2000-01-01T00:00:00Z")); } @Test diff --git a/core/src/test/java/google/registry/tools/server/ListTldsActionTest.java b/core/src/test/java/google/registry/tools/server/ListTldsActionTest.java index a1588ed6d..0d3077330 100644 --- a/core/src/test/java/google/registry/tools/server/ListTldsActionTest.java +++ b/core/src/test/java/google/registry/tools/server/ListTldsActionTest.java @@ -17,8 +17,8 @@ package google.registry.tools.server; import static google.registry.testing.DatabaseHelper.createTld; import google.registry.testing.FakeClock; +import java.time.Instant; import java.util.Optional; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,7 +31,7 @@ class ListTldsActionTest extends ListActionTestCase { void beforeEach() { createTld("xn--q9jyb4c"); action = new ListTldsAction(); - action.clock = new FakeClock(DateTime.parse("2000-01-01TZ")); + action.clock = new FakeClock(Instant.parse("2000-01-01T00:00:00Z")); } @Test diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleActionBaseTestCase.java b/core/src/test/java/google/registry/ui/server/console/ConsoleActionBaseTestCase.java index 9f95aac98..44fe1b5de 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleActionBaseTestCase.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleActionBaseTestCase.java @@ -25,7 +25,7 @@ import google.registry.testing.ConsoleApiParamsUtils; import google.registry.testing.FakeClock; import google.registry.testing.FakeResponse; import google.registry.tools.GsonUtils; -import org.joda.time.DateTime; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.RegisterExtension; @@ -33,7 +33,7 @@ public abstract class ConsoleActionBaseTestCase { protected static final Gson GSON = GsonUtils.provideGson(); - protected final FakeClock clock = new FakeClock(DateTime.parse("2024-04-15T00:00:00.000Z")); + protected final FakeClock clock = new FakeClock(Instant.parse("2024-04-15T00:00:00.000Z")); @RegisterExtension final JpaTestExtensions.JpaIntegrationTestExtension jpa = diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleHistoryDataActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleHistoryDataActionTest.java index f24123219..d7fee4abc 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleHistoryDataActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleHistoryDataActionTest.java @@ -14,7 +14,6 @@ package google.registry.ui.server.console; - import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.truth.Truth.assertThat; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java index a498126a0..2e30efc3c 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java @@ -38,7 +38,7 @@ import google.registry.testing.FakeResponse; import google.registry.tools.DomainLockUtils; import google.registry.util.StringGenerator; import jakarta.servlet.http.HttpServletResponse; -import org.joda.time.Duration; +import java.time.Duration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -150,7 +150,7 @@ public class ConsoleRegistryLockVerifyActionTest extends ConsoleActionBaseTestCa @Test void testFailure_expiredLock() { saveRegistryLock(createDefaultLockBuilder().build()); - clock.advanceBy(Duration.standardDays(1)); + clock.advanceBy(Duration.ofDays(1)); action.run(); assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_BAD_REQUEST); assertThat(response.getPayload()).isEqualTo("The pending lock has expired; please try again"); diff --git a/core/src/test/java/google/registry/ui/server/console/PasswordResetVerifyActionTest.java b/core/src/test/java/google/registry/ui/server/console/PasswordResetVerifyActionTest.java index 700f4e29e..97b577258 100644 --- a/core/src/test/java/google/registry/ui/server/console/PasswordResetVerifyActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/PasswordResetVerifyActionTest.java @@ -29,10 +29,10 @@ import google.registry.request.auth.AuthResult; import google.registry.testing.ConsoleApiParamsUtils; import google.registry.testing.FakeResponse; import jakarta.servlet.http.HttpServletResponse; +import java.time.Duration; import java.util.Map; import java.util.Optional; import javax.annotation.Nullable; -import org.joda.time.Duration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -135,14 +135,14 @@ public class PasswordResetVerifyActionTest extends ConsoleActionBaseTestCase { @Test void testFailure_get_expired() throws Exception { - clock.advanceBy(Duration.standardDays(1)); + clock.advanceBy(Duration.ofDays(1)); createAction("GET", verificationCode, null).run(); assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_BAD_REQUEST); } @Test void testFailure_post_expired() throws Exception { - clock.advanceBy(Duration.standardDays(1)); + clock.advanceBy(Duration.ofDays(1)); createAction("POST", verificationCode, "newPassword").run(); assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_BAD_REQUEST); } diff --git a/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java b/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java index 26a60d724..ad1f61a62 100644 --- a/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java @@ -84,7 +84,6 @@ class SecurityActionTest extends ConsoleActionBaseTestCase { AuthenticatedRegistrarAccessor.createForTesting( ImmutableSetMultimap.of("registrarId", AuthenticatedRegistrarAccessor.Role.ADMIN)); - @BeforeEach void beforeEach() { testRegistrar = saveRegistrar("registrarId"); diff --git a/core/src/test/java/google/registry/webdriver/ConsoleScreenshotTest.java b/core/src/test/java/google/registry/webdriver/ConsoleScreenshotTest.java index cd7719cde..d57eb7efe 100644 --- a/core/src/test/java/google/registry/webdriver/ConsoleScreenshotTest.java +++ b/core/src/test/java/google/registry/webdriver/ConsoleScreenshotTest.java @@ -97,7 +97,6 @@ public class ConsoleScreenshotTest { assertThat(driver.getCurrentUrl()).endsWith("?registrarId=TheRegistrar"); } - @RetryingTest(3) void dums_mainPage() throws Exception { server.setGlobalRole(GlobalRole.FTE); diff --git a/core/src/test/java/google/registry/xml/UtcDateTimeAdapterTest.java b/core/src/test/java/google/registry/xml/UtcInstantAdapterTest.java similarity index 50% rename from core/src/test/java/google/registry/xml/UtcDateTimeAdapterTest.java rename to core/src/test/java/google/registry/xml/UtcInstantAdapterTest.java index 9083916a5..271234487 100644 --- a/core/src/test/java/google/registry/xml/UtcDateTimeAdapterTest.java +++ b/core/src/test/java/google/registry/xml/UtcInstantAdapterTest.java @@ -15,56 +15,54 @@ package google.registry.xml; import static com.google.common.truth.Truth.assertThat; -import static org.joda.time.DateTimeZone.UTC; import static org.junit.jupiter.api.Assertions.assertThrows; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; +import java.time.Instant; +import java.time.format.DateTimeParseException; import org.junit.jupiter.api.Test; -/** Unit tests for {@link UtcDateTimeAdapter}. */ -class UtcDateTimeAdapterTest { +/** Unit tests for {@link UtcInstantAdapter}. */ +class UtcInstantAdapterTest { @Test void testMarshal() { - assertThat(new UtcDateTimeAdapter().marshal(new DateTime(2010, 10, 17, 4, 20, 0, UTC))) - .isEqualTo("2010-10-17T04:20:00Z"); + assertThat(new UtcInstantAdapter().marshal(Instant.parse("2010-10-17T04:20:00Z"))) + .isEqualTo("2010-10-17T04:20:00.000Z"); } @Test void testMarshalConvertsToZuluTime() { - assertThat(new UtcDateTimeAdapter().marshal( - new DateTime(2010, 10, 17, 0, 20, 0, DateTimeZone.forOffsetHours(-4)))) - .isEqualTo("2010-10-17T04:20:00Z"); + assertThat(new UtcInstantAdapter().marshal(Instant.parse("2010-10-17T00:20:00-04:00"))) + .isEqualTo("2010-10-17T04:20:00.000Z"); } @Test void testMarshalEmpty() { - assertThat(new UtcDateTimeAdapter().marshal(null)).isEmpty(); + assertThat(new UtcInstantAdapter().marshal(null)).isEmpty(); } @Test void testUnmarshal() { - assertThat(new UtcDateTimeAdapter().unmarshal("2010-10-17T04:20:00Z")) - .isEqualTo(new DateTime(2010, 10, 17, 4, 20, 0, UTC)); + assertThat(new UtcInstantAdapter().unmarshal("2010-10-17T04:20:00Z")) + .isEqualTo(Instant.parse("2010-10-17T04:20:00Z")); } @Test void testUnmarshalConvertsToZuluTime() { - assertThat(new UtcDateTimeAdapter().unmarshal("2010-10-17T00:20:00-04:00")) - .isEqualTo(new DateTime(2010, 10, 17, 4, 20, 0, UTC)); + assertThat(new UtcInstantAdapter().unmarshal("2010-10-17T00:20:00-04:00")) + .isEqualTo(Instant.parse("2010-10-17T04:20:00Z")); } @Test void testUnmarshalEmpty() { - assertThat(new UtcDateTimeAdapter().unmarshal(null)).isNull(); - assertThat(new UtcDateTimeAdapter().unmarshal("")).isNull(); + assertThat(new UtcInstantAdapter().unmarshal(null)).isNull(); + assertThat(new UtcInstantAdapter().unmarshal("")).isNull(); } @Test void testUnmarshalInvalid() { assertThrows( - IllegalArgumentException.class, - () -> assertThat(new UtcDateTimeAdapter().unmarshal("oh my goth")).isNull()); + DateTimeParseException.class, + () -> assertThat(new UtcInstantAdapter().unmarshal("oh my goth")).isNull()); } } diff --git a/core/src/test/java/google/registry/xml/XmlTestUtils.java b/core/src/test/java/google/registry/xml/XmlTestUtils.java index 436c69d65..47543bac2 100644 --- a/core/src/test/java/google/registry/xml/XmlTestUtils.java +++ b/core/src/test/java/google/registry/xml/XmlTestUtils.java @@ -17,7 +17,6 @@ package google.registry.xml; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.truth.Truth.assertWithMessage; import static google.registry.util.DiffUtils.prettyPrintXmlDeepDiff; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; @@ -26,6 +25,9 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.net.InetAddresses; import com.google.common.net.InternetDomainName; +import java.time.Instant; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; import java.util.AbstractMap; import java.util.HashMap; import java.util.HashSet; @@ -33,7 +35,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Nullable; -import org.joda.time.format.ISODateTimeFormat; import org.json.JSONArray; import org.json.JSONObject; import org.json.XML; @@ -247,18 +248,12 @@ public class XmlTestUtils { } String string = obj.toString(); // We use a slightly different datetime format (both legal) than the samples, so normalize - // both into Datetime objects. + // both into Instant objects. try { return new AbstractMap.SimpleEntry<>( - null, ISODateTimeFormat.dateTime().parseDateTime(string).toDateTime(UTC)); - } catch (IllegalArgumentException e) { - // It wasn't a DateTime. - } - try { - return new AbstractMap.SimpleEntry<>( - null, ISODateTimeFormat.dateTimeNoMillis().parseDateTime(string).toDateTime(UTC)); - } catch (IllegalArgumentException e) { - // It wasn't a DateTime. + null, Instant.parse(string).truncatedTo(ChronoUnit.SECONDS)); + } catch (DateTimeParseException e) { + // It wasn't an Instant. } try { if (!InternetDomainName.isValid(string)) { @@ -284,4 +279,3 @@ public class XmlTestUtils { ImmutableMap.of()).getValue(); } } - 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 4f47d05de..200103938 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 @@ -1,6 +1,6 @@ - 2000-01-01T00:00:00Z + 2000-01-01T00:00:00.000Z 1.0 urn:ietf:params:xml:ns:rdeDomain-1.0 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 069493831..3facd12ff 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 @@ -1,6 +1,6 @@ - 2000-01-01T00:00:00Z + 2000-01-01T00:00:00.000Z 1.0 urn:ietf:params:xml:ns:rdeDomain-1.0 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 5271f2c41..c3d5b0213 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 @@ -5,9 +5,9 @@ draft-arias-noguchi-registry-data-escrow-06 draft-arias-noguchi-dnrd-objects-mapping-05 %RESEND% - 2000-01-01T00:00:00Z + 2000-01-01T00:00:00.000Z FULL - 2000-01-01T00:00:00Z + 2000-01-01T00:00:00.000Z soy 1 diff --git a/core/src/test/resources/google/registry/flows/poll/poll_message_domain_pending_action_immediate_delete.xml b/core/src/test/resources/google/registry/flows/poll/poll_message_domain_pending_action_immediate_delete.xml index d82d4e18e..a71925d80 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_message_domain_pending_action_immediate_delete.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_message_domain_pending_action_immediate_delete.xml @@ -23,4 +23,3 @@ - diff --git a/core/src/test/resources/google/registry/rde/deposit_full_out_of_order.xml b/core/src/test/resources/google/registry/rde/deposit_full_out_of_order.xml index 2f99a9725..680a92b67 100644 --- a/core/src/test/resources/google/registry/rde/deposit_full_out_of_order.xml +++ b/core/src/test/resources/google/registry/rde/deposit_full_out_of_order.xml @@ -77,8 +77,6 @@ 2015-04-03T22:00:00.0Z - - ns1.example.com diff --git a/db/buildscript-gradle.lockfile b/db/buildscript-gradle.lockfile index 171e5b033..d109decc7 100644 --- a/db/buildscript-gradle.lockfile +++ b/db/buildscript-gradle.lockfile @@ -4,8 +4,8 @@ com.fasterxml.jackson.core:jackson-annotations:2.21=classpath gradle.plugin.org.flywaydb:gradle-plugin-publishing:12.2.0=classpath org.flywaydb.flyway:org.flywaydb.flyway.gradle.plugin:12.2.0=classpath -org.flywaydb:flyway-core:12.6.0=classpath -org.flywaydb:flyway-database-postgresql:12.6.0=classpath +org.flywaydb:flyway-core:12.6.1=classpath +org.flywaydb:flyway-database-postgresql:12.6.1=classpath tools.jackson.core:jackson-core:3.1.1=classpath tools.jackson.core:jackson-databind:3.1.1=classpath tools.jackson:jackson-bom:3.1.1=classpath diff --git a/db/gradle.lockfile b/db/gradle.lockfile index 9193453d6..ec6eb6cd0 100644 --- a/db/gradle.lockfile +++ b/db/gradle.lockfile @@ -79,7 +79,6 @@ io.opencensus:opencensus-contrib-http-util:0.31.1=deploy_jar,runtimeClasspath,te jakarta.inject:jakarta.inject-api:2.0.1=testCompileClasspath,testRuntimeClasspath javax.annotation:javax.annotation-api:1.3.2=deploy_jar,runtimeClasspath,testRuntimeClasspath javax.inject:javax.inject:1=annotationProcessor,testAnnotationProcessor -joda-time:joda-time:2.14.2=testCompileClasspath,testRuntimeClasspath junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath net.java.dev.jna:jna:5.13.0=testCompileClasspath,testRuntimeClasspath net.java.dev.jna:jna:5.18.1=compileClasspath,deploy_jar,runtimeClasspath @@ -110,8 +109,8 @@ org.codehaus.plexus:plexus-classworlds:2.6.0=checkstyle org.codehaus.plexus:plexus-component-annotations:2.1.0=checkstyle org.codehaus.plexus:plexus-container-default:2.1.0=checkstyle org.codehaus.plexus:plexus-utils:3.3.0=checkstyle -org.flywaydb:flyway-core:12.6.0=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.flywaydb:flyway-database-postgresql:12.6.0=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.flywaydb:flyway-core:12.6.1=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.flywaydb:flyway-database-postgresql:12.6.1=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.hamcrest:hamcrest-core:1.3=testCompileClasspath,testRuntimeClasspath org.jacoco:org.jacoco.agent:0.8.14=jacocoAgent,jacocoAnt org.jacoco:org.jacoco.ant:0.8.14=jacocoAnt diff --git a/db/src/main/resources/sql/flyway/V113__add_host_missing_indexes.sql b/db/src/main/resources/sql/flyway/V113__add_host_missing_indexes.sql index cbb099d9e..507718c14 100644 --- a/db/src/main/resources/sql/flyway/V113__add_host_missing_indexes.sql +++ b/db/src/main/resources/sql/flyway/V113__add_host_missing_indexes.sql @@ -15,4 +15,3 @@ CREATE INDEX IDXy98mebut8ix1v07fjxxdkqcx ON "Host" (creation_time); CREATE INDEX IDXovmntef6l45tw2bsfl56tcugx ON "Host" (deletion_time); CREATE INDEX IDXl49vydnq0h5j1piefwjy4i8er ON "Host" (current_sponsor_registrar_id); - diff --git a/db/src/main/resources/sql/flyway/V123__drop_unused_columns_in_billing_cancellation_table.sql b/db/src/main/resources/sql/flyway/V123__drop_unused_columns_in_billing_cancellation_table.sql index a2a7881ce..124aed49c 100644 --- a/db/src/main/resources/sql/flyway/V123__drop_unused_columns_in_billing_cancellation_table.sql +++ b/db/src/main/resources/sql/flyway/V123__drop_unused_columns_in_billing_cancellation_table.sql @@ -16,4 +16,3 @@ ALTER TABLE "BillingCancellation" DROP COLUMN billing_event_domain_repo_id; ALTER TABLE "BillingCancellation" DROP COLUMN billing_event_history_id; ALTER TABLE "BillingCancellation" DROP COLUMN billing_recurrence_domain_repo_id; ALTER TABLE "BillingCancellation" DROP COLUMN billing_recurrence_history_id; - diff --git a/db/src/main/resources/sql/flyway/V125__create_package_promotion.sql b/db/src/main/resources/sql/flyway/V125__create_package_promotion.sql index f11e8fe80..f3d41390d 100644 --- a/db/src/main/resources/sql/flyway/V125__create_package_promotion.sql +++ b/db/src/main/resources/sql/flyway/V125__create_package_promotion.sql @@ -25,4 +25,3 @@ ); create index IDXlg6a5tp70nch9cp0gc11brc5o on "PackagePromotion" (token); - diff --git a/db/src/main/resources/sql/flyway/V129__create_allocateId_sequence_alternative.sql b/db/src/main/resources/sql/flyway/V129__create_allocateId_sequence_alternative.sql index 554b830b7..a932f34ee 100644 --- a/db/src/main/resources/sql/flyway/V129__create_allocateId_sequence_alternative.sql +++ b/db/src/main/resources/sql/flyway/V129__create_allocateId_sequence_alternative.sql @@ -18,4 +18,3 @@ CREATE SEQUENCE public."project_wide_unique_id_seq" MINVALUE 59880480005 NO MAXVALUE CACHE 10; - diff --git a/db/src/main/resources/sql/flyway/V130__add_login_email_column_to_registrarpoc.sql b/db/src/main/resources/sql/flyway/V130__add_login_email_column_to_registrarpoc.sql index 24dc57788..4b5edc945 100644 --- a/db/src/main/resources/sql/flyway/V130__add_login_email_column_to_registrarpoc.sql +++ b/db/src/main/resources/sql/flyway/V130__add_login_email_column_to_registrarpoc.sql @@ -14,4 +14,3 @@ alter table "RegistrarPoc" add column login_email_address text; create index registrarpoc_login_email_idx on "RegistrarPoc" (login_email_address); - diff --git a/db/src/main/resources/sql/flyway/V132__drop_gae_user_id_from_registrar_poc.sql b/db/src/main/resources/sql/flyway/V132__drop_gae_user_id_from_registrar_poc.sql index e7d1a06be..d80d5a669 100644 --- a/db/src/main/resources/sql/flyway/V132__drop_gae_user_id_from_registrar_poc.sql +++ b/db/src/main/resources/sql/flyway/V132__drop_gae_user_id_from_registrar_poc.sql @@ -13,4 +13,3 @@ -- limitations under the License. ALTER TABLE "RegistrarPoc" DROP COLUMN gae_user_id; - diff --git a/db/src/main/resources/sql/flyway/V140__rename_process_time_column_in_dns_refresh_request_table.sql b/db/src/main/resources/sql/flyway/V140__rename_process_time_column_in_dns_refresh_request_table.sql index 465261ec2..39db58f6a 100644 --- a/db/src/main/resources/sql/flyway/V140__rename_process_time_column_in_dns_refresh_request_table.sql +++ b/db/src/main/resources/sql/flyway/V140__rename_process_time_column_in_dns_refresh_request_table.sql @@ -15,6 +15,3 @@ ALTER TABLE "DnsRefreshRequest" RENAME COLUMN process_time TO last_process_time; CREATE INDEX IDXfdk2xpil2x1gh0omt84k2y3o1 ON "DnsRefreshRequest" (last_process_time); DROP INDEX IDX3i7i2ktts9d7lcjbs34h0pvwo; - - - diff --git a/db/src/main/resources/sql/flyway/V142__drop_request_log_id.sql b/db/src/main/resources/sql/flyway/V142__drop_request_log_id.sql index 9d3108837..009b75f2e 100644 --- a/db/src/main/resources/sql/flyway/V142__drop_request_log_id.sql +++ b/db/src/main/resources/sql/flyway/V142__drop_request_log_id.sql @@ -13,4 +13,3 @@ -- limitations under the License. ALTER TABLE "Lock" DROP COLUMN request_log_id; - diff --git a/db/src/main/resources/sql/flyway/V147__drop_gaia_id_from_user.sql b/db/src/main/resources/sql/flyway/V147__drop_gaia_id_from_user.sql index b2473957c..c1dc0099b 100644 --- a/db/src/main/resources/sql/flyway/V147__drop_gaia_id_from_user.sql +++ b/db/src/main/resources/sql/flyway/V147__drop_gaia_id_from_user.sql @@ -13,4 +13,3 @@ -- limitations under the License. ALTER TABLE "User" DROP COLUMN gaia_id; - diff --git a/db/src/main/resources/sql/flyway/V25__rename_vkey_fields.sql b/db/src/main/resources/sql/flyway/V25__rename_vkey_fields.sql index 6286b66b8..4c5b29cff 100644 --- a/db/src/main/resources/sql/flyway/V25__rename_vkey_fields.sql +++ b/db/src/main/resources/sql/flyway/V25__rename_vkey_fields.sql @@ -19,4 +19,3 @@ ALTER TABLE "DomainHost" ADD CONSTRAINT FK_DomainHost_host_valid FOREIGN KEY (ns_hosts) REFERENCES "HostResource"; - diff --git a/db/src/main/resources/sql/flyway/V43__update_relock_duration_type.sql b/db/src/main/resources/sql/flyway/V43__update_relock_duration_type.sql index 89d90687c..0c0996f53 100644 --- a/db/src/main/resources/sql/flyway/V43__update_relock_duration_type.sql +++ b/db/src/main/resources/sql/flyway/V43__update_relock_duration_type.sql @@ -15,4 +15,3 @@ ALTER TABLE "RegistryLock" DROP COLUMN relock_duration; ALTER TABLE "RegistryLock" ADD COLUMN relock_duration interval; - diff --git a/db/src/main/resources/sql/flyway/V80__defer_bill_event_key.sql b/db/src/main/resources/sql/flyway/V80__defer_bill_event_key.sql index bc5a20277..f73836790 100644 --- a/db/src/main/resources/sql/flyway/V80__defer_bill_event_key.sql +++ b/db/src/main/resources/sql/flyway/V80__defer_bill_event_key.sql @@ -24,4 +24,3 @@ ALTER TABLE if exists "Domain" FOREIGN KEY (transfer_billing_event_id) REFERENCES "BillingEvent" DEFERRABLE INITIALLY DEFERRED; - diff --git a/db/src/main/resources/sql/flyway/V89__host_history_host_deferred.sql b/db/src/main/resources/sql/flyway/V89__host_history_host_deferred.sql index a9b990a17..26e0e479f 100644 --- a/db/src/main/resources/sql/flyway/V89__host_history_host_deferred.sql +++ b/db/src/main/resources/sql/flyway/V89__host_history_host_deferred.sql @@ -22,4 +22,3 @@ ALTER TABLE "HostHistory" ADD CONSTRAINT fk_hosthistory_host FOREIGN KEY (host_repo_id) REFERENCES "Host"(repo_id) DEFERRABLE INITIALLY DEFERRED; - diff --git a/db/src/main/resources/sql/flyway/V95__add_contacts_indexes_on_domain.sql b/db/src/main/resources/sql/flyway/V95__add_contacts_indexes_on_domain.sql index 096243179..c95a89b06 100644 --- a/db/src/main/resources/sql/flyway/V95__add_contacts_indexes_on_domain.sql +++ b/db/src/main/resources/sql/flyway/V95__add_contacts_indexes_on_domain.sql @@ -19,4 +19,3 @@ create index IDXq9gy8x2xynt9tb16yajn1gcm8 on "Domain" (billing_contact); create index IDXr22ciyccwi9rrqmt1ro0s59qf on "Domain" (tech_contact); create index IDXa7fu0bqynfb79rr80528b4jqt on "Domain" (registrant_contact); - diff --git a/dependencies.gradle b/dependencies.gradle index 2acc517ad..4395e93d0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -144,7 +144,6 @@ ext { 'jakarta.persistence:jakarta.persistence-api:[3.2.0,4.+)', 'jakarta.servlet:jakarta.servlet-api:[6.0,6.1)', 'jakarta.xml.bind:jakarta.xml.bind-api:[4.0.2,)', - 'joda-time:joda-time:[2.9.2,)', // Antlr is not a direct dependency, but we need to ensure that the // compile-time and runtime dependencies are compatible. 'org.antlr:antlr4-runtime:[4.13.2,)', diff --git a/jetty/gradle.lockfile b/jetty/gradle.lockfile index 1f5f32998..f152ea216 100644 --- a/jetty/gradle.lockfile +++ b/jetty/gradle.lockfile @@ -344,8 +344,8 @@ org.codehaus.plexus:plexus-utils:3.3.0=checkstyle org.conscrypt:conscrypt-openjdk-uber:2.5.2=deploy_jar,runtimeClasspath,testRuntimeClasspath org.eclipse.angus:angus-activation:2.1.0-M1=deploy_jar,runtimeClasspath,testRuntimeClasspath org.eclipse.angus:jakarta.mail:2.1.0-M1=deploy_jar,runtimeClasspath,testRuntimeClasspath -org.flywaydb:flyway-core:12.6.0=deploy_jar,runtimeClasspath,testRuntimeClasspath -org.flywaydb:flyway-database-postgresql:12.6.0=deploy_jar,runtimeClasspath,testRuntimeClasspath +org.flywaydb:flyway-core:12.6.1=deploy_jar,runtimeClasspath,testRuntimeClasspath +org.flywaydb:flyway-database-postgresql:12.6.1=deploy_jar,runtimeClasspath,testRuntimeClasspath org.glassfish.jaxb:jaxb-core:4.0.6=deploy_jar,runtimeClasspath,testRuntimeClasspath org.glassfish.jaxb:jaxb-runtime:4.0.6=deploy_jar,runtimeClasspath,testRuntimeClasspath org.glassfish.jaxb:txw2:4.0.6=deploy_jar,runtimeClasspath,testRuntimeClasspath diff --git a/load-testing/build.gradle b/load-testing/build.gradle index 776b1570e..7abb97cae 100644 --- a/load-testing/build.gradle +++ b/load-testing/build.gradle @@ -18,7 +18,6 @@ createUberJar('buildLoadTestClient', 'loadTest', 'google.registry.client.EppClie dependencies { def deps = rootProject.dependencyMap - implementation deps['joda-time:joda-time'] implementation deps['io.netty:netty-buffer'] implementation deps['io.netty:netty-codec'] implementation deps['io.netty:netty-codec-http'] diff --git a/load-testing/gradle.lockfile b/load-testing/gradle.lockfile index 682ace803..ebae8ed8e 100644 --- a/load-testing/gradle.lockfile +++ b/load-testing/gradle.lockfile @@ -40,7 +40,6 @@ io.netty:netty-resolver:4.1.133.Final=compileClasspath,deploy_jar,runtimeClasspa io.netty:netty-transport-native-unix-common:4.1.133.Final=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.netty:netty-transport:4.1.133.Final=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath javax.inject:javax.inject:1=annotationProcessor,testAnnotationProcessor -joda-time:joda-time:2.14.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath net.sf.saxon:Saxon-HE:12.5=checkstyle org.antlr:antlr4-runtime:4.13.2=checkstyle org.apache.commons:commons-lang3:3.8.1=checkstyle diff --git a/load-testing/src/main/java/google/registry/client/EppClient.java b/load-testing/src/main/java/google/registry/client/EppClient.java index 6f6d514cc..fad6de64c 100644 --- a/load-testing/src/main/java/google/registry/client/EppClient.java +++ b/load-testing/src/main/java/google/registry/client/EppClient.java @@ -15,7 +15,6 @@ package google.registry.client; import static com.google.common.io.Resources.getResource; import static java.nio.charset.StandardCharsets.UTF_8; -import static java.time.ZoneOffset.UTC; import com.beust.jcommander.IStringConverter; import com.beust.jcommander.JCommander; @@ -54,7 +53,7 @@ import java.security.Security; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.time.Duration; -import java.time.ZonedDateTime; +import java.time.Instant; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashSet; @@ -69,8 +68,6 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openssl.PEMKeyPair; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; /** A simple EPP client that can be used for load testing. */ @Parameters(separators = " =") @@ -90,9 +87,8 @@ public class EppClient implements Runnable { private static final String DOMAIN_CREATE_FILE = "domain_create.xml"; - static final AttributeKey> REQUEST_SENT = - AttributeKey.valueOf("REQUEST_SENT"); - static final AttributeKey> RESPONSE_RECEIVED = + static final AttributeKey> REQUEST_SENT = AttributeKey.valueOf("REQUEST_SENT"); + static final AttributeKey> RESPONSE_RECEIVED = AttributeKey.valueOf("RESPONSE_RECEIVED"); static final AttributeKey CHANNEL_NUMBER = AttributeKey.valueOf("CHANNEL_NUMBER"); static final AttributeKey LOGGING_LOCATION = AttributeKey.valueOf("LOGGING_LOCATION"); @@ -192,7 +188,7 @@ public class EppClient implements Runnable { return BaseEncoding.base32().encode(buffer).toLowerCase(Locale.US); } - private ImmutableList makeInputList(ZonedDateTime now) { + private ImmutableList makeInputList(Instant now) { ImmutableList.Builder templatesList = ImmutableList.builder(); ImmutableList.Builder inputList = ImmutableList.builder(); templatesList.add(readStringFromFile(LOGIN_FILE)); @@ -261,7 +257,7 @@ public class EppClient implements Runnable { String outputFolder, ImmutableList loggingExecutors) throws IOException { return new ChannelInitializer<>() { - private final ImmutableList inputList = makeInputList(ZonedDateTime.now(UTC)); + private final ImmutableList inputList = makeInputList(Instant.now()); private final KeyPair key = getKeyPair(keyFileName); private final X509Certificate cert = getCertificate(certFileName); private final LoggingHandler loggingHandler = new LoggingHandler(LogLevel.INFO); @@ -316,8 +312,7 @@ public class EppClient implements Runnable { @Override public void run() { - String outputFolder = - createOutputFolder(String.format("load-tests/%s", DateTime.now(DateTimeZone.UTC))); + String outputFolder = createOutputFolder(String.format("load-tests/%s", Instant.now())); ImmutableList.Builder builder = ImmutableList.builderWithExpectedSize(5); for (int i = 0; i < 5; ++i) { builder.add(Executors.newSingleThreadExecutor()); @@ -360,8 +355,8 @@ public class EppClient implements Runnable { LinkedHashSet killedConnections = new LinkedHashSet<>(); LinkedHashSet incompleteConnections = new LinkedHashSet<>(); List requestDurations = new ArrayList<>(); - ZonedDateTime startTime = null; - ZonedDateTime endTime = null; + Instant startTime = null; + Instant endTime = null; int failedRequests = 0; // Wait for all channels to close. @@ -372,8 +367,7 @@ public class EppClient implements Runnable { .closeFuture() .awaitUninterruptibly( TIMEOUT_SECONDS * 1000 - - Duration.between( - channel.attr(REQUEST_SENT).get().getFirst(), ZonedDateTime.now(UTC)) + - Duration.between(channel.attr(REQUEST_SENT).get().getFirst(), Instant.now()) .toMillis())) { channel.close().syncUninterruptibly(); killedConnections.add(channelNumber); @@ -442,9 +436,9 @@ public class EppClient implements Runnable { } } - private ZonedDateTime updateStartTime( - List channelFutures, int channelNumber, ZonedDateTime startTime) { - ZonedDateTime channelStartTime = + private Instant updateStartTime( + List channelFutures, int channelNumber, Instant startTime) { + Instant channelStartTime = channelFutures.get(channelNumber).channel().attr(REQUEST_SENT).get().getFirst(); if (startTime == null || startTime.isAfter(channelStartTime)) { return channelStartTime; @@ -452,9 +446,9 @@ public class EppClient implements Runnable { return startTime; } - private ZonedDateTime updateEndTime( - List channelFutures, int channelNumber, ZonedDateTime endTime) { - ZonedDateTime channelEndTime = + private Instant updateEndTime( + List channelFutures, int channelNumber, Instant endTime) { + Instant channelEndTime = channelFutures.get(channelNumber).channel().attr(RESPONSE_RECEIVED).get().getLast(); if (endTime == null || endTime.isBefore(channelEndTime)) { diff --git a/load-testing/src/main/java/google/registry/client/EppClientHandler.java b/load-testing/src/main/java/google/registry/client/EppClientHandler.java index f18293b66..3fd7145e6 100644 --- a/load-testing/src/main/java/google/registry/client/EppClientHandler.java +++ b/load-testing/src/main/java/google/registry/client/EppClientHandler.java @@ -23,7 +23,6 @@ import static google.registry.client.EppClient.LOGGING_REQUEST_COMPLETE; import static google.registry.client.EppClient.REQUEST_SENT; import static google.registry.client.EppClient.RESPONSE_RECEIVED; import static java.nio.file.StandardOpenOption.APPEND; -import static java.time.ZoneOffset.UTC; import com.google.common.flogger.FluentLogger; import io.netty.buffer.ByteBuf; @@ -38,7 +37,7 @@ import io.netty.util.concurrent.Promise; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.time.ZonedDateTime; +import java.time.Instant; /** Handler that sends EPP requests and receives EPP responses. */ @SuppressWarnings("FutureReturnValueIgnored") @@ -51,9 +50,9 @@ public class EppClientHandler extends ChannelDuplexHandler { private final Path loggingLocation; private final byte[] contents; - private final ZonedDateTime time; + private final Instant time; - FileWriter(Path loggingLocation, byte[] contents, ZonedDateTime time) { + FileWriter(Path loggingLocation, byte[] contents, Instant time) { this.loggingLocation = loggingLocation; this.contents = contents; this.time = time; @@ -75,7 +74,7 @@ public class EppClientHandler extends ChannelDuplexHandler { @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - ZonedDateTime now = ZonedDateTime.now(UTC); + Instant now = Instant.now(); ctx.channel().attr(REQUEST_SENT).get().add(now); ctx.channel().attr(LOGGING_REQUEST_COMPLETE).set(ctx.executor().newPromise()); super.channelRegistered(ctx); @@ -93,7 +92,7 @@ public class EppClientHandler extends ChannelDuplexHandler { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { - ZonedDateTime now = ZonedDateTime.now(UTC); + Instant now = Instant.now(); Channel ch = ctx.channel(); ctx.channel().attr(RESPONSE_RECEIVED).get().add(now); if (msg instanceof ByteBuf buffer) { @@ -118,7 +117,7 @@ public class EppClientHandler extends ChannelDuplexHandler { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { - ZonedDateTime now = ZonedDateTime.now(UTC); + Instant now = Instant.now(); Channel ch = ctx.channel(); ctx.channel().attr(REQUEST_SENT).get().add(now); if (msg instanceof byte[] outputBytes) { diff --git a/networking/gradle.lockfile b/networking/gradle.lockfile index 6f7059416..11e3304de 100644 --- a/networking/gradle.lockfile +++ b/networking/gradle.lockfile @@ -109,7 +109,6 @@ jakarta.mail:jakarta.mail-api:2.2.0-M1=deploy_jar,runtimeClasspath,testRuntimeCl jakarta.xml.bind:jakarta.xml.bind-api:4.1.0-M1=deploy_jar,runtimeClasspath,testRuntimeClasspath javax.annotation:javax.annotation-api:1.3.2=deploy_jar,runtimeClasspath,testRuntimeClasspath javax.inject:javax.inject:1=annotationProcessor,compileClasspath,deploy_jar,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath -joda-time:joda-time:2.14.2=deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath net.java.dev.jna:jna:5.13.0=testCompileClasspath,testRuntimeClasspath net.ltgt.gradle.incap:incap:0.2=annotationProcessor,testAnnotationProcessor diff --git a/networking/src/test/java/google/registry/networking/handler/SslClientInitializerTest.java b/networking/src/test/java/google/registry/networking/handler/SslClientInitializerTest.java index 928d3ed5f..306d6546c 100644 --- a/networking/src/test/java/google/registry/networking/handler/SslClientInitializerTest.java +++ b/networking/src/test/java/google/registry/networking/handler/SslClientInitializerTest.java @@ -19,7 +19,6 @@ import static google.registry.networking.handler.SslInitializerTestUtils.getKeyP import static google.registry.networking.handler.SslInitializerTestUtils.setUpSslChannel; import static google.registry.networking.handler.SslInitializerTestUtils.signKeyPair; import static google.registry.networking.handler.SslInitializerTestUtils.verifySslException; -import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.ImmutableList; import google.registry.testing.FakeClock; @@ -45,10 +44,11 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateNotYetValidException; import java.security.cert.X509Certificate; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.stream.Stream; import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; -import org.joda.time.DateTime; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -243,7 +243,11 @@ class SslClientInitializerTest { SelfSignedCaCertificate ssc = SelfSignedCaCertificate.create(new FakeClock()); X509Certificate cert = signKeyPair( - ssc, keyPair, SSL_HOST, DateTime.now(UTC).minusDays(2), DateTime.now(UTC).minusDays(1)); + ssc, + keyPair, + SSL_HOST, + Instant.now().minus(2, ChronoUnit.DAYS), + Instant.now().minus(1, ChronoUnit.DAYS)); // Set up the server to use the signed cert and private key to perform handshake; PrivateKey privateKey = keyPair.getPrivate(); @@ -280,7 +284,11 @@ class SslClientInitializerTest { SelfSignedCaCertificate ssc = SelfSignedCaCertificate.create(new FakeClock()); X509Certificate cert = signKeyPair( - ssc, keyPair, SSL_HOST, DateTime.now(UTC).plusDays(1), DateTime.now(UTC).plusDays(2)); + ssc, + keyPair, + SSL_HOST, + Instant.now().plus(1, ChronoUnit.DAYS), + Instant.now().plus(2, ChronoUnit.DAYS)); // Set up the server to use the signed cert and private key to perform handshake; PrivateKey privateKey = keyPair.getPrivate(); diff --git a/networking/src/test/java/google/registry/networking/handler/SslInitializerTestUtils.java b/networking/src/test/java/google/registry/networking/handler/SslInitializerTestUtils.java index ce0900f41..b47997c2c 100644 --- a/networking/src/test/java/google/registry/networking/handler/SslInitializerTestUtils.java +++ b/networking/src/test/java/google/registry/networking/handler/SslInitializerTestUtils.java @@ -15,7 +15,6 @@ package google.registry.networking.handler; import static com.google.common.truth.Truth.assertThat; -import static org.joda.time.DateTimeZone.UTC; import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.base.Throwables; @@ -28,6 +27,9 @@ import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.cert.X509Certificate; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; import java.util.concurrent.ExecutionException; import javax.net.ssl.SSLSession; import org.bouncycastle.asn1.x500.X500Name; @@ -38,7 +40,6 @@ import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; -import org.joda.time.DateTime; /** * Utility class that provides methods used by {@link SslClientInitializerTest} and {@link @@ -72,7 +73,7 @@ public final class SslInitializerTestUtils { * @return signed public key (of the key pair) certificate */ public static X509Certificate signKeyPair( - SelfSignedCaCertificate ssc, KeyPair keyPair, String hostname, DateTime from, DateTime to) + SelfSignedCaCertificate ssc, KeyPair keyPair, String hostname, Instant from, Instant to) throws Exception { X500Name subjectDnName = new X500Name("CN=" + hostname); BigInteger serialNumber = BigInteger.valueOf(System.currentTimeMillis()); @@ -82,8 +83,8 @@ public final class SslInitializerTestUtils { new JcaX509v3CertificateBuilder( issuerDnName, serialNumber, - from.toDate(), - to.toDate(), + Date.from(from), + Date.from(to), subjectDnName, keyPair.getPublic()); @@ -102,7 +103,11 @@ public final class SslInitializerTestUtils { public static X509Certificate signKeyPair( SelfSignedCaCertificate ssc, KeyPair keyPair, String hostname) throws Exception { return signKeyPair( - ssc, keyPair, hostname, DateTime.now(UTC).minusDays(1), DateTime.now(UTC).plusDays(1)); + ssc, + keyPair, + hostname, + Instant.now().minus(1, ChronoUnit.DAYS), + Instant.now().plus(1, ChronoUnit.DAYS)); } /** diff --git a/prober/build.gradle b/prober/build.gradle index dee2c2d91..fad945b40 100644 --- a/prober/build.gradle +++ b/prober/build.gradle @@ -33,7 +33,6 @@ dependencies { implementation deps['io.netty:netty-handler'] implementation deps['io.netty:netty-transport'] implementation deps['jakarta.inject:jakarta.inject-api'] - implementation deps['joda-time:joda-time'] implementation deps['org.bouncycastle:bcpkix-jdk18on'] implementation deps['org.bouncycastle:bcprov-jdk18on'] implementation deps['xerces:xmlParserAPIs'] diff --git a/prober/gradle.lockfile b/prober/gradle.lockfile index 9aed16825..9da461335 100644 --- a/prober/gradle.lockfile +++ b/prober/gradle.lockfile @@ -113,7 +113,6 @@ jakarta.mail:jakarta.mail-api:2.2.0-M1=deploy_jar,runtimeClasspath,testRuntimeCl jakarta.xml.bind:jakarta.xml.bind-api:4.1.0-M1=deploy_jar,runtimeClasspath,testRuntimeClasspath javax.annotation:javax.annotation-api:1.3.2=deploy_jar,runtimeClasspath,testRuntimeClasspath javax.inject:javax.inject:1=annotationProcessor,compileClasspath,deploy_jar,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath -joda-time:joda-time:2.14.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy-agent:1.17.7=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testRuntimeClasspath diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/ProberModule.java b/prober/src/main/java/google/registry/monitoring/blackbox/ProberModule.java index ab389fe01..b3e1ceba1 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/ProberModule.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/ProberModule.java @@ -31,8 +31,8 @@ import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.ssl.OpenSsl; import io.netty.handler.ssl.SslProvider; import jakarta.inject.Singleton; +import java.time.Duration; import java.util.Set; -import org.joda.time.Duration; /** * Dagger main module, which {@link Provides} all objects that are shared between sequences and @@ -43,7 +43,7 @@ import org.joda.time.Duration; public class ProberModule { /** Default {@link Duration} chosen to be time between each {@link ProbingAction} call. */ - private static final Duration DEFAULT_PROBER_INTERVAL = Duration.standardSeconds(4); + private static final Duration DEFAULT_PROBER_INTERVAL = Duration.ofSeconds(4); /** {@link Provides} the {@link SslProvider} used by instances of {@link SslClientInitializer} */ @Provides diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/ProbingSequence.java b/prober/src/main/java/google/registry/monitoring/blackbox/ProbingSequence.java index bb7b7f6e9..fde979c8c 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/ProbingSequence.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/ProbingSequence.java @@ -111,7 +111,7 @@ public class ProbingSequence extends CircularList { * get().generateAction}. */ private void runStep(Token token) { - long start = clock.now().toEpochMilli(); + long start = clock.nowMillis(); ProbingAction currentAction; ChannelFuture future; @@ -133,7 +133,7 @@ public class ProbingSequence extends CircularList { get().messageTemplate().name(), get().messageTemplate().responseName(), MetricsCollector.ResponseType.ERROR, - clock.now().toEpochMilli() - start); + clock.nowMillis() - start); return; } catch (Exception e) { @@ -146,7 +146,7 @@ public class ProbingSequence extends CircularList { get().messageTemplate().name(), get().messageTemplate().responseName(), MetricsCollector.ResponseType.ERROR, - clock.now().toEpochMilli() - start); + clock.nowMillis() - start); // Restart the sequence at the very first step. restartSequence(); @@ -165,7 +165,7 @@ public class ProbingSequence extends CircularList { get().messageTemplate().name(), get().messageTemplate().responseName(), MetricsCollector.ResponseType.SUCCESS, - clock.now().toEpochMilli() - start); + clock.nowMillis() - start); } else { // On a failed result, we log the failure and note either a failure or error. logger.atSevere().withCause(f.cause()).log("Did not result in future success"); @@ -177,14 +177,14 @@ public class ProbingSequence extends CircularList { get().messageTemplate().name(), get().messageTemplate().responseName(), MetricsCollector.ResponseType.FAILURE, - clock.now().toEpochMilli() - start); + clock.nowMillis() - start); } else { metrics.recordResult( get().protocol().name(), get().messageTemplate().name(), get().messageTemplate().responseName(), MetricsCollector.ResponseType.ERROR, - clock.now().toEpochMilli() - start); + clock.nowMillis() - start); } // If not unrecoverable, we restart the sequence. diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/ProbingStep.java b/prober/src/main/java/google/registry/monitoring/blackbox/ProbingStep.java index 9464cd5a7..550feb679 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/ProbingStep.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/ProbingStep.java @@ -22,7 +22,7 @@ import google.registry.monitoring.blackbox.exception.UndeterminedStateException; import google.registry.monitoring.blackbox.message.OutboundMessageType; import google.registry.monitoring.blackbox.token.Token; import io.netty.bootstrap.Bootstrap; -import org.joda.time.Duration; +import java.time.Duration; /** * {@link AutoValue} class that represents generator of actions performed at each step in {@link @@ -75,9 +75,9 @@ public record ProbingStep( public String toString() { return String.format( """ - ProbingStep with Protocol: %s - OutboundMessage: %s - """, + ProbingStep with Protocol: %s + OutboundMessage: %s + """, protocol(), messageTemplate().getClass().getName()); } diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/connection/ProbingAction.java b/prober/src/main/java/google/registry/monitoring/blackbox/connection/ProbingAction.java index ef7be4583..a1e99697d 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/connection/ProbingAction.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/connection/ProbingAction.java @@ -40,9 +40,9 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; +import java.time.Duration; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; -import org.joda.time.Duration; /** * AutoValue class that represents action generated by {@link ProbingStep} @@ -186,7 +186,7 @@ public abstract class ProbingAction implements Callable { } }); }, - delay().getStandardSeconds(), + delay().toSeconds(), TimeUnit.SECONDS); } else { // if we receive a failure, log the failure, and close the channel @@ -208,7 +208,7 @@ public abstract class ProbingAction implements Callable { protocol: %s host: %s """, - delay().getStandardSeconds(), outboundMessage(), protocol(), host()); + delay().toSeconds(), outboundMessage(), protocol(), host()); } /** {@link AutoValue.Builder} that does work of creating connection when not already present. */ diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/module/CertificateModule.java b/prober/src/main/java/google/registry/monitoring/blackbox/module/CertificateModule.java index 2335c63f9..6184d7306 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/module/CertificateModule.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/module/CertificateModule.java @@ -30,9 +30,9 @@ import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.X509Certificate; +import java.time.Duration; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import org.joda.time.Duration; /** * Dagger module that provides bindings needed to inject server certificate chain and private key. @@ -63,7 +63,7 @@ public class CertificateModule { @Provides @LocalSecrets static Duration provideCacheDuration() { - return Duration.standardSeconds(2); + return Duration.ofSeconds(2); } @Singleton @@ -111,8 +111,7 @@ public class CertificateModule { @LocalSecrets static Supplier providePrivatekeySupplier( @LocalSecrets Provider privateKeyProvider, @LocalSecrets Duration duration) { - return memoizeWithExpiration( - privateKeyProvider::get, duration.getStandardSeconds(), TimeUnit.SECONDS); + return memoizeWithExpiration(privateKeyProvider::get, duration.toSeconds(), TimeUnit.SECONDS); } @Singleton @@ -121,7 +120,6 @@ public class CertificateModule { static Supplier> provideCertificatesSupplier( @LocalSecrets Provider> certificatesProvider, @LocalSecrets Duration duration) { - return memoizeWithExpiration( - certificatesProvider::get, duration.getStandardSeconds(), TimeUnit.SECONDS); + return memoizeWithExpiration(certificatesProvider::get, duration.toSeconds(), TimeUnit.SECONDS); } } diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/module/EppModule.java b/prober/src/main/java/google/registry/monitoring/blackbox/module/EppModule.java index 933c283ae..fb6d650d8 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/module/EppModule.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/module/EppModule.java @@ -52,8 +52,8 @@ import jakarta.inject.Qualifier; import jakarta.inject.Singleton; import java.security.PrivateKey; import java.security.cert.X509Certificate; +import java.time.Duration; import java.util.function.Supplier; -import org.joda.time.Duration; /** * A module that provides the components necessary for and the overall {@link ProbingSequence} to diff --git a/prober/src/main/java/google/registry/monitoring/blackbox/token/EppToken.java b/prober/src/main/java/google/registry/monitoring/blackbox/token/EppToken.java index 65ad32b16..d50acb83f 100644 --- a/prober/src/main/java/google/registry/monitoring/blackbox/token/EppToken.java +++ b/prober/src/main/java/google/registry/monitoring/blackbox/token/EppToken.java @@ -81,8 +81,7 @@ public abstract class EppToken extends Token { */ private String getNewTRID() { return String.format( - "prober-%s-%d-%d", - "localhost", clock.now().toEpochMilli(), clientIdSuffix.incrementAndGet()); + "prober-%s-%d-%d", "localhost", clock.nowMillis(), clientIdSuffix.incrementAndGet()); } /** Return a fully qualified domain label to use, derived from the client transaction ID. */ diff --git a/prober/src/test/java/google/registry/monitoring/blackbox/ProbingSequenceTest.java b/prober/src/test/java/google/registry/monitoring/blackbox/ProbingSequenceTest.java index 183f59f87..670cb6d2b 100644 --- a/prober/src/test/java/google/registry/monitoring/blackbox/ProbingSequenceTest.java +++ b/prober/src/test/java/google/registry/monitoring/blackbox/ProbingSequenceTest.java @@ -36,7 +36,7 @@ import google.registry.util.Clock; import io.netty.channel.Channel; import io.netty.channel.ChannelPromise; import io.netty.channel.embedded.EmbeddedChannel; -import org.joda.time.Duration; +import java.time.Duration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -60,7 +60,7 @@ class ProbingSequenceTest { private static final String PROTOCOL_NAME = "PROTOCOL"; private static final String MESSAGE_NAME = "MESSAGE"; private static final String RESPONSE_NAME = "RESPONSE"; - private static final Duration LATENCY = Duration.millis(2L); + private static final Duration LATENCY = Duration.ofMillis(2L); /** Default mock {@link ProbingAction} returned when generating an action with a mockStep. */ private ProbingAction mockAction = Mockito.mock(ProbingAction.class); @@ -223,7 +223,7 @@ class ProbingSequenceTest { // name and message name). verify(metrics) .recordResult( - PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.SUCCESS, LATENCY.getMillis()); + PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.SUCCESS, LATENCY.toMillis()); } @Test @@ -305,7 +305,7 @@ class ProbingSequenceTest { // name and message name) two times: once for mockStep and once for secondStep. verify(metrics, times(2)) .recordResult( - PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.SUCCESS, LATENCY.getMillis()); + PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.SUCCESS, LATENCY.toMillis()); // Verify that on second pass, since we purposely throw UnrecoverableStateException, we // record the ERROR. Also, we haven't had any time pass in the fake clock, so recorded @@ -390,13 +390,13 @@ class ProbingSequenceTest { // name and message name). verify(metrics) .recordResult( - PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.FAILURE, LATENCY.getMillis()); + PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.FAILURE, LATENCY.toMillis()); // Verify that on second pass, since we purposely throw UnrecoverableStateException, we // record the ERROR. We also should make sure LATENCY seconds have passed. verify(metrics) .recordResult( - PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.ERROR, LATENCY.getMillis()); + PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.ERROR, LATENCY.toMillis()); } @Test @@ -421,6 +421,6 @@ class ProbingSequenceTest { // for terminating the sequence. verify(metrics, times(2)) .recordResult( - PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.ERROR, LATENCY.getMillis()); + PROTOCOL_NAME, MESSAGE_NAME, RESPONSE_NAME, ResponseType.ERROR, LATENCY.toMillis()); } } diff --git a/prober/src/test/java/google/registry/monitoring/blackbox/ProbingStepTest.java b/prober/src/test/java/google/registry/monitoring/blackbox/ProbingStepTest.java index c27b073d1..ff15cae77 100644 --- a/prober/src/test/java/google/registry/monitoring/blackbox/ProbingStepTest.java +++ b/prober/src/test/java/google/registry/monitoring/blackbox/ProbingStepTest.java @@ -39,7 +39,7 @@ import io.netty.channel.embedded.EmbeddedChannel; import io.netty.channel.local.LocalAddress; import io.netty.channel.local.LocalChannel; import io.netty.channel.nio.NioEventLoopGroup; -import org.joda.time.Duration; +import java.time.Duration; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.Mockito; diff --git a/prober/src/test/java/google/registry/monitoring/blackbox/connection/ProbingActionTest.java b/prober/src/test/java/google/registry/monitoring/blackbox/connection/ProbingActionTest.java index acf882506..ed91bca7e 100644 --- a/prober/src/test/java/google/registry/monitoring/blackbox/connection/ProbingActionTest.java +++ b/prober/src/test/java/google/registry/monitoring/blackbox/connection/ProbingActionTest.java @@ -33,7 +33,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.channel.local.LocalAddress; import io.netty.channel.local.LocalChannel; -import org.joda.time.Duration; +import java.time.Duration; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; diff --git a/proxy/build.gradle b/proxy/build.gradle index 3bddd072d..4dd2db9ef 100644 --- a/proxy/build.gradle +++ b/proxy/build.gradle @@ -60,7 +60,6 @@ dependencies { implementation deps['io.netty:netty-handler'] implementation deps['io.netty:netty-transport'] implementation deps['jakarta.inject:jakarta.inject-api'] - implementation deps['joda-time:joda-time'] implementation deps['org.bouncycastle:bcpkix-jdk18on'] implementation deps['org.bouncycastle:bcprov-jdk18on'] implementation project(':common') diff --git a/proxy/gradle.lockfile b/proxy/gradle.lockfile index 23f135918..ade45080c 100644 --- a/proxy/gradle.lockfile +++ b/proxy/gradle.lockfile @@ -144,7 +144,6 @@ jakarta.mail:jakarta.mail-api:2.2.0-M1=deploy_jar,runtimeClasspath,testRuntimeCl jakarta.xml.bind:jakarta.xml.bind-api:4.1.0-M1=deploy_jar,runtimeClasspath,testRuntimeClasspath javax.annotation:javax.annotation-api:1.3.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath javax.inject:javax.inject:1=annotationProcessor,compileClasspath,deploy_jar,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath -joda-time:joda-time:2.14.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy-agent:1.17.7=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testRuntimeClasspath diff --git a/proxy/src/main/java/google/registry/proxy/ProxyModule.java b/proxy/src/main/java/google/registry/proxy/ProxyModule.java index b11730138..10fdd6166 100644 --- a/proxy/src/main/java/google/registry/proxy/ProxyModule.java +++ b/proxy/src/main/java/google/registry/proxy/ProxyModule.java @@ -14,7 +14,6 @@ package google.registry.proxy; - import static com.google.common.base.Preconditions.checkArgument; import static google.registry.proxy.ProxyConfig.getProxyConfig; diff --git a/release/schema-verifier/verify_deployed_sql_schema.sh b/release/schema-verifier/verify_deployed_sql_schema.sh index b4e105565..e2b19b815 100755 --- a/release/schema-verifier/verify_deployed_sql_schema.sh +++ b/release/schema-verifier/verify_deployed_sql_schema.sh @@ -76,7 +76,6 @@ else echo "Schema dumped." fi - raw_diff=$(diff /schema/nomulus.golden.sql /schema/nomulus.actual.sql) # Clean up the raw_diff: # - Remove diff locations (e.g. "5,6c5,6): grep "^[<>]" diff --git a/util/build.gradle b/util/build.gradle index c5fee186c..35bb4dd46 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -37,7 +37,6 @@ dependencies { implementation deps['jakarta.mail:jakarta.mail-api'] implementation deps['jakarta.inject:jakarta.inject-api'] implementation deps['jakarta.xml.bind:jakarta.xml.bind-api'] - implementation deps['joda-time:joda-time'] implementation deps['org.bouncycastle:bcpkix-jdk18on'] implementation deps['org.bouncycastle:bcprov-jdk18on'] implementation deps['org.checkerframework:checker-compat-qual'] diff --git a/util/gradle.lockfile b/util/gradle.lockfile index c03b37460..b5e0142c9 100644 --- a/util/gradle.lockfile +++ b/util/gradle.lockfile @@ -100,7 +100,6 @@ jakarta.mail:jakarta.mail-api:2.2.0-M1=compileClasspath,deploy_jar,runtimeClassp jakarta.xml.bind:jakarta.xml.bind-api:4.1.0-M1=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath javax.annotation:javax.annotation-api:1.3.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath javax.inject:javax.inject:1=annotationProcessor,compileClasspath,deploy_jar,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath -joda-time:joda-time:2.14.2=compileClasspath,deploy_jar,runtimeClasspath,testCompileClasspath,testRuntimeClasspath junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy-agent:1.17.7=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testRuntimeClasspath diff --git a/util/src/main/java/google/registry/util/DateTimeTypeAdapter.java b/util/src/main/java/google/registry/util/DateTimeTypeAdapter.java deleted file mode 100644 index b3025a2bd..000000000 --- a/util/src/main/java/google/registry/util/DateTimeTypeAdapter.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2023 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.util; - -import java.io.IOException; -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; - -/** GSON type adapter for Joda {@link DateTime} objects. */ -public class DateTimeTypeAdapter extends StringBaseTypeAdapter { - - @Override - protected DateTime fromString(String stringValue) throws IOException { - return ISODateTimeFormat.dateTime().withZoneUTC().parseDateTime(stringValue); - } -} diff --git a/util/src/main/java/google/registry/util/DurationTypeAdapter.java b/util/src/main/java/google/registry/util/DurationTypeAdapter.java index 0d4c0c401..03b00f9d0 100644 --- a/util/src/main/java/google/registry/util/DurationTypeAdapter.java +++ b/util/src/main/java/google/registry/util/DurationTypeAdapter.java @@ -17,7 +17,7 @@ package google.registry.util; import java.io.IOException; import java.time.Duration; -/** GSON type adapter for {@link java.time.Duration} objects. */ +/** GSON type adapter for {@link Duration} objects. */ public class DurationTypeAdapter extends StringBaseTypeAdapter { @Override diff --git a/util/src/main/java/google/registry/util/PosixTarHeader.java b/util/src/main/java/google/registry/util/PosixTarHeader.java index 5c68086c2..0d1929d72 100644 --- a/util/src/main/java/google/registry/util/PosixTarHeader.java +++ b/util/src/main/java/google/registry/util/PosixTarHeader.java @@ -19,13 +19,11 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Strings.isNullOrEmpty; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.joda.time.DateTimeConstants.MILLIS_PER_SECOND; -import static org.joda.time.DateTimeZone.UTC; +import java.time.Instant; import java.util.Arrays; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import org.joda.time.DateTime; /** * POSIX Tar Header. @@ -171,10 +169,14 @@ public final class PosixTarHeader { return Integer.parseInt(extractField(124, 12).trim(), 8); } - /** Returns the modified time as a UTC {@link DateTime} object. */ + /** Returns the modified time as a UTC {@link Instant} object. */ @SuppressWarnings("JodaDateTimeConstants") - public DateTime getMtime() { - return new DateTime(Long.parseLong(extractField(136, 12).trim(), 8) * MILLIS_PER_SECOND, UTC); + public Instant getMtime() { + try { + return Instant.ofEpochMilli(Long.parseLong(extractField(136, 12).trim(), 8) * 1000L); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(e); + } } /** Returns the checksum value stored in the . */ @@ -411,13 +413,13 @@ public final class PosixTarHeader { * constructed. * *

The modified time is always stored as a UNIX timestamp which is seconds since the UNIX - * epoch in UTC time. Because {@link DateTime} has millisecond precision, it gets rounded down + * epoch in UTC time. Because {@link Instant} has millisecond precision, it gets rounded down * (floor) to the second. */ @SuppressWarnings("JodaDateTimeConstants") - public Builder setMtime(DateTime mtime) { + public Builder setMtime(Instant mtime) { checkNotNull(mtime, "mtime"); - setField("mtime", 136, 12, String.format("%011o", mtime.getMillis() / MILLIS_PER_SECOND)); + setField("mtime", 136, 12, String.format("%011o", mtime.getEpochSecond())); hasMtime = true; return this; } diff --git a/util/src/main/java/google/registry/util/RegistrarUtils.java b/util/src/main/java/google/registry/util/RegistrarUtils.java index 1600e7078..97b9fec56 100644 --- a/util/src/main/java/google/registry/util/RegistrarUtils.java +++ b/util/src/main/java/google/registry/util/RegistrarUtils.java @@ -14,7 +14,6 @@ package google.registry.util; - import com.google.common.base.Ascii; import com.google.common.base.CharMatcher; diff --git a/util/src/main/java/google/registry/util/SafeObjectInputStream.java b/util/src/main/java/google/registry/util/SafeObjectInputStream.java index d07a68803..f68b688e7 100644 --- a/util/src/main/java/google/registry/util/SafeObjectInputStream.java +++ b/util/src/main/java/google/registry/util/SafeObjectInputStream.java @@ -43,8 +43,8 @@ import java.util.Map; * including third-party dependencies. (As a side note, this class does not use allow lists * for Nomulus or third-party classes because it is infeasible in practice. Super classes of * the instance being deserialized must be resolved, and therefore must be on the allow list; - * same for the field types of the instance. The allow list for the Joda {@code DateTime} - * class alone would have more than 10 classes. Generated classes, e.g., by AutoValue, present + * same for the field types of the instance. The allow list for the Joda {@code Instant} class + * alone would have more than 10 classes. Generated classes, e.g., by AutoValue, present * another problem: their real names are not meant to be a concern to the user). *

  • CPU-targeting denial-of-service attacks. Containers and arrays may be used to construct * object graphs that require enormous amount of computation during deserialization and/or diff --git a/util/src/main/java/google/registry/util/YamlUtils.java b/util/src/main/java/google/registry/util/YamlUtils.java index d0756ee09..f52744e39 100644 --- a/util/src/main/java/google/registry/util/YamlUtils.java +++ b/util/src/main/java/google/registry/util/YamlUtils.java @@ -14,7 +14,6 @@ package google.registry.util; - import com.google.common.flogger.FluentLogger; import java.util.Map; import java.util.Optional; diff --git a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java index ac3360031..2f34f20bf 100644 --- a/util/src/test/java/google/registry/util/DateTimeUtilsTest.java +++ b/util/src/test/java/google/registry/util/DateTimeUtilsTest.java @@ -28,22 +28,17 @@ import static google.registry.util.DateTimeUtils.minusMinutes; import static google.registry.util.DateTimeUtils.minusMonths; import static google.registry.util.DateTimeUtils.minusWeeks; import static google.registry.util.DateTimeUtils.minusYears; -import static google.registry.util.DateTimeUtils.parseInstant; import static google.registry.util.DateTimeUtils.plusDays; import static google.registry.util.DateTimeUtils.plusHours; import static google.registry.util.DateTimeUtils.plusMinutes; import static google.registry.util.DateTimeUtils.plusMonths; import static google.registry.util.DateTimeUtils.plusWeeks; import static google.registry.util.DateTimeUtils.plusYears; -import static google.registry.util.DateTimeUtils.toDateTime; -import static google.registry.util.DateTimeUtils.toInstant; -import static google.registry.util.DateTimeUtils.toJodaInstant; import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.collect.ImmutableList; import java.time.Instant; import java.time.temporal.ChronoUnit; -import org.joda.time.DateTime; import org.junit.jupiter.api.Test; /** Unit tests for {@link DateTimeUtils}. */ @@ -79,18 +74,6 @@ class DateTimeUtilsTest { assertThat(isAtOrAfter(START_INSTANT.plus(1, ChronoUnit.DAYS), START_INSTANT)).isTrue(); } - @Test - void testSuccess_plusYears() { - Instant startDate = Instant.parse("2012-02-29T00:00:00Z"); - assertThat(plusYears(startDate, 4)).isEqualTo(Instant.parse("2016-02-28T00:00:00Z")); - } - - @Test - void testSuccess_minusYears() { - Instant startDate = Instant.parse("2012-02-29T00:00:00Z"); - assertThat(minusYears(startDate, 4)).isEqualTo(Instant.parse("2008-02-28T00:00:00Z")); - } - @Test void test_plusMonths_worksWithInstants() { Instant startDate = Instant.parse("2012-02-29T00:00:00Z"); @@ -109,10 +92,23 @@ class DateTimeUtilsTest { assertThat(minusMonths(startLeapYear, 1)).isEqualTo(Instant.parse("2012-02-29T00:00:00Z")); } + @Test + void testSuccess_plusYears() { + Instant startDate = Instant.parse("2012-02-29T00:00:00Z"); + assertThat(plusYears(startDate, 4)).isEqualTo(Instant.parse("2016-02-28T00:00:00Z")); + } + + @Test + void testSuccess_minusYears() { + Instant startDate = Instant.parse("2012-02-29T00:00:00Z"); + assertThat(minusYears(startDate, 4)).isEqualTo(Instant.parse("2008-02-28T00:00:00Z")); + } + @Test void testSuccess_minusYears_zeroYears() { - DateTime leapDay = DateTime.parse("2012-02-29T00:00:00Z"); - assertThat(leapDay.minusYears(0)).isEqualTo(leapDay); + Instant leapDay = Instant.parse("2012-02-29T00:00:00Z"); + assertThat(minusYears(leapDay, 0)).isEqualTo(leapDay); + assertThat(plusYears(leapDay, 0)).isEqualTo(leapDay); } @Test @@ -136,6 +132,7 @@ class DateTimeUtilsTest { @Test void test_plusMinusWeeksDaysHoursMinutes() { Instant time = Instant.parse("2024-03-27T10:15:30.000Z"); + assertThat(plusWeeks(time, 2)).isEqualTo(Instant.parse("2024-04-10T10:15:30.000Z")); assertThat(minusWeeks(time, 2)).isEqualTo(Instant.parse("2024-03-13T10:15:30.000Z")); @@ -149,17 +146,4 @@ class DateTimeUtilsTest { assertThat(minusMinutes(time, 2)).isEqualTo(Instant.parse("2024-03-27T10:13:30.000Z")); } - @Test - void test_instantConversionMethods_workCorrectly() { - assertThat(toDateTime(Instant.parse("2024-03-27T10:15:30.105Z"))) - .isEqualTo(DateTime.parse("2024-03-27T10:15:30.105Z")); - assertThat(toInstant(DateTime.parse("2024-03-27T10:15:30.105Z"))) - .isEqualTo(Instant.parse("2024-03-27T10:15:30.105Z")); - assertThat(toJodaInstant(Instant.parse("2024-03-27T10:15:30.105Z"))) - .isEqualTo(org.joda.time.Instant.parse("2024-03-27T10:15:30.105Z")); - assertThat(parseInstant("2024-03-27T10:15:30.105Z")) - .isEqualTo(Instant.parse("2024-03-27T10:15:30.105Z")); - assertThat(parseInstant("2024-03-27T10:15:30Z")) - .isEqualTo(Instant.parse("2024-03-27T10:15:30Z")); - } } diff --git a/util/src/test/java/google/registry/util/PosixTarHeaderTest.java b/util/src/test/java/google/registry/util/PosixTarHeaderTest.java index f9e10ec6c..8a3e64e07 100644 --- a/util/src/test/java/google/registry/util/PosixTarHeaderTest.java +++ b/util/src/test/java/google/registry/util/PosixTarHeaderTest.java @@ -18,17 +18,15 @@ import static com.google.common.io.BaseEncoding.base64; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.joda.time.DateTimeZone.UTC; import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.testing.EqualsTester; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; +import java.time.Instant; import java.util.Arrays; import java.util.zip.GZIPInputStream; -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; import org.junit.jupiter.api.Test; /** Unit tests for {@link PosixTarHeader}. */ @@ -76,7 +74,7 @@ class PosixTarHeaderTest { .setMode(0640) // This timestamp should have been midnight but I think GNU tar might not understand // daylight savings time. Woe is me. - .setMtime(DateTime.parse("2013-08-13T01:50:12Z")) + .setMtime(Instant.parse("2013-08-13T01:50:12Z")) .setUname("jart") .setGname("eng") .setUid(180918) // echo $UID @@ -125,7 +123,7 @@ class PosixTarHeaderTest { .setName("(◕‿◕).txt") .setSize(666) .setMode(0777) - .setMtime(DateTime.parse("1984-12-18T04:20:00Z")) + .setMtime(Instant.parse("1984-12-18T04:20:00Z")) .setUname("everything i ever touched") .setGname("everything i ever had, has died") .setUid(180918) @@ -139,7 +137,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("everything i ever had, has died"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(5000); - assertThat(header.getMtime()).isEqualTo(DateTime.parse("1984-12-18T04:20:00Z")); + assertThat(header.getMtime()).isEqualTo(Instant.parse("1984-12-18T04:20:00Z")); assertThat(header.getMagic()).isEqualTo("ustar"); assertThat(header.getVersion()).isEqualTo("00"); } @@ -152,7 +150,7 @@ class PosixTarHeaderTest { .setName("Black lung full of fumes, choke on memories") .setSize(1024 * 1024 * 1024) .setMode(31337) - .setMtime(DateTime.parse("2020-12-18T04:20:00Z")) + .setMtime(Instant.parse("2020-12-18T04:20:00Z")) .setUname("every street i ever walked") .setGname("every home i ever had, is lost") .setUid(0) @@ -166,7 +164,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("every home i ever had, is lost"); assertThat(header.getUid()).isEqualTo(0); assertThat(header.getGid()).isEqualTo(31337); - assertThat(header.getMtime()).isEqualTo(DateTime.parse("2020-12-18T04:20:00Z")); + assertThat(header.getMtime()).isEqualTo(Instant.parse("2020-12-18T04:20:00Z")); } @Test @@ -177,7 +175,7 @@ class PosixTarHeaderTest { .setName("(◕‿◕).txt") .setSize(31337) .setMode(0777) - .setMtime(DateTime.parse("1984-12-18T04:20:00Z")) + .setMtime(Instant.parse("1984-12-18T04:20:00Z")) .setUname("everything i ever touched") .setGname("everything i ever had, has died") .setUid(180918) @@ -192,7 +190,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("everything i ever had, has died"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(5000); - assertThat(header.getMtime()).isEqualTo(DateTime.parse("1984-12-18T04:20:00Z")); + assertThat(header.getMtime()).isEqualTo(Instant.parse("1984-12-18T04:20:00Z")); assertThat(header.getMagic()).isEqualTo("ustar"); assertThat(header.getVersion()).isEqualTo("00"); } @@ -203,7 +201,7 @@ class PosixTarHeaderTest { new PosixTarHeader.Builder() .setName("(◕‿◕).txt") .setSize(31337) - .setMtime(DateTime.now(UTC)) + .setMtime(Instant.now()) .build(); byte[] bytes = header.getBytes(); bytes[150] = '0'; @@ -220,7 +218,7 @@ class PosixTarHeaderTest { new PosixTarHeader.Builder() .setName("(◕‿◕).txt") .setSize(123) - .setMtime(DateTime.parse("1984-12-18TZ")) + .setMtime(Instant.parse("1984-12-18T00:00:00Z")) .setUid(1234) .setGid(456) .setUname("jart") @@ -229,7 +227,7 @@ class PosixTarHeaderTest { new PosixTarHeader.Builder() .setName("(◕‿◕).txt") .setSize(123) - .setMtime(DateTime.parse("1984-12-18TZ")) + .setMtime(Instant.parse("1984-12-18T00:00:00Z")) .setUid(1234) .setGid(456) .setUname("jart") @@ -239,7 +237,7 @@ class PosixTarHeaderTest { new PosixTarHeader.Builder() .setName("(•︵•).txt") // Awwwww! It looks so sad... .setSize(123) - .setMtime(DateTime.now(UTC)) + .setMtime(Instant.now()) .build()) .testEquals(); } @@ -277,7 +275,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("wheel"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(0); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, likeTears.length(), UTF_8)).isEqualTo(likeTears); @@ -291,7 +289,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("wheel"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(0); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, inRain.length(), UTF_8)).isEqualTo(inRain); @@ -335,7 +333,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("wheel"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(0); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, likeTears.length(), UTF_8)).isEqualTo(likeTears); @@ -349,7 +347,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("wheel"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(0); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, inRain.length(), UTF_8)).isEqualTo(inRain); @@ -393,7 +391,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("eng"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(5000); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, likeTears.length(), UTF_8)).isEqualTo(likeTears); @@ -407,7 +405,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("eng"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(5000); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, inRain.length(), UTF_8)).isEqualTo(inRain); @@ -452,7 +450,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("eng"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(5000); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, likeTears.length(), UTF_8)).isEqualTo(likeTears); @@ -467,7 +465,7 @@ class PosixTarHeaderTest { assertThat(header.getGname()).isEqualTo("eng"); assertThat(header.getUid()).isEqualTo(180918); assertThat(header.getGid()).isEqualTo(5000); - assertThat(header.getMtime().toString(ISODateTimeFormat.date())).isEqualTo("2013-08-16"); + assertThat(header.getMtime().toString().substring(0, 10)).isEqualTo("2013-08-16"); assertThat(input.read(block)).isEqualTo(512); assertThat(new String(block, 0, inRain.length(), UTF_8)).isEqualTo(inRain); diff --git a/util/src/test/java/google/registry/util/SafeObjectInputStreamTest.java b/util/src/test/java/google/registry/util/SafeObjectInputStreamTest.java index 1e844fee6..8c550a792 100644 --- a/util/src/test/java/google/registry/util/SafeObjectInputStreamTest.java +++ b/util/src/test/java/google/registry/util/SafeObjectInputStreamTest.java @@ -24,9 +24,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import java.io.ByteArrayInputStream; import java.io.Serializable; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; -import org.joda.time.Duration; import org.junit.jupiter.api.Test; /** Unit tests for {@link SafeObjectInputStream}. */ @@ -72,7 +72,7 @@ public class SafeObjectInputStreamTest { @Test void nonJavaNonNomulusUnitaryFailure() throws Exception { - Serializable orig = Duration.millis(1); + Serializable orig = Duration.ofMillis(1); try (SafeObjectInputStream sois = new SafeObjectInputStream(new ByteArrayInputStream(serialize(orig)))) { assertThrows(ClassNotFoundException.class, () -> sois.readObject());