@Test
  public void testPrintChecksumErrorStateForReplica()
      throws IOException, NoSuchFieldException, IllegalAccessException {
    MockFileBasedActiveBitPreservation fbabp = new MockFileBasedActiveBitPreservation();
    JspWriter jw = new MockJspWriter();
    BitpreserveFileState.printChecksumErrorStateForReplica(
        jw, Replica.getReplicaFromId("ONE"), new Locale("da"));

    assertTrue(
        "Number of changed files should be called by a bitarchive replica",
        fbabp.calls.get(NUM_CHANGED_FILES).contains("ONE"));
    assertFalse(
        "Number of changed files should not be called by the Checksum replica.",
        fbabp
            .calls
            .get(NUM_CHANGED_FILES)
            .contains(Replica.getReplicaFromId("THREE").getType().name()));

    assertTrue(
        "Date for changed files should be called by replica ONE",
        fbabp.calls.get(DATE_CHANGED_FILES).contains("ONE"));
    assertFalse(
        "Date for changed files should not have been called by replica THREE",
        fbabp.calls.get(DATE_CHANGED_FILES).contains("THREE"));

    fbabp.calls.clear();
  }
  @Test
  public void testProcessChecksumRequest() throws NoSuchFieldException, IllegalAccessException {
    MockFileBasedActiveBitPreservation mockabp = new MockFileBasedActiveBitPreservation();
    TestServletRequest request = new TestServletRequest();
    Locale l = new Locale("da");
    mockabp.calls.clear();

    // Setup to neither run checksum nor find-missing-files.
    Map<String, String[]> parameters = new HashMap<String, String[]>();
    parameters.put(
        dk.netarkivet.archive.webinterface.Constants.BITARCHIVE_NAME_PARAM,
        new String[] {Replica.getReplicaFromId("ONE").getName()});
    parameters.put(dk.netarkivet.archive.webinterface.Constants.FILENAME_PARAM, (String[]) null);
    parameters.put(
        dk.netarkivet.archive.webinterface.Constants.FIX_ADMIN_CHECKSUM_PARAM, (String[]) null);
    parameters.put(dk.netarkivet.archive.webinterface.Constants.CREDENTIALS_PARAM, (String[]) null);
    parameters.put(dk.netarkivet.archive.webinterface.Constants.CHECKSUM_PARAM, (String[]) null);
    request.setParameterMap(parameters);

    StringBuilder res = new StringBuilder();
    PageContext context =
        dk.netarkivet.common.webinterface.WebinterfaceTestCase.getDummyPageContext(l, request);

    PreservationState ps = BitpreserveFileState.processChecksumRequest(res, context);
    assertNull("Only null arguments, should give a null result.", ps);
  }
  @Test
  // Tests both printFileName, printFileState
  public void testPrints() throws Exception {
    MockJspWriter jspout = new MockJspWriter();
    Locale l = new Locale("da");

    BitpreserveFileState.printFileName(jspout, "filename", 0, l);

    // jspout.
  }
  @Test
  public void testPrintMissingFileStateForReplica()
      throws IOException, NoSuchFieldException, IllegalAccessException {
    MockFileBasedActiveBitPreservation fbabp = new MockFileBasedActiveBitPreservation();
    JspWriter fw = new MockJspWriter();
    BitpreserveFileState.printMissingFileStateForReplica(
        fw, Replica.getReplicaFromId("ONE"), new Locale("da"));
    BitpreserveFileState.printMissingFileStateForReplica(
        fw, Replica.getReplicaFromId("TWO"), new Locale("da"));

    assertTrue(
        "Number of missing files should be called by a bitarchive replica",
        fbabp
            .calls
            .get(NUM_MISSING_FILES)
            .contains(Replica.getReplicaFromId("ONE").getType().name()));
    assertFalse(
        "Number of missing files should not be called by the Checksum replica.",
        fbabp
            .calls
            .get(NUM_MISSING_FILES)
            .contains(Replica.getReplicaFromId("THREE").getType().name()));
    assertEquals(
        "Number of missing files should be put into the array 2 times",
        2,
        fbabp.calls.get(NUM_MISSING_FILES).size());

    assertTrue(
        "Number of files should be called by replica ONE",
        fbabp.calls.get(NUM_FILES).contains("ONE"));
    assertFalse(
        "Number of file should not have been called by replica THREE",
        fbabp.calls.get(NUM_FILES).contains("THREE"));

    assertTrue(
        "Date for missing files should be called by replica TWO",
        fbabp.calls.get(DATE_MISSING_FILES).contains("TWO"));
    assertFalse(
        "Date for missing files should not have been called by replica THREE",
        fbabp.calls.get(DATE_MISSING_FILES).contains("THREE"));

    fbabp.calls.clear();
  }
  @Test
  public void testMakeCheckbox() throws NoSuchFieldException, IllegalAccessException {
    String res = BitpreserveFileState.makeCheckbox("TEST-COMMAND", "TEST-ARG1", "TEST-ARG2");

    assertTrue("Should contain the TEST-COMMAND", res.contains("name=\"TEST-COMMAND\""));
    assertTrue(
        "Should contain TEST-ARG1 and TEST-ARG2 seperated by "
            + dk.netarkivet.archive.webinterface.Constants.STRING_FILENAME_SEPARATOR
            + " but the result was "
            + res,
        res.contains(
            "value=\""
                + "TEST-ARG1"
                + dk.netarkivet.archive.webinterface.Constants.STRING_FILENAME_SEPARATOR
                + "TEST-ARG2"
                + "\""));
  }
  /**
   * FIXME fails after new threadbased implementation
   *
   * @throws NoSuchFieldException
   * @throws IllegalAccessException
   */
  @Test
  public void testUpdateRequest() throws NoSuchFieldException, IllegalAccessException {
    MockFileBasedActiveBitPreservation mockabp = new MockFileBasedActiveBitPreservation();
    MockHttpServletRequest request = new MockHttpServletRequest();

    Locale l = new Locale("da");
    mockabp.calls.clear();

    // Setup to run find-missing-files
    request = new MockHttpServletRequest();
    request.setupAddParameter(
        dk.netarkivet.archive.webinterface.Constants.BITARCHIVE_NAME_PARAM,
        new String[] {Replica.getReplicaFromId("ONE").getName()});

    request.setupAddParameter(
        dk.netarkivet.archive.webinterface.Constants.UPDATE_TYPE_PARAM,
        new String[] {dk.netarkivet.archive.webinterface.Constants.FIND_MISSING_FILES_OPTION});

    BitpreserveFileState.processUpdateRequest(WebinterfaceTestCase.getDummyPageContext(l, request));

    // TODO something here to avoid the failure!!

    // assertTrue("One calls to Find Missing Files expected",
    // mockabp.calls.containsKey(FIND_MISSING_FILES));
    // assertFalse("No calls to Find Checksum expected",
    // mockabp.calls.containsKey(FIND_CHECKSUM));
    // mockabp.calls.clear();
    //
    // // Setup to run find-checksum
    // request = new MockHttpServletRequest();
    // request.setupAddParameter(dk.netarkivet.archive.webinterface.Constants.BITARCHIVE_NAME_PARAM,
    // new String[]{Replica.getReplicaFromId("ONE").getName()});
    // request.setupAddParameter(dk.netarkivet.archive.webinterface.Constants.UPDATE_TYPE_PARAM,
    // new String[]{dk.netarkivet.archive.webinterface.Constants.CHECKSUM_OPTION});
    //
    // BitpreserveFileState.processUpdateRequest(WebinterfaceTestCase.getDummyPageContext(l,
    // request));
    //
    // assertFalse("No calls to Find Missing Files expected",
    // mockabp.calls.containsKey(FIND_MISSING_FILES));
    // assertTrue("One calls to Find Checksum expected",
    // mockabp.calls.containsKey(FIND_CHECKSUM));
    // mockabp.calls.clear();
  }
  @Test
  public void testProcessMissingRequest() throws Exception {

    Settings.set(
        ArchiveSettings.DIR_ARCREPOSITORY_BITPRESERVATION, TestInfo.WORKING_DIR.getAbsolutePath());
    Settings.set(ArchiveSettings.DIRS_ARCREPOSITORY_ADMIN, TestInfo.WORKING_DIR.getAbsolutePath());

    // Ensure that a admin data exists before we start.
    AdminData.getUpdateableInstance();

    MockFileBasedActiveBitPreservation mockabp = new MockFileBasedActiveBitPreservation();
    MockHttpServletRequest request = new MockHttpServletRequest();
    String replicaID1 = "ONE";
    String replicaID2 = "TWO";
    String filename1 = "foo";
    String filename2 = "bar";
    Locale defaultLocale = new Locale("da");

    // First test a working set of params
    Map<String, String[]> args = new HashMap<String, String[]>();
    args.put(
        ADD_COMMAND,
        new String[] {
          Replica.getReplicaFromId(replicaID1).getName() + STRING_FILENAME_SEPARATOR + filename1
        });
    request.setupAddParameter(
        ADD_COMMAND,
        new String[] {
          Replica.getReplicaFromId(replicaID1).getName() + STRING_FILENAME_SEPARATOR + filename1
        });
    args.put(GET_INFO_COMMAND, new String[] {filename1});
    request.setupAddParameter(GET_INFO_COMMAND, new String[] {filename1});
    args.put(BITARCHIVE_NAME_PARAM, new String[] {Replica.getReplicaFromId(replicaID1).getName()});
    request.setupAddParameter(
        BITARCHIVE_NAME_PARAM, new String[] {Replica.getReplicaFromId(replicaID1).getName()});
    request.setupGetParameterMap(args);
    request.setupGetParameterNames(new Vector<String>(args.keySet()).elements());
    Map<String, PreservationState> status =
        BitpreserveFileState.processMissingRequest(
            WebinterfaceTestCase.getDummyPageContext(defaultLocale, request), new StringBuilder());
    assertEquals("Should have one call to reestablish", 1, mockabp.getCallCount(ADD_METHOD));
    assertEquals(
        "Should have one call to getFilePreservationStatus",
        1,
        mockabp.getCallCount(GET_INFO_METHOD));
    assertEquals("Should have one info element (with mock results)", null, status.get(filename1));

    // Check that we can call without any params
    mockabp.calls.clear();
    request = new MockHttpServletRequest();
    args.clear();
    args.put(BITARCHIVE_NAME_PARAM, new String[] {Replica.getReplicaFromId(replicaID1).getName()});
    request.setupAddParameter(
        BITARCHIVE_NAME_PARAM, new String[] {Replica.getReplicaFromId(replicaID1).getName()});
    request.setupGetParameterMap(args);
    status =
        BitpreserveFileState.processMissingRequest(
            WebinterfaceTestCase.getDummyPageContext(defaultLocale, request), new StringBuilder());
    assertEquals("Should have no call to restablish", 0, mockabp.getCallCount(ADD_METHOD));
    assertEquals(
        "Should have no call to getFilePreservationStatus",
        0,
        mockabp.getCallCount(GET_INFO_METHOD));
    assertEquals("Should have no status", 0, status.size());

    // Check that we can handle more than one call to each and that the
    // args are correct.
    mockabp.calls.clear();
    request = new MockHttpServletRequest();
    args.clear();
    args.put(BITARCHIVE_NAME_PARAM, new String[] {Replica.getReplicaFromId(replicaID2).getName()});
    request.setupAddParameter(
        BITARCHIVE_NAME_PARAM, new String[] {Replica.getReplicaFromId(replicaID2).getName()});
    request.setupAddParameter(
        ADD_COMMAND,
        new String[] {
          Replica.getReplicaFromId(replicaID2).getName() + STRING_FILENAME_SEPARATOR + filename1,
          Replica.getReplicaFromId(replicaID2).getName() + STRING_FILENAME_SEPARATOR + filename1
        });
    args.put(
        ADD_COMMAND,
        new String[] {
          Replica.getReplicaFromId(replicaID2).getName() + STRING_FILENAME_SEPARATOR + filename1,
          Replica.getReplicaFromId(replicaID2).getName() + STRING_FILENAME_SEPARATOR + filename1
        });
    request.setupAddParameter(GET_INFO_COMMAND, new String[] {filename1, filename2, filename1});
    args.put(GET_INFO_COMMAND, new String[] {filename1, filename2, filename1});
    request.setupGetParameterMap(args);
    status =
        BitpreserveFileState.processMissingRequest(
            WebinterfaceTestCase.getDummyPageContext(defaultLocale, request), new StringBuilder());
    assertEquals("Should have two calls to restablish", 2, mockabp.getCallCount(ADD_METHOD));
    assertEquals(
        "Should have three calls to getFilePreservationStatus",
        3,
        mockabp.getCallCount(GET_INFO_METHOD));
    assertEquals("Should have two info elements", 2, status.size());
    assertEquals("Should have info for filename1", null, status.get(filename1));
    assertEquals("Should have info for filename2", null, status.get(filename2));

    // Iterator<String> it = mockabp.calls.get(ADD_METHOD).iterator();
    // while (it.hasNext()) {
    // System.out.println(it.next());
    // }

    CollectionAsserts.assertIteratorEquals(
        "Should have the args given add",
        Arrays.asList(new String[] {filename1 + "," + replicaID2, filename1 + "," + replicaID2})
            .iterator(),
        mockabp.calls.get(ADD_METHOD).iterator());

    CollectionAsserts.assertIteratorEquals(
        "Should have the args given info",
        Arrays.asList(new String[] {filename1, filename2, filename1}).iterator(),
        mockabp.calls.get(GET_INFO_METHOD).iterator());
  }