@Test
  public void testNewHeadersAreAddedByMerge() throws IOException {

    Header[] headers = {
      new BasicHeader("Date", formatDate(requestDate)), new BasicHeader("ETag", "\"etag\"")
    };

    entry = HttpTestUtils.makeCacheEntry(headers);
    response.setHeaders(
        new Header[] {
          new BasicHeader("Last-Modified", formatDate(responseDate)),
          new BasicHeader("Cache-Control", "public"),
        });

    HttpCacheEntry updatedEntry =
        impl.updateCacheEntry(null, entry, new Date(), new Date(), response);

    Header[] updatedHeaders = updatedEntry.getAllHeaders();
    assertEquals(4, updatedHeaders.length);

    headersContain(updatedHeaders, "Date", formatDate(requestDate));
    headersContain(updatedHeaders, "ETag", "\"etag\"");
    headersContain(updatedHeaders, "Last-Modified", formatDate(responseDate));
    headersContain(updatedHeaders, "Cache-Control", "public");
  }
 @Test
 public void testUpdateCacheEntryReturnsDifferentEntryInstance() throws IOException {
   entry = HttpTestUtils.makeCacheEntry();
   HttpCacheEntry newEntry =
       impl.updateCacheEntry(null, entry, requestDate, responseDate, response);
   assertNotSame(newEntry, entry);
 }
  @Test
  public void testUpdatedEntryHasLatestRequestAndResponseDates() throws IOException {
    entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo);
    HttpCacheEntry updated =
        impl.updateCacheEntry(null, entry, twoSecondsAgo, oneSecondAgo, response);

    assertEquals(twoSecondsAgo, updated.getRequestDate());
    assertEquals(oneSecondAgo, updated.getResponseDate());
  }
 @Test
 public void cannotUpdateFromANon304OriginResponse() throws Exception {
   entry = HttpTestUtils.makeCacheEntry();
   response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
   try {
     impl.updateCacheEntry("A", entry, new Date(), new Date(), response);
     fail("should have thrown exception");
   } catch (IllegalArgumentException expected) {
   }
 }
  @Test
  public void entryWithMalformedDateIsStillUpdated() throws Exception {
    Header[] headers = {new BasicHeader("ETag", "\"old\""), new BasicHeader("Date", "bad-date")};
    entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
    response.setHeader("ETag", "\"new\"");
    response.setHeader("Date", formatDate(twoSecondsAgo));
    HttpCacheEntry updated =
        impl.updateCacheEntry(null, entry, twoSecondsAgo, oneSecondAgo, response);

    assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
  }
 @Test
 public void oldHeadersRetainedIfResponseOlderThanEntry() throws Exception {
   Header[] headers = {
     new BasicHeader("Date", formatDate(oneSecondAgo)), new BasicHeader("ETag", "\"new-etag\"")
   };
   entry = HttpTestUtils.makeCacheEntry(twoSecondsAgo, now, headers);
   response.setHeader("Date", formatDate(tenSecondsAgo));
   response.setHeader("ETag", "\"old-etag\"");
   HttpCacheEntry result = impl.updateCacheEntry("A", entry, new Date(), new Date(), response);
   assertEquals(2, result.getAllHeaders().length);
   headersContain(result.getAllHeaders(), "Date", formatDate(oneSecondAgo));
   headersContain(result.getAllHeaders(), "ETag", "\"new-etag\"");
 }
  @Test
  public void entry1xxWarningsAreRemovedOnUpdate() throws Exception {
    Header[] headers = {
      new BasicHeader("Warning", "110 fred \"Response is stale\""),
      new BasicHeader("ETag", "\"old\""),
      new BasicHeader("Date", formatDate(eightSecondsAgo))
    };
    entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
    response.setHeader("ETag", "\"new\"");
    response.setHeader("Date", formatDate(twoSecondsAgo));
    HttpCacheEntry updated =
        impl.updateCacheEntry(null, entry, twoSecondsAgo, oneSecondAgo, response);

    assertEquals(0, updated.getHeaders("Warning").length);
  }
  @Test
  public void testHeadersAreMergedCorrectly() throws IOException {
    Header[] headers = {
      new BasicHeader("Date", formatDate(responseDate)), new BasicHeader("ETag", "\"etag\"")
    };
    entry = HttpTestUtils.makeCacheEntry(headers);
    response.setHeaders(new Header[] {});

    HttpCacheEntry updatedEntry =
        impl.updateCacheEntry(null, entry, new Date(), new Date(), response);

    Header[] updatedHeaders = updatedEntry.getAllHeaders();
    assertEquals(2, updatedHeaders.length);
    headersContain(updatedHeaders, "Date", formatDate(responseDate));
    headersContain(updatedHeaders, "ETag", "\"etag\"");
  }