<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://xmpp-interop-testing.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://xmpp-interop-testing.github.io/" rel="alternate" type="text/html" /><updated>2025-10-28T19:59:35+00:00</updated><id>https://xmpp-interop-testing.github.io/feed.xml</id><title type="html">XMPP Interop Testing</title><subtitle>A project to advance interoperability in the XMPP ecosystem by  creating an implementation-agnostic test suite for servers.</subtitle><entry><title type="html">Putting NTA 7532 to the Test (Literally)</title><link href="https://xmpp-interop-testing.github.io/2025/10/28/putting-nta7532-to-the-test.html" rel="alternate" type="text/html" title="Putting NTA 7532 to the Test (Literally)" /><published>2025-10-28T19:40:06+00:00</published><updated>2025-10-28T19:40:06+00:00</updated><id>https://xmpp-interop-testing.github.io/2025/10/28/putting-nta7532-to-the-test</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2025/10/28/putting-nta7532-to-the-test.html"><![CDATA[<p>You might have seen the <a href="https://xmpp.org/2025/10/towards-secure-and-interoperable-healthcare-chat/">XMPP Standards Foundation’s open letter</a> to NEN about <strong>NTA 7532</strong>, the Dutch effort to standardise secure healthcare chat. It’s a good read, and, as it happens, right up our street.</p>

<p>If you’re building a chat system that has to <em>actually talk</em> to someone else’s chat system (and keep doctors happy while doing it), you’ll know: writing a specification is only half the battle. The other half is making sure that everyone follow it, and that everyone follows it in the same way.</p>

<p>That’s where the <strong>XMPP Interop Testing Framework</strong> comes in.</p>

<h2 id="so-what-do-we-do-again">So, What Do We Do Again?</h2>

<p>In short: we make sure XMPP software behaves the way the standards say it should.</p>

<p>We’ve built an open-source test framework that runs a bunch of automated checks against real XMPP servers using a real XMPP client library, testing everything from the core RFCs (6120, 6121, 7622) to the popular protocol extensions for things like:</p>

<ul>
  <li>message receipts (<code class="language-plaintext highlighter-rouge">XEP-0184</code>)</li>
  <li>group chat (<code class="language-plaintext highlighter-rouge">XEP-0045</code>)</li>
  <li>file upload (<code class="language-plaintext highlighter-rouge">XEP-0363</code>)</li>
  <li>end-to-end encryption</li>
</ul>

<p>It’s all designed to run in CI, with containers, and produce nice, clear pass/fail results, along with machine-consumable reports and human-readbale actionable information. The kind you can wave around in a meeting and say “See? Interoperable!”</p>

<h2 id="why-nta-7532-folks-should-care">Why NTA 7532 Folks Should Care</h2>

<p>NTA 7532 is about making sure healthcare professionals can message each other securely, even when they’re on different systems and members of different organizations. That means encryption, integrity, and <em>actual interoperability</em> between products from different vendors.</p>

<p>You could write those requirements into a 200-page document (and you probably will). But to prove it works, you need tests. Preferably ones that don’t take a week to run by hand, and that aren’t only run just prior to launch and never again.</p>

<p>That’s exactly what we provide.</p>

<p>Our framework already checks for the building blocks that NTA 7532 is likely to depend on: authentication, transport security, message delivery, receipts, and so on.  And because the tests are open and automated, every vendor can run the same suite - no secret sauce or proprietary knowledge required.</p>

<h2 id="from-we-think-to-we-know">From “We Think” to “We Know”</h2>

<p>Here’s the value add:</p>

<ol>
  <li><strong>Validation</strong> - The framework tells you, with logs and evidence, whether a given implementation matches the spec or standard.</li>
  <li><strong>Transparency</strong> - Everyone can see what’s tested and why and how. The same tests for everyone, with the same criteria.</li>
  <li><strong>Continuous improvement</strong> - When specs change or new features appear, we add new tests. Easy.</li>
</ol>

<p>It turns a written standard into a <em>living, testable thing</em>. If you want to know whether two systems will work together before putting them in front of clinicians, this is how you find out.</p>

<h2 id="the-bigger-picture">The Bigger Picture</h2>

<p>The fun part is collaboration.</p>

<p>The XSF writes and maintains the XMPP specs. 
NEN and the folks behind NTA 7532 define the national healthcare chat profile. 
And we, the <strong>Interop Testing Framework</strong> team, provide the bit in the middle: the place where specs meet running code.</p>

<p>Together, we can prove that “open standard” isn’t just a phrase, but that it’s something you can test, verify, and rely upon.</p>

<h2 id="whats-next">What’s Next</h2>

<p>We’d love to:</p>

<ul>
  <li>run <strong>pilot tests</strong> with any NTA 7532-aligned vendors</li>
  <li>map specific NTA 7532 requirements to existing (or new) XMPP test cases</li>
  <li>publish anonymised results to show real-world interoperability</li>
  <li>feed our findings back to both the NTA 7532 working group and to the XSF</li>
</ul>

<p>If that sounds like something you’d like to be part of: fantastic!</p>

