@Test
  public void testRedisSubjectFanoutToNats() throws Exception {

    int count = 5;

    String config =
        "{"
            + "\"redis_to_nats_map\" : ["
            + "{"
            + "\"channel\" : \"Export_NATS\","
            + "\"subject\" : \"Import.Redis\""
            + "},"
            + "{"
            + "\"channel\" : \"Export_NATS\","
            + "\"subject\" : \"Import.Redis2\""
            + "}"
            + "]"
            + "}";

    System.setProperty(RedisPubSubPlugin.CONFIG_URL, generateContentFile(config));

    Connector c = new Connector();

    ExecutorService executor = Executors.newFixedThreadPool(10);

    RedisPublisher rp1 = new RedisPublisher("rp1", "Export_NATS", count);

    NatsSubscriber ns1 = new NatsSubscriber("ns1", "Import.Redis", count);
    NatsSubscriber ns2 = new NatsSubscriber("ns2", "Import.Redis2", count);

    // start the connector
    executor.execute(c);

    // start the subsciber apps
    executor.execute(ns1);
    executor.execute(ns2);

    // wait for subscribers to be ready.
    ns1.waitUntilReady();
    ns2.waitUntilReady();

    // let the connector start
    Thread.sleep(1000);

    // start the publishers
    executor.execute(rp1);

    // wait for the subscribers to complete.
    ns1.waitForCompletion();
    ns2.waitForCompletion();

    Assert.assertTrue("Invalid count", ns1.getMessageCount() == count);
    Assert.assertTrue("Invalid count", ns2.getMessageCount() == count);

    c.shutdown();
  }
  @Test
  public void testRedisToNats() throws Exception {

    System.clearProperty(RedisPubSubPlugin.CONFIG_URL);

    Connector c = new Connector();

    ExecutorService executor = Executors.newFixedThreadPool(6);

    RedisPublisher rp = new RedisPublisher("rp", "Export_NATS", 5);
    NatsSubscriber ns = new NatsSubscriber("ns", "Import.Redis", 5);

    // start the connector
    executor.execute(c);

    // start the subsciber app
    executor.execute(ns);

    // wait for subscriber to be ready.
    ns.waitUntilReady();

    // let the connector start
    Thread.sleep(2000);

    // start the publisher
    executor.execute(rp);

    // wait for the subscriber to complete.
    ns.waitForCompletion();

    Assert.assertTrue("Invalid count", ns.getMessageCount() == 5);

    c.shutdown();
  }
  private void testOneToOneWithDefaultConfig(int count) throws Exception {

    System.clearProperty(RedisPubSubPlugin.CONFIG_URL);

    Connector c = new Connector();

    ExecutorService executor = Executors.newFixedThreadPool(6);

    RedisSubscriber rs = new RedisSubscriber("rs", "Import_NATS", count);
    RedisPublisher rp = new RedisPublisher("rp", "Export_NATS", count);

    NatsPublisher np = new NatsPublisher("np", "Export.Redis", count);
    NatsSubscriber ns = new NatsSubscriber("ns", "Import.Redis", count);

    // start the connector
    executor.execute(c);

    // start the subsciber apps
    executor.execute(rs);
    executor.execute(ns);

    // wait for subscribers to be ready.
    rs.waitUntilReady();
    ns.waitUntilReady();

    // let the connector start
    Thread.sleep(1000);

    // start the publishers
    executor.execute(np);
    executor.execute(rp);

    // wait for the subscribers to complete.
    rs.waitForCompletion();
    ns.waitForCompletion();

    Assert.assertTrue("Invalid count", rs.getMessageCount() == count);
    Assert.assertTrue("Invalid count", ns.getMessageCount() == count);

    c.shutdown();
  }