From ba08bbba1d14b12dca7f83d4bdb90cfe06929629 Mon Sep 17 00:00:00 2001 From: Dmytro Dashenkov Date: Wed, 12 Oct 2016 11:45:37 +0300 Subject: [PATCH 1/5] Add read-all tests for record storage. --- .../server/storage/RecordStorageShould.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java b/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java index 39272553426..07250ab573d 100644 --- a/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java +++ b/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java @@ -20,13 +20,24 @@ package org.spine3.server.storage; +import com.google.common.base.Supplier; import com.google.protobuf.FieldMask; import org.junit.Test; +import org.spine3.protobuf.AnyPacker; +import org.spine3.protobuf.Timestamps; +import org.spine3.test.projection.Project; +import org.spine3.test.projection.ProjectId; +import org.spine3.test.projection.Task; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.UUID; import static org.junit.Assert.assertNotNull; import static org.spine3.test.Verify.assertEmpty; +import static org.spine3.test.Verify.assertSize; /** * @author Dmytro Dashenkov @@ -46,5 +57,47 @@ public void retrieve_empty_map_if_storage_is_empty() { assertEmpty(empty); } + @Test + public void retrieve_all_records() { + final RecordStorage storage = createStorage(); + final Collection ids = fill(storage, 10, new Supplier() { + @Override + public String get() { + return UUID.randomUUID() + .toString(); + } + }); + + final Map allRecords = storage.readAll(); + assertSize(ids.size(), allRecords); + + } + + protected static List fill(RecordStorage storage, int count, Supplier idSupplier) { + final List ids = new LinkedList<>(); + + for (int i = 0; i < count; i++) { + final T genericId = idSupplier.get(); + final ProjectId id = ProjectId.newBuilder() + .setId(genericId.toString()) + .build(); + final Project project = Project.newBuilder() + .setId(id) + .setStatus(Project.Status.CREATED) + .setName(String.format("test-project-%s", i)) + .addTask(Task.getDefaultInstance()) + .build(); + final EntityStorageRecord record = EntityStorageRecord.newBuilder() + .setState(AnyPacker.pack(project)) + .setWhenModified(Timestamps.getCurrentTime()) + .setVersion(1) + .build(); + storage.write(genericId, record); + ids.add(genericId); + } + + return ids; + } + protected abstract RecordStorage createStorage(); } From 8a157f2705bd663bb980ee60911c18fe551258da Mon Sep 17 00:00:00 2001 From: Dmytro Dashenkov Date: Wed, 12 Oct 2016 12:03:45 +0300 Subject: [PATCH 2/5] Extract stand storage tests into separate class. --- .../server/storage/RecordStorageShould.java | 53 --------- .../server/storage/StandStorageShould.java | 108 ++++++++++++++++++ .../memory/InMemoryStandStorageShould.java | 37 ++++++ 3 files changed, 145 insertions(+), 53 deletions(-) create mode 100644 server/src/test/java/org/spine3/server/storage/StandStorageShould.java create mode 100644 server/src/test/java/org/spine3/server/storage/memory/InMemoryStandStorageShould.java diff --git a/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java b/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java index 07250ab573d..39272553426 100644 --- a/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java +++ b/server/src/test/java/org/spine3/server/storage/RecordStorageShould.java @@ -20,24 +20,13 @@ package org.spine3.server.storage; -import com.google.common.base.Supplier; import com.google.protobuf.FieldMask; import org.junit.Test; -import org.spine3.protobuf.AnyPacker; -import org.spine3.protobuf.Timestamps; -import org.spine3.test.projection.Project; -import org.spine3.test.projection.ProjectId; -import org.spine3.test.projection.Task; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; import java.util.Map; -import java.util.UUID; import static org.junit.Assert.assertNotNull; import static org.spine3.test.Verify.assertEmpty; -import static org.spine3.test.Verify.assertSize; /** * @author Dmytro Dashenkov @@ -57,47 +46,5 @@ public void retrieve_empty_map_if_storage_is_empty() { assertEmpty(empty); } - @Test - public void retrieve_all_records() { - final RecordStorage storage = createStorage(); - final Collection ids = fill(storage, 10, new Supplier() { - @Override - public String get() { - return UUID.randomUUID() - .toString(); - } - }); - - final Map allRecords = storage.readAll(); - assertSize(ids.size(), allRecords); - - } - - protected static List fill(RecordStorage storage, int count, Supplier idSupplier) { - final List ids = new LinkedList<>(); - - for (int i = 0; i < count; i++) { - final T genericId = idSupplier.get(); - final ProjectId id = ProjectId.newBuilder() - .setId(genericId.toString()) - .build(); - final Project project = Project.newBuilder() - .setId(id) - .setStatus(Project.Status.CREATED) - .setName(String.format("test-project-%s", i)) - .addTask(Task.getDefaultInstance()) - .build(); - final EntityStorageRecord record = EntityStorageRecord.newBuilder() - .setState(AnyPacker.pack(project)) - .setWhenModified(Timestamps.getCurrentTime()) - .setVersion(1) - .build(); - storage.write(genericId, record); - ids.add(genericId); - } - - return ids; - } - protected abstract RecordStorage createStorage(); } diff --git a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java new file mode 100644 index 00000000000..68114bee2ad --- /dev/null +++ b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java @@ -0,0 +1,108 @@ +/* + * Copyright 2016, TeamDev Ltd. All rights reserved. + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.spine3.server.storage; + +import com.google.common.base.Supplier; +import com.google.protobuf.Any; +import org.junit.Test; +import org.spine3.protobuf.AnyPacker; +import org.spine3.protobuf.Timestamps; +import org.spine3.protobuf.TypeUrl; +import org.spine3.server.stand.AggregateStateId; +import org.spine3.test.projection.Project; +import org.spine3.test.projection.ProjectId; +import org.spine3.test.projection.Task; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.spine3.test.Verify.assertContains; +import static org.spine3.test.Verify.assertSize; + +/** + * @author Dmytro Dashenkov + */ +public abstract class StandStorageShould { + + protected abstract StandStorage createStorage(); + + @Test + public void retrieve_all_records() { + final StandStorage storage = createStorage(); + final List> ids = fill(storage, 10, new Supplier>() { + @SuppressWarnings("unchecked") + @Override + public AggregateStateId get() { + final ProjectId projectId = ProjectId.newBuilder() + .setId(UUID.randomUUID() + .toString()) + .build(); + return AggregateStateId.of(projectId, TypeUrl.of(Project.class)); + } + }); + + final Map allRecords = storage.readAll(); + + checkIds(ids, allRecords.values()); + } + + protected static List> fill(StandStorage storage, + int count, + Supplier> idSupplier) { + final List> ids = new LinkedList<>(); + + for (int i = 0; i < count; i++) { + final AggregateStateId genericId = idSupplier.get(); + final ProjectId id = genericId.getAggregateId(); + final Project project = Project.newBuilder() + .setId(id) + .setStatus(Project.Status.CREATED) + .setName(String.format("test-project-%s", i)) + .addTask(Task.getDefaultInstance()) + .build(); + final EntityStorageRecord record = EntityStorageRecord.newBuilder() + .setState(AnyPacker.pack(project)) + .setWhenModified(Timestamps.getCurrentTime()) + .setVersion(1) + .build(); + storage.write(genericId, record); + ids.add(genericId); + } + + return ids; + } + + protected void checkIds(List> ids, Collection records) { + assertSize(ids.size(), records); + + for (EntityStorageRecord record : records) { + final Any packedState = record.getState(); + final Project state = AnyPacker.unpack(packedState); + final ProjectId id = state.getId(); + + assertContains(id, ids); + } + } + +} diff --git a/server/src/test/java/org/spine3/server/storage/memory/InMemoryStandStorageShould.java b/server/src/test/java/org/spine3/server/storage/memory/InMemoryStandStorageShould.java new file mode 100644 index 00000000000..801816d0e7c --- /dev/null +++ b/server/src/test/java/org/spine3/server/storage/memory/InMemoryStandStorageShould.java @@ -0,0 +1,37 @@ +/* + * Copyright 2016, TeamDev Ltd. All rights reserved. + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.spine3.server.storage.memory; + +import org.spine3.server.storage.StandStorage; +import org.spine3.server.storage.StandStorageShould; + +/** + * @author Dmytro Dashenkov + */ +public class InMemoryStandStorageShould extends StandStorageShould { + + @Override + protected StandStorage createStorage() { + return InMemoryStandStorage.newBuilder() + .setMultitenant(false) + .build(); + } +} From c3d6558e4eed8be2304803fe8f40a1a52f8baf18 Mon Sep 17 00:00:00 2001 From: Dmytro Dashenkov Date: Wed, 12 Oct 2016 12:10:15 +0300 Subject: [PATCH 3/5] Fix ids check. --- .../server/storage/StandStorageShould.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java index 68114bee2ad..1db8719b282 100644 --- a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java +++ b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java @@ -20,7 +20,9 @@ package org.spine3.server.storage; +import com.google.common.base.Function; import com.google.common.base.Supplier; +import com.google.common.collect.Collections2; import com.google.protobuf.Any; import org.junit.Test; import org.spine3.protobuf.AnyPacker; @@ -31,6 +33,7 @@ import org.spine3.test.projection.ProjectId; import org.spine3.test.projection.Task; +import javax.annotation.Nullable; import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -96,12 +99,23 @@ protected static List> fill(StandStorage storage, protected void checkIds(List> ids, Collection records) { assertSize(ids.size(), records); + final Collection projectIds = Collections2.transform(ids, new Function, ProjectId>() { + @Nullable + @Override + public ProjectId apply(@Nullable AggregateStateId input) { + if (input == null) { + return null; + } + return input.getAggregateId(); + } + }); + for (EntityStorageRecord record : records) { final Any packedState = record.getState(); final Project state = AnyPacker.unpack(packedState); final ProjectId id = state.getId(); - assertContains(id, ids); + assertContains(id, projectIds); } } From e45dc75a477a68e2a624441a5a629c6aa2fc99c3 Mon Sep 17 00:00:00 2001 From: Dmytro Dashenkov Date: Wed, 12 Oct 2016 12:25:36 +0300 Subject: [PATCH 4/5] Add readMultiple(ids) test. --- .../server/storage/StandStorageShould.java | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java index 1db8719b282..e84c1089d4a 100644 --- a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java +++ b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java @@ -50,34 +50,45 @@ public abstract class StandStorageShould { protected abstract StandStorage createStorage(); + protected static final Supplier> DEFAULT_ID_SUPPLIER = new Supplier>() { + @SuppressWarnings("unchecked") + @Override + public AggregateStateId get() { + final ProjectId projectId = ProjectId.newBuilder() + .setId(UUID.randomUUID() + .toString()) + .build(); + return AggregateStateId.of(projectId, TypeUrl.of(Project.class)); + } + }; + @Test public void retrieve_all_records() { final StandStorage storage = createStorage(); - final List> ids = fill(storage, 10, new Supplier>() { - @SuppressWarnings("unchecked") - @Override - public AggregateStateId get() { - final ProjectId projectId = ProjectId.newBuilder() - .setId(UUID.randomUUID() - .toString()) - .build(); - return AggregateStateId.of(projectId, TypeUrl.of(Project.class)); - } - }); + final List ids = fill(storage, 10, DEFAULT_ID_SUPPLIER); final Map allRecords = storage.readAll(); - checkIds(ids, allRecords.values()); } - protected static List> fill(StandStorage storage, - int count, - Supplier> idSupplier) { - final List> ids = new LinkedList<>(); + @Test + public void retrieve_records_by_ids() { + final StandStorage storage = createStorage(); + // Use a subset of IDs + final List ids = fill(storage, 10, DEFAULT_ID_SUPPLIER).subList(0, 5); + + final Collection records = (Collection) storage.readMultiple(ids); + checkIds(ids, records); + } + + protected static List fill(StandStorage storage, + int count, + Supplier> idSupplier) { + final List ids = new LinkedList<>(); for (int i = 0; i < count; i++) { - final AggregateStateId genericId = idSupplier.get(); - final ProjectId id = genericId.getAggregateId(); + final AggregateStateId genericId = idSupplier.get(); + final ProjectId id = (ProjectId) genericId.getAggregateId(); final Project project = Project.newBuilder() .setId(id) .setStatus(Project.Status.CREATED) @@ -96,17 +107,17 @@ protected static List> fill(StandStorage storage, return ids; } - protected void checkIds(List> ids, Collection records) { + protected void checkIds(List ids, Collection records) { assertSize(ids.size(), records); - final Collection projectIds = Collections2.transform(ids, new Function, ProjectId>() { + final Collection projectIds = Collections2.transform(ids, new Function() { @Nullable @Override - public ProjectId apply(@Nullable AggregateStateId input) { + public ProjectId apply(@Nullable AggregateStateId input) { if (input == null) { return null; } - return input.getAggregateId(); + return (ProjectId) input.getAggregateId(); } }); From 7e97ee87d103deb690d9a57cca6b40c8907e73e0 Mon Sep 17 00:00:00 2001 From: Dmytro Dashenkov Date: Wed, 12 Oct 2016 14:49:03 +0300 Subject: [PATCH 5/5] Fix minor issues. --- .../org/spine3/server/storage/StandStorageShould.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java index e84c1089d4a..3b762b228bf 100644 --- a/server/src/test/java/org/spine3/server/storage/StandStorageShould.java +++ b/server/src/test/java/org/spine3/server/storage/StandStorageShould.java @@ -25,6 +25,7 @@ import com.google.common.collect.Collections2; import com.google.protobuf.Any; import org.junit.Test; +import org.spine3.base.Identifiers; import org.spine3.protobuf.AnyPacker; import org.spine3.protobuf.Timestamps; import org.spine3.protobuf.TypeUrl; @@ -38,7 +39,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.UUID; import static org.spine3.test.Verify.assertContains; import static org.spine3.test.Verify.assertSize; @@ -50,13 +50,13 @@ public abstract class StandStorageShould { protected abstract StandStorage createStorage(); - protected static final Supplier> DEFAULT_ID_SUPPLIER = new Supplier>() { + protected static final Supplier> DEFAULT_ID_SUPPLIER + = new Supplier>() { @SuppressWarnings("unchecked") @Override public AggregateStateId get() { final ProjectId projectId = ProjectId.newBuilder() - .setId(UUID.randomUUID() - .toString()) + .setId(Identifiers.newUuid()) .build(); return AggregateStateId.of(projectId, TypeUrl.of(Project.class)); }