Drill provides a simple way to test internal components without a full Drill server (assuming, of course, that the component is structured in a way that allows such testing; something that only a few parts of the code allow at the moment.)
Testing is based on the OperatorFixture
which sets up the basic internal mechanisms:
- Memory allocator
- Operator context
- Fragment context (but without the server-related
DrillbitContext
)
Here is a very simple example to allow testing a UDF that uses VarChar holders, which in turn use DrillBuf, which requires access to a memory allocator:
@Test
public void testDupItFn() throws Exception {
try (OperatorFixture fixture = OperatorFixture.standardFixture()) {
OperatorContext context = fixture.operatorContext(null);
try {
// Test code goes here
} finally {
context.close();
}
}
}
In the above, we simply create an instance of the OperatorFixture
in a try-with-resources block so we can be sure that the memory allocator shuts down, even if the test fails.
Then, since this test needs an OperatorContext
, we go ahead and create one of those. Since it isn't auto-closeable, we run tests in a try/finally block so we can be sure it is closed.
Then, our code that run tests (in this case, that allocates a buffer using the managed allocator) goes in the test block.
Tests that don't need an operator context are even simpler. See Drill code for examples.