use of com.github.dedis.popstellar.model.network.method.Query in project popstellar by dedis.
the class LAONetworkManagerTest method multipleRequestsAtATimeShouldAllSucceed.
@Test
public void multipleRequestsAtATimeShouldAllSucceed() {
TestSchedulerProvider schedulerProvider = new TestSchedulerProvider();
TestScheduler testScheduler = schedulerProvider.getTestScheduler();
LAONetworkManager networkManager = new LAONetworkManager(laoRepository, handler, connection, JsonModule.provideGson(DataRegistryModule.provideDataRegistry()), schedulerProvider);
// Set a response that stores requested ids
Set<Integer> requests = new HashSet<>();
Set<Integer> catchups = new HashSet<>();
// Setup mock answer
Answer<?> answer = args -> {
// Retrieve subscribe object
Query query = args.getArgument(0);
if (query instanceof Catchup)
catchups.add(query.getRequestId());
else
requests.add(query.getRequestId());
return null;
};
doAnswer(answer).when(connection).sendMessage(any());
// Actual test
// Create
AtomicBoolean sub1Called = new AtomicBoolean(false);
AtomicBoolean sub2Called = new AtomicBoolean(false);
Disposable disposable1 = networkManager.subscribe(CHANNEL).subscribe(() -> sub1Called.set(true));
Disposable disposable2 = networkManager.subscribe(CHANNEL).subscribe(() -> sub2Called.set(true));
testScheduler.advanceTimeBy(1, TimeUnit.SECONDS);
// Responses for subscribes
requests.forEach(id -> messages.onNext(new Result(id)));
testScheduler.advanceTimeBy(1, TimeUnit.SECONDS);
// Expect catchups to be sent now
testScheduler.advanceTimeBy(1, TimeUnit.SECONDS);
// Responses to catchups
catchups.forEach(id -> messages.onNext(new ResultMessages(id, Collections.emptyList())));
testScheduler.advanceTimeBy(1, TimeUnit.SECONDS);
// Make sure the subscription succeed
assertTrue(sub1Called.get());
assertTrue(sub2Called.get());
disposable1.dispose();
disposable2.dispose();
networkManager.dispose();
verify(connection, times(2)).sendMessage(any(Subscribe.class));
verify(connection, times(2)).sendMessage(any(Catchup.class));
verify(connection, atLeastOnce()).observeMessage();
verify(connection).observeConnectionEvents();
verify(connection).close();
verifyNoMoreInteractions(connection);
}
use of com.github.dedis.popstellar.model.network.method.Query in project popstellar by dedis.
the class LAONetworkManagerTest method errorsAreDispatchedCorrectly.
@Test
public void errorsAreDispatchedCorrectly() {
TestSchedulerProvider schedulerProvider = new TestSchedulerProvider();
TestScheduler testScheduler = schedulerProvider.getTestScheduler();
LAONetworkManager networkManager = new LAONetworkManager(laoRepository, handler, connection, JsonModule.provideGson(DataRegistryModule.provideDataRegistry()), schedulerProvider);
ErrorCode error = new ErrorCode(3, "error");
// Setup mock answer
Answer<?> answer = args -> {
// Retrieve subscribe object
Query query = args.getArgument(0);
// Return a negative result
messages.onNext(new Error(query.getRequestId(), error));
return null;
};
doAnswer(answer).when(connection).sendMessage(any());
Disposable disposable = networkManager.subscribe(CHANNEL).subscribe(() -> {
throw new IllegalAccessException("The subscription should have failed.");
}, err -> assertTrue(err instanceof JsonRPCErrorException));
testScheduler.advanceTimeBy(5, TimeUnit.SECONDS);
disposable.dispose();
networkManager.dispose();
verify(connection).sendMessage(any(Subscribe.class));
verify(connection, atLeastOnce()).observeMessage();
verify(connection).observeConnectionEvents();
verify(connection).close();
verifyNoMoreInteractions(connection);
}
use of com.github.dedis.popstellar.model.network.method.Query in project popstellar by dedis.
the class JsonMessageSerializer method serialize.
@Override
public JsonElement serialize(Message src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject params = context.serialize(src).getAsJsonObject();
JsonObject obj = context.serialize(new JSONRPCRequest(JsonUtils.JSON_RPC_VERSION, src.getMethod(), params)).getAsJsonObject();
if (src instanceof Query) {
obj.addProperty(JsonUtils.JSON_REQUEST_ID, ((Query) src).getRequestId());
}
return obj;
}
use of com.github.dedis.popstellar.model.network.method.Query in project popstellar by dedis.
the class LAONetworkManager method request.
private Single<Answer> request(Query query) {
Single<Answer> answerSingle = connection.observeMessage().filter(// Filter the Answers
Answer.class::isInstance).map(Answer.class::cast).filter(answer -> answer.getId() == query.getRequestId()).doOnNext(answer -> Log.d(TAG, "request id: " + answer.getId())).firstOrError().flatMap(answer -> {
if (answer instanceof Error) {
return Single.error(new JsonRPCErrorException((Error) answer));
} else {
return Single.just(answer);
}
}).subscribeOn(schedulerProvider.io()).observeOn(schedulerProvider.mainThread()).timeout(5, TimeUnit.SECONDS).cache();
// Only send the message after the single is created to make sure it is already waiting
// before the answer is received
connection.sendMessage(query);
return answerSingle;
}
Aggregations