<p>Come talk to us.</p>

<h2 id="get-involved">Get Involved</h2>

<p>The framework’s open-source, so dive right in:</p>

<ul>
  <li><a href="https://xmpp-interop-testing.github.io">Website</a></li>
  <li><a href="https://github.com/xmpp-interop-testing">Code</a></li>
</ul>

<p>Whether you’re writing specs, building servers, or just trying to get two chat systems to agree on a message receipt, we’re here for you.</p>

<p>Let’s make interoperability not just a checkbox, but a test you can actually pass ✅</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/photos/black-and-silver-microphone-on-white-computer-keyboard-qY6ikaS8L38?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Marcus Urbenz, Unsplash</a></em></p>]]></content><author><name>Dan Caseley</name></author><summary type="html"><![CDATA[You might have seen the XMPP Standards Foundation’s open letter to NEN about NTA 7532, the Dutch effort to standardise secure healthcare chat. It’s a good read, and, as it happens, right up our street.]]></summary></entry><entry><title type="html">Two New Features for Clearer Testing</title><link href="https://xmpp-interop-testing.github.io/2025/09/26/new-features-for-clearer-testing.html" rel="alternate" type="text/html" title="Two New Features for Clearer Testing" /><published>2025-09-26T19:39:32+00:00</published><updated>2025-09-26T19:39:32+00:00</updated><id>https://xmpp-interop-testing.github.io/2025/09/26/new-features-for-clearer-testing</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2025/09/26/new-features-for-clearer-testing.html"><![CDATA[<p>We’ve just released version 1.7.1 of all of our test runners. This release adds two improvements to make interop testing
both stricter and easier to set up!</p>

<h2 id="impossible-tests-can-fail-runs">Impossible Tests Can Fail Runs</h2>

<p>Some tests can’t be executed if the server lacks required features. Previously, these “impossible” tests were skipped,
which could make a run look fully successful when it wasn’t. Now you can configure the suite to treat impossible tests
as failures, ensuring that a green run really means every configured test executed and passed.</p>

<h2 id="flexible-account-provisioning">Flexible Account Provisioning</h2>

<p>Our tests act like clients, so they need accounts to log in. You can now choose from three provisioning methods:</p>

<ul>
  <li>Admin Account using <a href="https://xmpp.org/extensions/xep-0133.html">XEP-0133</a> to create test accounts.</li>
  <li>Explicit Test Accounts you configure up front.</li>
  <li>In-Band Registration via <a href="https://xmpp.org/extensions/xep-0077.html">XEP-0077</a>.</li>
</ul>

<p>Pick the approach that fits your setup best. There is <a href="/documentation/provisioning-accounts">documentation</a> available 
for you to review the finer details!</p>

<p>Together, these features give you more reliable results and more flexibility in how you run tests!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/photos/a-group-of-white-robots-sitting-on-top-of-laptops-2iUrK025cec?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Mohamed Nohassi, Unsplash</a></em></p>]]></content><author><name>Guus der Kinderen</name></author><summary type="html"><![CDATA[We’ve just released version 1.7.1 of all of our test runners. This release adds two improvements to make interop testing both stricter and easier to set up!]]></summary></entry><entry><title type="html">Lots More Options</title><link href="https://xmpp-interop-testing.github.io/2025/09/14/lots-more-options.html" rel="alternate" type="text/html" title="Lots More Options" /><published>2025-09-14T12:42:12+00:00</published><updated>2025-09-14T12:42:12+00:00</updated><id>https://xmpp-interop-testing.github.io/2025/09/14/lots-more-options</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2025/09/14/lots-more-options.html"><![CDATA[<p>Since the last update, we’ve added a lot more options on how to run your tests. We’ve added a slew of new CI systems, this time focussing on freedom-respecting, open source CI systems for your open source projects.</p>

<p>Recent additions include Jenkins, Drone, Harness and Woodpecker.</p>

<p>This brings our total number of CI systems in which you can run XMPP interop tests up to a whopping <em>ELEVEN</em>, plus anywhere else you can run containers!</p>

<p>Whether you’re building in GitHub, GitLab, CircleCI, Jenkins, Forgejo, Woodpecker, Drone, Hardness or Bamboo, we’ve got you covered. If you build locally, you can run the JAR, and if you build anywhere that has a Docker or OCI image container runtime, you’re sorted.</p>

<p>We’ve done our absolute best to preserve every option in every runner, but not all CI systems are created equal, and there might be some discrepancies. If there’s a feature you’re missing that you need, do let us know.</p>

<p>Similarly, If there’s a CI system that you’re using that you’d like us to support, or if we do support it but you’re struggling, come find us <a href="xmpp:interop@conference.igniterealtime.org?join">in our MUC</a>, or <a href="https://github.com/XMPP-Interop-Testing/smack-sint-server-extensions">open an issue on GitHub</a>.</p>

