8ed18448c27573cdd3e2fbb7dc78cb2d64b55c3e
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / implementation / inmemory / ShardedChatHomeServiceTest.java
1 package de.juplo.kafka.chat.backend.implementation.inmemory;
2
3 import com.fasterxml.jackson.databind.ObjectMapper;
4 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
5 import de.juplo.kafka.chat.backend.domain.ChatHomeServiceWithShardsTest;
6 import de.juplo.kafka.chat.backend.implementation.ShardingStrategy;
7 import de.juplo.kafka.chat.backend.implementation.StorageStrategy;
8 import de.juplo.kafka.chat.backend.storage.files.FilesStorageStrategy;
9 import org.springframework.boot.test.context.TestConfiguration;
10 import org.springframework.context.annotation.Bean;
11
12 import java.net.URI;
13 import java.nio.file.Paths;
14 import java.time.Clock;
15 import java.util.stream.IntStream;
16
17 public class ShardedChatHomeServiceTest extends ChatHomeServiceWithShardsTest
18 {
19   @TestConfiguration
20   static class Configuration
21   {
22     @Bean
23     ShardedChatHomeService chatHome(
24         StorageStrategy storageStrategy,
25         Clock clock)
26     {
27       SimpleChatHomeService[] chatHomes = new SimpleChatHomeService[NUM_SHARDS];
28
29       IntStream
30           .of(ownedShards())
31           .forEach(shard -> chatHomes[shard] = new SimpleChatHomeService(
32               shard,
33               storageStrategy,
34               clock,
35               bufferSize()));
36
37       ShardingStrategy strategy = new KafkaLikeShardingStrategy(NUM_SHARDS);
38
39       return new ShardedChatHomeService(
40           "http://instance-0",
41           chatHomes,
42           IntStream
43               .range(0, NUM_SHARDS)
44               .mapToObj(shard -> "http://instance-0")
45               .map(uriString -> URI.create(uriString))
46               .toArray(size -> new URI[size]),
47           strategy);
48     }
49
50     @Bean
51     FilesStorageStrategy storageStrategy(
52         Clock clock,
53         ObjectMapper objectMapper)
54     {
55       return new FilesStorageStrategy(
56           Paths.get("target", "test-classes", "data", "files"),
57           new KafkaLikeShardingStrategy(NUM_SHARDS),
58           objectMapper);
59     }
60
61     @Bean
62     ObjectMapper objectMapper()
63     {
64       ObjectMapper objectMapper = new ObjectMapper();
65       objectMapper.registerModule(new JavaTimeModule());
66       return objectMapper;
67     }
68
69     @Bean
70     Clock clock()
71     {
72       return Clock.systemDefaultZone();
73     }
74
75     int[] ownedShards()
76     {
77       return new int[] { OWNED_SHARD };
78     }
79
80     int bufferSize()
81     {
82       return 8;
83     }
84   }
85 }