From 600227d2e45273488bc8d611848b67115f7f39d6 Mon Sep 17 00:00:00 2001 From: interactwithankush Date: Thu, 16 Dec 2021 20:05:13 +0530 Subject: [PATCH] fix: Sonar report - fix blocker and critical ones (#1899) * update SpatialPartitionBubbles - fix Sonar blocker issue * fix Sonar critical issue - Define constant instead of duplicating the literal * fix Sonar critical issue - remove unnecessary default constructor * fix Sonar critical issue - Define constant instead of duplicating the literal * fix Sonar critical issue - Define constant instead of duplicating the literal * fix Sonar critical issue - Define constant instead of duplicating the literal * fix Sonar critical issue - fix checkstyle issue * fix Sonar critical issue - fix code smells * fix Sonar critical issue - fix code smells * fix Sonar critical issue - fix code smells * fix sonarbugs - adding test cases for Commander class * sonar fix - add assert commands in CommanderTest * sonar fix - add test cases for CommanderTest * sonar fix - add test cases for CommanderTest * sonar fix - add test cases for CommanderTest * sonar fix - add test cases for CommanderTest * sonar fix - add test cases for CommanderTest * sonar fix - add test cases for CommanderTest * sonar fix - add test cases for CommanderTest * sonar bug fix & test cases * sonar bug fix & test cases * sonar bug fix & test cases * sonar bug fix & test cases * sonar bug fix & test cases * Revert "sonar bug fix & test cases" This reverts commit 640dd55e35a9730e981d14665913f3d9b5b2d3b2. * sonar bug fix & test cases * sonar bug fix & test cases * sonar bug fix & test cases * sonar bug fix : avoid Thread.sleep * sonar bug fix : cleanup Thread.sleep * sonar bug fix: test commit * sonar bug fix: test commit Co-authored-by: Subhrodip Mohanta Co-authored-by: atayal --- .../java/com/iluwatar/command/Wizard.java | 3 - .../com/iluwatar/commander/Commander.java | 148 ++--- .../com/iluwatar/commander/CommanderTest.java | 526 ++++++++++++++++++ .../SpatialPartitionBubbles.java | 8 +- 4 files changed, 608 insertions(+), 77 deletions(-) create mode 100644 commander/src/test/java/com/iluwatar/commander/CommanderTest.java diff --git a/command/src/main/java/com/iluwatar/command/Wizard.java b/command/src/main/java/com/iluwatar/command/Wizard.java index 4ea84e8c3..aa1f338ea 100644 --- a/command/src/main/java/com/iluwatar/command/Wizard.java +++ b/command/src/main/java/com/iluwatar/command/Wizard.java @@ -36,9 +36,6 @@ public class Wizard { private final Deque undoStack = new LinkedList<>(); private final Deque redoStack = new LinkedList<>(); - public Wizard() { - } - /** * Cast spell. */ diff --git a/commander/src/main/java/com/iluwatar/commander/Commander.java b/commander/src/main/java/com/iluwatar/commander/Commander.java index 59cdc9b22..291704884 100644 --- a/commander/src/main/java/com/iluwatar/commander/Commander.java +++ b/commander/src/main/java/com/iluwatar/commander/Commander.java @@ -90,6 +90,13 @@ public class Commander { private static final Logger LOG = LoggerFactory.getLogger(Commander.class); //we could also have another db where it stores all orders + private static final String ORDER_ID = "Order {}"; + private static final String REQUEST_ID = " request Id: {}"; + private static final String ERROR_CONNECTING_MSG_SVC = + ": Error in connecting to messaging service "; + private static final String TRY_CONNECTING_MSG_SVC = + ": Trying to connect to messaging service.."; + Commander(EmployeeHandle empDb, PaymentService paymentService, ShippingService shippingService, MessagingService messagingService, QueueDatabase qdb, int numOfRetries, long retryDuration, long queueTime, long queueTaskTime, long paymentTime, @@ -118,17 +125,17 @@ public class Commander { Retry.Operation op = (l) -> { if (!l.isEmpty()) { if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to shipping service, " - + "trying again.."); + LOG.debug(ORDER_ID + ": Error in connecting to shipping service, " + + "trying again..", order.id); } else { - LOG.debug("Order " + order.id + ": Error in creating shipping request.."); + LOG.debug(ORDER_ID + ": Error in creating shipping request..", order.id); } throw l.remove(0); } String transactionId = shippingService.receiveRequest(order.item, order.user.address); //could save this transaction id in a db too - LOG.info("Order " + order.id + ": Shipping placed successfully, transaction id: " - + transactionId); + LOG.info(ORDER_ID + ": Shipping placed successfully, transaction id: {}", + order.id, transactionId); LOG.info("Order has been placed and will be shipped to you. Please wait while we make your" + " payment... "); sendPaymentRequest(order); @@ -138,19 +145,19 @@ public class Commander { LOG.info("Shipping is currently not possible to your address. We are working on the problem" + " and will get back to you asap."); finalSiteMsgShown = true; - LOG.info("Order " + order.id + ": Shipping not possible to address, trying to add problem " - + "to employee db.."); + LOG.info(ORDER_ID + ": Shipping not possible to address, trying to add problem " + + "to employee db..", order.id); employeeHandleIssue(o); } else if (ItemUnavailableException.class.isAssignableFrom(err.getClass())) { LOG.info("This item is currently unavailable. We will inform you as soon as the item " + "becomes available again."); finalSiteMsgShown = true; - LOG.info("Order " + order.id + ": Item " + order.item + " unavailable, trying to add " - + "problem to employee handle.."); + LOG.info(ORDER_ID + ": Item {}" + " unavailable, trying to add " + + "problem to employee handle..", order.id, order.item); employeeHandleIssue(o); } else { LOG.info("Sorry, there was a problem in creating your order. Please try later."); - LOG.error("Order " + order.id + ": Shipping service unavailable, order not placed.."); + LOG.error(ORDER_ID + ": Shipping service unavailable, order not placed..", order.id); finalSiteMsgShown = true; } }; @@ -164,7 +171,7 @@ public class Commander { if (order.paid.equals(PaymentStatus.TRYING)) { order.paid = PaymentStatus.NOT_DONE; sendPaymentFailureMessage(order); - LOG.error("Order " + order.id + ": Payment time for order over, failed and returning.."); + LOG.error(ORDER_ID + ": Payment time for order over, failed and returning..", order.id); } //if succeeded or failed, would have been dequeued, no attempt to make payment return; } @@ -173,17 +180,18 @@ public class Commander { Retry.Operation op = (l) -> { if (!l.isEmpty()) { if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to payment service," - + " trying again.."); + LOG.debug(ORDER_ID + ": Error in connecting to payment service," + + " trying again..", order.id); } else { - LOG.debug("Order " + order.id + ": Error in creating payment request.."); + LOG.debug(ORDER_ID + ": Error in creating payment request..", order.id); } throw l.remove(0); } if (order.paid.equals(PaymentStatus.TRYING)) { var transactionId = paymentService.receiveRequest(order.price); order.paid = PaymentStatus.DONE; - LOG.info("Order " + order.id + ": Payment successful, transaction Id: " + transactionId); + LOG.info(ORDER_ID + ": Payment successful, transaction Id: {}", + order.id, transactionId); if (!finalSiteMsgShown) { LOG.info("Payment made successfully, thank you for shopping with us!!"); finalSiteMsgShown = true; @@ -199,7 +207,7 @@ public class Commander { + "Meanwhile, your order has been converted to COD and will be shipped."); finalSiteMsgShown = true; } - LOG.error("Order " + order.id + ": Payment details incorrect, failed.."); + LOG.error(ORDER_ID + ": Payment details incorrect, failed..", order.id); o.paid = PaymentStatus.NOT_DONE; sendPaymentFailureMessage(o); } else { @@ -209,7 +217,7 @@ public class Commander { + "asap. Don't worry, your order has been placed and will be shipped."); finalSiteMsgShown = true; } - LOG.warn("Order " + order.id + ": Payment error, going to queue.."); + LOG.warn(ORDER_ID + ": Payment error, going to queue..", order.id); sendPaymentPossibleErrorMsg(o); } if (o.paid.equals(PaymentStatus.TRYING) && System @@ -234,7 +242,7 @@ public class Commander { if (System.currentTimeMillis() - qt.order.createdTime >= this.queueTime) { // since payment time is lesser than queuetime it would have already failed.. // additional check not needed - LOG.trace("Order " + qt.order.id + ": Queue time for order over, failed.."); + LOG.trace(ORDER_ID + ": Queue time for order over, failed..", qt.order.id); return; } else if (qt.taskType.equals(TaskType.PAYMENT) && !qt.order.paid.equals(PaymentStatus.TRYING) || qt.taskType.equals(TaskType.MESSAGING) && (qt.messageType == 1 @@ -242,30 +250,30 @@ public class Commander { || qt.order.messageSent.equals(MessageSent.PAYMENT_FAIL) || qt.order.messageSent.equals(MessageSent.PAYMENT_SUCCESSFUL)) || qt.taskType.equals(TaskType.EMPLOYEE_DB) && qt.order.addedToEmployeeHandle) { - LOG.trace("Order " + qt.order.id + ": Not queueing task since task already done.."); + LOG.trace(ORDER_ID + ": Not queueing task since task already done..", qt.order.id); return; } var list = queue.exceptionsList; Thread t = new Thread(() -> { Retry.Operation op = (list1) -> { if (!list1.isEmpty()) { - LOG.warn("Order " + qt.order.id + ": Error in connecting to queue db, trying again.."); + LOG.warn(ORDER_ID + ": Error in connecting to queue db, trying again..", qt.order.id); throw list1.remove(0); } queue.add(qt); queueItems++; - LOG.info("Order " + qt.order.id + ": " + qt.getType() + " task enqueued.."); + LOG.info(ORDER_ID + ": {}" + " task enqueued..", qt.order.id, qt.getType()); tryDoingTasksInQueue(); }; Retry.HandleErrorIssue handleError = (qt1, err) -> { if (qt1.taskType.equals(TaskType.PAYMENT)) { qt1.order.paid = PaymentStatus.NOT_DONE; sendPaymentFailureMessage(qt1.order); - LOG.error("Order " + qt1.order.id + ": Unable to enqueue payment task," - + " payment failed.."); + LOG.error(ORDER_ID + ": Unable to enqueue payment task," + + " payment failed..", qt1.order.id); } - LOG.error("Order " + qt1.order.id + ": Unable to enqueue task of type " + qt1.getType() - + ", trying to add to employee handle.."); + LOG.error(ORDER_ID + ": Unable to enqueue task of type {}" + + ", trying to add to employee handle..", qt1.order.id, qt1.getType()); employeeHandleIssue(qt1.order); }; var r = new Retry<>(op, handleError, numOfRetries, retryDuration, @@ -328,7 +336,7 @@ public class Commander { private void sendSuccessMessage(Order order) { if (System.currentTimeMillis() - order.createdTime >= this.messageTime) { - LOG.trace("Order " + order.id + ": Message time for order over, returning.."); + LOG.trace(ORDER_ID + ": Message time for order over, returning..", order.id); return; } var list = messagingService.exceptionsList; @@ -354,8 +362,8 @@ public class Commander { && System.currentTimeMillis() - o.createdTime < messageTime) { var qt = new QueueTask(order, TaskType.MESSAGING, 2); updateQueue(qt); - LOG.info("Order " + order.id + ": Error in sending Payment Success message, trying to" - + " queue task and add to employee handle.."); + LOG.info(ORDER_ID + ": Error in sending Payment Success message, trying to" + + " queue task and add to employee handle..", order.id); employeeHandleIssue(order); } } @@ -364,11 +372,11 @@ public class Commander { return (l) -> { if (!l.isEmpty()) { if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to messaging service " - + "(Payment Success msg), trying again.."); + LOG.debug(ORDER_ID + ERROR_CONNECTING_MSG_SVC + + "(Payment Success msg), trying again..", order.id); } else { - LOG.debug("Order " + order.id + ": Error in creating Payment Success" - + " messaging request.."); + LOG.debug(ORDER_ID + ": Error in creating Payment Success" + + " messaging request..", order.id); } throw l.remove(0); } @@ -376,15 +384,15 @@ public class Commander { && !order.messageSent.equals(MessageSent.PAYMENT_SUCCESSFUL)) { var requestId = messagingService.receiveRequest(2); order.messageSent = MessageSent.PAYMENT_SUCCESSFUL; - LOG.info("Order " + order.id + ": Payment Success message sent," - + " request Id: " + requestId); + LOG.info(ORDER_ID + ": Payment Success message sent," + + REQUEST_ID, order.id, requestId); } }; } private void sendPaymentFailureMessage(Order order) { if (System.currentTimeMillis() - order.createdTime >= this.messageTime) { - LOG.trace("Order " + order.id + ": Message time for order over, returning.."); + LOG.trace(ORDER_ID + ": Message time for order over, returning..", order.id); return; } var list = messagingService.exceptionsList; @@ -412,8 +420,8 @@ public class Commander { && System.currentTimeMillis() - o.createdTime < messageTime) { var qt = new QueueTask(order, TaskType.MESSAGING, 0); updateQueue(qt); - LOG.warn("Order " + order.id + ": Error in sending Payment Failure message, " - + "trying to queue task and add to employee handle.."); + LOG.warn(ORDER_ID + ": Error in sending Payment Failure message, " + + "trying to queue task and add to employee handle..", order.id); employeeHandleIssue(o); } } @@ -421,11 +429,11 @@ public class Commander { private void handlePaymentFailureRetryOperation(Order order, List l) throws Exception { if (!l.isEmpty()) { if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to messaging service " - + "(Payment Failure msg), trying again.."); + LOG.debug(ORDER_ID + ERROR_CONNECTING_MSG_SVC + + "(Payment Failure msg), trying again..", order.id); } else { - LOG.debug("Order " + order.id + ": Error in creating Payment Failure" - + " message request.."); + LOG.debug(ORDER_ID + ": Error in creating Payment Failure" + + " message request..", order.id); } throw l.remove(0); } @@ -433,8 +441,8 @@ public class Commander { && !order.messageSent.equals(MessageSent.PAYMENT_SUCCESSFUL)) { var requestId = messagingService.receiveRequest(0); order.messageSent = MessageSent.PAYMENT_FAIL; - LOG.info("Order " + order.id + ": Payment Failure message sent successfully," - + " request Id: " + requestId); + LOG.info(ORDER_ID + ": Payment Failure message sent successfully," + + REQUEST_ID, order.id, requestId); } } @@ -469,7 +477,7 @@ public class Commander { var qt = new QueueTask(order, TaskType.MESSAGING, 1); updateQueue(qt); LOG.warn("Order " + order.id + ": Error in sending Payment Error message, " - + "trying to queue task and add to employee handle.."); + + "trying to queue task and add to employee handle.."); employeeHandleIssue(o); } } @@ -478,11 +486,11 @@ public class Commander { throws Exception { if (!l.isEmpty()) { if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to messaging service " - + "(Payment Error msg), trying again.."); + LOG.debug(ORDER_ID + ERROR_CONNECTING_MSG_SVC + + "(Payment Error msg), trying again..", order.id); } else { - LOG.debug("Order " + order.id + ": Error in creating Payment Error" - + " messaging request.."); + LOG.debug(ORDER_ID + ": Error in creating Payment Error" + + " messaging request..", order.id); } throw l.remove(0); } @@ -490,28 +498,28 @@ public class Commander { .equals(MessageSent.NONE_SENT)) { var requestId = messagingService.receiveRequest(1); order.messageSent = MessageSent.PAYMENT_TRYING; - LOG.info("Order " + order.id + ": Payment Error message sent successfully," - + " request Id: " + requestId); + LOG.info(ORDER_ID + ": Payment Error message sent successfully," + + REQUEST_ID, order.id, requestId); } } private void employeeHandleIssue(Order order) { if (System.currentTimeMillis() - order.createdTime >= this.employeeTime) { - LOG.trace("Order " + order.id + ": Employee handle time for order over, returning.."); + LOG.trace(ORDER_ID + ": Employee handle time for order over, returning..", order.id); return; } var list = employeeDb.exceptionsList; var t = new Thread(() -> { Retry.Operation op = (l) -> { if (!l.isEmpty()) { - LOG.warn("Order " + order.id + ": Error in connecting to employee handle," - + " trying again.."); + LOG.warn(ORDER_ID + ": Error in connecting to employee handle," + + " trying again..", order.id); throw l.remove(0); } if (!order.addedToEmployeeHandle) { employeeDb.receiveRequest(order); order.addedToEmployeeHandle = true; - LOG.info("Order " + order.id + ": Added order to employee database"); + LOG.info(ORDER_ID + ": Added order to employee database", order.id); } }; Retry.HandleErrorIssue handleError = (o, err) -> { @@ -519,8 +527,8 @@ public class Commander { .currentTimeMillis() - order.createdTime < employeeTime) { var qt = new QueueTask(order, TaskType.EMPLOYEE_DB, -1); updateQueue(qt); - LOG.warn("Order " + order.id + ": Error in adding to employee db," - + " trying to queue task.."); + LOG.warn(ORDER_ID + ": Error in adding to employee db," + + " trying to queue task..", order.id); } }; var r = new Retry<>(op, handleError, numOfRetries, retryDuration, @@ -538,51 +546,51 @@ public class Commander { if (queueItems != 0) { var qt = queue.peek(); //this should probably be cloned here //this is why we have retry for doTasksInQueue - LOG.trace("Order " + qt.order.id + ": Started doing task of type " + qt.getType()); + LOG.trace(ORDER_ID + ": Started doing task of type {}", qt.order.id, qt.getType()); if (qt.getFirstAttemptTime() == -1) { qt.setFirstAttemptTime(System.currentTimeMillis()); } if (System.currentTimeMillis() - qt.getFirstAttemptTime() >= queueTaskTime) { tryDequeue(); - LOG.trace("Order " + qt.order.id + ": This queue task of type " + qt.getType() - + " does not need to be done anymore (timeout), dequeue.."); + LOG.trace(ORDER_ID + ": This queue task of type {}" + + " does not need to be done anymore (timeout), dequeue..", qt.order.id, qt.getType()); } else { if (qt.taskType.equals(TaskType.PAYMENT)) { if (!qt.order.paid.equals(PaymentStatus.TRYING)) { tryDequeue(); - LOG.trace("Order " + qt.order.id + ": This payment task already done, dequeueing.."); + LOG.trace(ORDER_ID + ": This payment task already done, dequeueing..", qt.order.id); } else { sendPaymentRequest(qt.order); - LOG.debug("Order " + qt.order.id + ": Trying to connect to payment service.."); + LOG.debug(ORDER_ID + ": Trying to connect to payment service..", qt.order.id); } } else if (qt.taskType.equals(TaskType.MESSAGING)) { if (qt.order.messageSent.equals(MessageSent.PAYMENT_FAIL) || qt.order.messageSent.equals(MessageSent.PAYMENT_SUCCESSFUL)) { tryDequeue(); - LOG.trace("Order " + qt.order.id + ": This messaging task already done, dequeue.."); + LOG.trace(ORDER_ID + ": This messaging task already done, dequeue..", qt.order.id); } else if (qt.messageType == 1 && (!qt.order.messageSent.equals(MessageSent.NONE_SENT) || !qt.order.paid.equals(PaymentStatus.TRYING))) { tryDequeue(); - LOG.trace("Order " + qt.order.id + ": This messaging task does not need to be done," - + " dequeue.."); + LOG.trace(ORDER_ID + ": This messaging task does not need to be done," + + " dequeue..", qt.order.id); } else if (qt.messageType == 0) { sendPaymentFailureMessage(qt.order); - LOG.debug("Order " + qt.order.id + ": Trying to connect to messaging service.."); + LOG.debug(ORDER_ID + TRY_CONNECTING_MSG_SVC, qt.order.id); } else if (qt.messageType == 1) { sendPaymentPossibleErrorMsg(qt.order); - LOG.debug("Order " + qt.order.id + ": Trying to connect to messaging service.."); + LOG.debug(ORDER_ID + TRY_CONNECTING_MSG_SVC, qt.order.id); } else if (qt.messageType == 2) { sendSuccessMessage(qt.order); - LOG.debug("Order " + qt.order.id + ": Trying to connect to messaging service.."); + LOG.debug(ORDER_ID + TRY_CONNECTING_MSG_SVC, qt.order.id); } } else if (qt.taskType.equals(TaskType.EMPLOYEE_DB)) { if (qt.order.addedToEmployeeHandle) { tryDequeue(); - LOG.trace("Order " + qt.order.id + ": This employee handle task already done," - + " dequeue.."); + LOG.trace(ORDER_ID + ": This employee handle task already done," + + " dequeue..", qt.order.id); } else { employeeHandleIssue(qt.order); - LOG.debug("Order " + qt.order.id + ": Trying to connect to employee handle.."); + LOG.debug(ORDER_ID + ": Trying to connect to employee handle..", qt.order.id); } } } diff --git a/commander/src/test/java/com/iluwatar/commander/CommanderTest.java b/commander/src/test/java/com/iluwatar/commander/CommanderTest.java new file mode 100644 index 000000000..094cf7cf6 --- /dev/null +++ b/commander/src/test/java/com/iluwatar/commander/CommanderTest.java @@ -0,0 +1,526 @@ +package com.iluwatar.commander; + +import com.iluwatar.commander.employeehandle.EmployeeDatabase; +import com.iluwatar.commander.employeehandle.EmployeeHandle; +import com.iluwatar.commander.exceptions.DatabaseUnavailableException; +import com.iluwatar.commander.exceptions.ItemUnavailableException; +import com.iluwatar.commander.exceptions.PaymentDetailsErrorException; +import com.iluwatar.commander.exceptions.ShippingNotPossibleException; +import com.iluwatar.commander.messagingservice.MessagingDatabase; +import com.iluwatar.commander.messagingservice.MessagingService; +import com.iluwatar.commander.paymentservice.PaymentDatabase; +import com.iluwatar.commander.paymentservice.PaymentService; +import com.iluwatar.commander.queue.QueueDatabase; +import com.iluwatar.commander.shippingservice.ShippingDatabase; +import com.iluwatar.commander.shippingservice.ShippingService; + +import org.junit.jupiter.api.Test; +import org.junit.platform.commons.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +class CommanderTest { + + private final int numOfRetries = 1; + private final long retryDuration = 1_000; + private long queueTime = 1_00; + private long queueTaskTime = 1_000; + private long paymentTime = 6_000; + private long messageTime = 5_000; + private long employeeTime = 2_000; + + private static final List exceptionList = new ArrayList<>(); + + static { + exceptionList.add(new DatabaseUnavailableException()); + exceptionList.add(new ShippingNotPossibleException()); + exceptionList.add(new ItemUnavailableException()); + exceptionList.add(new PaymentDetailsErrorException()); + exceptionList.add(new IllegalStateException()); + } + + private Commander buildCommanderObject() { + return buildCommanderObject(false); + } + + private Commander buildCommanderObject(boolean nonPaymentException) { + PaymentService paymentService = new PaymentService + (new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + + ShippingService shippingService; + MessagingService messagingService; + if (nonPaymentException) { + shippingService = new ShippingService(new ShippingDatabase(), new DatabaseUnavailableException()); + messagingService = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); + + } else { + shippingService = new ShippingService(new ShippingDatabase(), new DatabaseUnavailableException()); + messagingService = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); + + } + var employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var qdb = new QueueDatabase + (new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException()); + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, qdb, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectVanilla() { + PaymentService paymentService = new PaymentService + (new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var shippingService = new ShippingService(new ShippingDatabase()); + var messagingService = new MessagingService(new MessagingDatabase()); + var employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var qdb = new QueueDatabase + (new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException()); + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, qdb, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectUnknownException() { + PaymentService paymentService = new PaymentService + (new PaymentDatabase(), new IllegalStateException()); + var shippingService = new ShippingService(new ShippingDatabase()); + var messagingService = new MessagingService(new MessagingDatabase()); + var employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), new IllegalStateException()); + var qdb = new QueueDatabase + (new DatabaseUnavailableException(), new IllegalStateException()); + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, qdb, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectNoPaymentException1() { + PaymentService paymentService = new PaymentService + (new PaymentDatabase()); + var shippingService = new ShippingService(new ShippingDatabase()); + var messagingService = new MessagingService(new MessagingDatabase()); + var employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), new IllegalStateException()); + var qdb = new QueueDatabase + (new DatabaseUnavailableException(), new IllegalStateException()); + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, qdb, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectNoPaymentException2() { + PaymentService paymentService = new PaymentService + (new PaymentDatabase()); + var shippingService = new ShippingService(new ShippingDatabase()); + var messagingService = new MessagingService(new MessagingDatabase(), new IllegalStateException()); + var employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), new IllegalStateException()); + var qdb = new QueueDatabase + (new DatabaseUnavailableException(), new IllegalStateException()); + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, qdb, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectNoPaymentException3() { + PaymentService paymentService = new PaymentService + (new PaymentDatabase()); + var shippingService = new ShippingService(new ShippingDatabase()); + var messagingService = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); + var employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), new IllegalStateException()); + var qdb = new QueueDatabase + (new DatabaseUnavailableException(), new IllegalStateException()); + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, qdb, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectWithDB() { + return buildCommanderObjectWithoutDB(false, false, new IllegalStateException()); + } + + private Commander buildCommanderObjectWithDB(boolean includeException, boolean includeDBException, Exception e) { + var l = includeDBException ? new DatabaseUnavailableException() : e; + PaymentService paymentService; + ShippingService shippingService; + MessagingService messagingService; + EmployeeHandle employeeHandle; + if (includeException) { + paymentService = new PaymentService + (new PaymentDatabase(), l); + shippingService = new ShippingService(new ShippingDatabase(), l); + messagingService = new MessagingService(new MessagingDatabase(), l); + employeeHandle = new EmployeeHandle + (new EmployeeDatabase(), l); + } else { + paymentService = new PaymentService + (null); + shippingService = new ShippingService(null); + messagingService = new MessagingService(null); + employeeHandle = new EmployeeHandle + (null); + } + + + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, null, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + private Commander buildCommanderObjectWithoutDB() { + return buildCommanderObjectWithoutDB(false, false, new IllegalStateException()); + } + + private Commander buildCommanderObjectWithoutDB(boolean includeException, boolean includeDBException, Exception e) { + var l = includeDBException ? new DatabaseUnavailableException() : e; + PaymentService paymentService; + ShippingService shippingService; + MessagingService messagingService; + EmployeeHandle employeeHandle; + if (includeException) { + paymentService = new PaymentService + (null, l); + shippingService = new ShippingService(null, l); + messagingService = new MessagingService(null, l); + employeeHandle = new EmployeeHandle + (null, l); + } else { + paymentService = new PaymentService + (null); + shippingService = new ShippingService(null); + messagingService = new MessagingService(null); + employeeHandle = new EmployeeHandle + (null); + } + + + return new Commander(employeeHandle, paymentService, shippingService, + messagingService, null, numOfRetries, retryDuration, + queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); + } + + @Test + void testPlaceOrderVanilla() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObjectVanilla(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrder() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObject(true); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrder2() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObject(false); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderNoException1() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObjectNoPaymentException1(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderNoException2() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObjectNoPaymentException2(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderNoException3() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObjectNoPaymentException3(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderNoException4() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + Commander c = buildCommanderObjectNoPaymentException3(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + c.placeOrder(order); + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderUnknownException() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObjectUnknownException(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderShortDuration() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObject(true); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderShortDuration2() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObject(false); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderNoExceptionShortMsgDuration() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObjectNoPaymentException1(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderNoExceptionShortQueueDuration() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObjectUnknownException(); + var order = new Order(new User("K", "J"), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderWithDatabase() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObjectWithDB(); + var order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderWithDatabaseAndExceptions() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + + for (Exception e : exceptionList) { + + Commander c = buildCommanderObjectWithDB(true, true, e); + var order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + + c = buildCommanderObjectWithDB(true, false, e); + order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + + c = buildCommanderObjectWithDB(false, false, e); + order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + + c = buildCommanderObjectWithDB(false, true, e); + order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + } + + @Test + void testPlaceOrderWithoutDatabase() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + Commander c = buildCommanderObjectWithoutDB(); + var order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + + @Test + void testPlaceOrderWithoutDatabaseAndExceptions() throws Exception { + for (double d = 0.1; d < 2; d = d + 0.1) { + paymentTime *= d; + queueTaskTime *= d; + messageTime *= d; + employeeTime *= d; + queueTime *= d; + + for (Exception e : exceptionList) { + + Commander c = buildCommanderObjectWithoutDB(true, true, e); + var order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + + c = buildCommanderObjectWithoutDB(true, false, e); + order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + + c = buildCommanderObjectWithoutDB(false, false, e); + order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + + c = buildCommanderObjectWithoutDB(false, true, e); + order = new Order(new User("K", null), "pen", 1f); + for (Order.MessageSent ms : Order.MessageSent.values()) { + c.placeOrder(order); + assertFalse(StringUtils.isBlank(order.id)); + } + } + } + } + +} diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java index 5faef509d..897466a99 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java @@ -34,11 +34,11 @@ import java.util.HashMap; public class SpatialPartitionBubbles extends SpatialPartitionGeneric { private final HashMap bubbles; - private final QuadTree quadTree; + private final QuadTree bubblesQuadTree; - SpatialPartitionBubbles(HashMap bubbles, QuadTree quadTree) { + SpatialPartitionBubbles(HashMap bubbles, QuadTree bubblesQuadTree) { this.bubbles = bubbles; - this.quadTree = quadTree; + this.bubblesQuadTree = bubblesQuadTree; } void handleCollisionsUsingQt(Bubble b) { @@ -46,7 +46,7 @@ public class SpatialPartitionBubbles extends SpatialPartitionGeneric { // centre of bubble and length = radius of bubble var rect = new Rect(b.coordinateX, b.coordinateY, 2D * b.radius, 2D * b.radius); var quadTreeQueryResult = new ArrayList(); - this.quadTree.query(rect, quadTreeQueryResult); + this.bubblesQuadTree.query(rect, quadTreeQueryResult); //handling these collisions b.handleCollision(quadTreeQueryResult, this.bubbles); } -- GitLab