@Test
public void ensuresThatNoOpsMustHappenUntilSubscriptionInCaseOfFnfCall() {

  Payload payload1 = ByteBufPayload.create("abc1");
  Mono<Void> fnf1 = rule.socket.fireAndForget(payload1);
  Payload payload2 = ByteBufPayload.create("abc2");
  Mono<Void> fnf2 = rule.socket.fireAndForget(payload2);
  Assertions.assertThat(rule.connection.getSent()).isEmpty();
  // checks that fnf2 should have id 1 even though it was generated later than fnf1
  AssertSubscriber<Void> voidAssertSubscriber2 = fnf2.subscribeWith(AssertSubscriber.create(0));
  voidAssertSubscriber2.assertTerminated().assertNoError();
  Assertions.assertThat(rule.connection.getSent())
      .hasSize(1)
      .first()
      .matches(bb -> frameType(bb) == REQUEST_FNF)
      .matches(bb -> FrameHeaderCodec.streamId(bb) == 1)
      // ensures that this is fnf1 with abc2 data
      .matches(
          bb ->
              ByteBufUtil.equals(
                  RequestFireAndForgetFrameCodec.data(bb),
                  Unpooled.wrappedBuffer("abc2".getBytes())))
      .matches(ReferenceCounted::release);
  rule.connection.clearSendReceiveBuffers();
  // checks that fnf1 should have id 3 even though it was generated earlier
  AssertSubscriber<Void> voidAssertSubscriber1 = fnf1.subscribeWith(AssertSubscriber.create(0));
  voidAssertSubscriber1.assertTerminated().assertNoError();
  Assertions.assertThat(rule.connection.getSent())
      .hasSize(1)
      .first()
      .matches(bb -> frameType(bb) == REQUEST_FNF)
      .matches(bb -> FrameHeaderCodec.streamId(bb) == 3)
      // ensures that this is fnf1 with abc1 data
      .matches(
          bb ->
              ByteBufUtil.equals(
                  RequestFireAndForgetFrameCodec.data(bb),
                  Unpooled.wrappedBuffer("abc1".getBytes())))
      .matches(ReferenceCounted::release);
}