@Test(enabled = ENABLE_TESTS)
public void testBZ884338_2() throws Exception {
beginTx();
try {
Availability avail;
AvailabilityReport report;
setupResource();
commitAndClose();
long allAvailCount = setUpAvailabilities();
assertTrue("should have >= 3 avail records", 3 <= allAvailCount);
List<Availability> avails = getResourceAvailabilities(theResource);
// there is always the UNKNOWN period starting at epoch, plus the three created in setup
assertEquals(avails.toString(), 4, avails.size());
// we now have 1:00 UP, 1:20 DOWN, 1:40 UP
avail = availabilityManager.getCurrentAvailabilityForResource(overlord, theResource.getId());
beginTx();
avail = em.find(Availability.class, avail.getId());
assert avail.getAvailabilityType() == UP;
// mess things up by assigning an end time to the latest avail record.
Long currentStartTime = avail.getStartTime();
Long nonNullEndTime = currentStartTime + 1000L;
avail.setEndTime(nonNullEndTime);
avail = em.merge(avail);
commitAndClose();
// try to insert new avail, this should trigger the repair code
long newStartTime = (currentStartTime + (5 * 60 * 1000L));
avail = new Availability(theResource, newStartTime, DOWN);
report = new AvailabilityReport(false, theAgent.getName());
report.addAvailability(avail);
Thread.sleep(1000);
availabilityManager.mergeAvailabilityReport(report);
// the end time of avail 4 should have been reset to the start time of avail 5. Avail 5 should have been
// added and should be DOWN
avails = getResourceAvailabilities(theResource);
assertEquals(avails.toString(), 5, avails.size());
// avail start times should now be 0, 1:00 (UP), 1:20(DOWN), 1:40(UP), 1:45(DOWN)
avail = avails.get(0); // 0..1:00
assertTrue(avail.toString(), Math.abs(avail.getStartTime() - 0L) < 1000L);
assertEquals(avail.toString(), AvailabilityType.UNKNOWN, avail.getAvailabilityType());
assertTrue(avail.toString(), Math.abs(avail.getEndTime() - avails.get(1).getStartTime()) < 1000L);
avail = avails.get(1); // 1:00..1:20
assertTrue(avail.toString(), Math.abs(newStartTime - (avail.getStartTime() + (45 * 60 * 1000))) < 1000L);
assertEquals(avail.toString(), AvailabilityType.UP, avail.getAvailabilityType());
assertTrue(avail.toString(), Math.abs(avail.getEndTime() - avails.get(2).getStartTime()) < 1000L);
avail = avails.get(2); // 1:20..1:40
assertTrue(avail.toString(), Math.abs(newStartTime - (avail.getStartTime() + (25 * 60 * 1000))) < 1000L);
assertEquals(avail.toString(), AvailabilityType.DOWN, avail.getAvailabilityType());
assertTrue(avail.toString(), Math.abs(avail.getEndTime() - avails.get(3).getStartTime()) < 1000L);
avail = avails.get(3); // 1:40..1:45
assertTrue(avail.toString(), Math.abs(newStartTime - (avail.getStartTime() + (5 * 60 * 1000))) < 1000L);
assertEquals(avail.toString(), AvailabilityType.UP, avail.getAvailabilityType());
assertTrue(avail.toString(), Math.abs(avail.getEndTime() - avails.get(4).getStartTime()) < 1000L); // THE FIX
avail = avails.get(4); // 1:45..null
assertTrue(avail.toString(), Math.abs(newStartTime - avail.getStartTime()) < 1000L);
assertEquals(avail.toString(), AvailabilityType.DOWN, avail.getAvailabilityType());
assertEquals(avail.toString(), null, avail.getEndTime());
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {