DatagramChannel channel1 = TestUtils.getDatagramChannel(conf1.getPort());
DatagramChannel channel2 = TestUtils.getDatagramChannel(conf2.getPort());
// Ask 2 for A rec
Message query = Message.newQuery(
Record.newRecord(new Name("foo.example.com."), Type.A, DClass.IN));
channel2.write(ByteBuffer.wrap(query.toWire()));
// Make sure only 2 replies
latch.await(2, TimeUnit.SECONDS);
Thread.sleep(100);
ByteBuffer buf = ByteBuffer.allocate(100);
channel2.read(buf);
Message message = new Message(buf.array());
Record answer = message.getSectionArray(Section.ANSWER)[0];
String addr = ((ARecord)answer).getAddress().getHostAddress();
Assert.assertEquals("1.2.3.4", addr);
Thread.sleep(50); // in case 1 is a bit slow
buf.clear();
int count = channel1.read(buf);
Assert.assertEquals(0, count); // There should be no noutput from 1
// Ask 1 for A rec
// Make sure it came from cache
update.address = "1.2.3.40"; // if our client is asked, would answer thus
channel1.write(ByteBuffer.wrap(query.toWire()));
Thread.sleep(50); // make sure our client would have time to answer
buf.clear();
channel1.read(buf);
message = new Message(buf.array());
answer = message.getSectionArray(Section.ANSWER)[0];
addr = ((ARecord)answer).getAddress().getHostAddress();
Assert.assertEquals("1.2.3.4", addr);
// Shut down frontend 2
// Make sure frontend 1 is still answering
frontend2.stop();
channel1.write(ByteBuffer.wrap(query.toWire()));
Thread.sleep(50); // make sure our client would have time to answer
buf.clear();
channel1.read(buf);
message = new Message(buf.array());
answer = message.getSectionArray(Section.ANSWER)[0];
addr = ((ARecord)answer).getAddress().getHostAddress();
Assert.assertEquals("1.2.3.4", addr);
// Start frontend 3