<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-afrind-moq-test-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="moq-test">MoQT Test</title>
    <seriesInfo name="Internet-Draft" value="draft-afrind-moq-test-01"/>
    <author fullname="Alan Frindell">
      <organization>Meta</organization>
      <address>
        <email>afrind@meta.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area/>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>moq</keyword>
    <abstract>
      <?line 35?>

<t>This document specifies the moq-test protocol, a testing protocol for Media over QUIC (MOQ) implementations. moq-test utilizes the Track Namespace as parameters to the publisher, enabling flexible and customizable testing scenarios.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://afrind.github.io/moq-test/draft-afrind-moq-test.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-afrind-moq-test/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC  mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/afrind/moq-test"/>.</t>
    </note>
  </front>
  <middle>
    <?line 39?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>moq-test is designed to provide a comprehensive testing framework for MOQ implementations. By leveraging the Track Namespace, moq-test allows testers to specify various parameters that control the testing process, such as forwarding preferences, group and object ranges, and object sizes.</t>
    </section>
    <section anchor="track-namespace-parameters">
      <name>Track Namespace Parameters</name>
      <t>The moq-test protocol utilizes the Track Namespace to convey testing parameters from the publisher to the subscriber. The Track Namespace tuple fields are defined as follows.  Exactly 16 tuple fields must be provided, but any blank tuple field other than field 0 indicates the default value is used.  Future versions will use a different value for tuple field 0 and potentially define a different set of parameters.</t>
      <section anchor="tuple-field-0-moq-test-00">
        <name>Tuple Field 0: "moq-test-00"</name>
        <t>This field indicates that the Track Namespace parameters are for the moq-test protocol.</t>
      </section>
      <section anchor="tuple-field-1-forwarding-preference">
        <name>Tuple Field 1: Forwarding Preference</name>
        <t>This field specifies the forwarding preference for the track. The following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>0 := One subgroup per group</t>
          </li>
          <li>
            <t>1 := One subgroup per object</t>
          </li>
          <li>
            <t>2 := Two subgroups per group (0 and 1)</t>
          </li>
          <li>
            <t>3 := Datagram</t>
          </li>
        </ul>
        <t>The default value is 0.  When using two subgroups per group, even numbered objects are sent on subgroup 0 and odd numbered objects are sent on group 1.</t>
      </section>
      <section anchor="tuple-field-2-start-group">
        <name>Tuple Field 2: Start Group</name>
        <t>This field specifies the starting group number for the track.  The default value is 0.</t>
      </section>
      <section anchor="tuple-field-3-start-object">
        <name>Tuple Field 3: Start Object</name>
        <t>This field specifies the starting object number for each group in the track.
The default value is 0.</t>
      </section>
      <section anchor="tuple-field-4-last-group-in-track">
        <name>Tuple Field 4: Last Group in Track</name>
        <t>This field specifies the last group number in the track.  The default value is 2^62 - 1 (eg: the track continues until unsubscribed).</t>
        <t>Use caution when setting this field accessing this track via FETCH.</t>
      </section>
      <section anchor="tuple-field-5-last-object-in-track">
        <name>Tuple Field 5: Last Object in Track</name>
        <t>This field specifies the last object number in the track.  The maximum value is the number of objects in the group, plus one if end of group markers are used.</t>
        <t>The default value is the maximum value.</t>
      </section>
      <section anchor="tuple-field-6-objects-per-group">
        <name>Tuple Field 6: Objects per Group</name>
        <t>This field specifies the number of objects per group.  The default is 10.</t>
      </section>
      <section anchor="tuple-field-7-size-of-object-0">
        <name>Tuple Field 7: Size of Object 0</name>
        <t>This field specifies the size of the first object in bytes.  The default is 1024 bytes.</t>
      </section>
      <section anchor="tuple-field-8-size-of-objects-0">
        <name>Tuple Field 8: Size of Objects &gt; 0</name>
        <t>This specifies the size of objects with ID greater than 0, in bytes.  The default value is 100 bytes.</t>
      </section>
      <section anchor="tuple-field-9-object-frequency">
        <name>Tuple Field 9: Object Frequency</name>
        <t>This field specifies the frequency at which objects are sent in milliseconds.  The default value is 1000.</t>
      </section>
      <section anchor="tuple-field-10-group-increment">
        <name>Tuple Field 10: Group Increment</name>
        <t>This field specifies the increment between group numbers.  The default is 1.</t>
      </section>
      <section anchor="tuple-field-11-object-increment">
        <name>Tuple Field 11: Object Increment</name>
        <t>This tuple field specifies the increment between object numbers.  The default is 1.</t>
      </section>
      <section anchor="tuple-field-12-send-end-of-group-markers">
        <name>Tuple Field 12: Send End of Group Markers</name>
        <t>This field specifies whether to send end of group markers.</t>
        <ul spacing="normal">
          <li>
            <t>0 := Do not send End of Group markers</t>
          </li>
          <li>
            <t>1 := Send End of Group markers</t>
          </li>
        </ul>
        <t>End of group markers are an Object with status 0x3 End of Group.</t>
        <t>The default value is 0 / No End of Group markers.</t>
      </section>
      <section anchor="tuple-field-13-test-integer-extension">
        <name>Tuple Field 13: Test Integer Extension</name>
        <t>This field specifies whether to include a test integer extension on every object in the track.  The ID of the extension is 2 * field value.  The value of the extension is random.</t>
        <t>The default value indicates no integer extension is sent.</t>
      </section>
      <section anchor="tuple-field-14-test-variable-extensions">
        <name>Tuple Field 14: Test Variable Extensions</name>
        <t>This field specifies whether to include a test variable extension on every object in the track.  The ID of the extension is 2 * field value + 1.  The value of the extension is random data.</t>
        <t>The default value indicates no variable extension is sent.</t>
      </section>
      <section anchor="tuple-field-15-publisher-delivery-timeout">
        <name>Tuple Field 15: Publisher Delivery Timeout</name>
        <t>This field specifies the publisher delivery timeout in milliseconds.   The default is no delivery timeout.</t>
      </section>
    </section>
    <section anchor="publisher-behavior">
      <name>Publisher Behavior</name>
      <t>If any namespace tuple field other than zero is not a positive integer, or is outside the supported range of the publisher, a SUBSCRIBE_ERROR or FETCH_ERROR is returned.</t>
      <t>Upon receiving a valid SUBSCRIBE or FETCH for a moq-test track, the publisher
<bcp14>MUST</bcp14> publish objects according to the parameters of the namespace.</t>
      <t>Upon receiving a SUBSCRIBE_ANNOUNCES with a Track Namespace, the publisher <bcp14>MUST</bcp14>
use PUBLISH to send objects according to the parameters of the namespace. If the
publisher receives a PUBLISH_ERROR, it will stop sending objects immediately.</t>
      <t>The payload of each published object is the charater t (for test) repeated for the length of the payload.</t>
      <t>When Datagram forwarding preference is used, certain combinations of options result in objects that cannot be transmitted below the maximum datagram size.  The publisher either responds with SUBSCRIBE_ERROR if detected when handling the SUBSCRIBE, or SUBSCRIBE_DONE with an error code if detected when publishing the object.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The subscriber can generate an asymmetric amount of work on the server.  Servers <bcp14>SHOULD</bcp14> set limits on certain values such as object frequency and object size to prevent resource exhaustion attacks.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 185?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Members of the Media over QUIC working group</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
