Tried to fix test, but LeastPicker and SequentialFilling do no passing

This commit is contained in:
Andrey Terentev 2024-03-16 15:43:47 +07:00 committed by Andrey Terentev
parent 8b655bfb4b
commit e38410a1ea
10 changed files with 46 additions and 36 deletions

View File

@ -35,9 +35,9 @@ public class NodeContainer {
private @NotNull RoomPicker initPicker() {
return switch (node.getPickingMethod()) {
case SEQUENTIAL_FILLING -> new SequentialFillingPicker();
case ROUND_ROBIN -> new RoundRobinPicker();
case LEAST_PICKED -> new LeastPickedPicker();
case SEQUENTIAL_FILLING -> new SequentialFillingPicker(this);
case ROUND_ROBIN -> new RoundRobinPicker(this);
case LEAST_PICKED -> new LeastPickedPicker(this);
};
}
@ -93,10 +93,12 @@ public class NodeContainer {
}
public @NotNull Room pick(@NotNull Set<User> users) {
synchronized (picker) {
var room = picker.pick(users);
transactionListener.accept(new UserTransaction(room.getRoom(), users));
return room.getRoom();
}
}
public @NotNull RoomPicker getPicker() {
return picker;

View File

@ -90,6 +90,7 @@ public class RoomContainer {
}
public boolean canBePicked(int users) {
usersLock.readLock().lock();
try {
return !room.isLocked() && canAdd0(users);
} finally {

View File

@ -1,16 +1,21 @@
package ru.dragonestia.picker.repository.impl.picker;
import lombok.RequiredArgsConstructor;
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
import ru.dragonestia.picker.api.model.node.PickingMethod;
import ru.dragonestia.picker.model.Room;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.UserRepository;
import ru.dragonestia.picker.repository.impl.collection.DynamicSortedMap;
import ru.dragonestia.picker.repository.impl.container.NodeContainer;
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
import java.util.Collection;
@RequiredArgsConstructor
public class LeastPickedPicker implements RoomPicker {
private final NodeContainer container;
private final DynamicSortedMap<RoomWrapper> map = new DynamicSortedMap<>();
@Override
@ -37,7 +42,7 @@ public class LeastPickedPicker implements RoomPicker {
if (!wrapper.canAddUnits(users.size())) throw new RuntimeException();
} catch (RuntimeException ex) {
throw new RuntimeException("There are no rooms available");
throw new NoRoomsAvailableException(container.getNode().getIdentifier());
}
}

View File

@ -1,15 +1,20 @@
package ru.dragonestia.picker.repository.impl.picker;
import lombok.RequiredArgsConstructor;
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
import ru.dragonestia.picker.api.model.node.PickingMethod;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.impl.collection.QueuedLinkedList;
import ru.dragonestia.picker.repository.impl.container.NodeContainer;
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;
@RequiredArgsConstructor
public class RoundRobinPicker implements RoomPicker {
private final NodeContainer container;
private final AtomicInteger addition = new AtomicInteger(0);
private final QueuedLinkedList<RoomWrapper> list = new QueuedLinkedList<>(wrapper -> wrapper.canAddUnits(addition.get()));
@ -37,7 +42,7 @@ public class RoundRobinPicker implements RoomPicker {
addition.set(amount);
wrapper = list.pick();
} catch (RuntimeException ex) {
throw new RuntimeException("There are no rooms available");
throw new NoRoomsAvailableException(container.getNode().getIdentifier());
}
}

View File

@ -1,15 +1,20 @@
package ru.dragonestia.picker.repository.impl.picker;
import lombok.RequiredArgsConstructor;
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
import ru.dragonestia.picker.api.model.node.PickingMethod;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.impl.container.NodeContainer;
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
@RequiredArgsConstructor
public class SequentialFillingPicker implements RoomPicker {
private final NodeContainer container;
private final Map<String, RoomWrapper> wrappers = new LinkedHashMap<>();
@Override
@ -38,7 +43,7 @@ public class SequentialFillingPicker implements RoomPicker {
}
}
throw new RuntimeException("There are no rooms available");
throw new NoRoomsAvailableException(container.getNode().getIdentifier());
}
@Override

View File

@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
import ru.dragonestia.picker.config.FillingNodesConfig;
import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.repository.RoomRepository;
@ -40,14 +41,12 @@ public class LeastPickedTests {
@ParameterizedTest
@ArgumentsSource(PickingArgumentProvider.class)
void testPicking(String expectedRoomId, int usersAmount) {
var roomOpt = roomRepository.pick(node, userFiller.createRandomUsers(usersAmount));
Assertions.assertTrue(roomOpt.isPresent());
var room = roomOpt.get();
var room = roomRepository.pick(node, userFiller.createRandomUsers(usersAmount));
var slots = room.getMaxSlots();
var users = userRepository.usersOf(room);
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
System.out.printf("Room(%s) has %s/%s users. Expected: %s, added: %s%n", room.getIdentifier(), users.size(), slots, expectedRoomId, usersAmount);
Assertions.assertEquals(expectedRoomId, room.getIdentifier());
}
@ -73,7 +72,6 @@ public class LeastPickedTests {
@Timeout(value = 1, threadMode = Timeout.ThreadMode.SEPARATE_THREAD)
@Test
void testNoOneRoomExpected() { // Take 9 users. expected none result
var roomOpt = roomRepository.pick(node, userFiller.createRandomUsers(9));
Assertions.assertTrue(roomOpt.isEmpty());
Assertions.assertThrows(NoRoomsAvailableException.class, () -> roomRepository.pick(node, userFiller.createRandomUsers(9)));
}
}

View File

@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
import ru.dragonestia.picker.config.FillingNodesConfig;
import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.repository.RoomRepository;
@ -38,10 +39,7 @@ public class RoundRobinTests {
@ParameterizedTest
@ArgumentsSource(PickingArgumentProvider.class)
void testPicking(String expectedRoomId, int usersAmount) {
var roomOpt = roomRepository.pick(node, userFiller.createRandomUsers(usersAmount));
Assertions.assertTrue(roomOpt.isPresent());
var room = roomOpt.get();
var room = roomRepository.pick(node, userFiller.createRandomUsers(usersAmount));
var slots = room.getMaxSlots();
var users = userRepository.usersOf(room);
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
@ -68,7 +66,6 @@ public class RoundRobinTests {
@Timeout(value = 1, threadMode = Timeout.ThreadMode.SEPARATE_THREAD)
@Test
void testNoOneRoomExpected() { // Take 9 users. expected none result
var roomOpt = roomRepository.pick(node, userFiller.createRandomUsers(9));
Assertions.assertTrue(roomOpt.isEmpty());
Assertions.assertThrows(NoRoomsAvailableException.class, () -> roomRepository.pick(node, userFiller.createRandomUsers(9)));
}
}

View File

@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
import ru.dragonestia.picker.config.FillingNodesConfig;
import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.repository.RoomRepository;
@ -40,14 +41,12 @@ public class SequentialFillingTests {
@ParameterizedTest
@ArgumentsSource(PickingArgumentProvider.class)
void testPicking(String expectedRoomId, int usersAmount) {
var roomOpt = roomRepository.pick(node, userFiller.createRandomUsers(usersAmount));
Assertions.assertTrue(roomOpt.isPresent());
var room = roomOpt.get();
var room = roomRepository.pick(node, userFiller.createRandomUsers(usersAmount));
var slots = room.getMaxSlots();
var users = userRepository.usersOf(room);
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
System.out.printf("Room(%s) has %s/%s users. Expected: %s, added: %s%n", room.getIdentifier(), users.size(), slots, expectedRoomId, usersAmount);
Assertions.assertEquals(expectedRoomId, room.getIdentifier());
}
@ -70,7 +69,6 @@ public class SequentialFillingTests {
@Timeout(value = 1, threadMode = Timeout.ThreadMode.SEPARATE_THREAD)
@Test
void testNoOneRoomExpected() { // Take 9 users. expected none result
var roomOpt = roomRepository.pick(node, userFiller.createRandomUsers(9));
Assertions.assertTrue(roomOpt.isEmpty());
Assertions.assertThrows(NoRoomsAvailableException.class, () -> roomRepository.pick(node, userFiller.createRandomUsers(9)));
}
}

View File

@ -21,6 +21,7 @@ import ru.dragonestia.picker.model.factory.RoomFactory;
import ru.dragonestia.picker.model.type.SlotLimit;
import java.util.List;
import java.util.Set;
@SpringBootTest
public class RoomServiceTests {
@ -93,7 +94,7 @@ public class RoomServiceTests {
rooms.forEach(room -> roomService.create(room));
var users = List.of(
var users = Set.of(
new User(UserIdentifier.of("1")),
new User(UserIdentifier.of("2")),
new User(UserIdentifier.of("3")),
@ -121,6 +122,6 @@ public class RoomServiceTests {
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.create(room));
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.remove(room));
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.find(node, "Bruh"));
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.pickAvailable(node, List.of(new User(UserIdentifier.of("1")))));
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.pickAvailable(node, Set.of(new User(UserIdentifier.of("1")))));
}
}

View File

@ -4,18 +4,16 @@ import org.springframework.boot.test.context.TestComponent;
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
import ru.dragonestia.picker.model.User;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.*;
@TestComponent
public class UserFiller {
public List<User> createRandomUsers(int amount) {
var list = new LinkedList<User>();
public Set<User> createRandomUsers(int amount) {
var set = new HashSet<User>();
for (int i = 0; i < amount; i++) {
list.add(new User(UserIdentifier.of(UUID.randomUUID().toString())));
set.add(new User(UserIdentifier.of(UUID.randomUUID().toString())));
}
return list;
return set;
}
}