<?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.24 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-afrind-moq-test-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="moq-test">MoQT Test</title>
    <seriesInfo name="Internet-Draft" value="draft-afrind-moq-test-00"/>
    <author fullname="Alan Frindell">
      <organization>Meta</organization>
      <address>
        <email>afrind@meta.com</email>
      </address>
    </author>
    <date year="2025" month="March" day="03"/>
    <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 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 vald SUBSCRIBE or FETCH for a moq-test track, the publisher <bcp14>MUST</bcp14> publish objects according to the parameters of the namespace.</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 179?>

<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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
GAAA

-->

</rfc>