<p>Test all the things!!!1!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/@claybanks?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Clay Banks, Unsplash</a></em></p>]]></content><author><name>Dan Caseley</name></author><summary type="html"><![CDATA[Since the last update, we’ve added a lot more options on how to run your tests. We’ve added a slew of new CI systems, this time focussing on freedom-respecting, open source CI systems for your open source projects.]]></summary></entry><entry><title type="html">MOAR TESTS!</title><link href="https://xmpp-interop-testing.github.io/2025/07/30/moar-tests.html" rel="alternate" type="text/html" title="MOAR TESTS!" /><published>2025-07-30T20:24:12+00:00</published><updated>2025-07-30T20:24:12+00:00</updated><id>https://xmpp-interop-testing.github.io/2025/07/30/moar-tests</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2025/07/30/moar-tests.html"><![CDATA[<p>Ever heard of XMPP Interop Testing? It’s this cool project that helps make sure different XMPP servers can all work 
together smoothly. Our XMPP Interop Testing project provides a suite of automated tests that can be integrated into 
CI/CD pipelines to verify the compliance and interoperability of XMPP server implementations.</p>

<p>Late last year, we reported that we had secured funding graciously provided by <a href="https://nlnet.nl/">NLnet</a> that allowed 
us to massively build out this project. This blog has been a bit quiet since then, but work has progressed. Significantly.</p>

<p>We have just released version 1.6.0 of all our test runners. With this release, we (again) more than doubled the total
number of XMPP interop tests! By my count, our project now lets loose 933 tests on your XMPP server implementation!</p>

<p>The biggest chunk of work has gone into tests that verify parts of the basic XMPP protocol, notably for testing
functionality that involves roster management (as specified in <a href="https://datatracker.ietf.org/doc/html/rfc6121#autoid-7">section 2 of RFC 6121</a>)
and for server rules for processing XML stanzas (<a href="https://datatracker.ietf.org/doc/html/rfc6121#autoid-103">section 8 of RFC 6121</a>).</p>

<p>Additionally, a couple of new specifications are now being tested by our framework! Tests have been added for:</p>

<ul>
  <li><a href="https://xmpp.org/extensions/xep-0133.html">XEP-0133: Service Administration</a></li>
  <li><a href="https://xmpp.org/extensions/xep-0410.html">XEP-0410: MUC Self-Ping (Schrödinger’s Chat)</a></li>
  <li><a href="https://xmpp.org/extensions/xep-0421.html">XEP-0421: Occupant identifiers for semi-anonymous MUCs</a></li>
  <li><a href="https://xmpp.org/extensions/xep-0433.html">XEP-0433: Extended Channel Search</a></li>
</ul>

<p>This table gives a complete comparison of test coverage between versions 1.5.0 and 1.6.0.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Specification</th>
      <th style="text-align: center">v1.5.0</th>
      <th style="text-align: center">v1.6.0</th>
      <th style="text-align: center">Difference</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">unknown</td>
      <td style="text-align: center">13</td>
      <td style="text-align: center">13</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://datatracker.ietf.org/doc/html/rfc6120">RFC 6120</a></td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://datatracker.ietf.org/doc/html/rfc6121">RFC 6121</a></td>
      <td style="text-align: center">11</td>
      <td style="text-align: center">402</td>
      <td style="text-align: center">391</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0030.html">XEP-0030</a></td>
      <td style="text-align: center">19</td>
      <td style="text-align: center">19</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0045.html">XEP-0045</a></td>
      <td style="text-align: center">252</td>
      <td style="text-align: center">252</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0048.html">XEP-0048</a></td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0050.html">XEP-0050</a></td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0054.html">XEP-0054</a></td>
      <td style="text-align: center">10</td>
      <td style="text-align: center">10</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0060.html">XEP-0060</a></td>
      <td style="text-align: center">24</td>
      <td style="text-align: center">24</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0080.html">XEP-0080</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0085.html">XEP-0085</a></td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0092.html">XEP-0092</a></td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0096.html">XEP-0096</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0107.html">XEP-0107</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0115.html">XEP-0115</a></td>
      <td style="text-align: center">12</td>
      <td style="text-align: center">12</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0118.html">XEP-0118</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0133.html">XEP-0133</a></td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">44</td>
      <td style="text-align: center">44</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0198.html">XEP-0198</a></td>
      <td style="text-align: center">10</td>
      <td style="text-align: center">10</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0199.html">XEP-0199</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0215.html">XEP-0215</a></td>
      <td style="text-align: center">6</td>
      <td style="text-align: center">6</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0232.html">XEP-0232</a></td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0313.html">XEP-0313</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0347.html">XEP-0347</a></td>
      <td style="text-align: center">3</td>
      <td style="text-align: center">3</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0352.html">XEP-0352</a></td>
      <td style="text-align: center">6</td>
      <td style="text-align: center">6</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0363.html">XEP-0363</a></td>
      <td style="text-align: center">12</td>
      <td style="text-align: center">12</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0374.html">XEP-0374</a></td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0384.html">XEP-0384</a></td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0410.html">XEP-0410</a></td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">3</td>
      <td style="text-align: center">3</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0421.html">XEP-0421</a></td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">67</td>
      <td style="text-align: center">67</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0433.html">XEP-0433</a></td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">19</td>
      <td style="text-align: center">19</td>
    </tr>
    <tr>
      <td style="text-align: left"><a href="https://xmpp.org/extensions/xep-0486.html">XEP-0486</a></td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">0</td>
    </tr>
  </tbody>
