blob: 3627dd198aaa6d553ac77ffabac0539b0ee63835 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.quarkus.component.jt400.it;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import com.ibm.as400.access.QueuedMessage;
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import org.apache.camel.component.jt400.Jt400Constants;
import org.apache.commons.lang3.RandomStringUtils;
import org.awaitility.Awaitility;
import org.hamcrest.Matchers;
import org.jboss.logging.Logger;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
@QuarkusTest
@EnabledIfEnvironmentVariable(named = "JT400_URL", matches = ".+")
@QuarkusTestResource(Jt400TestResource.class)
public class Jt400Test {
private static final Logger LOGGER = Logger.getLogger(Jt400Test.class);
private final int MSG_LENGTH = 20;
//tests may be executed in parallel, therefore the timeout is a little bigger in case the test has to wait for another one
private final int WAIT_IN_SECONDS = 20;
@BeforeAll
public static void beforeAll() throws Exception {
//for development purposes
// logQueues();
//lock execution
Jt400TestResource.CLIENT_HELPER.lock();
}
@AfterAll
public static void afterAll() throws Exception {
getClientHelper().unlock();
}
private static void logQueues() throws Exception {
StringBuilder sb = new StringBuilder("\n");
sb.append("**********************************************************");
sb.append(getClientHelper().dumpQueues());
sb.append("\n**********************************************************\n");
LOGGER.info(sb.toString());
}
@Test
public void testDataQueue() {
LOGGER.debug("** testDataQueue() ** has started ");
String msg = RandomStringUtils.randomAlphanumeric(MSG_LENGTH).toLowerCase(Locale.ROOT);
String answer = "Hello From DQ: " + msg;
RestAssured.given()
.body(msg)
.post("/jt400/dataQueue/write")
.then()
.statusCode(200)
.body(Matchers.equalTo(answer));
LOGGER.debug("testDataQueue: message '" + answer + "' was written. ");
getClientHelper().registerForRemoval(Jt400TestResource.RESOURCE_TYPE.lifoQueueu, answer);
RestAssured.post("/jt400/dataQueue/read")
.then()
.statusCode(200)
.body("result", Matchers.equalTo(answer));
}
@Test
public void testDataQueueBinary() throws Exception {
LOGGER.debug("** testDataQueueBinary() ** has started ");
String msg = RandomStringUtils.randomAlphanumeric(MSG_LENGTH).toLowerCase(Locale.ROOT);
String answer = "Hello (bin) " + msg;
RestAssured.given()
.body(msg)
.queryParam("format", "binary")
.post("/jt400/dataQueue/write")
.then()
.statusCode(200)
.body(Matchers.equalTo(answer));
LOGGER.debug("testDataQueueBinary: message '" + answer + "' was written. ");
//register to delete
getClientHelper().registerForRemoval(Jt400TestResource.RESOURCE_TYPE.lifoQueueu, answer);
RestAssured.given()
.queryParam("format", "binary")
.post("/jt400/dataQueue/read")
.then()
.statusCode(200)
.body("result", Matchers.equalTo(answer));
}
@Test
public void testKeyedDataQueue() {
LOGGER.debug("** testKeyedDataQueue() ** has started ");
String msg1 = RandomStringUtils.randomAlphanumeric(MSG_LENGTH).toLowerCase(Locale.ROOT);
String msg2 = RandomStringUtils.randomAlphanumeric(MSG_LENGTH).toLowerCase(Locale.ROOT);
String answer1 = "Hello From KDQ: " + msg1;
String answer2 = "Hello From KDQ: " + msg2;
String key1 = RandomStringUtils.randomAlphanumeric(MSG_LENGTH - 1).toLowerCase(Locale.ROOT);
//key2 is right after key1
String key2 = key1 + "a";
RestAssured.given()
.body(msg1)
.queryParam("key", key1)
.post("/jt400/dataQueue/write/")
.then()
.statusCode(200)
.body(Matchers.equalTo(answer1));
LOGGER.debug("testKeyedDataQueue: message '" + answer1 + " (key " + key1 + ") was written. ");
getClientHelper().registerForRemoval(Jt400TestResource.RESOURCE_TYPE.keyedDataQue, key1);
RestAssured.given()
.body(msg2)
.queryParam("key", key2)
.post("/jt400/dataQueue/write/")
.then()
.statusCode(200)
.body(Matchers.equalTo(answer2));
LOGGER.debug("testKeyedDataQueue: message '" + answer2 + " (key " + key2 + ") was written. ");
getClientHelper().registerForRemoval(Jt400TestResource.RESOURCE_TYPE.keyedDataQue, key2);
RestAssured.given()
.body(key1)
.post("/jt400/dataQueue/read/")
.then()
.statusCode(200)
.body("result", Matchers.equalTo(answer1))
.body(Jt400Constants.KEY, Matchers.equalTo(key1));
RestAssured.given()
.body(key1)
.queryParam("searchType", "GE")
.post("/jt400/dataQueue/read/")
.then()
.statusCode(200)
.body("result", Matchers.not(Matchers.equalTo(answer1)))
.body(Jt400Constants.KEY, Matchers.equalTo(key2));
}
@Test
public void testMessageQueue() throws Exception {
LOGGER.debug("** testMessageQueue() ** has started ");
//write
String msg = RandomStringUtils.randomAlphanumeric(MSG_LENGTH).toLowerCase(Locale.ROOT);
String answer = "Hello from MQ: " + msg;
RestAssured.given()
.body(msg)
.post("/jt400/messageQueue/write")
.then()
.statusCode(200)
.body(Matchers.equalTo(answer));
LOGGER.debug("testMessageQueue: message '" + answer + "' was written. ");
//register to delete
getClientHelper().registerForRemoval(Jt400TestResource.RESOURCE_TYPE.messageQueue, answer);
//read (the read message might be different in case the test runs in parallel
RestAssured.post("/jt400/messageQueue/read")
.then()
.statusCode(200)
//check of headers
.body(Jt400Constants.SENDER_INFORMATION, Matchers.not(Matchers.empty()))
.body(Jt400Constants.MESSAGE_FILE, Matchers.is(""))
.body(Jt400Constants.MESSAGE_SEVERITY, Matchers.is(0))
.body(Jt400Constants.MESSAGE_ID, Matchers.is(""))
.body(Jt400Constants.MESSAGE_TYPE, Matchers.is(4))
.body(Jt400Constants.MESSAGE, Matchers.startsWith("QueuedMessage: Hello "))
.body("result", Matchers.equalTo(answer));
//Jt400Constants.MESSAGE_DFT_RPY && Jt400Constants.MESSAGE_REPLYTO_KEY are used only for a special
// type of message which can not be created by the camel component (*INQUIRY)
}
@Test
public void testInquiryMessageQueue() throws Exception {
LOGGER.debug("** testInquiryMessageQueue() **: has started ");
String msg = RandomStringUtils.randomAlphanumeric(10).toLowerCase(Locale.ROOT);
String replyMsg = "reply to: " + msg;
LOGGER.debug("testInquiryMessageQueue: writing " + msg);
//sending a message using the same client as component
getClientHelper().sendInquiry(msg);
//register deletion of the message in case some following task fails
QueuedMessage queuedMessage = getClientHelper().peekReplyToQueueMessage(msg);
if (queuedMessage != null) {
getClientHelper().registerForRemoval(Jt400TestResource.RESOURCE_TYPE.replyToQueueu, queuedMessage.getKey());
LOGGER.debug("testInquiryMessageQueue: message confirmed by peek: " + msg);
}
//set filter for expected messages (for parallel executions)
RestAssured.given()
.body(msg)
.post("/jt400/inquiryMessageSetExpected")
.then()
.statusCode(204);
//start route before sending message (and wait for start)
Awaitility.await().atMost(WAIT_IN_SECONDS, TimeUnit.SECONDS).until(
() -> RestAssured.get("/jt400/route/start/inquiryRoute")
.then()
.statusCode(200)
.extract().asString(),
Matchers.is(Boolean.TRUE.toString()));
LOGGER.debug("testInquiryMessageQueue: inquiry route started");
//await to be processed
Awaitility.await().pollInterval(1, TimeUnit.SECONDS).atMost(20, TimeUnit.SECONDS).until(
() -> RestAssured.get("/jt400/inquiryMessageProcessed")
.then()
.statusCode(200)
.extract().asString(),
Matchers.is(String.valueOf(Boolean.TRUE)));
LOGGER.debug("testInquiryMessageQueue: inquiry message processed");
//stop route (and wait for stop)
Awaitility.await().atMost(WAIT_IN_SECONDS, TimeUnit.SECONDS).until(
() -> RestAssured.get("/jt400/route/stop/inquiryRoute")
.then()
.statusCode(200)
.extract().asString(),
Matchers.is(Boolean.TRUE.toString()));
LOGGER.debug("testInquiryMessageQueue: inquiry route stooped");
//check written message with client
Awaitility.await().pollInterval(1, TimeUnit.SECONDS).atMost(20, TimeUnit.SECONDS).until(
() -> getClientHelper().peekReplyToQueueMessage(replyMsg),
Matchers.notNullValue());
LOGGER.debug("testInquiryMessageQueue: reply message confirmed by peek: " + replyMsg);
}
@Test
public void testProgramCall() {
RestAssured.given()
.body("test")
.post("/jt400/programCall")
.then()
.statusCode(200)
.body(Matchers.containsString("hello camel"));
}
private static Jt400ClientHelper getClientHelper() {
return Jt400TestResource.CLIENT_HELPER;
}
}