TSM - Aeronautical Bug Fix

Cătălin Roman - Lead Software Architect @Frequentis

În numărul 104 vă prezentam un bug ce se reproducea o dată la 23 de ani, într-un sistem informatic folosit pentru navigație aeriană și lansam un concurs pentru rezolvarea lui.

Cele mai bune soluții au venit de la Remus Gabor, Product Owner la o firmă din Cluj-Napoca și Ovidiu Zakarias, QA Automation Engineer tot din Cluj-Napoca.

Aceștia au fost premiați deja de Frequentis România și le transmitem felicitări încă odată.

Metoda de mai jos convertește un cod AIRAC Cycle într-un timestamp, iar pentru fixarea bugului, a fost necesar să se țină cont de anii bisecți și de faptul că o dată la 23 de ani există 14 cicluri AIRAC.

public String transformAIRACDateToISO(String airacCycle) {
  if (airacCycle != null && airacCycle.length() >= 4) {
    int year = Integer.parseInt(airacCycle.substring(0, 2));
    int cycle = Integer.parseInt(airacCycle.substring(2, 4));
    DateTime startingDateRef = new DateTime(2010, 1, 14, 0, 0, DateTimeZone.UTC);
    DateTime lastDayFromPrevYear = new DateTime(2000 + year - 1, 12, 31, 0, 0, DateTimeZone.UTC);
    int remainingDaysFromPrevYear = Days.daysBetween(startingDateRef, lastDayFromPrevYear).getDays() % 28;

    return  ISODateTimeFormat.dateTime()
         .print(lastDayFromPrevYear
         .plusDays(28 - remainingDaysFromPrevYear + (cycle - 1) * 28));
   }

  return "2012-06-28T00:00:00.000Z";
}

Iar acesta e unit testul aferent:

@Test
public void testTransformAIRACtoISO() {
  assertEquals("2020-12-31T00:00:00.000Z",
    transformAIRACDateToISO("2014"));
  assertEquals("2021-01-28T00:00:00.000Z",
    transformAIRACDateToISO("2101"));
  assertEquals("2022-12-29T00:00:00.000Z",
    transformAIRACDateToISO("2213"));
  assertEquals("2043-12-31T00:00:00.000Z",
    transformAIRACDateToISO("4314"));
  assertEquals("2044-01-28T00:00:00.000Z",
    transformAIRACDateToISO("4401"));
}