</table>

<p>To be clear: the work doesn’t end here. There is still significant improvement to be made (and we’ve not yet used up
all of the grant either!) - we just liked to give you all an update. In the works are additional test implementations,
and a couple of new test runners. That should both increase coverage, but also allow our tests to be executed on even
more CI/CD platforms!</p>

<p>Please <a href="/contact">get in touch</a> if you have any ideas for improvement, or other feedback. We’d love to hear from you!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/photos/a-person-placing-a-piece-of-wood-into-a-pyramid-vsLbaIdhwaU?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Imagine Buddy, Unsplash</a></em></p>]]></content><author><name>Guus der Kinderen</name></author><summary type="html"><![CDATA[Ever heard of XMPP Interop Testing? It’s this cool project that helps make sure different XMPP servers can all work together smoothly. Our XMPP Interop Testing project provides a suite of automated tests that can be integrated into CI/CD pipelines to verify the compliance and interoperability of XMPP server implementations.]]></summary></entry><entry><title type="html">Enabling Tests</title><link href="https://xmpp-interop-testing.github.io/2025/04/03/enabling-tests.html" rel="alternate" type="text/html" title="Enabling Tests" /><published>2025-04-03T12:04:02+00:00</published><updated>2025-04-03T12:04:02+00:00</updated><id>https://xmpp-interop-testing.github.io/2025/04/03/enabling-tests</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2025/04/03/enabling-tests.html"><![CDATA[<p>Our project creates a framework that allows anyone to easily add XMPP standards compliance tests to the test phase of
their build pipeline. Prior to our most recent release (version 1.5.0) a test execution would basically run <em>all</em> tests
in the test suite. We provided an option to exclude certain tests, but in essence, the bulk of tests would execute.</p>

<p>This behavior is generally preferable when testing an XMPP server implementation. A benefit of exclusion-based
configuration is that tests that are newly added to the test suite will automatically be picked up, without requiring a
configuration change.</p>

<p>However, there are scenarios where it is desirable to execute only a specific set of tests, for example when:</p>
<ul>
  <li>testing of a server-sided component, that implements only one specification, or</li>
  <li>testing a development branch in which changes are applied to only one feature.</li>
</ul>

<p>In those scenarios, having to disable <em>all other</em> tests is cumbersome.</p>

<p>We have now made available a mechanism in which specific tests can be <em>included</em>. When you include tests, only the 
included tests are executed. These configuration is very similar to that of the exclusion of tests. You can find more
information in our <a href="/documentation/selecting-tests">documentation on Selecting Tests</a>.</p>

<p>Please <a href="/contact">let us know</a> if you like the new features. We’d love to hear from you!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/@heerenaway?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Heeren Darji, Unsplash</a></em></p>]]></content><author><name>Guus der Kinderen</name></author><summary type="html"><![CDATA[Our project creates a framework that allows anyone to easily add XMPP standards compliance tests to the test phase of their build pipeline. Prior to our most recent release (version 1.5.0) a test execution would basically run all tests in the test suite. We provided an option to exclude certain tests, but in essence, the bulk of tests would execute.]]></summary></entry><entry><title type="html">Incoming: Improvements!</title><link href="https://xmpp-interop-testing.github.io/2024/10/10/funding.html" rel="alternate" type="text/html" title="Incoming: Improvements!" /><published>2024-10-10T09:10:12+00:00</published><updated>2024-10-10T09:10:12+00:00</updated><id>https://xmpp-interop-testing.github.io/2024/10/10/funding</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2024/10/10/funding.html"><![CDATA[<p>A new boost in the project’s budget will allow us to approximately <em>double</em> the test coverage of our project (and add a couple of nice features)!</p>

<p>Much of the <a href="https://xmpp-interop-testing.github.io/">XMPP Interop Testing project</a> was made possible as the work was funded through the NGI0 Core Fund. This is a fund established by <a href="https://nlnet.nl/">NLnet</a> with financial support from the European Commission’s <a href="https://ngi.eu/">Next Generation Internet programme</a>.</p>

<p>It is quite remarkable how far the effects of funding reach: it allowed us to work out our plans to take various, pre-existing bits and bobs, and quickly and efficiently turn a small tool used for internal testing to a proper testing framework for any XMPP server implementation to be able to use. That snowballed in bug fixes for server implementations, and improvements to specifications used by many. A relatively small fund thus improved the quality of open standard-based communication used in one shape or another by countless people, daily!</p>

<p>We are so happy and grateful to NLnet for boosting our project’s grant! With the additional work, we will add the following improvements:</p>

<ul>
  <li>Have better test coverage by writing more tests;</li>
  <li>Improve feedback when tests fail or do not run at all;</li>
  <li>Add a new test account provisioning option;</li>
  <li>Improve test selection configuration;</li>
  <li>Automate recurring maintenance tasks;</li>
  <li>Add support for other build systems.</li>
