DynamoDBCertRecordStoreConnection implements CertRecordStoreConnection { @Override public List<X509CertRecord> updateUnrefreshedCertificatesNotificationTimestamp(String lastNotifiedServer, long lastNotifiedTime, String provider) { try { List<Item> items = getUnrefreshedCertsRecords(lastNotifiedTime, provider); return updateLastNotified(lastNotifiedServer, lastNotifiedTime, items); } catch (Exception ex) { LOGGER.error("DynamoDB updateUnrefreshedCertificatesNotificationTimestamp Error: {}/{}", ex.getClass(), ex.getMessage()); return new ArrayList<>(); } } DynamoDBCertRecordStoreConnection(DynamoDB dynamoDB, final String tableName, String indexName); @Override void setOperationTimeout(int queryTimeout); @Override void close(); @Override X509CertRecord getX509CertRecord(String provider, String instanceId, String service); @Override boolean updateX509CertRecord(X509CertRecord certRecord); @Override boolean insertX509CertRecord(X509CertRecord certRecord); @Override boolean deleteX509CertRecord(String provider, String instanceId, String service); @Override int deleteExpiredX509CertRecords(int expiryTimeMins); @Override List<X509CertRecord> updateUnrefreshedCertificatesNotificationTimestamp(String lastNotifiedServer,
                                                                      long lastNotifiedTime,
                                                                      String provider);  }
@Test public void testUpdateUnrefreshedCertificatesNotificationTimestamp() { DynamoDBCertRecordStoreConnection dbConn = getDBConnection(); ItemCollection<QueryOutcome> itemCollection = Mockito.mock(ItemCollection.class); Date now = new Date(1591706189000L); long nowL = now.getTime(); long fiveDaysAgo = nowL - 5 * 24 * 60 * 60 * 1000; Map<String, AttributeValue> unNotified = generateAttributeValues( "home.test.service2", "testInstance2", null, null, null, null, "testHost1"); Map<String, AttributeValue> reNotified = generateAttributeValues( "home.test.service3", "testInstance3", Long.toString(fiveDaysAgo), Long.toString(fiveDaysAgo), "testServer", null, "testHost1"); Map<String, AttributeValue> willBeUpdatedByOtherZts = generateAttributeValues( "home.test.service4", "testInstance4", Long.toString(fiveDaysAgo), Long.toString(fiveDaysAgo), "testServer", null, "testHost1"); Item item1 = ItemUtils.toItem(unNotified); Item item2 = ItemUtils.toItem(reNotified); Item item3 = ItemUtils.toItem(willBeUpdatedByOtherZts); IteratorSupport<Item, QueryOutcome> iteratorSupport = Mockito.mock(IteratorSupport.class); when(itemCollection.iterator()).thenReturn(iteratorSupport); when(iteratorSupport.hasNext()).thenReturn(true, true, true, false); when(iteratorSupport.next()).thenReturn(item1).thenReturn(item2).thenReturn(item3); Mockito.doReturn(itemCollection).when(index).query(any(QuerySpec.class)); AttributeValue lastNotifiedTimeAttrValue = new AttributeValue(); lastNotifiedTimeAttrValue.setN(Long.toString(nowL)); AttributeValue lastNotifiedServerAttrValue = new AttributeValue(); lastNotifiedServerAttrValue.setS("localhost"); AttributeValue lastNotifiedOtherServerAttrValue = new AttributeValue(); lastNotifiedOtherServerAttrValue.setS("SomeOtherZTS"); unNotified.put("lastNotifiedTime", lastNotifiedTimeAttrValue); unNotified.put("lastNotifiedServer", lastNotifiedServerAttrValue); reNotified.put("lastNotifiedTime", lastNotifiedTimeAttrValue); reNotified.put("lastNotifiedServer", lastNotifiedServerAttrValue); willBeUpdatedByOtherZts.put("lastNotifiedTime", lastNotifiedTimeAttrValue); willBeUpdatedByOtherZts.put("lastNotifiedServer", lastNotifiedOtherServerAttrValue); Item updatedItem1 = ItemUtils.toItem(unNotified); Item updatedItem2 = ItemUtils.toItem(reNotified); Item updatedItem3 = ItemUtils.toItem(willBeUpdatedByOtherZts); UpdateItemOutcome updateItemOutcome1 = Mockito.mock(UpdateItemOutcome.class); when(updateItemOutcome1.getItem()).thenReturn(updatedItem1); UpdateItemOutcome updateItemOutcome2 = Mockito.mock(UpdateItemOutcome.class); when(updateItemOutcome2.getItem()).thenReturn(updatedItem2); UpdateItemOutcome updateItemOutcome3 = Mockito.mock(UpdateItemOutcome.class); when(updateItemOutcome3.getItem()).thenReturn(updatedItem3); when(table.updateItem(any(UpdateItemSpec.class))).thenReturn(updateItemOutcome1).thenReturn(updateItemOutcome2).thenReturn(updateItemOutcome3); List<X509CertRecord> records = dbConn.updateUnrefreshedCertificatesNotificationTimestamp( "localhost", nowL, "provider"); assertEquals(records.size(), 2); assertNull(records.get(0).getCurrentTime()); assertEquals(records.get(0).getService(), "home.test.service2"); assertEquals(records.get(0).getLastNotifiedTime(), now); assertEquals(records.get(1).getCurrentTime().getTime(), fiveDaysAgo); assertEquals(records.get(1).getService(), "home.test.service3"); assertEquals(records.get(1).getLastNotifiedTime(), now); }