public WikipediaEditsSource() {
        this(DEFAULT_HOST, DEFAULT_PORT, DEFAULT_CHANNEL);
    }
@TestTemplate
    @RetryOnFailure(times = 1)
    void testWikipediaEditsSource() throws Exception {
        if (canConnect(1, TimeUnit.SECONDS)) {
            final Time testTimeout = Time.seconds(60);
            final WikipediaEditsSource wikipediaEditsSource = new WikipediaEditsSource();

            ExecutorService executorService = null;
            try {
                executorService = Executors.newSingleThreadExecutor();
                BlockingQueue<Object> collectedEvents = new ArrayBlockingQueue<>(1);
                AtomicReference<Exception> asyncError = new AtomicReference<>();

                // Execute the source in a different thread and collect events into the queue.
                // We do this in a separate thread in order to not block the main test thread
                // indefinitely in case that something bad happens (like not receiving any
                // events)
                executorService.execute(
                        () -> {
                            try {
                                wikipediaEditsSource.run(
                                        new CollectingSourceContext<>(collectedEvents));
                            } catch (Exception e) {
                                boolean interrupted = e instanceof InterruptedException;
                                if (!interrupted) {
                                    LOG.warn("Failure in WikipediaEditsSource", e);
                                }

                                asyncError.compareAndSet(null, e);
                            }
                        });

                long deadline = deadlineNanos(testTimeout);

                Object event = null;
                Exception error = null;

                // Check event or error
                while (event == null && error == null && System.nanoTime() < deadline) {
                    event = collectedEvents.poll(1, TimeUnit.SECONDS);
                    error = asyncError.get();
                }

                if (error != null) {
                    // We don't use assertNull, because we want to include the error message
                    fail("Failure in WikipediaEditsSource: " + error.getMessage());
                }

                assertThat(event)
                        .as("Did not receive a WikipediaEditEvent within the desired timeout")
                        .isNotNull();
                assertThat(event)
                        .as("Received unexpected event " + event)
                        .isInstanceOf(WikipediaEditEvent.class);
            } finally {
                wikipediaEditsSource.cancel();

                if (executorService != null) {
                    executorService.shutdownNow();
                    executorService.awaitTermination(1, TimeUnit.SECONDS);
                }
            }
        } else {
            LOG.info("Skipping test, because not able to connect to IRC server.");
        }
    }