Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Timestamp.of(java.util.Date) fails for pre-epoch dates not truncated to seconds #3429

@matjazs

Description

@matjazs

com.google.cloud.Timestamp.of(Date) fails with IllegalArgumentException if the given date is before epoch and not truncated to seconds, in the concrete example, one millisecond before epoch was used.

google-cloud-core version: 1.35.0

Stacktrace fragment:

java.lang.IllegalArgumentException: timestamp out of range: 0, -1000000

	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:356)
	at com.google.cloud.Timestamp.ofTimeMicroseconds(Timestamp.java:84)
	at com.google.cloud.Timestamp.of(Timestamp.java:95)

Unit test (the variant with seconds and nanos succeeds, the variant with Date fails for the same instant in time):

package com.outfit7.gcloud;

import java.time.Instant;
import java.util.Date;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import com.google.cloud.Timestamp;

class TimestampTest {

   private static final long EPOCH_MILLIS = 0L;
   private static final long EPOCH_MILLIS_MINUS_ONE = EPOCH_MILLIS - 1;

   @Test
   void ofTimeSecondsAndNanos_preEpoch() {

       // given (one second backwards, 999 millis forward, effectively one millisecond before epoch)
       long seconds = -1;
       int nanos = 999 * 1000000;

       // when
       Timestamp timestamp = Timestamp.ofTimeSecondsAndNanos(seconds, nanos);

       // then
       Assertions.assertThat(timestamp.toDate().getTime()).isEqualTo(EPOCH_MILLIS_MINUS_ONE);
   }

   @Test
   void ofJavaUtilDate_preEpoch() {

       // given
       Date epochMinusMillisecond = Date.from(Instant.ofEpochMilli(EPOCH_MILLIS_MINUS_ONE));

       // when
       Timestamp timestamp = Timestamp.of(epochMinusMillisecond);

       // then
       Assertions.assertThat(timestamp.toDate().getTime()).isEqualTo(EPOCH_MILLIS_MINUS_ONE);
   }
}

Metadata

Metadata

Assignees

Labels

api: corepriority: p2Moderately-important priority. Fix may not be included in next release.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions