@Test
  public void testEmptyLastUpdateWithFullStash() throws Exception {
    assumeFalse(TinkFips.useOnlyFips());
    ChunkedMac mac = new ChunkedAesCmacImpl(AesCmacTestUtil.FILL_UP_EXACTLY_INTERNAL_STATE.key);

    ChunkedMacComputation macComputation = mac.createComputation();
    macComputation.update(ByteBuffer.wrap(AesCmacTestUtil.FILL_UP_EXACTLY_INTERNAL_STATE.message));
    macComputation.update(ByteBuffer.wrap(new byte[0]));
    assertThat(AesCmacTestUtil.FILL_UP_EXACTLY_INTERNAL_STATE.tag)
        .isEqualTo(macComputation.computeMac());

    ChunkedMacVerification macVerification =
        mac.createVerification(AesCmacTestUtil.FILL_UP_EXACTLY_INTERNAL_STATE.tag);
    macVerification.update(ByteBuffer.wrap(AesCmacTestUtil.FILL_UP_EXACTLY_INTERNAL_STATE.message));
    macVerification.update(ByteBuffer.wrap(new byte[0]));
    macVerification.verifyMac();
  }
A cute little table to help verify that the tests below indeed cover the major (when not all)
code paths in our streaming AesCmac implementation:

<p>-------------------------------------
| Inner state | Amount of new data |  # |
----------------------------------------
| empty       | empty              |  0 |
| empty       | not overflowing    |  1 |
| empty       | overflowing        |  2 |
| empty       | a lot              |  3 |
----------------------------------------
| some data   | empty              |  4 |
| some data   | not overflowing    |  5 |
| some data   | overflowing        |  6 |
| some data   | a lot              |  7 |
----------------------------------------
| full        | empty              |  8 |
| full        | not overfl. (^)    |  9 |
| full        | overflowing        | 10 |
| full        | a lot              | 11 |
----------------------------------------
java_src/src/test/java/com/google/crypto/tink/mac/internal/ChunkedAesCmacTest.java