93 lines
3.7 KiB
Java
93 lines
3.7 KiB
Java
package ru.dragonestia.picker.config;
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.SneakyThrows;
|
|
import org.apache.tomcat.util.codec.binary.Base64;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.context.annotation.Profile;
|
|
import org.springframework.lang.NonNull;
|
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
|
import ru.dragonestia.picker.api.model.room.IRoom;
|
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
|
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
|
import ru.dragonestia.picker.interceptor.DebugInterceptor;
|
|
import ru.dragonestia.picker.model.Room;
|
|
import ru.dragonestia.picker.model.Node;
|
|
import ru.dragonestia.picker.model.User;
|
|
import ru.dragonestia.picker.model.factory.RoomFactory;
|
|
import ru.dragonestia.picker.model.type.SlotLimit;
|
|
import ru.dragonestia.picker.repository.RoomRepository;
|
|
import ru.dragonestia.picker.repository.NodeRepository;
|
|
import ru.dragonestia.picker.repository.UserRepository;
|
|
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
import java.util.UUID;
|
|
|
|
@Profile("test")
|
|
@Configuration
|
|
@RequiredArgsConstructor
|
|
public class TestConfig implements WebMvcConfigurer {
|
|
|
|
private final NodeRepository nodeRepository;
|
|
private final RoomRepository roomRepository;
|
|
private final UserRepository userRepository;
|
|
private final RoomFactory roomFactory;
|
|
|
|
private final Random rand = new Random(0);
|
|
|
|
@Override
|
|
public void addInterceptors(@NonNull InterceptorRegistry registry) {
|
|
registry.addInterceptor(new DebugInterceptor());
|
|
}
|
|
|
|
@Bean
|
|
void createNodes() {
|
|
createNodeWithContent(new Node(NodeIdentifier.of("game-servers"), PickingMethod.ROUND_ROBIN, false));
|
|
createNodeWithContent(new Node(NodeIdentifier.of("game-lobbies"), PickingMethod.LEAST_PICKED, false));
|
|
createNodeWithContent(new Node(NodeIdentifier.of("hub"), PickingMethod.SEQUENTIAL_FILLING, false));
|
|
}
|
|
|
|
@SneakyThrows
|
|
private void createNodeWithContent(Node node) {
|
|
nodeRepository.create(node);
|
|
var json = new ObjectMapper().writer().withDefaultPrettyPrinter();
|
|
|
|
for (int i = 1; i <= 5; i++) {
|
|
var slots = 5 * i;
|
|
var room = roomFactory.create(RoomIdentifier.of("test-" + i), node, slots, json.writeValueAsString(generatePayload()), false);
|
|
roomRepository.create(room);
|
|
|
|
for (int j = 0, n = rand.nextInt(slots + 1); j < n; j++) {
|
|
var user = new User(UserIdentifier.of("test-user-" + rand.nextInt(20)));
|
|
userRepository.linkWithRoom(room, List.of(user), false);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
var room = roomFactory.create(RoomIdentifier.of(randomUUID().toString()), node, IRoom.UNLIMITED_SLOTS, json.writeValueAsString(generatePayload()), false);
|
|
room.setLocked((i & 1) == 0);
|
|
roomRepository.create(room);
|
|
}
|
|
}
|
|
|
|
private UUID randomUUID() {
|
|
byte[] randomBytes = new byte[16];
|
|
rand.nextBytes(randomBytes);
|
|
return UUID.nameUUIDFromBytes(randomBytes);
|
|
}
|
|
|
|
private SomePayload generatePayload() {
|
|
return new SomePayload("Game server",
|
|
"game.dragonestia.ru:" + rand.nextInt(19000, 25000), randomUUID(),
|
|
new Base64().encodeAsString(randomUUID().toString().getBytes()));
|
|
}
|
|
|
|
private record SomePayload(String name, String host, UUID gameId, String secureKey) {}
|
|
}
|