</ul>

<p>This all will help us improve our framework, it will help our users to improve their products, and will allow new projects to more easily deploy our open and free solutions into their CI pipelines!</p>

<p>You can expect a lot of these improvements to become available to you, soon!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/@micheile?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Micheile Henderson, Unsplash</a></em></p>]]></content><author><name>Guus der Kinderen</name></author><summary type="html"><![CDATA[A new boost in the project’s budget will allow us to approximately double the test coverage of our project (and add a couple of nice features)!]]></summary></entry><entry><title type="html">Containers!</title><link href="https://xmpp-interop-testing.github.io/2024/09/04/containers.html" rel="alternate" type="text/html" title="Containers!" /><published>2024-09-04T16:33:07+00:00</published><updated>2024-09-04T16:33:07+00:00</updated><id>https://xmpp-interop-testing.github.io/2024/09/04/containers</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2024/09/04/containers.html"><![CDATA[<p>I know it’s not universal, but I <em>love</em> working with containers. Once you’ve got your container runtime, it doesn’t matter what you’re running, whether it’s a web app, a database, a command line tool, or something else entirely. It doesn’t matter whether it was written in Rust or Erlang or Perl or Java or something properly esoteric. It just works, all at the cost of a few extra megabytes for the wrapper (or the container, if you will).</p>

<p>For our project, we opted early on to try something a little different. Rather than choose between the most popular engine and toolchain (Docker) and something more fully open-source source, we opted to do both. We wanted Docker and OCI images, and we wanted Docker and open-source build tools, to prove it can be built and it can be run by whoever wants to, however they want to.</p>

<p>I don’t know how many folks have been down the rabbit-hole of “what’s the difference between the Docker image format and OCI?” - the differences between the image formats are really fairly miniscule. Right now at least. Docker donated their tech of the day to form the initial OCI standards, and most tooling out there supports both Docker and OCI building and running. But that might not always be the case.</p>

<p>What did we do?</p>

<p>Firstly, for build instructions, we created a Dockerfile and a Containerfile. Sure, podman will consume a Dockerfile and produce an OCI image, but given the above mention of possible future divergence, it made sense. We also liked the idea that it gave the appropriate credit to the FOSS community - that whilst all Docker images are container images, not all container images are Docker images, and calling them Docker images devalues the gargantuan effort put into open <a href="https://github.com/containers/">tooling</a> and <a href="https://github.com/opencontainers/">standards</a>.</p>

<p>Next, we tested that our work could actually be used to make a working container.</p>

<p>Here’s how it looks OCI:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/git/smack-sint-server-extensions&gt; podman build . -t sintse-oci:test
[1/3] STEP 1/3: FROM docker.io/library/eclipse-temurin:17-jdk-noble AS pom
[1/3] STEP 2/3: WORKDIR /usr/src
&lt;snip&gt;
[3/3] STEP 6/6: ENTRYPOINT ["/sbin/entrypoint.sh"]
[3/3] COMMIT sintse-oci:test
--&gt; 56d0a8a75584
Successfully tagged localhost/sintse-oci:test
56d0a8a75584c3c1cc41d535dac50c244a0acf04bb3cf4abca989363d46a1608


~/git/smack-sint-server-extensions&gt; podman inspect sintse-oci:test
&lt;snip&gt;
          "Annotations": {
               "org.opencontainers.image.base.digest": "sha256:5579258e20135a9b54c16b9038008adcff50bd1d637824ed564d5b1cc881cba8",
               "org.opencontainers.image.base.name": "docker.io/library/eclipse-temurin:17-jre-noble"
          },
          "ManifestType": "application/vnd.oci.image.manifest.v1+json",
&lt;snip&gt;


~/git/smack-sint-server-extensions&gt; podman run --network host sintse-oci:test --adminAccountUsername admin --adminAccountPassword admin
Saving JUnit-compatible XML file with results to /logs/test-results.xml
Saving debug logs in /logs
&lt;snip&gt;
Test run (id: bjvrd) finished! 266 tests were successful (✔), 2 failed (💀), and 29 were impossible to run (✖).
&lt;snip&gt;
</code></pre></div></div>

<p>And this is Docker:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/git/smack-sint-server-extensions&gt; docker build . -t sintse-docker:test
[+] Building 96.5s (21/21) FINISHED                                                                                             docker:default
 =&gt; [internal] load build definition from Dockerfile                                                                                      0.0s
 =&gt; =&gt; transferring dockerfile: 860B                                                                                                      0.0s
 =&gt; [internal] load metadata for docker.io/library/eclipse-temurin:17-jre-noble 
 &lt;snip&gt;
  =&gt; exporting to image                                                                                                                    0.1s
 =&gt; =&gt; exporting layers                                                                                                                   0.1s
 =&gt; =&gt; writing image sha256:922ebdbac4d3c45b00c54ac2c5687b73312bd8697941a25380e7870708a5b25f                                              0.0s
 =&gt; =&gt; naming to docker.io/library/sintse-docker:test  


~/git/smack-sint-server-extensions&gt; docker inspect sintse-docker:test
&lt;snip&gt;
        "Comment": "buildkit.dockerfile.v0",
