@Test
  @Ignore(
      "BZ-1199993 - No results from Process Query API when I query process instances with 2 or more variables")
  public void moreQueryProcessRestCallTest() throws Exception {
    int pageSize = 5;
    assertTrue(numProcesses > pageSize);
    int[] pageInfo = {0, pageSize};
    Map<String, String[]> queryParams = new HashMap<String, String[]>();
    addParams(queryParams, "processinstancestatus", "" + ProcessInstance.STATE_COMPLETED);

    // simple (everything)
    JaxbQueryProcessInstanceResult result =
        queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertTrue(
        "Empty result (status complete)",
        result != null
            && result.getProcessInstanceInfoList() != null
            && !result.getProcessInstanceInfoList().isEmpty());
    int origNumResults = result.getProcessInstanceInfoList().size();

    JaxbQueryProcessInstanceInfo foundProcInfo = null;
    FIND:
    for (JaxbQueryProcessInstanceInfo queryProcInfo : result.getProcessInstanceInfoList()) {
      assertEquals(
          "Incorrect process instance state!",
          ProcessInstance.STATE_COMPLETED,
          queryProcInfo.getProcessInstance().getState());
      for (JaxbVariableInfo varInfo : queryProcInfo.getVariables()) {
        if (varInfo.getName().equals("secondStr")) {
          foundProcInfo = queryProcInfo;
          break FIND;
        }
      }
    }
    assertNotNull("Could not find process instance!", foundProcInfo);

    int i = 0;
    for (JaxbVariableInfo varInfo : foundProcInfo.getVariables()) {
      if (i++ > 1) break;
      addParams(queryParams, "var_" + varInfo.getName(), varInfo.getValue().toString());
    }

    result = queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertTrue(
        "Empty result ('COMPLETE' + var1 + var2)",
        result != null
            && result.getProcessInstanceInfoList() != null
            && !result.getProcessInstanceInfoList().isEmpty());
    assertEquals("Incorrect num results", 1, result.getProcessInstanceInfoList().size());
  }
  @Test
  public void notBeingFilteredTest() {
    int[] pageInfo = {0, 0};
    Map<String, String[]> queryParams = new HashMap<String, String[]>();
    addParams(queryParams, "processinstancestatus", "2");
    addParams(queryParams, "varregex_myobject", "Hello .*");

    JaxbQueryProcessInstanceResult result =
        queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertNotNull("Null result", result);
    assertFalse("Empty result (all)", result.getProcessInstanceInfoList().isEmpty());
    assertEquals("Process instance info results", 2, result.getProcessInstanceInfoList().size());
    for (JaxbQueryProcessInstanceInfo queryInfo : result.getProcessInstanceInfoList()) {
      assertNotNull("No process instance info!", queryInfo.getProcessInstance());
      assertEquals("No variable info!", 1, queryInfo.getVariables().size());
    }
  }
  @Test
  public void queryProcessRestCallTest() throws Exception {
    int pageSize = 5;
    assertTrue(numProcesses > pageSize);
    int[] pageInfo = {0, pageSize};
    Map<String, String[]> queryParams = new HashMap<String, String[]>();

    // simple (everything)
    JaxbQueryProcessInstanceResult result =
        queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertNotNull("Null result", result);
    assertFalse("Empty result (all)", result.getProcessInstanceInfoList().isEmpty());
    assertTrue(
        "Not enough proc info's: " + result.getProcessInstanceInfoList().size(),
        result.getProcessInstanceInfoList().size() > 2);
    assertEquals("Max results", result.getProcessInstanceInfoList().size(), pageSize);

    long procInstMin = Long.MAX_VALUE;
    long procInstMax = -1l;
    for (JaxbQueryProcessInstanceInfo procInfo : result.getProcessInstanceInfoList()) {
      long procInstId = procInfo.getProcessInstance().getId();
      // ordered by proc inst id
      assertTrue(procInstId + " ! >= max " + procInstMax, procInstId >= procInstMax);
      procInstMax = procInstId;
      if (procInstId < procInstMin) {
        procInstMin = procInstId;
      }

      String procId = procInfo.getProcessInstance().getProcessId();
      boolean myType = procId.contains("object");
      for (JaxbVariableInfo varInfo : procInfo.getVariables()) {
        String varVal = (String) varInfo.getValue();
        String varName = varInfo.getName();
        // test object
        assertTrue(procId + ": var value [" + varVal + "]", varVal.contains("{") || !myType);
        assertTrue(
            procInstId + ": var [" + varVal + "]",
            varVal.contains("check") || !varName.equals("inputStr"));
      }
    }

    roundTripJson(result);
    roundTripXml(result);

    // pagination
    pageSize = 2;
    int pageNum = 2;
    pageInfo[0] = pageNum; // offset = ((pageNum-1)*pageSize)-1
    int offset = (pageNum - 1) * pageSize;
    pageInfo[1] = pageSize; // max results
    JaxbQueryProcessInstanceResult newResult =
        queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertNotNull("null result", newResult);
    assertFalse("empty result (all)", newResult.getProcessInstanceInfoList().isEmpty());
    assertTrue(
        "Expected max results of "
            + pageSize
            + ", not "
            + newResult.getProcessInstanceInfoList().size(),
        newResult.getProcessInstanceInfoList().size() == pageSize);
    assertEquals(
        "Expected offset of " + offset + " | ",
        result.getProcessInstanceInfoList().get(offset).getProcessInstance().getId(),
        newResult.getProcessInstanceInfoList().get(0).getProcessInstance().getId());
    pageInfo[0] = pageInfo[1] = 0;

    // complicated
    Long procInstId = null;
    String varName = null;
    String varVal = null;
    for (JaxbQueryProcessInstanceInfo procInfo : result.getProcessInstanceInfoList()) {
      if (procInfo.getProcessInstance().getProcessId().equals(PROCESS_OBJ_VAR_ID)) {
        procInstId = procInfo.getProcessInstance().getId();
        JaxbVariableInfo varInfo = procInfo.getVariables().get(0);
        if (!varInfo.getName().equals("inputStr")) {
          varInfo = procInfo.getVariables().get(1);
        }
        varName = varInfo.getName();
        varVal = (String) varInfo.getValue();
        break;
      }
    }
    assertNotNull("proc inst id", procInstId);
    assertNotNull("var id", varName);
    assertNotNull("var value ", varVal);

    addParams(queryParams, "processinstanceid", procInstId + "");
    addParams(queryParams, "processid_re", "*" + PROCESS_OBJ_VAR_ID.substring(10));

    Calendar cal = GregorianCalendar.getInstance();
    cal.roll(Calendar.DAY_OF_YEAR, +2);
    String tomorowStr = QUERY_PARAM_DATE_FORMAT.format(cal.getTime()).substring(0, 8);
    addParams(queryParams, "enddate_max", tomorowStr);
    String yesterdayStr = "00:00:01";
    addParams(queryParams, "stdt_min", yesterdayStr);
    addParams(queryParams, "var_" + varName, varVal);

    result = queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertNotNull("null result", result);
    assertFalse("empty result", result.getProcessInstanceInfoList().isEmpty());
    assertTrue("more than 1 result", result.getProcessInstanceInfoList().size() == 1);
    JaxbQueryProcessInstanceInfo procInfo = result.getProcessInstanceInfoList().get(0);
    assertNotNull("no proc instance", procInfo.getProcessInstance());
    assertEquals("num variables", 1, procInfo.getVariables().size());

    roundTripJson(result);
    roundTripXml(result);

    // more complicated
    queryParams.clear();
    --procInstMax;
    ++procInstMin;
    addParams(queryParams, "piid_min", String.valueOf(procInstMin));
    addParams(queryParams, "processinstanceid_max", String.valueOf(procInstMax));
    result = queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertNotNull("null result", result);
    assertFalse("empty result", result.getProcessInstanceInfoList().isEmpty());
    assertEquals(
        "number results",
        procInstMax - procInstMin + 1,
        result.getProcessInstanceInfoList().size());
    long findMin = Long.MAX_VALUE;
    long findMax = -1;
    for (JaxbQueryProcessInstanceInfo jaxbProcInfo : result.getProcessInstanceInfoList()) {
      procInstId = jaxbProcInfo.getProcessInstance().getId();
      if (procInstId > findMax) {
        findMax = procInstId;
      }
      if (procInstId < findMin) {
        findMin = procInstId;
      }
    }
    assertEquals("process instance id max", procInstMax, findMax);
    assertEquals("process instance id min", procInstMin, findMin);

    // test bad parameter
    addParams(queryParams, "taskowner", USER_ID);
    boolean exThrown = false;
    try {
      result = queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    } catch (Exception e) {
      exThrown = true;
    }
    assertTrue("Exception not thrown on invalid parameter 'taskowner'", exThrown);

    // varregex test
    queryParams.clear();
    addParams(queryParams, "processinstanceid", procInstId + "");
    addParams(queryParams, "processid_re", "*" + PROCESS_OBJ_VAR_ID.substring(10));

    addParams(queryParams, "vr_" + varName, "X" + varVal.substring(0, 3) + "*");

    result = queryProcInstHelper.queryTasksOrProcInstsAndVariables(queryParams, pageInfo);
    assertNotNull("null result", result);
    assertTrue(
        "Expected empty result: " + result.getProcessInstanceInfoList().size(),
        result.getProcessInstanceInfoList().isEmpty());
  }