From 390358d7a4236639dec56e5efbfc29385b6a390d Mon Sep 17 00:00:00 2001 From: Dev Narula Date: Sun, 16 Feb 2025 16:07:25 +0530 Subject: [PATCH] remote-procedure-call --- pom.xml | 1 + remote-procedure-call/README.md | 147 ++++++++++++++ .../cart-service/etc/cart-service.urm.png | Bin 0 -> 121381 bytes .../cart-service/etc/cart-service.urm.puml | 70 +++++++ remote-procedure-call/cart-service/pom.xml | 42 ++++ .../main/java/com/iluwatar/rpc/cart/Main.java | 74 +++++++ .../rpc/cart/model/ProductInCart.java | 46 +++++ .../rpc/cart/service/CartService.java | 61 ++++++ .../rpc/cart/service/CartServiceImpl.java | 132 ++++++++++++ .../src/main/resources/logback.xml | 12 ++ .../CartServiceImplIntegrationTest.java | 96 +++++++++ .../rpc/cart/service/CartServiceImplTest.java | 168 +++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + .../etc/remote-procedure-call.urm.puml | 2 + remote-procedure-call/pom.xml | 131 ++++++++++++ .../etc/product-service.urm.png | Bin 0 -> 155055 bytes .../etc/product-service.urm.puml | 80 ++++++++ remote-procedure-call/product-service/pom.xml | 42 ++++ .../java/com/iluwatar/rpc/product/Main.java | 72 +++++++ .../rpc/product/mocks/ProductMocks.java | 54 +++++ .../iluwatar/rpc/product/model/Product.java | 44 ++++ .../rpc/product/service/ProductService.java | 55 +++++ .../service/ProductServiceGrpcImpl.java | 147 ++++++++++++++ .../product/service/ProductServiceImpl.java | 78 +++++++ .../src/main/resources/logback.xml | 12 ++ .../service/ProductServiceGrpcImplTest.java | 192 ++++++++++++++++++ .../service/ProductServiceImplTest.java | 92 +++++++++ .../ProductServiceIntegrationTest.java | 102 ++++++++++ .../org.mockito.plugins.MockMaker | 1 + remote-procedure-call/proto/shopping.proto | 52 +++++ 30 files changed, 2006 insertions(+) create mode 100644 remote-procedure-call/README.md create mode 100644 remote-procedure-call/cart-service/etc/cart-service.urm.png create mode 100644 remote-procedure-call/cart-service/etc/cart-service.urm.puml create mode 100644 remote-procedure-call/cart-service/pom.xml create mode 100644 remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/Main.java create mode 100644 remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/model/ProductInCart.java create mode 100644 remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartService.java create mode 100644 remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartServiceImpl.java create mode 100644 remote-procedure-call/cart-service/src/main/resources/logback.xml create mode 100644 remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplIntegrationTest.java create mode 100644 remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplTest.java create mode 100644 remote-procedure-call/cart-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 remote-procedure-call/etc/remote-procedure-call.urm.puml create mode 100644 remote-procedure-call/pom.xml create mode 100644 remote-procedure-call/product-service/etc/product-service.urm.png create mode 100644 remote-procedure-call/product-service/etc/product-service.urm.puml create mode 100644 remote-procedure-call/product-service/pom.xml create mode 100644 remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/Main.java create mode 100644 remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/mocks/ProductMocks.java create mode 100644 remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/model/Product.java create mode 100644 remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductService.java create mode 100644 remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImpl.java create mode 100644 remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceImpl.java create mode 100644 remote-procedure-call/product-service/src/main/resources/logback.xml create mode 100644 remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImplTest.java create mode 100644 remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceImplTest.java create mode 100644 remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceIntegrationTest.java create mode 100644 remote-procedure-call/product-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 remote-procedure-call/proto/shopping.proto diff --git a/pom.xml b/pom.xml index 5ac889f7f24f..989d5d436f90 100644 --- a/pom.xml +++ b/pom.xml @@ -225,6 +225,7 @@ money table-inheritance bloc + remote-procedure-call diff --git a/remote-procedure-call/README.md b/remote-procedure-call/README.md new file mode 100644 index 000000000000..58c2b7eb3a9d --- /dev/null +++ b/remote-procedure-call/README.md @@ -0,0 +1,147 @@ +--- +title: Remote Procedure Call in Java using gRPC +shortTitle: gRPC in Java +description: Remote Procedure Call in Java using gRPC communicating between 2 microservices product and cart application +category: Data Transfer +language: en +tag: +- Behavioral +- Integration +- Messaging +- Client-Server +- Data Transfer +- Microservices +- Remote Procedure Call +- Remote Method Invocation +--- +# Remote Method Invocation / Remote Procedure Call +Remote Method Invocation has various different aliases, Remote Procedure Call / Remote Method Invocation or RPC for short. Is a protocol +that one program can use to request a service from a different program located in same or another computer in a network without having to understand network details. + +RMI can be implemented in various different languages and frameworks. Technologies like REST, gRPC and Thrift can be used for RMI. In this example we +will be using gRPC to implement Remote Procedure Call in Java. + +## Terminologies +- Client: The client is the application that sends a request to the server. +- Server: The server is the application that receives the request from the client and sends a response back to the client. +- Stub: The client-side proxy for the server. +- Skeleton: The server-side proxy for the client. +- Protocol: The set of rules that the client and server follow to communicate with each other. +- Stream: The sequence of messages that are sent between the client and server, understand it as list of objects. + +## What is gRPC? +[gRPC](https://grpc.io/docs/what-is-grpc/introduction/) is a high-performance, open-source and universal RPC framework. gRPC was developed by Google but is now open-source +and is based on the HTTP/2 protocol. + +A gRPC client can call a method on a gRPC server similar to if it was calling a method on a local object. +This allows client and server to communicate with each other by just using method calls. gRPC internally uses [protobuf](https://protobuf.dev/) to serialize the data for communication. + +## When to use gRPC? +gRPC should be used when you need high performance communication between client and server. It is mostly used in micro-service architecture when one +service needs to communicate with another service. + +For communication you need to define contract / interfaces denoting the method signature, data types and parameters along with return type. +These methods can be called by client service just like a method call, when using gRPC, a gRPC service is created which will in-turn call the +implementation of the RPC method in the server and return the response (if any). + +Start by creating a .proto file which should have all the methods and data types you need for communication between the services. +When you compile your code `maven/gradle gRPC` plugin will in return create objects and interfaces which you need to implement / extend in your +server side. The client will then call the method defined in .proto file using the generated stubs by gPRC. In return inside the server the +implementation of the method will be called and the response will be sent back to the client. + +### In this example +We will be using 2 different micro-services +- product-service +- cart-service + +Along with a shopping.proto file to define the contract between the services. +- ShoppingService + +This is a basic e-commerce simulation. + +In this simple example the `product-service` has data related to products and is used a source of truth. The `cart-service` +needs the product data that is available in `product-service`. Certain number of products in turn may be bought by a customer, +inside the cart service at which point the product quantity needs to be decreased in `product-service`, hence the need for bidirectional +communication from `product-service` -> `cart-service` and vice versa they both communicate via gRPC. + +- getAllProducts() - gets all the product from state in `product-service` and stores it in `cart-service` +- reduceProductQuantity() - reduces the quantity of a product by `id` fetched by `getAllProducts` and stored in `cart-service` + when the method is hit, it reduces the quantity of product with same `id` in `product-service` + +## How to implement gRPC in Java? +### .proto file +- Create a [.proto](https://protobuf.dev/programming-guides/proto2/) file [example](./proto/shopping.proto) defining the service and message contracts +- Define service interfaces, method signatures and data types in your .proto file +### At the server end +- Add gRPC and protobuf dependencies in your `pom.xml` +- Include gRPC and protobuf plugins in `mvn build plugins`, for it to generate interfaces from your `.proto` during compilation +- Include the .proto file directory in mvn build plugins to generate the interfaces +- Build the project via `mvn clean install` +- gRPC will generate the stubs and skeletons for you +- Implement the service logic for the generated methods of skeleton in your service classes +- Start the gRPC server at server's side on a specific port and attach the gRPC Implementation service to it +### At the client end +- Add gRPC and protobuf dependencies in your `pom.xml` +- Include gRPC and protobuf plugins in `mvn build plugins`, for it to generate interfaces from your `.proto` during compilation +- Include the .proto file directory in mvn build plugins to generate the interfaces +- Build the project via `mvn clean install` +- gRPC will generate the stubs and skeletons for you +- A stub will expose the available methods to be called by the client, call the methods you need on server via the stub +- Create Channel with server's host and port at client's end to communicate between server and client +- Start client, and you are good to go + +## gRPC in action +### Product Service +#### Service +- ProductService - API Interface for Internal logic in `product-service` +- ProductServiceImpl - Implementation of ProductService, saves product data in memory for simplicity, exposes getter(s) for the same. + Houses Composition of ProductService to store state. +- ProductServiceGrpcImpl - gRPC contract implementation, methods to retrieve all products and reduce quantity of a product. +This file implements the logic that should be executed when gRPC methods are called + +#### Model +- Product - Product POJO Model +#### Mocks +- ProductMocks - Mock data of Product for testing and state initialization. + +### Cart Service +#### Service +- CartService - API Interface for Internal logic in `cart-service`, +- CartServiceImpl - Implementation of CartService, methods to call the stub to populate data in cart and reduce quantities. + This file calls the gRPC method to communicate with `product-service`. +#### Model +- ProductInCart - Cut from Product POJO in `product-service` + +### proto +Proto folder contains all the proto files which define contract for the services. +proto files end with .proto and contain the types, methods and services that are to be used in gRPC communication. + +### Good practise +- Keep types / method names in PascalCase in .proto file + +### How to run this project +- Clone the project +- navigate to 'remote-procedure-call' directory via +```shell +cd java-design-patterns/remote-procedure-call +``` +- build the project with, this will download dependencies, compile .proto to java interface and classes and create final jar +```shell +mvn clean install +``` +- Start the `product-service` before `cart-service` as `cart-service` depends on product-service +```shell +mvn exec:java -Dexec.mainClass="com.iluwatar.rpc.product.Main" -pl product-service +``` +- Start a new terminal session +- navigate to 'remote-procedure-call' directory +- Start the `cart-service` +```shell +mvn exec:java -Dexec.mainClass="com.iluwatar.rpc.cart.Main" -pl cart-service +``` +- `cart-service` on startup will hit a gRPC call to `product-service` to get all products and populate the cart. +- `cart-service` will then reduce the quantity of a product in `product-service` when a product is bought. +- `cart-service` will then shut-down gracefully. +- all the operations will be logged in the console. +- `product-service` will continue to run and can be used for further operations by running `cart-service` again. +- To stop the services, press `ctrl+c` in the terminal. diff --git a/remote-procedure-call/cart-service/etc/cart-service.urm.png b/remote-procedure-call/cart-service/etc/cart-service.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..ab374fa9732bd0f9076a55f51ad0e9df1831ed94 GIT binary patch literal 121381 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 literal 0 HcmV?d00001 diff --git a/remote-procedure-call/cart-service/etc/cart-service.urm.puml b/remote-procedure-call/cart-service/etc/cart-service.urm.puml new file mode 100644 index 000000000000..b49796603e31 --- /dev/null +++ b/remote-procedure-call/cart-service/etc/cart-service.urm.puml @@ -0,0 +1,70 @@ +@startuml +skinparam dpi 300 +scale 0.3 + +package com.iluwatar.rpc.cart.model { + class ProductInCart { + - id : Long + - name : String + - price : double + - quantityToReduce : int + - type : String + } +} + +package com.iluwatar.rpc.cart.service { + interface CartService { + + getAllProducts() {abstract} + + getRandomProductFromCart() : ProductInCart {abstract} + + reduceCartQuantityFromProduct(ProductInCart) {abstract} + } + + class CartServiceImpl { + - log : Logger {static} + - productsInCart : List + - shoppingServiceBlockingStub : ShoppingServiceBlockingStub + + CartServiceImpl(shoppingStub : ShoppingServiceBlockingStub) + + getAllProducts() + + getRandomProductFromCart() : ProductInCart + + reduceCartQuantityFromProduct(product : ProductInCart) + } +} + +package com.iluwatar.rpc.proto { + class Empty {} + + class ProductResponse { + - id : long + - name : String + - price : double + - type : String + } + + class ReduceProductRequest { + - productId : long + - quantity : int + } + + class ReduceProductResponse { + - message : String + - status : boolean + } + + class ShoppingServiceImplBase { + - getAllProducts(request: Empty, responseStreamObserver: StreamObserver) + - reduceProductQuantity(request: ReduceProductRequest, responseStreamObserver : StreamObserver) + } + +} +package com.iluwatar.rpc.cart { + class Main { + - HOST : String {static} + - SERVER_PORT : int {static} + - log : Logger {static} + + main(args : String[]) {static} + } +} + +CartServiceImpl --> "-productsInCart" ProductInCart +CartServiceImpl ..|> CartService +@enduml \ No newline at end of file diff --git a/remote-procedure-call/cart-service/pom.xml b/remote-procedure-call/cart-service/pom.xml new file mode 100644 index 000000000000..7fad34a3edb6 --- /dev/null +++ b/remote-procedure-call/cart-service/pom.xml @@ -0,0 +1,42 @@ + + + + + + remote-procedure-call + com.iluwatar + 1.26.0-SNAPSHOT + + + 4.0.0 + cart-service + jar + + \ No newline at end of file diff --git a/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/Main.java b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/Main.java new file mode 100644 index 000000000000..db8bd1738ee5 --- /dev/null +++ b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/Main.java @@ -0,0 +1,74 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.cart; + +import com.iluwatar.rpc.cart.service.CartServiceImpl; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc.ShoppingServiceBlockingStub; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Main class for the cart service. + * Initializes the shopping channel and the cart service. + * + * @author CoderSleek + * @version 1.0 + */ +public class Main { + private static final int SERVER_PORT = 8080; + private static final String HOST = "localhost"; + private static final Logger log = LoggerFactory.getLogger(Main.class); + /** + * Main method to initialize the cart service and channel for RPC connection + * initializes blocking stub and passes it to CartServiceImpl for constructor initialization. + * Initializes data fetching from product-service. + * shuts down after 1 request + */ + public static void main(String[] args) { + ManagedChannel productChannel = ManagedChannelBuilder + .forAddress(HOST, SERVER_PORT) + .usePlaintext() + .enableRetry() + .keepAliveTime(10, TimeUnit.SECONDS) + .build(); + + ShoppingServiceBlockingStub blockingStub = ShoppingServiceGrpc.newBlockingStub(productChannel); + log.info("cart-service started"); + + var cartService = new CartServiceImpl(blockingStub); + cartService.getAllProducts(); + + var productInCart = cartService.getRandomProductFromCart(); + productInCart.setQuantityToReduce(10); + + cartService.reduceCartQuantityFromProduct(productInCart); + productChannel.shutdown(); + log.info("cart-service execution successful, shutting down"); + } +} \ No newline at end of file diff --git a/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/model/ProductInCart.java b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/model/ProductInCart.java new file mode 100644 index 000000000000..522dce357f5d --- /dev/null +++ b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/model/ProductInCart.java @@ -0,0 +1,46 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.cart.model; + +import lombok.Builder; +import lombok.Data; + +/** + * ProductInCart is a POJO model class for product in cart. + * ProductInCart is a cut from Product class in product-service + * + * @link com.iluwatar.rpc.product.model.Product + * @author CoderSleek + * @version 1.0 + */ +@Data +@Builder(toBuilder = true) +public class ProductInCart { + private Long id; + private String name; + private String type; + private double price; + private int quantityToReduce; +} diff --git a/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartService.java b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartService.java new file mode 100644 index 000000000000..e6720f439cd4 --- /dev/null +++ b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartService.java @@ -0,0 +1,61 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.cart.service; + +import com.iluwatar.rpc.cart.model.ProductInCart; + +/** + * API Contract for Cart service, which can be exposed. + * Includes contract method for grpc stub as well. + * Thread safety is not guaranteed. + * @link com.iluwatar.rpc.cart.model.ProductInCart + * @author CoderSleek + * @version 1.0 + */ +public interface CartService { + /** + * returns a random product from cart, if cart is empty throws IllegalStateException. + * randomized just for demonstration purposes. + * + * @return randomly chosen ProductInCart from List of ProductInCart + * @throws IllegalStateException if cart is empty + */ + ProductInCart getRandomProductFromCart() throws IllegalStateException; + + /** + * reduces the quantity of a product from cart by doing a RPC call to product service. + * + * @param product product whose quantity needs to be reduced in product-service + * @throws IllegalArgumentException if product is null or id invalid + * @throws IllegalStateException if product is not found in cart or cart is null + */ + void reduceCartQuantityFromProduct(ProductInCart product) + throws IllegalStateException, IllegalArgumentException; + + /** + * RPC call to get all the products from product-service and add them to cart. + */ + void getAllProducts(); +} diff --git a/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartServiceImpl.java b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartServiceImpl.java new file mode 100644 index 000000000000..c647bde3110d --- /dev/null +++ b/remote-procedure-call/cart-service/src/main/java/com/iluwatar/rpc/cart/service/CartServiceImpl.java @@ -0,0 +1,132 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.cart.service; + +import com.iluwatar.rpc.cart.model.ProductInCart; +import com.iluwatar.rpc.proto.Shopping.ReduceProductRequest; +import com.iluwatar.rpc.proto.Shopping.ReduceProductResponse; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc.ShoppingServiceBlockingStub; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implementation of cart-service Contract exposed by gRPC proto. + * Thread safety is not guaranteed. + * @link com.iluwatar.rpc.cart.model.ProductInCart + * @link com.iluwatar.rpc.cart.service.CartService + * @author CoderSleek + * @version 1.0 + */ +public class CartServiceImpl implements CartService { + private final ShoppingServiceBlockingStub shoppingServiceBlockingStub; + private final List productsInCart = new ArrayList<>(); + private static final Logger log = LoggerFactory.getLogger(CartServiceImpl.class); + + /** + * Constructor to initialize CartServiceImpl with ProductServiceBlockingStub. + * blocking-stub is initialized in Main + * @param shoppingStub ProductServiceBlockingStub + * @throws IllegalArgumentException if ProductServiceBlockingStub is null + */ + public CartServiceImpl(ShoppingServiceBlockingStub shoppingStub) { + if (shoppingStub == null) { + throw new IllegalArgumentException("ShoppingServiceBlockingStub is null"); + } + this.shoppingServiceBlockingStub = shoppingStub; + } + + @Override + public void reduceCartQuantityFromProduct(ProductInCart product) + throws IllegalArgumentException, IllegalStateException { + log.info("Started Request for reducing product quantity from cart in product-service"); + if (product == null) { + throw new IllegalArgumentException("Product state is null"); + } + if (product.getId() <= 0) { + throw new IllegalArgumentException("Invalid Product id"); + } + if (productsInCart.isEmpty()) { + throw new IllegalStateException("Products In cart array empty, populate cart first"); + } + + // type exposed and maintained in gRPC proto + ReduceProductRequest request = ReduceProductRequest + .newBuilder() + .setProductId(product.getId()) + .setQuantity(product.getQuantityToReduce()) + .build(); + + log.info("Initiating RPC call to reduce quantity of product with id: {}", product.getId()); + ReduceProductResponse response = shoppingServiceBlockingStub.reduceProductQuantity(request); + log.info("Completed RPC call reduce quantity with status: {}", response.getStatus()); + log.info("RPC call response message: {}", response.getMessage()); + log.info("Completed Request for reducing product quantity from cart in product-service"); + } + + @Override + public void getAllProducts() { + log.info("Started request to fetch all products from product-service"); + // stream of products / multiple products + try { + shoppingServiceBlockingStub.getAllProducts(null) + .forEachRemaining(product -> + productsInCart.add(ProductInCart.builder() + .name(product.getName()) + .id(product.getId()) + .price(product.getPrice()) + .type(product.getType()) + .quantityToReduce(0) + .build()) + ); + } catch (Exception e) { + log.error("Error occurred while fetching products: ", e); + throw new IllegalStateException("Failed to fetch products from ProductService", e); + } + log.info("Fetching of products completed"); + } + + /** + * returns a random product from cart, if cart is empty throws IllegalStateException. + * randomized just for demonstration purposes. + * returns a new instance of ProductInCart to avoid mutation of quantityToReduce in original object. + * + * @return randomly chosen ProductInCart from List of ProductInCart + * @throws IllegalStateException if cart is empty + */ + @Override + public ProductInCart getRandomProductFromCart() throws IllegalStateException { + if (productsInCart.isEmpty()) { + throw new IllegalStateException("Products In cart array empty"); + } + + // randomly choose a product for dynamic results + int randInt = new Random().nextInt(productsInCart.size()); + // to builder is used to return a copy of the object to avoid mutation of original object + return productsInCart.get(randInt).toBuilder().build(); + } +} diff --git a/remote-procedure-call/cart-service/src/main/resources/logback.xml b/remote-procedure-call/cart-service/src/main/resources/logback.xml new file mode 100644 index 000000000000..ed930c512e7e --- /dev/null +++ b/remote-procedure-call/cart-service/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file diff --git a/remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplIntegrationTest.java b/remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplIntegrationTest.java new file mode 100644 index 000000000000..64bdbe46eb20 --- /dev/null +++ b/remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplIntegrationTest.java @@ -0,0 +1,96 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.cart.service; + +import com.iluwatar.rpc.cart.model.ProductInCart; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc.ShoppingServiceBlockingStub; +import com.iluwatar.rpc.proto.Shopping.ProductResponse; +import com.iluwatar.rpc.proto.Shopping.ReduceProductRequest; +import com.iluwatar.rpc.proto.Shopping.ReduceProductResponse; +import java.util.ArrayList; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CartServiceImplIntegrationTest { + + @Mock + private ShoppingServiceBlockingStub productServiceBlockingStub; + + @InjectMocks + private CartServiceImpl cartService; + + private ProductResponse product; + + @BeforeEach + public void setUp() { + product = ProductResponse.newBuilder() + .setId(1) + .setName("Test") + .setPrice(100) + .setType("Test") + .build(); + + ArrayList productList = new ArrayList<>(); + + productList.add(product); + when(productServiceBlockingStub.getAllProducts(null)).thenReturn(productList.iterator()); + cartService.getAllProducts(); + } + + @Test + void testGetRandomProductFromCartAndReduceQuantity_Success() { + ProductInCart randomProduct = cartService.getRandomProductFromCart(); + + assertNotNull(randomProduct); + assertEquals(product.getId(), randomProduct.getId()); + assertEquals(product.getName(), randomProduct.getName()); + randomProduct.setQuantityToReduce(100); + + ReduceProductResponse response = ReduceProductResponse.newBuilder() + .setStatus(true) + .setMessage("Success") + .build(); + + when(productServiceBlockingStub.reduceProductQuantity( + any(ReduceProductRequest.class) + )).thenReturn(response); + cartService.reduceCartQuantityFromProduct(randomProduct); + + verify(productServiceBlockingStub, times(1)).reduceProductQuantity( + any(ReduceProductRequest.class)); + } +} \ No newline at end of file diff --git a/remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplTest.java b/remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplTest.java new file mode 100644 index 000000000000..6cd2ccdd627c --- /dev/null +++ b/remote-procedure-call/cart-service/src/test/java/com/iluwatar/rpc/cart/service/CartServiceImplTest.java @@ -0,0 +1,168 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.cart.service; + +import com.iluwatar.rpc.cart.model.ProductInCart; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc.ShoppingServiceBlockingStub; +import com.iluwatar.rpc.proto.Shopping; +import com.iluwatar.rpc.proto.Shopping.ReduceProductRequest; +import com.iluwatar.rpc.proto.Shopping.ReduceProductResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CartServiceImplTest { + @Mock + private ShoppingServiceBlockingStub productServiceBlockingStub; + @InjectMocks + private CartServiceImpl cartService; + + private static List products; + + @BeforeEach + public void setUp() { + products = new ArrayList<>(); + var product = productInCartProvider(); + products.add(Shopping.ProductResponse.newBuilder() + .setId(product.getId()) + .setPrice(product.getPrice()) + .setType(product.getType()) + .setName(product.getName()) + .build()); + } + + @Test + void testReduceCartQuantityFromProduct_NullProduct() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + cartService.reduceCartQuantityFromProduct(null); + }); + assertEquals("Product state is null", exception.getMessage()); + } + + @Test + void testReduceCartQuantityFromProduct_InvalidProductProperties() { + ProductInCart invalidProduct = productInCartProvider(); + invalidProduct.setId(-1L); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + cartService.reduceCartQuantityFromProduct(invalidProduct); + }); + assertEquals("Invalid Product id", exception.getMessage()); + } + + @Test + void testReduceCartQuantityFromProduct_EmptyCart() { + ProductInCart product = productInCartProvider(); + + IllegalStateException exception = assertThrows(IllegalStateException.class, () -> { + cartService.reduceCartQuantityFromProduct(product); + }); + assertEquals("Products In cart array empty, populate cart first", exception.getMessage()); + } + + @Test + void testReduceCartQuantityFromProduct_Success() { + when(productServiceBlockingStub.getAllProducts(null)).thenReturn(products.iterator()); + + ProductInCart product = productInCartProvider(); + product.setId(3L); + + ReduceProductResponse response = + ReduceProductResponse.newBuilder().setStatus(true).setMessage("Success").build(); + when(productServiceBlockingStub.reduceProductQuantity( + any(ReduceProductRequest.class))).thenReturn(response); + + cartService.getAllProducts(); + cartService.reduceCartQuantityFromProduct(product); + verify(productServiceBlockingStub, times(1)).reduceProductQuantity( + any(ReduceProductRequest.class)); + } + + @Test + void testGetAllProducts_Success() { + when(productServiceBlockingStub.getAllProducts(null)).thenReturn(products.iterator()); + + List products = new ArrayList<>(); + var productInCart = productInCartProvider(); + products.add(Shopping.ProductResponse.newBuilder() + .setId(productInCart.getId()) + .setName(productInCart.getName()) + .setType(productInCart.getType()) + .setPrice(productInCart.getPrice() + 10) + .build()); + + when(productServiceBlockingStub.getAllProducts(null)).thenReturn(products.iterator()); + + cartService.getAllProducts(); + assertDoesNotThrow(() -> cartService.getRandomProductFromCart()); + } + + @Test + void testGetAllProducts_Exception() { + when(productServiceBlockingStub.getAllProducts(null)).thenThrow( + new RuntimeException("Service error")); + + IllegalStateException exception = assertThrows(IllegalStateException.class, () -> { + cartService.getAllProducts(); + }); + assertEquals("Failed to fetch products from ProductService", exception.getMessage()); + } + + @Test + void testGetRandomProductFromCart_EmptyCart() { + IllegalStateException exception = assertThrows(IllegalStateException.class, () -> { + cartService.getRandomProductFromCart(); + }); + assertEquals("Products In cart array empty", exception.getMessage()); + } + + @Test + void testGetRandomProductFromCart_Success() { + when(productServiceBlockingStub.getAllProducts(null)).thenReturn(products.iterator()); + + cartService.getAllProducts(); + ProductInCart randomProduct = cartService.getRandomProductFromCart(); + assertNotNull(randomProduct); + } + + private ProductInCart productInCartProvider() { + return ProductInCart.builder() + .id(1L) + .name("Test") + .type("Test type") + .price(0.0) + .quantityToReduce(10) + .build(); + } +} \ No newline at end of file diff --git a/remote-procedure-call/cart-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/remote-procedure-call/cart-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 000000000000..ca6ee9cea8ec --- /dev/null +++ b/remote-procedure-call/cart-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file diff --git a/remote-procedure-call/etc/remote-procedure-call.urm.puml b/remote-procedure-call/etc/remote-procedure-call.urm.puml new file mode 100644 index 000000000000..02af47ddf261 --- /dev/null +++ b/remote-procedure-call/etc/remote-procedure-call.urm.puml @@ -0,0 +1,2 @@ +@startuml +@enduml \ No newline at end of file diff --git a/remote-procedure-call/pom.xml b/remote-procedure-call/pom.xml new file mode 100644 index 000000000000..a9c8761191a9 --- /dev/null +++ b/remote-procedure-call/pom.xml @@ -0,0 +1,131 @@ + + + + + java-design-patterns + com.iluwatar + 1.26.0-SNAPSHOT + + + + 1.68.0 + 4.28.2 + 3.0.0 + 5.14.2 + 3.11.0 + 0.6.1 + + + 4.0.0 + remote-procedure-call + 1.26.0-SNAPSHOT + pom + + + cart-service + product-service + + + + + io.grpc + grpc-netty-shaded + ${grpc-version} + runtime + + + io.grpc + grpc-protobuf + ${grpc-version} + + + io.grpc + grpc-stub + ${grpc-version} + + + com.google.protobuf + protobuf-java + ${protobuf-version} + + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.mockito + mockito-junit-jupiter + ${mockito-version} + test + + + + + + + kr.motd.maven + os-maven-plugin + 1.7.1 + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + + org.xolstice.maven.plugins + protobuf-maven-plugin + ${protobuf-maven-plugin-version} + + ${project.basedir}/../proto + com.google.protobuf:protoc:4.28.2:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:1.68.0:exe:${os.detected.classifier} + + + + + @generated=omit + + + compile + compile-custom + + + + + + + + \ No newline at end of file diff --git a/remote-procedure-call/product-service/etc/product-service.urm.png b/remote-procedure-call/product-service/etc/product-service.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..948b3d5273be3b5dbd7f3c89ca1b7320a7ca7a3f GIT binary patch literal 155055 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 b+}XbcwHY(d-um#Id~TnL+U~TShcEswIqaHd literal 0 HcmV?d00001 diff --git a/remote-procedure-call/product-service/etc/product-service.urm.puml b/remote-procedure-call/product-service/etc/product-service.urm.puml new file mode 100644 index 000000000000..799192b93d2e --- /dev/null +++ b/remote-procedure-call/product-service/etc/product-service.urm.puml @@ -0,0 +1,80 @@ +@startuml +skinparam dpi 300 +scale 0.3 + +package com.iluwatar.rpc.product { + class Main { + - SERVER_PORT : int {static} + - log : Logger {static} + + main(args : String[]) {static} + } +} + +package com.iluwatar.rpc.product.model { + class Product { + - id : Long + - name : String + - price : double + - quantity : int + - type : String + } +} + +package com.iluwatar.rpc.product.mocks { + class ProductMocks { + + ProductMocks() + + getMockProducts() : List {static} + } +} + +package com.iluwatar.rpc.product.service { + interface ProductService { + + getAllProducts() : List {abstract} + + getProduct(Long) : Optional {abstract} + } + class ProductServiceGrpcImpl { + - log : Logger {static} + - productService : ProductService + + ProductServiceGrpcImpl(productService : ProductService) + + getAllProducts(request : Empty, responseStreamObserver : StreamObserver) + + reduceProductQuantity(request : ReduceProductRequest, responseStreamObserver : StreamObserver) + } + class ProductServiceImpl { + - products : List + + ProductServiceImpl(products : List) + + getAllProducts() : List + + getProduct(id : Long) : Optional + } +} + +package com.iluwatar.rpc.proto { + class Empty {} + + class ProductResponse { + - id : long + - name : String + - price : double + - type : String + } + + class ReduceProductRequest { + - productId : long + - quantity : int + } + + class ReduceProductResponse { + - message : String + - status : boolean + } + + class ShoppingServiceImplBase { + - getAllProducts(request: Empty, responseStreamObserver: StreamObserver) + - reduceProductQuantity(request: ReduceProductRequest, responseStreamObserver : StreamObserver) + } +} + +ProductServiceImpl --> "-products" Product +ProductServiceGrpcImpl --> "-productService" ProductService +ProductServiceGrpcImpl --|> ShoppingServiceImplBase +ProductServiceImpl ..|> ProductService +@enduml \ No newline at end of file diff --git a/remote-procedure-call/product-service/pom.xml b/remote-procedure-call/product-service/pom.xml new file mode 100644 index 000000000000..bf54b0e75413 --- /dev/null +++ b/remote-procedure-call/product-service/pom.xml @@ -0,0 +1,42 @@ + + + + + + remote-procedure-call + com.iluwatar + 1.26.0-SNAPSHOT + + + 4.0.0 + product-service + jar + + \ No newline at end of file diff --git a/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/Main.java b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/Main.java new file mode 100644 index 000000000000..bd1c958cbb20 --- /dev/null +++ b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/Main.java @@ -0,0 +1,72 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product; + +import com.iluwatar.rpc.product.mocks.ProductMocks; +import com.iluwatar.rpc.product.model.Product; +import com.iluwatar.rpc.product.service.ProductServiceGrpcImpl; +import com.iluwatar.rpc.product.service.ProductServiceImpl; +import io.grpc.Server; +import io.grpc.ServerBuilder; +import java.io.IOException; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Main class to start the product service. + * + * @author CoderSleek + * @version 1.0 + */ +public class Main { + private static final int SERVER_PORT = 8080; + private static final Logger log = LoggerFactory.getLogger(Main.class); + /** + * Main method to start the product service. + * instantiates product mock data and starts the gRPC server. + * constructor injects ProductService into ProductServiceGrpcImpl + * listens on default server port 8080 + * + * @param args the input arguments + * @throws IOException the io exception + * @throws InterruptedException the interrupted exception + */ + public static void main(String[] args) throws IOException, InterruptedException { + List products = ProductMocks.getMockProducts(); + var productServiceImpl = new ProductServiceImpl(products); + var productServiceGrpcImpl = new ProductServiceGrpcImpl(productServiceImpl); + + Server server = ServerBuilder + .forPort(SERVER_PORT) + .addService(productServiceGrpcImpl) + .build(); + + log.info("Starting server on port: " + SERVER_PORT); + log.info("Waiting for request---------"); + server.start(); + server.awaitTermination(); + } +} \ No newline at end of file diff --git a/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/mocks/ProductMocks.java b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/mocks/ProductMocks.java new file mode 100644 index 000000000000..68b5cd036fa2 --- /dev/null +++ b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/mocks/ProductMocks.java @@ -0,0 +1,54 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.mocks; + +import com.iluwatar.rpc.product.model.Product; +import java.util.ArrayList; +import java.util.List; + +/** + * Mocks data for product POJO, used for testing and in memory store. + * Thread safety is not guaranteed. + * @link com.iluwatar.rpc.product.model.Product + * @author CoderSleek + * @version 1.0 + */ +public class ProductMocks { + /** + * Returns new Mock product ArrayList on each call, to reset state. + * + * @return the mock products + */ + public static List getMockProducts() { + return new ArrayList<>() {{ + add(new Product(1L, "Product 1", "Type 1", 50.0, 10)); + add(new Product(2L, "Product 2", "Type 2", 40.0, 20)); + add(new Product(3L, "Product 3", "Type 3", 30.0, 30)); + add(new Product(4L, "Product 4", "Type 4", 20.0, 40)); + add(new Product(5L, "Product 5", "Type 5", 10.0, 50)); + } + }; + } +} \ No newline at end of file diff --git a/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/model/Product.java b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/model/Product.java new file mode 100644 index 000000000000..f0975877b35b --- /dev/null +++ b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/model/Product.java @@ -0,0 +1,44 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * Product POJO class. + * + * @author CoderSleek + * @version 1.0 + */ +@Data +@AllArgsConstructor +public class Product { + private Long id; + private String name; + private String type; + private double price; + private int quantity; +} \ No newline at end of file diff --git a/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductService.java b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductService.java new file mode 100644 index 000000000000..01ef6f2dbb5b --- /dev/null +++ b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductService.java @@ -0,0 +1,55 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.service; + +import com.iluwatar.rpc.product.model.Product; +import java.util.List; +import java.util.Optional; + +/** + * API Contract for Product service, which can be exposed. + * Includes getter methods for product by id and all products. + * Thread safety is not guaranteed. + * + * @link com.iluwatar.rpc.product.model.Product + * @author CoderSleek + * @version 1.0 + */ +public interface ProductService { + /** + * Get optional of product by id. + * + * @param id id of product + * @return product + */ + Optional getProduct(Long id); + + /** + * Get all products. + * @return ArrayList of all products + * @throws IllegalStateException thrown when products array is null or empty, denotes improper initialization + */ + List getAllProducts() throws IllegalStateException; +} diff --git a/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImpl.java b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImpl.java new file mode 100644 index 000000000000..2dd5d58e3f2f --- /dev/null +++ b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImpl.java @@ -0,0 +1,147 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.service; + +import com.iluwatar.rpc.product.model.Product; +import com.iluwatar.rpc.proto.Shopping.Empty; +import com.iluwatar.rpc.proto.Shopping.ProductResponse; +import com.iluwatar.rpc.proto.Shopping.ReduceProductRequest; +import com.iluwatar.rpc.proto.Shopping.ReduceProductResponse; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc.ShoppingServiceImplBase; +import io.grpc.Status; +import io.grpc.stub.StreamObserver; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implementation of product-service Contract exposed by gRPC proto. + * Thread safety is not guaranteed. + * + * @link com.iluwatar.rpc.product.service.ProductService + * @link com.iluwatar.rpc.product.model.Product + * @author CoderSleek + * @version 1.0 + */ +public class ProductServiceGrpcImpl extends ShoppingServiceImplBase { + private final ProductService productService; + private static final Logger log = LoggerFactory.getLogger(ProductServiceGrpcImpl.class); + + /** + * Constructor for initializing Implementation of ProductService Contract internally. + * ProductService Implementation stores Product data in internal state for simplicity. + * + * @param productService ProductService + */ + public ProductServiceGrpcImpl(ProductService productService) { + this.productService = productService; + } + + /** + * Reduces the quantity of a specified product via product id by the requested quantity. + * To simulate a customer buying an item, once bought the quantity of the product is reduced from stock. + * @param request contains product id and quantity to reduce + * @param responseStreamObserver for iterating over response + */ + @Override + public void reduceProductQuantity(ReduceProductRequest request, + StreamObserver responseStreamObserver) { + log.info("Received request to reduce product quantity"); + boolean status; + String message; + var product = this.productService.getProduct(request.getProductId()); + + if (product.isEmpty()) { + status = false; + message = "Product with ID does not exist"; + } else { + int productQuantity = product.get().getQuantity(); + int requestedQuantity = request.getQuantity(); + + if (requestedQuantity <= 0) { + status = false; + message = "Invalid Quantity"; + } else if (requestedQuantity > productQuantity) { + status = false; + message = "Product has less quantity in stock than requested"; + } else { + log.info("Before reducing quantity: {}", productQuantity); + product.get().setQuantity(productQuantity - requestedQuantity); + log.info("After reducing quantity: {}", product.get().getQuantity()); + status = true; + message = "Success"; + } + } + + var response = ReduceProductResponse + .newBuilder() + .setMessage(message) + .setStatus(status) + .build(); + + responseStreamObserver.onNext(response); + responseStreamObserver.onCompleted(); + log.info("Request to Reduce Product Quantity Execution Completed"); + } + + /** + * Fetches all products from ProductService and streams them to the client. + * Throws NOT_FOUND status exception if products are not found. + * @param request empty placeholder request + * @param responseStreamObserver for iterating over responses + */ + @Override + public void getAllProducts(Empty request, + StreamObserver responseStreamObserver) { + log.info("Received request to fetch all products"); + List products; + + try { + products = this.productService.getAllProducts(); + } catch (IllegalStateException e) { + log.error("Failed to fetch products from ProductService", e); + responseStreamObserver.onError( + Status.NOT_FOUND + .withDescription(e.getMessage()) + .asException()); + responseStreamObserver.onCompleted(); + return; + } + + for (var product : products) { + responseStreamObserver.onNext( + ProductResponse.newBuilder() + .setId(product.getId()) + .setName(product.getName()) + .setPrice(product.getPrice()) + .setType(product.getType()) + .build() + ); + } + + responseStreamObserver.onCompleted(); + log.info("Request to fetch all products Execution Completed"); + } +} diff --git a/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceImpl.java b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceImpl.java new file mode 100644 index 000000000000..2ce1749b1927 --- /dev/null +++ b/remote-procedure-call/product-service/src/main/java/com/iluwatar/rpc/product/service/ProductServiceImpl.java @@ -0,0 +1,78 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.service; + +import com.iluwatar.rpc.product.model.Product; +import java.util.List; +import java.util.Optional; + +/** + * Implementation of ProductService Contract, maintains Product state for simplicity. + * Provides getter methods for product by id and all products. + * Thread safety is not guaranteed. + * + * @link com.iluwatar.rpc.product.service.ProductService + * @link com.iluwatar.rpc.product.model.Product + * @author CoderSleek + * @version 1.0 + */ +public class ProductServiceImpl implements ProductService { + private final List products; + + /** + * Constructor to set internal state of Product array. + * + * @param products ArrayList of products + */ + public ProductServiceImpl(List products) { + this.products = products; + } + + /** + * Get optional of product by id. + * @param id id of product + * @return Product first item in the list with matching id, if not found returns empty optional + */ + @Override + public Optional getProduct(Long id) { + return products + .stream() + .filter(product -> product.getId().equals(id)) + .findFirst(); + } + + @Override + public List getAllProducts() throws IllegalStateException { + if (products == null) { + throw new IllegalStateException("Products array is not initialized properly"); + } + + if (products.isEmpty()) { + throw new IllegalStateException("Products array does not have any data"); + } + + return products; + } +} diff --git a/remote-procedure-call/product-service/src/main/resources/logback.xml b/remote-procedure-call/product-service/src/main/resources/logback.xml new file mode 100644 index 000000000000..ed930c512e7e --- /dev/null +++ b/remote-procedure-call/product-service/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file diff --git a/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImplTest.java b/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImplTest.java new file mode 100644 index 000000000000..4a390b9123d1 --- /dev/null +++ b/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceGrpcImplTest.java @@ -0,0 +1,192 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.service; + +import com.iluwatar.rpc.product.mocks.ProductMocks; +import com.iluwatar.rpc.product.model.Product; +import com.iluwatar.rpc.proto.Shopping.Empty; +import com.iluwatar.rpc.proto.Shopping.ProductResponse; +import com.iluwatar.rpc.proto.Shopping.ReduceProductRequest; +import com.iluwatar.rpc.proto.Shopping.ReduceProductResponse; +import io.grpc.StatusException; +import io.grpc.stub.StreamObserver; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; +import static org.mockito.ArgumentMatchers.any; + +@ExtendWith(MockitoExtension.class) +class ProductServiceGrpcImplTest { + @Mock + private ProductService productService; + + @InjectMocks + private ProductServiceGrpcImpl productServiceGrpcImpl; + + private List productsMockData; + + @BeforeEach + public void setUp() { + productsMockData = ProductMocks.getMockProducts(); + } + + @Test + void testReduceProductQuantity_ProductNotFound() { + var request = ReduceProductRequest.newBuilder() + .setProductId(6L) + .setQuantity(5) + .build(); + StreamObserver responseObserver = mock(StreamObserver.class); + + when(productService.getProduct(request.getProductId())).thenReturn(Optional.empty()); + + productServiceGrpcImpl.reduceProductQuantity(request, responseObserver); + + ArgumentCaptor responseCaptor = + ArgumentCaptor.forClass(ReduceProductResponse.class); + verify(responseObserver).onNext(responseCaptor.capture()); + verify(responseObserver).onCompleted(); + + ReduceProductResponse response = responseCaptor.getValue(); + assertFalse(response.getStatus()); + assertEquals("Product with ID does not exist", response.getMessage()); + } + + @Test + void testReduceProductQuantity_InvalidQuantity() { + Product product = productsMockData.get(0); + ReduceProductRequest request = ReduceProductRequest.newBuilder() + .setProductId(product.getId()) + .setQuantity(-5) + .build(); + StreamObserver responseObserver = mock(StreamObserver.class); + + when(productService.getProduct(product.getId())).thenReturn(Optional.of(product)); + + productServiceGrpcImpl.reduceProductQuantity(request, responseObserver); + + ArgumentCaptor responseCaptor = + ArgumentCaptor.forClass(ReduceProductResponse.class); + verify(responseObserver).onNext(responseCaptor.capture()); + verify(responseObserver).onCompleted(); + + ReduceProductResponse response = responseCaptor.getValue(); + assertFalse(response.getStatus()); + assertEquals("Invalid Quantity", response.getMessage()); + } + + @Test + void testReduceProductQuantity_InsufficientQuantity() { + Product product = productsMockData.get(0); + + ReduceProductRequest request = ReduceProductRequest.newBuilder() + .setProductId(product.getId()) + .setQuantity(1000) + .build(); + StreamObserver responseObserver = mock(StreamObserver.class); + + when(productService.getProduct(product.getId())).thenReturn(Optional.of(product)); + + productServiceGrpcImpl.reduceProductQuantity(request, responseObserver); + + ArgumentCaptor responseCaptor = + ArgumentCaptor.forClass(ReduceProductResponse.class); + verify(responseObserver).onNext(responseCaptor.capture()); + verify(responseObserver).onCompleted(); + + ReduceProductResponse response = responseCaptor.getValue(); + assertFalse(response.getStatus()); + assertEquals("Product has less quantity in stock than requested", response.getMessage()); + } + + @Test + void testReduceProductQuantity_Success() { + Product product = productsMockData.get(0); + ReduceProductRequest request = ReduceProductRequest.newBuilder() + .setProductId(product.getId()) + .setQuantity(5) + .build(); + StreamObserver responseObserver = mock(StreamObserver.class); + + when(productService.getProduct(product.getId())).thenReturn(Optional.of(product)); + + productServiceGrpcImpl.reduceProductQuantity(request, responseObserver); + + ArgumentCaptor responseCaptor = + ArgumentCaptor.forClass(ReduceProductResponse.class); + verify(responseObserver).onNext(responseCaptor.capture()); + verify(responseObserver).onCompleted(); + + ReduceProductResponse response = responseCaptor.getValue(); + assertTrue(response.getStatus()); + assertEquals("Success", response.getMessage()); + assertEquals(5, product.getQuantity()); + } + + @Test + void testGetAllProducts_Success() { + List productsLocal = ProductMocks.getMockProducts(); + var product = productsLocal.get(0); + + StreamObserver responseObserver = mock(StreamObserver.class); + + when(productService.getAllProducts()).thenReturn(productsMockData); + productServiceGrpcImpl.getAllProducts(null, responseObserver); + + ArgumentCaptor responseCaptor = ArgumentCaptor.forClass(ProductResponse.class); + verify(responseObserver, times(5)).onNext(responseCaptor.capture()); + verify(responseObserver).onCompleted(); + + assertEquals(productsLocal.size(), responseCaptor.getAllValues().size()); + assertEquals(Long.compare(product.getId(), responseCaptor.getAllValues().get(0).getId()), 0); + assertEquals(product.getName(), responseCaptor.getAllValues().get(0).getName()); + assertEquals(product.getType(), responseCaptor.getAllValues().get(0).getType()); + assertEquals( + Double.compare(product.getPrice(), responseCaptor.getAllValues().get(0).getPrice()), 0); + } + + @Test + void testGetAllProducts_Failure() { + StreamObserver responseObserver = mock(StreamObserver.class); + + when(productService.getAllProducts()).thenThrow(new IllegalStateException("Database error")); + + productServiceGrpcImpl.getAllProducts(Empty.newBuilder().build(), responseObserver); + + verify(responseObserver).onError(any(StatusException.class)); + verify(responseObserver).onCompleted(); + } +} diff --git a/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceImplTest.java b/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceImplTest.java new file mode 100644 index 000000000000..9c82c86605d3 --- /dev/null +++ b/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceImplTest.java @@ -0,0 +1,92 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.service; + +import com.iluwatar.rpc.product.mocks.ProductMocks; +import com.iluwatar.rpc.product.model.Product; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@ExtendWith(MockitoExtension.class) +class ProductServiceImplTest { + private static List products; + private ProductServiceImpl productService; + + @BeforeEach + void setUp() { + products = ProductMocks.getMockProducts(); + productService = new ProductServiceImpl(products); + } + + @Test + void testGetProduct() { + Optional product = productService.getProduct(1L); + assertTrue(product.isPresent()); + assertEquals(1L, product.get().getId()); + assertEquals("Product 1", product.get().getName()); + assertEquals(50.0, product.get().getPrice()); + } + + @Test + void testGetProductNotFound() { + Optional product = productService.getProduct(6L); + assertFalse(product.isPresent()); + } + + @Test + void testGetAllProducts() { + List allProducts = productService.getAllProducts(); + assertNotNull(allProducts); + assertEquals(5, allProducts.size()); + } + + @Test + void testGetAllProductsEmpty() { + products.clear(); + IllegalStateException exception = assertThrows(IllegalStateException.class, () -> { + productService.getAllProducts(); + }); + assertEquals("Products array does not have any data", exception.getMessage()); + } + + @Test + void testGetAllProductNull() { + productService = new ProductServiceImpl(null); + IllegalStateException exception = assertThrows(IllegalStateException.class, () -> { + productService.getAllProducts(); + }); + assertEquals("Products array is not initialized properly", exception.getMessage()); + } +} \ No newline at end of file diff --git a/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceIntegrationTest.java b/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceIntegrationTest.java new file mode 100644 index 000000000000..a9a87463b43b --- /dev/null +++ b/remote-procedure-call/product-service/src/test/java/com/iluwatar/rpc/product/service/ProductServiceIntegrationTest.java @@ -0,0 +1,102 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.rpc.product.service; + +import com.iluwatar.rpc.product.mocks.ProductMocks; +import com.iluwatar.rpc.product.model.Product; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc; +import com.iluwatar.rpc.proto.ShoppingServiceGrpc.ShoppingServiceBlockingStub; +import com.iluwatar.rpc.proto.Shopping.ProductResponse; +import com.iluwatar.rpc.proto.Shopping.ReduceProductRequest; +import com.iluwatar.rpc.proto.Shopping.ReduceProductResponse; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.Server; +import io.grpc.ServerBuilder; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@ExtendWith(MockitoExtension.class) +class ProductServiceIntegrationTest { + private static Server server; + private static ManagedChannel channel; + private static ShoppingServiceBlockingStub blockingStub; + + @BeforeAll + public static void setup() throws IOException { + List products = ProductMocks.getMockProducts(); + var productServiceMain = new ProductServiceImpl(products); + + server = ServerBuilder + .forPort(8080) + .addService(new ProductServiceGrpcImpl(productServiceMain)) + .build() + .start(); + + channel = ManagedChannelBuilder.forAddress("localhost", 8080) + .usePlaintext() + .build(); + + blockingStub = ShoppingServiceGrpc.newBlockingStub(channel); + } + + @AfterAll + public static void teardown() { + channel.shutdownNow(); + server.shutdownNow(); + } + + @Test + void testReduceProductQuantity() { + ReduceProductRequest request = ReduceProductRequest.newBuilder() + .setProductId(1L) + .setQuantity(5) + .build(); + + ReduceProductResponse response = blockingStub.reduceProductQuantity(request); + + assertTrue(response.getStatus()); + assertEquals("Success", response.getMessage()); + } + + @Test + void testGetAllProducts() { + var responseIterator = blockingStub.getAllProducts(null); + + ArrayList responses = new ArrayList<>(); + responseIterator.forEachRemaining(responses::add); + + assertEquals(ProductMocks.getMockProducts().size(), responses.size()); + } +} diff --git a/remote-procedure-call/product-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/remote-procedure-call/product-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 000000000000..ca6ee9cea8ec --- /dev/null +++ b/remote-procedure-call/product-service/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file diff --git a/remote-procedure-call/proto/shopping.proto b/remote-procedure-call/proto/shopping.proto new file mode 100644 index 000000000000..47515f054fda --- /dev/null +++ b/remote-procedure-call/proto/shopping.proto @@ -0,0 +1,52 @@ +// +// This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). +// +// The MIT License +// Copyright © 2014-2022 Ilkka Seppälä +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +syntax = "proto3"; + +package com.iluwatar.rpc.proto; + +service ShoppingService { + rpc ReduceProductQuantity (ReduceProductRequest) returns (ReduceProductResponse); + rpc GetAllProducts (Empty) returns (stream ProductResponse); +} + +message ReduceProductRequest { + uint64 product_id = 1; + uint32 quantity = 2; +} + +message ReduceProductResponse { + bool status = 1; + string message = 2; +} + +message ProductResponse { + uint64 id = 1; + string name = 2; + string type = 3; + double price = 4; +} + +message Empty {}