OperatorFixture

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.