@Override public boolean equals(Object obj) { return obj instanceof HybridTimestamp && compareTo((HybridTimestamp) obj) == 0; }
@Test @SneakyThrows public void layout() { Layout<HybridTimestamp> layout = Layout.forClass(HybridTimestamp.class); List<Property<HybridTimestamp>> properties = layout.getProperties(); assertEquals(properties.size(), 2); assertTrue(properties.stream().anyMatch(p -> p.getName().contentEquals("logicalTime"))); assertTrue(properties.stream().anyMatch(p -> p.getName().contentEquals("logicalCounter"))); HybridTimestamp timestamp = new HybridTimestamp(physicalTimeProvider); timestamp.update(); BinarySerialization serialization = BinarySerialization.getInstance(); ObjectSerializer<HybridTimestamp> serializer = serialization.getSerializer(HybridTimestamp.class); ObjectDeserializer<HybridTimestamp> deserializer = serialization.getDeserializer(HybridTimestamp.class); ByteBuffer buffer = serializer.serialize(timestamp); buffer.rewind(); HybridTimestamp timestamp1 = deserializer.deserialize(buffer); assertEquals(timestamp1.compareTo(timestamp), 0); }
@Property(trials = 1_000) public void test(long logicalTime, long logicalCounter, long logicalTime1, long logicalCounter1) { HybridTimestamp ts1 = new HybridTimestamp(logicalTime, logicalCounter); HybridTimestamp ts2 = new HybridTimestamp(logicalTime1, logicalCounter1); assertEquals(ts1.compareTo(ts2), ts1.getSerializableComparable().compareTo(ts2.getSerializableComparable())); }
@Test @SneakyThrows public void changingDescription() { HybridTimestamp timestamp = new HybridTimestamp(timeProvider); timestamp.update(); TestModel model = new TestModel(repository, UUID.randomUUID()); ChangeDescription changeDescription = new ChangeDescription(model.getId(), "Description #1"); repository.publish(changeDescription).get(); assertEquals(model.description(), "Description #1"); ChangeDescription changeBefore = ChangeDescription.builder() .id(model.getId()).description("Description #0") .timestamp(timestamp).build(); assertTrue(changeBefore.timestamp().compareTo(changeDescription.timestamp()) < 0); repository.publish(changeBefore).get(); assertEquals(model.description(), "Description #1"); // earlier change shouldn't affect the description changeDescription = new ChangeDescription(model.getId(), "Description #2"); repository.publish(changeDescription).get(); assertEquals(model.description(), "Description #2"); }
@Test @SneakyThrows public void renaming() { HybridTimestamp timestamp = new HybridTimestamp(timeProvider); timestamp.update(); TestModel model = new TestModel(repository, UUID.randomUUID()); Rename rename = new Rename(model.getId(), "Name #1"); repository.publish(rename).get(); assertEquals(model.name(), "Name #1"); Rename renameBefore = Rename.builder().id(model.getId()).name("Name #0").timestamp(timestamp).build(); assertTrue(renameBefore.timestamp().compareTo(rename.timestamp()) < 0); repository.publish(renameBefore).get(); assertEquals(model.name(), "Name #1"); // earlier change shouldn't affect the name rename = new Rename(model.getId(), "Name #2"); repository.publish(rename).get(); assertEquals(model.name(), "Name #2"); }
@Test @SneakyThrows public void serializableComparable() { IndexedCollection<EntityHandle<Car>> collection = new ConcurrentIndexedCollection<>(); NavigableIndex index = onAttribute(Car.TIMESTAMP); index.clear(noQueryOptions()); collection.addIndex(index); Car car1 = CarFactory.createCar(1); Car car2 = CarFactory.createCar(2); NTPServerTimeProvider ntpServerTimeProvider = new NTPServerTimeProvider(); ntpServerTimeProvider.startAsync().awaitRunning(); HybridTimestamp ts1 = new HybridTimestamp(ntpServerTimeProvider); HybridTimestamp ts2 = ts1.clone(); Thread.sleep(1000); ts2.update(); assertTrue(ts2.compareTo(ts1) > 0); assertTrue(ts2.getSerializableComparable().compareTo(ts1.getSerializableComparable()) > 0); car1.timestamp(ts1); car2.timestamp(ts2); collection.add(new ResolvedEntityHandle<>(car1)); collection.add(new ResolvedEntityHandle<>(car2)); try (ResultSet<EntityHandle<Car>> resultSet = collection.retrieve(greaterThan(Car.TIMESTAMP, ts1))) { assertEquals(resultSet.size(), 1); assertEquals(resultSet.uniqueResult().get().getModel(), "Taurus"); } index.clear(noQueryOptions()); ntpServerTimeProvider.stopAsync().awaitTerminated(); }