This is an automated email from the ASF dual-hosted git repository. tabish pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-protonj2.git
The following commit(s) were added to refs/heads/main by this push: new 28b2c100 PROTON-2698 Simplify test client connect with SASL plain and anonymous 28b2c100 is described below commit 28b2c100e1bb796d6b62d51391dd5568b39c6c73 Author: Timothy Bish <tabish...@gmail.com> AuthorDate: Fri Apr 7 15:50:11 2023 -0400 PROTON-2698 Simplify test client connect with SASL plain and anonymous Provide some simple APIs in the script writer for scripting a normal client connect with SASL plain or anonymous. --- .../qpid/protonj2/test/driver/ScriptWriter.java | 74 ++++++++++++++++++ .../protonj2/test/driver/ProtonTestClientTest.java | 88 ++++++++++++++++++++++ 2 files changed, 162 insertions(+) diff --git a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/ScriptWriter.java b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/ScriptWriter.java index 85281ec1..ea52b321 100644 --- a/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/ScriptWriter.java +++ b/protonj2-test-driver/src/main/java/org/apache/qpid/protonj2/test/driver/ScriptWriter.java @@ -550,6 +550,80 @@ public abstract class ScriptWriter { remoteSaslOutcome().withCode(SaslCode.AUTH).queue(); } + /** + * Used to queue the sequence of frames that would occur during a typical client + * connection to a remote peer with SASL anonymous. This should be called before a + * client connect attempt as the queued headers won't fire if queued after the + * connection has already been established. + */ + public void queueClientSaslAnonymousConnect() { + remoteSASLHeader().queue(); + expectSASLHeader(); + expectSaslMechanisms().withSaslServerMechanism("ANONYMOUS"); + remoteSaslInit().withMechanism("ANONYMOUS").queue(); + expectSaslOutcome().withCode(SaslCode.OK); + remoteAMQPHeader().queue(); + } + + /** + * Used to trigger the sequence of frames that would occur during a typical client + * connection to a remote peer with SASL anonymous. This should be called after a + * client connects to the remote as the fired frames would fail until there is a + * connection in place. + */ + public void triggerClientSaslAnonymousConnect() { + expectSASLHeader(); + expectSaslMechanisms().withSaslServerMechanism("ANONYMOUS"); + remoteSaslInit().withMechanism("ANONYMOUS").queue(); + expectSaslOutcome().withCode(SaslCode.OK); + remoteAMQPHeader().queue(); + + // This trigger the exchange of frames. + remoteSASLHeader().now(); + } + + /** + * Used to queue the sequence of frames that would occur during a typical client + * connection to a remote peer with SASL plain. This should be called before a + * client connect attempt as the queued headers won't fire if queued after the + * connection has already been established. + * + * @param username + * The user name that is expected in the SASL Plain initial response. + * @param password + * The password that is expected in the SASL Plain initial response. + */ + public void queueClientSaslPlainConnect(String username, String password) { + remoteSASLHeader().queue(); + expectSASLHeader(); + expectSaslMechanisms().withSaslServerMechanism("PLAIN"); + remoteSaslInit().withMechanism("PLAIN").withInitialResponse(saslPlainInitialResponse(username, password)).queue(); + expectSaslOutcome().withCode(SaslCode.OK); + remoteAMQPHeader().queue(); + } + + /** + * Used to trigger the sequence of frames that would occur during a typical client + * connection to a remote peer with SASL plain. This should be called after a + * client connects to the remote as the fired frames would fail until there is a + * connection in place. + * + * @param username + * The user name that is expected in the SASL Plain initial response. + * @param password + * The password that is expected in the SASL Plain initial response. + */ + public void triggerClientSaslPlainConnect(String username, String password) { + expectSASLHeader(); + expectSaslMechanisms().withSaslServerMechanism("PLAIN"); + remoteSaslInit().withMechanism("PLAIN").withInitialResponse(saslPlainInitialResponse(username, password)).queue(); + expectSaslOutcome().withCode(SaslCode.OK); + remoteAMQPHeader().queue(); + + // This trigger the exchange of frames. + remoteSASLHeader().now(); + } + //----- Utility methods for tests writing raw scripted SASL tests public byte[] saslPlainInitialResponse(String username, String password) { diff --git a/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/ProtonTestClientTest.java b/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/ProtonTestClientTest.java index d15e9396..2cc9caa2 100644 --- a/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/ProtonTestClientTest.java +++ b/protonj2-test-driver/src/test/java/org/apache/qpid/protonj2/test/driver/ProtonTestClientTest.java @@ -224,4 +224,92 @@ class ProtonTestClientTest extends TestPeerTestsBase { peer.waitForScriptToComplete(5, TimeUnit.SECONDS); } } + + @Test + public void testScriptedClientSASLAnonymousBeforeConnect() throws Exception { + try (ProtonTestServer peer = new ProtonTestServer()) { + peer.expectSASLAnonymousConnect("PLAIN", "ANONYMOUS"); + peer.start(); + + URI remoteURI = peer.getServerURI(); + + ProtonTestClient client = new ProtonTestClient(); + + client.queueClientSaslAnonymousConnect(); + client.connect(remoteURI.getHost(), remoteURI.getPort()); + + client.waitForScriptToComplete(5, TimeUnit.SECONDS); + client.close(); + + LOG.info("Test started, peer listening on: {}", remoteURI); + + peer.waitForScriptToComplete(5, TimeUnit.SECONDS); + } + } + + @Test + public void testScriptedClientSASLAnonymousAfterConnect() throws Exception { + try (ProtonTestServer peer = new ProtonTestServer()) { + peer.expectSASLAnonymousConnect("PLAIN", "ANONYMOUS"); + peer.start(); + + URI remoteURI = peer.getServerURI(); + + ProtonTestClient client = new ProtonTestClient(); + + client.connect(remoteURI.getHost(), remoteURI.getPort()); + client.triggerClientSaslAnonymousConnect(); + + client.waitForScriptToComplete(5, TimeUnit.SECONDS); + client.close(); + + LOG.info("Test started, peer listening on: {}", remoteURI); + + peer.waitForScriptToComplete(5, TimeUnit.SECONDS); + } + } + + @Test + public void testScriptedClientSASLPlainBeforeConnect() throws Exception { + try (ProtonTestServer peer = new ProtonTestServer()) { + peer.expectSASLPlainConnect("test", "test"); + peer.start(); + + URI remoteURI = peer.getServerURI(); + + ProtonTestClient client = new ProtonTestClient(); + + client.queueClientSaslPlainConnect("test", "test"); + client.connect(remoteURI.getHost(), remoteURI.getPort()); + + client.waitForScriptToComplete(5, TimeUnit.SECONDS); + client.close(); + + LOG.info("Test started, peer listening on: {}", remoteURI); + + peer.waitForScriptToComplete(5, TimeUnit.SECONDS); + } + } + + @Test + public void testScriptedClientSASLPlainAfterConnect() throws Exception { + try (ProtonTestServer peer = new ProtonTestServer()) { + peer.expectSASLPlainConnect("test", "test"); + peer.start(); + + URI remoteURI = peer.getServerURI(); + + ProtonTestClient client = new ProtonTestClient(); + + client.connect(remoteURI.getHost(), remoteURI.getPort()); + client.triggerClientSaslPlainConnect("test", "test"); + + client.waitForScriptToComplete(5, TimeUnit.SECONDS); + client.close(); + + LOG.info("Test started, peer listening on: {}", remoteURI); + + peer.waitForScriptToComplete(5, TimeUnit.SECONDS); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org