&lt;snip&gt;


~/git/smack-sint-server-extensions&gt; docker run --network host sintse-docker:test --adminAccountUsername admin --adminAccountPassword admin
Saving JUnit-compatible XML file with results to /logs/test-results.xml
Saving debug logs in /logs
&lt;snip&gt;
Test run (id: 4z7ev) finished! 266 tests were successful (✔), 2 failed (💀), and 29 were impossible to run (✖).
&lt;snip&gt;
</code></pre></div></div>

<p>We added CI to run a podman and Docker build on every PR to the repo, just to be sure contributors would be warned if they did something to break it, or in case a podman itself got an upgrade that caused a breakage. We don’t need to run the tests - we’ve got other checks around to check the validity and the capability of test running - here we’re more relying on the output of the <code class="language-plaintext highlighter-rouge">podman build</code> command to prove that we can build a container image.</p>

<p>Next, we added CI to the main branch to build and push a “bleeding edge” image to a container registry. We chose GitHub because (a) it’s with our code (b) it has OCI support. The same CI also deals with publishing tagged images when the repo is tagged.</p>

<p>It’s exciting! With containerised servers and containerised tests, there’s far less onus on developers to manage dependencies or be dependent on operating systems or versions. Not only does this reduce the barrier to entry for folks wanting to adopt the tests, it’s also far easier for me!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/photos/birds-photo-of-cityscape-9cCeS9Sg6nU?utm_content=creditShareLink&amp;utm_medium=referral&amp;utm_source=unsplash">CHUTTERSNAP, Unsplash</a></em></p>]]></content><author><name>Dan Caseley</name></author><summary type="html"><![CDATA[I know it’s not universal, but I love working with containers. Once you’ve got your container runtime, it doesn’t matter what you’re running, whether it’s a web app, a database, a command line tool, or something else entirely. It doesn’t matter whether it was written in Rust or Erlang or Perl or Java or something properly esoteric. It just works, all at the cost of a few extra megabytes for the wrapper (or the container, if you will).]]></summary></entry><entry><title type="html">Progress Report</title><link href="https://xmpp-interop-testing.github.io/2024/06/12/progress-report.html" rel="alternate" type="text/html" title="Progress Report" /><published>2024-06-12T13:35:07+00:00</published><updated>2024-06-12T13:35:07+00:00</updated><id>https://xmpp-interop-testing.github.io/2024/06/12/progress-report</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2024/06/12/progress-report.html"><![CDATA[<p>We’ve been quiet for a while, but we’ve been busy! Over the last few months, things have progressed nicely. Let me catch you up!</p>

<h2 id="new-test-runners">New Test Runners</h2>

<p>In my <a href="/2024/03/08/first-test-abstraction-prototype.html">last blogpost</a>, I wrote about the first Test Runner that we created: one that is usable as a <a href="/documentation/github">GitHub Action</a>.</p>

<p>We are continuing to improve that runner, but I’m happy to report that we now also have runners for:</p>
<ul>
  <li><a href="/documentation/gitlab">GitLab</a></li>
  <li><a href="/documentation/circleci">Circle CI</a></li>
  <li><a href="/documentation/bamboo">Atlassian Bamboo</a></li>
</ul>

<p>(Please bear with us while we get the documentation in order).</p>

<p>What we’ve not yet crossed off the to-do list includes runners for:</p>
<ul>
  <li><a href="/documentation/docker">Docker</a></li>
  <li><a href="/documentation/podman">OCI, Podman &amp; ContainerIO</a></li>
  <li><a href="/documentation/forgejo">Forgejo &amp; Codeberg</a></li>
</ul>

<p>… and maybe Jenkins? 😬 I’m still on the fence, and I keep forgetting to poke Dan about that one. <strong>Hey Dan!</strong> Whaddayathink?</p>

<h2 id="smack-improvements">Smack improvements</h2>

<p>The testing framework that we’re using for most of the tests is provided by IgniteRealtime’s <a href="https://download.igniterealtime.org/smack/dailybuilds/sinttest-javadoc/org/igniterealtime/smack/inttest/package-summary.html">Smack Integration Test Framework</a>. Through continuous usage of that framework, we ran into several bits and bobs that we wanted that Framework to have, do or do differently. With help of Smack’s lead developer, Florian, a couple of nice additions have been added.</p>

<p>The rationale for many of these improvements is the same: We recognized that it is incredibly difficult to figure out <em>why</em> a particular test fails, especially since we do not expect people that run our tests to be familiar with Smack, the SINT framework, our test implementations, or even the programming language that is used to create them. We have put in effort to improve this.</p>

<p>We’ve set out to make this easier, documenting <a href="/documentation/diagnose-test-failures">a comprehensive how-to guide</a> in the process.</p>

<h4 id="annotations">Annotations</h4>

<p>SINT tests can now be annotated to reference specifications. This allows us to tell which implementation is testing which specification. That in turn allows us to tell you not only which test fails, but also to which specification/functionality that test relates. We can even quote the exact section of the specification for which a test is failing now.</p>

