// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.rendering;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yahoo.concurrent.Receiver;
import com.yahoo.processing.response.Data;
import com.yahoo.processing.response.DataList;
import com.yahoo.processing.response.DefaultIncomingData;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.result.Hit;
import com.yahoo.search.result.HitGroup;
import com.yahoo.search.result.Relevance;
import com.yahoo.search.searchchain.Execution;
import com.yahoo.text.Utf8;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.BiConsumer;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Test adding hits to a hit group during rendering.
*
* @author Steinar Knutsen
*/
public class AsyncGroupPopulationTestCase {
private static class WrappedFuture extends CompletableFuture {
Receiver isListening = new Receiver<>();
private final CompletableFuture wrapped;
WrappedFuture(CompletableFuture wrapped) {
this.wrapped = wrapped;
}
@Override
public CompletableFuture whenCompleteAsync(BiConsumer super F, ? super Throwable> action, Executor executor) {
wrapped.whenCompleteAsync(action);
isListening.put(Boolean.TRUE);
return this;
}
public boolean cancel(boolean mayInterruptIfRunning) {
return wrapped.cancel(mayInterruptIfRunning);
}
public boolean isCancelled() {
return wrapped.isCancelled();
}
public boolean isDone() {
return wrapped.isDone();
}
public F get() throws InterruptedException, ExecutionException {
return wrapped.get();
}
public F get(long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
return wrapped.get(timeout, unit);
}
}
private static class ObservableIncoming extends DefaultIncomingData {
volatile WrappedFuture