private Agent setUpAndRunAgent(String rule) throws Exception {
    final Agent agent = new Agent();

    agent.getTrace().disableAll();
    agent.initialize();

    agent.getProperties().set(SoarProperties.WAITSNC, true);
    agent.getProductions().loadProduction(rule);
    agent.runFor(1, RunType.DECISIONS);
    return agent;
  }
  @Test
  public void testMessageQueueRootIsCreated() throws Exception {
    XmlMessageQueue.newBuilder(agent.getInputOutput()).queueName("test-queue-root").create();

    agent
        .getProductions()
        .loadProduction(
            "testMessageQueueRootIsCreated (state <s> ^superstate nil ^io.input-link.test-queue-root) --> (match)");

    agent.runFor(1, RunType.DECISIONS);
    assertEquals(1, match.count);
  }
  @Test
  public void testMessagesAreRemovedFromQueueAfterTimeToLiveExpires() throws Exception {
    final XmlMessageQueue queue =
        XmlMessageQueue.newBuilder(agent.getInputOutput())
            .timeToLive(20)
            .queueName("test-messages")
            .create();

    agent.getProperties().set(SoarProperties.WAITSNC, true);
    agent
        .getProductions()
        .loadProduction(
            "checkForMessages"
                + "(state <s> ^superstate nil ^io.input-link.test-messages <r>)"
                + "(<r> ^a <a> ^b <b> ^c <c>)"
                + "(<a> ^/text |message a| ^/next <b> -^/previous)"
                + "(<b> ^/text |message b| ^/previous <a> ^/next <c>)"
                + "(<c> ^/text |message c| ^/previous <b> -^/next)"
                + "--> (match)");
    agent
        .getProductions()
        .loadProduction(
            "checkForRemoval"
                + "(state <s> ^superstate nil ^io.input-link <il>)"
                + "(<il> ^cycle-count > 2 < 24 ^test-messages <r>)"
                + "(<r> -^a -^b -^c)"
                + "-->"
                + "(match)");

    agent.runFor(1, RunType.DECISIONS);
    assertEquals(0, match.count);

    queue.add(XmlTools.parse("<a>message a</a>").getDocumentElement());
    queue.add(XmlTools.parse("<b>message b</b>").getDocumentElement());
    queue.add(XmlTools.parse("<c>message c</c>").getDocumentElement());
    agent.runFor(1, RunType.DECISIONS);
    assertEquals(1, match.count);
    agent.runFor(20, RunType.DECISIONS);
    assertEquals(2, match.count);
  }
  @Test
  public void testMessagesAreAddedToQueue() throws Exception {
    final XmlMessageQueue queue =
        XmlMessageQueue.newBuilder(agent.getInputOutput()).queueName("test-messages").create();

    agent
        .getProductions()
        .loadProduction(
            "checkForMessages"
                + "(state <s> ^superstate nil ^io.input-link.test-messages <r>)"
                + "(<r> ^a <a> ^b <b> ^c <c>)"
                + "(<a> ^/text |message a| ^/next <b> -^/previous)"
                + "(<b> ^/text |message b| ^/previous <a> ^/next <c>)"
                + "(<c> ^/text |message c| ^/previous <b> -^/next)"
                + "--> (match)");
    agent.runFor(1, RunType.DECISIONS);
    assertEquals(0, match.count);

    queue.add(XmlTools.parse("<a>message a</a>").getDocumentElement());
    queue.add(XmlTools.parse("<b>message b</b>").getDocumentElement());
    queue.add(XmlTools.parse("<c>message c</c>").getDocumentElement());
    agent.runFor(1, RunType.DECISIONS);
    assertEquals(1, match.count);
  }