<h4 id="debug-logging">Debug Logging</h4>

<p>Although debug logging (the act of logging XMPP stanzas related to any particular test) was already configurable in SINT, we’ve made that more flexible. This allowed us to write a custom logger, that generates debug files per test.</p>

<p>Having XMPP traffic dumps <em>per test</em> makes it much easier to debug the reason for a test failure. When a test fails, you can now easily see the exact XMPP traffic that was exchanged with the server under test.</p>

<p>Additionally, we’ve whipped up a test result processor that generates XML files in the JUnit format of test result reporting. Our thought here is that many build systems have native support for these files, which may lead to quick wins with regard to test result presentation in these systems. The proof of the pudding is in the eating though, so lets see how this pans out.</p>

<h4 id="assertion-messages">Assertion messages</h4>

<p>We’ve put in quite some effort to improve the reporting of assertion failures. We have tried to make sure that an assertion failure will report a human-readable message that can be understood without looking at the source code of the test.</p>

<p>This, combined with the other improvements described above, should allow for an XMPP developer to deduce the reason for most test failures.</p>

<h2 id="improved-test-coverage">Improved test coverage!</h2>

<p>We’ve also been busy writing new tests! So far, we’ve improved coverage for:</p>
<ul>
  <li><a href="https://xmpp.org/extensions/xep-0030.html">XEP-0030: Service Discover</a></li>
  <li><a href="https://xmpp.org/extensions/xep-0045.html">XEP-0045: Multi-User Chat</a></li>
  <li><a href="https://xmpp.org/extensions/xep-0352.html">XEP-0352: Client State Indication</a></li>
</ul>

<p>If you’re wondering why these: it is not completely arbitrary: we’re prioritizing the specifications mentioned in the <a href="https://xmpp.org/about/compliance-suites/">XMPP Compliance Suites</a>, but combine that with the available APIs in the libraries that we use. Obviously, we’re planning to add more and more coverage over time.</p>

<h2 id="next-steps">Next steps</h2>

<p>That about sums up what we’ve been busy with. Over the next few weeks, we’ll continue to build new runners and tests.</p>

<p>I’m also contemplating asking one or two server developers, that are unfamiliar with this project, to have a go and try to integrate one of our runners in their server project’s CI pipeline. I’m hoping that this results in feedback that allows us to improve the usability of the project. I’m not quite sure about the timing of this though. I’ll think it over…</p>

<p>Until next time!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/@isaacmsmith?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Isaac Smith, Unsplash</a></em></p>]]></content><author><name>Guus der Kinderen</name></author><summary type="html"><![CDATA[We’ve been quiet for a while, but we’ve been busy! Over the last few months, things have progressed nicely. Let me catch you up!]]></summary></entry><entry><title type="html">First Prototype of Test Runner</title><link href="https://xmpp-interop-testing.github.io/2024/03/08/first-test-abstraction-prototype.html" rel="alternate" type="text/html" title="First Prototype of Test Runner" /><published>2024-03-08T19:14:12+00:00</published><updated>2024-03-08T19:14:12+00:00</updated><id>https://xmpp-interop-testing.github.io/2024/03/08/first-test-abstraction-prototype</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2024/03/08/first-test-abstraction-prototype.html"><![CDATA[<blockquote>
  <p><strong>It is alive, ALIVE!</strong></p>
</blockquote>

<p>I’m so excited to have finished the first prototype of the first test runner that we are going to create!</p>

<p>As Dan &amp; me are part of a team that is maintaining an XMPP server on GitHub, creating a GitHub Action that can be used
to super easily run the integration tests in a GitHub pipeline/flow was the obvious first prototype to tackle.</p>

<p>Things worked out beautifully!</p>

<h2 id="a-wrapper-for-sint">A wrapper for SINT</h2>
<p>First, we’ve used a bit of prior art to create a new project that uses IgniteRealtime’s <a href="https://download.igniterealtime.org/smack/dailybuilds/sinttest-javadoc/org/igniterealtime/smack/inttest/package-summary.html">Smack Integration Test Framework</a>,
and adds its own test implementations. Smack’s tests are, after all, mostly client-oriented, while we’re mostly interested
in having server-oriented tests. This new project was dubbed the <a href="https://github.com/XMPP-Interop-Testing/smack-sint-server-extensions">smack-sint-server-extensions</a>.</p>

<h2 id="a-wrapper-for-the-wrapper">A wrapper for the wrapper</h2>
<p>Next, the <code class="language-plaintext highlighter-rouge">smack-sint-server-extension</code> artifact was easily embedded in a new GitHub Action: the <a href="https://github.com/XMPP-Interop-Testing/xmpp-interop-tests-action">xmpp-interop-tests-action</a>.</p>

<p>It is expected that this action is used in a continuous integration flow that creates a new build of the XMPP server
that is to be the subject of the tests.</p>

<p>Very generically, the xmpp-interop-test-action is expected to be part of such a flow in this manner:</p>
<ol>
  <li>Compile and build server software</li>
  <li>Start server</li>
  <li><strong>Invoke xmpp-interop-test-action</strong></li>
  <li>Stop server</li>
