use of io.scalecube.cluster.metadata.MetadataCodec in project scalecube by scalecube.
the class ServiceRegistryTest method test_listen_to_discovery_events.
@ParameterizedTest
@MethodSource("metadataCodecSource")
public void test_listen_to_discovery_events(MetadataCodec metadataCodec) {
Sinks.Many<ServiceDiscoveryEvent> processor = Sinks.many().replay().all();
List<Microservices> cluster = new CopyOnWriteArrayList<>();
Microservices seed = Microservices.builder().discovery(defServiceDiscovery(metadataCodec)).transport(RSocketServiceTransport::new).services(new AnnotationServiceImpl()).startAwait();
cluster.add(seed);
seed.listenDiscovery().subscribe(processor::tryEmitNext, processor::tryEmitError, processor::tryEmitComplete);
Address seedAddress = seed.discovery().address();
StepVerifier.create(processor.asFlux().onBackpressureBuffer()).then(() -> {
Microservices ms1 = Microservices.builder().discovery(defServiceDiscovery(seedAddress, metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl()).startAwait();
cluster.add(ms1);
}).assertNext(event -> assertEquals(ENDPOINT_ADDED, event.type())).then(() -> {
Microservices ms2 = Microservices.builder().discovery(defServiceDiscovery(seedAddress, metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl()).startAwait();
cluster.add(ms2);
}).assertNext(event -> assertEquals(ENDPOINT_ADDED, event.type())).then(() -> cluster.remove(2).shutdown().block(TIMEOUT)).assertNext(event -> assertEquals(ENDPOINT_LEAVING, event.type())).assertNext(event -> assertEquals(ENDPOINT_REMOVED, event.type())).then(() -> cluster.remove(1).shutdown().block(TIMEOUT)).assertNext(event -> assertEquals(ENDPOINT_LEAVING, event.type())).assertNext(event -> assertEquals(ENDPOINT_REMOVED, event.type())).thenCancel().verify(TIMEOUT);
StepVerifier.create(seed.call().api(AnnotationService.class).serviceDiscoveryEventTypes()).assertNext(type -> assertEquals(ENDPOINT_ADDED, type)).assertNext(type -> assertEquals(ENDPOINT_ADDED, type)).assertNext(type -> assertEquals(ENDPOINT_LEAVING, type)).assertNext(type -> assertEquals(ENDPOINT_REMOVED, type)).assertNext(type -> assertEquals(ENDPOINT_LEAVING, type)).assertNext(type -> assertEquals(ENDPOINT_REMOVED, type)).thenCancel().verify(TIMEOUT);
Mono.whenDelayError(cluster.stream().map(Microservices::shutdown).toArray(Mono[]::new)).block(TIMEOUT);
}
use of io.scalecube.cluster.metadata.MetadataCodec in project scalecube by scalecube.
the class ScalecubeServiceDiscoveryTest method testEndpointIsAddedThenRemoved.
@Disabled
@ParameterizedTest
@MethodSource("metadataCodecSource")
public void testEndpointIsAddedThenRemoved(MetadataCodec metadataCodec) {
startSeed(metadataCodec);
AtomicInteger registeredCount = new AtomicInteger();
AtomicInteger unregisteredCount = new AtomicInteger();
RecordingServiceDiscovery r1 = RecordingServiceDiscovery.create(() -> newServiceDiscovery(SEED_ADDRESS, metadataCodec));
RecordingServiceDiscovery r2 = RecordingServiceDiscovery.create(() -> newServiceDiscovery(SEED_ADDRESS, metadataCodec));
RecordingServiceDiscovery r3 = RecordingServiceDiscovery.create(() -> newServiceDiscovery(SEED_ADDRESS, metadataCodec));
// (1+3)x(1+3) - (1+3)/*exclude self*/ - 3/*exclude seed*/
int expectedAddedEventsNum = 9;
// r3 is shutdown => await by 1 event on r1 and r2
int expectedRemovedEventsNum = 2;
StepVerifier.create(Flux.merge(r1.nonGroupDiscoveryEvents(), r2.nonGroupDiscoveryEvents(), r3.nonGroupDiscoveryEvents())).thenConsumeWhile(event -> {
assertEquals(ENDPOINT_ADDED, event.type());
assertNotNull(event.serviceEndpoint());
return registeredCount.incrementAndGet() < expectedAddedEventsNum;
}).expectNoEvent(SHORT_TIMEOUT).then(r3::shutdown).thenConsumeWhile(event -> {
assertEquals(ENDPOINT_REMOVED, event.type());
assertNotNull(event.serviceEndpoint());
return unregisteredCount.incrementAndGet() < expectedRemovedEventsNum;
}).expectNoEvent(SHORT_TIMEOUT).thenCancel().verify();
}
use of io.scalecube.cluster.metadata.MetadataCodec in project scalecube by scalecube.
the class ScalecubeServiceDiscoveryTest method testEndpointIsRestarted.
@Disabled
@ParameterizedTest
@MethodSource("metadataCodecSource")
public void testEndpointIsRestarted(MetadataCodec metadataCodec) {
startSeed(metadataCodec);
AtomicInteger registeredCount = new AtomicInteger();
AtomicInteger unregisteredCount = new AtomicInteger();
RecordingServiceDiscovery r1 = RecordingServiceDiscovery.create(() -> newServiceDiscovery(SEED_ADDRESS, metadataCodec));
RecordingServiceDiscovery r2 = RecordingServiceDiscovery.create(() -> newServiceDiscovery(SEED_ADDRESS, metadataCodec));
RecordingServiceDiscovery r3 = RecordingServiceDiscovery.create(() -> newServiceDiscovery(SEED_ADDRESS, metadataCodec));
// (1+3)x(1+3) - (1+3)/*exclude self*/ - 3/*exclude seed*/
int expectedAddedEventsNum = 9;
// r3 is shutdown => await by 1 event on r1 and r2
int expectedRemovedEventsNum = 2;
StepVerifier.create(Flux.merge(r1.nonGroupDiscoveryEvents(), r2.nonGroupDiscoveryEvents(), r3.nonGroupDiscoveryEvents())).thenConsumeWhile(event -> {
assertEquals(ENDPOINT_ADDED, event.type());
assertNotNull(event.serviceEndpoint());
return registeredCount.incrementAndGet() < expectedAddedEventsNum;
}).expectNoEvent(SHORT_TIMEOUT).then(r3::shutdown).thenConsumeWhile(event -> {
assertEquals(ENDPOINT_REMOVED, event.type());
assertNotNull(event.serviceEndpoint());
return unregisteredCount.incrementAndGet() < expectedRemovedEventsNum;
}).expectNoEvent(SHORT_TIMEOUT).thenCancel().verify();
AtomicInteger registeredCountAfterRestart = new AtomicInteger();
// r3 is restared => await by 1 event on r1 and r2
int expectedAddedEventsNumAfterRestart = 2;
r1 = r1.resubscribe();
r2 = r2.resubscribe();
r3 = r3.recreate();
StepVerifier.create(Flux.merge(r1.nonGroupDiscoveryEvents(), r2.nonGroupDiscoveryEvents(), r3.nonGroupDiscoveryEvents())).thenConsumeWhile(event -> {
assertEquals(ENDPOINT_ADDED, event.type());
assertNotNull(event.serviceEndpoint());
return registeredCountAfterRestart.incrementAndGet() < expectedAddedEventsNumAfterRestart;
}).expectNoEvent(SHORT_TIMEOUT).thenCancel().verify();
}
use of io.scalecube.cluster.metadata.MetadataCodec in project scalecube by scalecube.
the class ServiceRegistryTest method test_delayed_listen_to_discovery_events.
@ParameterizedTest
@MethodSource("metadataCodecSource")
public void test_delayed_listen_to_discovery_events(MetadataCodec metadataCodec) {
Sinks.Many<ServiceDiscoveryEvent> processor = Sinks.many().replay().all();
List<Microservices> cluster = new CopyOnWriteArrayList<>();
Microservices seed = Microservices.builder().discovery(defServiceDiscovery(metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl()).startAwait();
cluster.add(seed);
seed.listenDiscovery().subscribe(processor::tryEmitNext, processor::tryEmitError, processor::tryEmitComplete);
Address seedAddress = seed.discovery().address();
StepVerifier.create(processor.asFlux().onBackpressureBuffer()).then(() -> {
Microservices ms1 = Microservices.builder().discovery(defServiceDiscovery(seedAddress, metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl(), new AnnotationServiceImpl()).startAwait();
cluster.add(ms1);
}).assertNext(event -> assertEquals(ENDPOINT_ADDED, event.type())).then(() -> {
Microservices ms2 = Microservices.builder().discovery(defServiceDiscovery(seedAddress, metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl()).startAwait();
cluster.add(ms2);
}).assertNext(event -> assertEquals(ENDPOINT_ADDED, event.type())).thenCancel().verify(TIMEOUT);
StepVerifier.create(seed.call().api(AnnotationService.class).serviceDiscoveryEventTypes()).assertNext(type -> assertEquals(ENDPOINT_ADDED, type)).assertNext(type -> assertEquals(ENDPOINT_ADDED, type)).thenCancel().verify(TIMEOUT);
Mono.whenDelayError(cluster.stream().map(Microservices::shutdown).toArray(Mono[]::new)).block(TIMEOUT);
}
use of io.scalecube.cluster.metadata.MetadataCodec in project scalecube by scalecube.
the class ServiceRegistryTest method test_added_removed_registration_events.
@ParameterizedTest
@MethodSource("metadataCodecSource")
public void test_added_removed_registration_events(MetadataCodec metadataCodec) {
Sinks.Many<ServiceDiscoveryEvent> events = Sinks.many().replay().all();
Microservices seed = Microservices.builder().discovery(defServiceDiscovery(metadataCodec)).transport(RSocketServiceTransport::new).startAwait();
seed.listenDiscovery().subscribe(events::tryEmitNext, events::tryEmitError, events::tryEmitComplete);
Address seedAddress = seed.discovery().address();
Microservices ms1 = Microservices.builder().discovery(defServiceDiscovery(seedAddress, metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl()).startAwait();
Microservices ms2 = Microservices.builder().discovery(defServiceDiscovery(seedAddress, metadataCodec)).transport(RSocketServiceTransport::new).services(new GreetingServiceImpl()).startAwait();
StepVerifier.create(events.asFlux().onBackpressureBuffer()).assertNext(event -> assertEquals(ENDPOINT_ADDED, event.type())).assertNext(event -> assertEquals(ENDPOINT_ADDED, event.type())).then(() -> Mono.whenDelayError(ms1.shutdown(), ms2.shutdown()).block(TIMEOUT)).assertNext(event -> assertEquals(ENDPOINT_LEAVING, event.type())).assertNext(event -> assertEquals(ENDPOINT_LEAVING, event.type())).assertNext(event -> assertEquals(ENDPOINT_REMOVED, event.type())).assertNext(event -> assertEquals(ENDPOINT_REMOVED, event.type())).then(() -> seed.shutdown().block(TIMEOUT)).thenCancel().verify(TIMEOUT);
}
Aggregations