test: Added tests for a chat-home _with_ shards
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / persistence / inmemory / ShardedChatHomeTest.java
1 package de.juplo.kafka.chat.backend.persistence.inmemory;
2
3 import com.fasterxml.jackson.databind.ObjectMapper;
4 import de.juplo.kafka.chat.backend.domain.ChatHomeWithShardsTest;
5 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
6 import de.juplo.kafka.chat.backend.persistence.storage.files.FilesStorageStrategy;
7 import org.springframework.boot.test.context.TestConfiguration;
8 import org.springframework.context.annotation.Bean;
9
10 import java.nio.file.Paths;
11 import java.time.Clock;
12 import java.util.stream.IntStream;
13
14 public class ShardedChatHomeTest extends ChatHomeWithShardsTest
15 {
16   @TestConfiguration
17   static class Configuration
18   {
19     @Bean
20     ShardedChatHome chatHome(
21         InMemoryChatHomeService chatHomeService)
22     {
23       SimpleChatHome[] chatHomes = new SimpleChatHome[NUM_SHARDS];
24
25       IntStream
26           .of(ownedShards())
27           .forEach(shard -> chatHomes[shard] = new SimpleChatHome(chatHomeService, shard));
28
29       ShardingStrategy strategy = new KafkaLikeShardingStrategy(NUM_SHARDS);
30
31       return new ShardedChatHome(chatHomes, strategy);
32     }
33
34     @Bean
35     InMemoryChatHomeService chatHomeService(
36         StorageStrategy storageStrategy)
37     {
38       return new InMemoryChatHomeService(
39           NUM_SHARDS,
40           ownedShards(),
41           storageStrategy.read());
42     }
43
44     @Bean
45     public FilesStorageStrategy storageStrategy()
46     {
47       return new FilesStorageStrategy(
48           Paths.get("target", "test-classes", "data", "files"),
49           Clock.systemDefaultZone(),
50           8,
51           new KafkaLikeShardingStrategy(NUM_SHARDS),
52           messageFlux -> new InMemoryChatRoomService(messageFlux),
53           new ObjectMapper());
54     }
55
56     int[] ownedShards()
57     {
58       return new int[] { OWNED_SHARD };
59     }
60   }
61 }