</ol>

<p>This could look something like the flow below:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Download Server distribution artifact from build job.</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/download-artifact@v4</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">my-server-distribution</span>
    <span class="na">path</span><span class="pi">:</span> <span class="s">.</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Start CI server from distribution</span>
  <span class="na">id</span><span class="pi">:</span> <span class="s">startCIServer</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./.github/actions/startserver-action</span> <span class="c1"># Should result in a running server.</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Run XMPP Interoperability Tests against CI server.</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">XMPP-Interop-Testing/xmpp-interop-tests-action@v1.0</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">domain</span><span class="pi">:</span> <span class="s1">'</span><span class="s">shakespeare.lit'</span>
    <span class="na">adminAccountUsername</span><span class="pi">:</span> <span class="s1">'</span><span class="s">juliet'</span>
    <span class="na">adminAccountPassword</span><span class="pi">:</span> <span class="s1">'</span><span class="s">O_Romeo_Romeo!'</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Stop CI server</span>
  <span class="na">if</span><span class="pi">:</span> <span class="s">${{ always() &amp;&amp; steps.startCIServer.conclusion == 'success' }}</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./.github/actions/stopserver-action</span>
</code></pre></div></div>

<p>Of course, we’ve immediately modified the continuous integration flow of our own XMPP server to make use of
<code class="language-plaintext highlighter-rouge">xmpp-interop-tests-action</code>. The proof of the pudding is in the tasting, after all! It worked!</p>

<p>Also, I’m happy to report that our server implementation passes all the tests that we’re running. 😅</p>

<p>There’s obviously still a lot of work to do, but, if you do feel adventurous and have a GitHub-based CI pipeline for an
XMPP project… have a go!</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/photos/silhouette-of-man-standing-on-high-ground-under-red-and-blue-skies-FiZTaNTj2Ak?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Benjamin Davies, Unsplash</a></em></p>]]></content><author><name>Guus der Kinderen</name></author><summary type="html"><![CDATA[It is alive, ALIVE!]]></summary></entry><entry><title type="html">How we expect to use Compliance Tests</title><link href="https://xmpp-interop-testing.github.io/2024/03/03/intended-usage.html" rel="alternate" type="text/html" title="How we expect to use Compliance Tests" /><published>2024-03-03T15:12:09+00:00</published><updated>2024-03-03T15:12:09+00:00</updated><id>https://xmpp-interop-testing.github.io/2024/03/03/intended-usage</id><content type="html" xml:base="https://xmpp-interop-testing.github.io/2024/03/03/intended-usage.html"><![CDATA[<p>One of XMPP’s largest challenges (and indeed of all open standards) is interoperability. We want to enable anyone to use the standards on any platform they like, written in the programming language they prefer, focussing design and utility toward any group, from enterprise to egg-cup enthusiasts.</p>

<p>When we came up with our idea for XMPP interop tests for server implementations, we knew we weren’t the first folk to ever have the idea. What was important for us wasn’t about getting the tests right, but about getting the tests <em>used</em>. With so many programming languages in play, we can’t get almost everyone to adopt an additional language into their toolchain. That’s a clear no-go.</p>

<p>Instead, we’re choosing to wrap our tests in the packaging of the common CI systems (a Github Action, a Circle CI Orb, etc) so that whatever your regular toolchain, you can slot the tests into the test phase of your build pipeline.</p>

<p>Previously you might’ve had something like:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>------------    ---------    -------------    --------------------    --------------------
| Checkout | =&gt; | Build | =&gt; | Unit Test | =&gt; | Integration Test | =&gt; | Publish Artifact |
------------    ---------    -------------    --------------------    --------------------
</code></pre></div></div>

<p>You’d just slot this into the pipeline, like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>------------    ---------    -------------    --------------------    --------------------    --------------------
| Checkout | =&gt; | Build | =&gt; | Unit Test | =&gt; | Integration Test | =&gt; | Compliance Tests | =&gt; | Publish Artifact |
------------    ---------    -------------    --------------------    --------------------    --------------------
</code></pre></div></div>

<p>Since the compliance tests are arms-length tests, akin to E2E tests, one individual test will likely exercise more code and run slower than the other kinds of test, so you’d naturally want to run the faster tests first.</p>

<p>Further, since it’s an actual XMPP test, the implementing server author will also need to have a mechanism of running the XMPP server in the pipeline.</p>

<p><em>Splash image courtesy of <a href="https://unsplash.com/photos/silhouette-of-road-signage-during-golden-hour-C7B-ExXpOIE?utm_content=creditShareLink&amp;utm_medium=referral&amp;utm_source=unsplash">Javier Allegue Barros, Unsplash</a></em></p>]]></content><author><name>Dan Caseley</name></author><summary type="html"><![CDATA[One of XMPP’s largest challenges (and indeed of all open standards) is interoperability. We want to enable anyone to use the standards on any platform they like, written in the programming language they prefer, focussing design and utility toward any group, from enterprise to egg-cup enthusiasts.]]></summary></entry></feed>