DataNodeFaultInjector { public void delaySendingAckToUpstream(final String upstreamAddr) throws IOException { }  static DataNodeFaultInjector get(); static void set(DataNodeFaultInjector injector); void getHdfsBlocksMetadata(); void writeBlockAfterFlush(); void sendShortCircuitShmResponse(); boolean dropHeartbeatPacket(); void stopSendingPacketDownstream(final String mirrAddr); void logDelaySendingPacketDownstream(
      final String mirrAddr,
      final long delayMs); void delaySendingAckToUpstream(final String upstreamAddr); void logDelaySendingAckToUpstream(
      final String upstreamAddr,
      final long delayMs); void noRegistration(); void failMirrorConnection(); void failPipeline(ReplicaInPipeline replicaInfo,
      String mirrorAddr); void startOfferService(); void endOfferService(); void throwTooManyOpenFiles(); void stripedBlockReconstruction(); void delayWhenOfferServiceHoldLock(); void blockUtilSendFullBlockReport();  }
@Test(timeout = 60000) public void testDelaySendingAckToUpstream() throws Exception { final MetricsDataNodeFaultInjector mdnFaultInjector = new MetricsDataNodeFaultInjector() { @Override public void delaySendingAckToUpstream(final String upstreamAddr) throws IOException { delayOnce(); } @Override public void logDelaySendingAckToUpstream(final String upstreamAddr, final long delayMs) throws IOException { logDelay(delayMs); } }; verifyFaultInjectionDelayPipeline(mdnFaultInjector); }