Compare commits
27 commits
installer+
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
04688cf473 | ||
|
9767302883 | ||
|
66eca4203e | ||
|
5fa4b7913b | ||
|
b4b747a5d0 | ||
|
11a0b0277a | ||
|
fb8e97c81d | ||
|
4f1883b49a | ||
|
4e75edb3f5 | ||
|
b52b5d55c7 | ||
|
31075947f9 | ||
|
8cdb099fb6 | ||
|
71744993ce | ||
|
ad3827d2f6 | ||
|
e24787960a | ||
|
14c59e621c | ||
|
4eafd5517b | ||
|
1ee353c179 | ||
|
1ea9e72024 | ||
|
a7985d7192 | ||
|
e5dd956117 | ||
|
b94408ad3b | ||
|
80696ef138 | ||
|
aa8f4fcd8d | ||
|
4bc48cb87f | ||
|
3ec2a93310 | ||
|
c2d1f59dea |
3
.gitignore
vendored
|
@ -39,3 +39,6 @@ build/
|
||||||
shortener_db_schema.sql
|
shortener_db_schema.sql
|
||||||
/out/
|
/out/
|
||||||
/logs/
|
/logs/
|
||||||
|
logs/
|
||||||
|
/test-output/
|
||||||
|
test-output/
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
|
|
||||||
http://maven.apache.org/xsd/settings-1.0.0.xsd">
|
|
||||||
|
|
||||||
<activeProfiles>
|
|
||||||
<activeProfile>github</activeProfile>
|
|
||||||
</activeProfiles>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
<profile>
|
|
||||||
<id>github</id>
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>central</id>
|
|
||||||
<url>https://repo1.maven.org/maven2</url>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
|
||||||
<id>github</id>
|
|
||||||
<url>https://maven.pkg.github.com/aamitn/URLShortener</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
</profile>
|
|
||||||
</profiles>
|
|
||||||
|
|
||||||
<servers>
|
|
||||||
<server>
|
|
||||||
<id>github</id>
|
|
||||||
<username>aamitn</username>
|
|
||||||
<password>#TOKEN#</password>
|
|
||||||
</server>
|
|
||||||
</servers>
|
|
||||||
</settings>
|
|
54
Dockerfile
|
@ -1,22 +1,44 @@
|
||||||
# syntax=docker/dockerfile:1
|
#syntax=docker/dockerfile:1
|
||||||
|
|
||||||
# Add the following lines to tag the image (replace 'your_username' and 'shortener-app' with your Docker Hub username and repository name)
|
# Add the following lines to tag the image (replace 'your_username' and 'shortener-app' with your Docker Hub username and repository name)
|
||||||
ARG VERSION=latest
|
ARG VERSION=latest
|
||||||
ARG IMAGE_NAME=bigwiz/shortener
|
ARG IMAGE_NAME=nmpl/shortener
|
||||||
ARG TAG=$VERSION
|
ARG TAG=$VERSION
|
||||||
|
|
||||||
# Stage 1: Build the application
|
|
||||||
|
|
||||||
|
#
|
||||||
|
#------STAGE 1: Build the application-----#
|
||||||
|
#
|
||||||
|
# Get Maven with JDK 21
|
||||||
FROM maven:3.9.6-eclipse-temurin-21 AS builder
|
FROM maven:3.9.6-eclipse-temurin-21 AS builder
|
||||||
|
|
||||||
# Clone the repository
|
#Cloud Install : Clone the repository
|
||||||
RUN git clone https://github.com/aamitn/URLShortener.git
|
#RUN git clone https://github.com/aamitn/URLShortener.git
|
||||||
|
|
||||||
|
RUN mkdir -p URLShortener
|
||||||
|
|
||||||
|
#Local Install
|
||||||
|
ADD . /URLShortener
|
||||||
|
|
||||||
|
# Change working directory to the repo directory
|
||||||
WORKDIR /URLShortener
|
WORKDIR /URLShortener
|
||||||
|
|
||||||
|
# Docker makes db accessible like this : mysql://<container-name>:port instead of mysql://<server-ip>:port
|
||||||
|
# Example real world db access url : mysql://127.0.0.1:3306
|
||||||
|
# Example Docker db access url : mysql://database:3306 (container name is datbase)
|
||||||
|
# Change the database ip in app config to the database docker container name/service
|
||||||
|
RUN sed -i "s|database.ip=127.0.0.1|database.ip=database|g" src/main/resources/application.properties
|
||||||
|
|
||||||
# Build the application
|
# Build the application
|
||||||
RUN mvn clean install
|
RUN mvn clean install
|
||||||
|
|
||||||
# Stage 2: Create the final image
|
|
||||||
|
|
||||||
|
#
|
||||||
|
#------STAGE 2: Deploy the Generated War-----#
|
||||||
|
#
|
||||||
|
## Get Tomacat 10 with JDK21
|
||||||
FROM tomcat:10-jdk21-openjdk-slim
|
FROM tomcat:10-jdk21-openjdk-slim
|
||||||
|
|
||||||
# Set environment variables
|
# Set environment variables
|
||||||
|
@ -24,29 +46,19 @@ ENV CATALINA_BASE /usr/local/tomcat
|
||||||
ENV CATALINA_HOME /usr/local/tomcat
|
ENV CATALINA_HOME /usr/local/tomcat
|
||||||
ENV PATH $CATALINA_HOME/bin:$PATH
|
ENV PATH $CATALINA_HOME/bin:$PATH
|
||||||
|
|
||||||
|
|
||||||
# Copy the WAR file from the builder stage
|
# Copy the WAR file from the builder stage
|
||||||
COPY --from=builder /URLShortener/target/shortener.war $CATALINA_BASE/webapps/
|
COPY --from=builder /URLShortener/target/shortener.war $CATALINA_BASE/webapps/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
#------STAGE 3: Configure and Start Application Server-----#
|
||||||
|
#
|
||||||
# Add configuration for document base path
|
# Add configuration for document base path
|
||||||
COPY server.xml $CATALINA_BASE/conf/server.xml
|
COPY server.xml $CATALINA_BASE/conf/server.xml
|
||||||
|
|
||||||
|
|
||||||
# Expose ports
|
# Expose ports
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
EXPOSE 3306
|
|
||||||
|
|
||||||
|
|
||||||
# Copy the startup script
|
|
||||||
COPY shortener.sh /usr/local/tomcat/shortener.sh
|
|
||||||
|
|
||||||
# Copy the sql file
|
|
||||||
COPY create.sql /usr/local/tomcat/create.sql
|
|
||||||
|
|
||||||
# Grant execute permissions to the startup.sh script
|
|
||||||
RUN chmod +x /usr/local/tomcat/shortener.sh
|
|
||||||
|
|
||||||
# Start Tomcat and MariaDB using the startup script
|
# Start Tomcat and MariaDB using the startup script
|
||||||
CMD ["sh", "/usr/local/tomcat/shortener.sh"]
|
CMD ["catalina.sh", "run"]
|
||||||
|
|
201
LICENSE
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
146
README.md
|
@ -17,10 +17,12 @@ An enterprise-grade, powerful and scalable URL shortener with integrated bio pag
|
||||||
* [Prerequisites](#prerequisites)
|
* [Prerequisites](#prerequisites)
|
||||||
* [Local Setup](#local-setup)
|
* [Local Setup](#local-setup)
|
||||||
* [Deployment](#deployment)
|
* [Deployment](#deployment)
|
||||||
* [Usage](#usage)
|
* [Cloud Native Deployment](#cloud-native-deployment)
|
||||||
|
* [SMS Configuration](#sms-service-configuration)
|
||||||
|
* [Use Cases](#use-cases)
|
||||||
* [Contributing](#contributing)
|
* [Contributing](#contributing)
|
||||||
* [License](#license)
|
* [License](#license)
|
||||||
|
***
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
This project is an enterprise-grade URL shortener and bio page application developed with Spring Boot. It provides a robust solution for shortening URLs and creating bio pages for users. The application is designed for scalability and includes features such as analytics, user management, and subscription plans.
|
This project is an enterprise-grade URL shortener and bio page application developed with Spring Boot. It provides a robust solution for shortening URLs and creating bio pages for users. The application is designed for scalability and includes features such as analytics, user management, and subscription plans.
|
||||||
|
@ -54,6 +56,8 @@ This project is an enterprise-grade URL shortener and bio page application devel
|
||||||
* Tailwind CSS: A utility-first CSS framework that makes it easy to design and build modern, responsive user interfaces.
|
* Tailwind CSS: A utility-first CSS framework that makes it easy to design and build modern, responsive user interfaces.
|
||||||
* Flowbite: A design system and UI toolkit for building responsive web applications.
|
* Flowbite: A design system and UI toolkit for building responsive web applications.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
@ -66,7 +70,7 @@ Before you begin, ensure you have the following installed:
|
||||||
* Your favorite IDE (IntelliJ, Eclipse, etc.)
|
* Your favorite IDE (IntelliJ, Eclipse, etc.)
|
||||||
|
|
||||||
|
|
||||||
### 1-Click Local Installation <a href="https://github.com/aamitn/URLShortener/blob/master/installers/install.bat">Windows</a> | <a href="https://github.com/aamitn/URLShortener/packages/2069528">Linux</a>
|
### 1-Click Local Installation <a href="https://github.com/aamitn/URLShortener/releases/download/final/install.cmd">Windows</a> | <a href="https://github.com/aamitn/URLShortener/releases/download/final/install.sh">Linux</a>
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
1. Open a Command Prompt with administrator privileges.
|
1. Open a Command Prompt with administrator privileges.
|
||||||
|
@ -83,6 +87,9 @@ Before you begin, ensure you have the following installed:
|
||||||
./install.sh
|
./install.sh
|
||||||
3. Follow the on-screen instructions.
|
3. Follow the on-screen instructions.
|
||||||
|
|
||||||
|
##### Finally, Select Application Server : Tomcat/Wildfly
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
### Local Setup
|
### Local Setup
|
||||||
|
|
||||||
|
@ -90,30 +97,32 @@ Before you begin, ensure you have the following installed:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
git clone https://github.com/aamitn/URLShortener.git
|
git clone https://github.com/aamitn/URLShortener.git
|
||||||
|
cd URLShortener
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Apply the Database Schema:**
|
2. **Apply the Database Schema:**
|
||||||
|
|
||||||
Execute the provided **db\_schema.sql** file to set up the necessary tables and schema for the application. This script will also create the required database.
|
Execute the provided `create.sql` file to set up the necessary tables and schema for the application. This script will also create the required database.
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
mysql -u your_username -p < path/to/db_schema.sql
|
mysql -u your_username -p{your_password} < create.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Update the application.properties file:
|
3. Update the application.properties file:
|
||||||
|
|
||||||
Update the application.properties file in the src/main/resources directory with your database configuration.
|
* Update the `application.properties` file in the src/main/resources directory with your application configuration.
|
||||||
|
|
||||||
4. Build and run the application:
|
4. Build and run the application:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
cd URLShortener
|
|
||||||
mvn spring-boot:run
|
mvn spring-boot:run
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Access the application at http://localhost:8080
|
5. Access the application at http://localhost:8080
|
||||||
|
|
||||||
### Deployment
|
***
|
||||||
|
|
||||||
|
### Deployment Setup
|
||||||
|
|
||||||
1. **Build a deployable WAR:**
|
1. **Build a deployable WAR:**
|
||||||
|
|
||||||
|
@ -137,9 +146,9 @@ Before you begin, ensure you have the following installed:
|
||||||
* Access the Tomcat Manager web interface at `http://localhost:8080/manager/html` (replace with your Tomcat server address).
|
* Access the Tomcat Manager web interface at `http://localhost:8080/manager/html` (replace with your Tomcat server address).
|
||||||
* Log in with your Tomcat manager credentials.
|
* Log in with your Tomcat manager credentials.
|
||||||
* Navigate to the "WAR file to deploy" section.
|
* Navigate to the "WAR file to deploy" section.
|
||||||
* Choose the `shorten.war` file using the file upload button.
|
* Choose the `shortener.war` file using the file upload button.
|
||||||
* Click the "Deploy" button.
|
* Click the "Deploy" button.
|
||||||
3. **Configure environment variables:**
|
3. **Configure Variables on deployed war:**
|
||||||
|
|
||||||
Set environment variables for cloud-specific settings.
|
Set environment variables for cloud-specific settings.
|
||||||
|
|
||||||
|
@ -167,9 +176,9 @@ Before you begin, ensure you have the following installed:
|
||||||
6. **Adjust Configuration (Optional):** If you need to customize the application configuration after deployment, you can find the **application.properties** file within the deployed WAR file. THe file can be accesses as :
|
6. **Adjust Configuration (Optional):** If you need to customize the application configuration after deployment, you can find the **application.properties** file within the deployed WAR file. THe file can be accesses as :
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
vi /path/to/tomcat/webapps/your-app/WEB-INF/classes/application.properties
|
vi /path/to/tomcat/webapps/shortener/WEB-INF/classes/application.properties
|
||||||
```
|
```
|
||||||
|
***
|
||||||
|
|
||||||
### Cloud Native Deployment
|
### Cloud Native Deployment
|
||||||
|
|
||||||
|
@ -179,6 +188,9 @@ To deploy the URL Shortener application on your cloud environment, follow the st
|
||||||
|
|
||||||
* [Docker](https://www.docker.com/get-started)
|
* [Docker](https://www.docker.com/get-started)
|
||||||
* [Docker Compose](https://docs.docker.com/compose/install/)
|
* [Docker Compose](https://docs.docker.com/compose/install/)
|
||||||
|
* [Kubernetes/K8s](https://kubernetes.io/docs/setup/)
|
||||||
|
* [Minikube](https://minikube.sigs.k8s.io/docs/start/)
|
||||||
|
* [Helm](https://helm.sh/docs/intro/install/)
|
||||||
|
|
||||||
1. **Clone the Repository:**
|
1. **Clone the Repository:**
|
||||||
|
|
||||||
|
@ -186,30 +198,33 @@ To deploy the URL Shortener application on your cloud environment, follow the st
|
||||||
git clone https://github.com/your-username/URLShortener.git
|
git clone https://github.com/your-username/URLShortener.git
|
||||||
cd URLShortener
|
cd URLShortener
|
||||||
```
|
```
|
||||||
|
2. ***Deploy Using Docker***
|
||||||
|
|
||||||
2. **Build and Run Your Own Image:**
|
* Build and Run Your Own Image:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
docker build -t shortener:latest .
|
docker build -t shortener:latest .
|
||||||
docker run -p 8080:8080 -p 3306:3306 shortener:latest
|
docker run -p 8080:8080 -p 3306:3306 shortener:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Use Our Pre-built Image with Docker Compose:**
|
<p style="text-align: center;"> OR </p>
|
||||||
|
|
||||||
|
* Use Our Pre-built Image with Docker Compose:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
docker compose build
|
docker compose build
|
||||||
docker compose up
|
docker compose up
|
||||||
```
|
```
|
||||||
|
|
||||||
4. **Customizing Docker Compose Configuration:**
|
* Customizing Docker Compose Configuration:
|
||||||
|
|
||||||
In the **docker-compose.yml** file, you can customize the build source for the Shortener service:
|
In the `docker-compose.yml` file, you can customize the build source for the Shortener service:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
#Build from docker hub image .Comment/Uncomment Below
|
# Build from docker hub image .Comment/Uncomment Below
|
||||||
image: nmpl/shortener:latest
|
image: nmpl/shortener:latest
|
||||||
|
|
||||||
#Build from local Dockerfile.Comment/Uncomment Below
|
# Build from local Dockerfile.Comment/Uncomment Below
|
||||||
# build:
|
# build:
|
||||||
# context: .
|
# context: .
|
||||||
# dockerfile: Dockerfilekerfile
|
# dockerfile: Dockerfilekerfile
|
||||||
|
@ -218,45 +233,115 @@ To deploy the URL Shortener application on your cloud environment, follow the st
|
||||||
Comment or uncomment the relevant lines based on whether you want to use the pre-built image from Docker Hub or build from the local Dockerfile.
|
Comment or uncomment the relevant lines based on whether you want to use the pre-built image from Docker Hub or build from the local Dockerfile.
|
||||||
|
|
||||||
|
|
||||||
5. **Deploy Using K8s**
|
3. ***Deploy Using K8s***
|
||||||
|
|
||||||
* **Setup Kubernetes Deployment and Service:**
|
* Setup Kubernetes Deployment and Service:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
kubectl apply -f shortener-deployment.yaml
|
cd k8s
|
||||||
kubectl apply -f shortener-service.yaml
|
kubectl apply -f deploy.yaml,service.yaml,data.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
* **Use the following command to monitor the deployment:**
|
* Expose the K8s service:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
kubectl port-forward service/shortener-app 8080:8080
|
||||||
|
```
|
||||||
|
Access Application at http://localhost:8080
|
||||||
|
<center>OR</center>
|
||||||
|
If you're using minikube, run the below command to run the app:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
minikube service shortener-app
|
||||||
|
```
|
||||||
|
|
||||||
|
* Use the following command to monitor the deployment:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
kubectl get pods
|
kubectl get pods
|
||||||
```
|
```
|
||||||
|
|
||||||
Wait until the pod is in the "Running" state.
|
|
||||||
|
|
||||||
* **Access the Application**
|
4. ***Deploy Using Helm Chart***
|
||||||
|
|
||||||
|
* Create Deployment from helm chart named "instance" , with a service named "instance-shortener-chart" :
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
cd k8s
|
||||||
|
helm install instance shortener-chart/ --values shortener-chart/values.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
* Expose the K8s service:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
kubectl port-forward service/instance-shortener-chart 8080:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
<center>OR</center>
|
||||||
|
If you're using minikube, run the below command to run the app:**
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
minikube service shortener-app
|
||||||
|
```
|
||||||
|
|
||||||
|
* Use the following command to monitor the deployment:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
kubectl get pods
|
||||||
|
```
|
||||||
|
|
||||||
|
Wait until the pod is in the "Running" state.
|
||||||
|
|
||||||
|
* Access the Application
|
||||||
|
|
||||||
Depending on your Kubernetes setup, you might need to get the external IP of the service:
|
Depending on your Kubernetes setup, you might need to get the external IP of the service:
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
kubectl get service shortener-service
|
kubectl get service instance-shortener-chart
|
||||||
```
|
```
|
||||||
|
|
||||||
Access your application using the provided external IP.
|
Access your application using the provided external IP(from command output) or at : http://localhost:8080.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### SMS Service Configuration
|
||||||
|
|
||||||
|
To configure the SMS service, you need to specify parameters related to the SMS provider in the `application.properties` file.
|
||||||
|
|
||||||
|
* #### Managed SMS Provider (Uses HttpSms API from https://httpsms.com/)
|
||||||
|
* Generate API Key : https://httpsms.com/settings/
|
||||||
|
* HttpSms API Docs : https://api.httpsms.com/
|
||||||
|
|
||||||
|
```properties
|
||||||
|
sms.provider=managed
|
||||||
|
managed.sms.api.key=your_managed_sms_api_key
|
||||||
|
managed.sms.phone-number=123456789
|
||||||
|
|
||||||
|
* #### Self-hosted SMS Provider (Host our open source android-based SMS web gateway : https://api.httpsms.com/)
|
||||||
|
|
||||||
|
```properties
|
||||||
|
sms.provider=selfhosted
|
||||||
|
selfhosted.gateway.url=https://your-smsgateway-url/index.php
|
||||||
|
selfhosted.device.id=your_device_id
|
||||||
|
selfhosted.hash=your_device_hash
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
### App Health
|
### App Health
|
||||||
|
Check application status from the /monitoring page at : http://localhost:8080/monitoring
|
||||||
|
### Docs
|
||||||
|
Check application OpenAPI 3.0 compliant docs at: http://localhost:8080/docs-ui
|
||||||
|
|
||||||
* Check application status from the /monitoring page example http://localhost:8080/monitoring
|
***
|
||||||
|
|
||||||
### Usage Cases
|
### Use Cases
|
||||||
|
|
||||||
1. Shorten URLs by visiting the URL Shortener page.
|
1. Shorten URLs by visiting the URL Shortener page.
|
||||||
2. Access analytics for each shortened URL.
|
2. Access analytics for each shortened URL.
|
||||||
3. Create and manage bio pages in the Bio section.
|
3. Create and manage bio pages in the Bio section.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
Contributions are welcome! Please follow the contribution guidelines.
|
Contributions are welcome! Please follow the contribution guidelines.
|
||||||
|
@ -264,3 +349,6 @@ Contributions are welcome! Please follow the contribution guidelines.
|
||||||
### License
|
### License
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the LICENSE.md file for details.
|
This project is licensed under the MIT License - see the LICENSE.md file for details.
|
||||||
|
|
||||||
|
***
|
||||||
|
<p style="text-align: center;">© Bitmutex Technologies | 2024</p>
|
||||||
|
|
|
@ -1,37 +1,43 @@
|
||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
shortener-app:
|
database:
|
||||||
|
image: mariadb
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: 1234qwer
|
||||||
|
MYSQL_DATABASE: shortener
|
||||||
|
MYSQL_USER: shortener_user
|
||||||
|
MYSQL_PASSWORD: 1234qwer
|
||||||
|
volumes:
|
||||||
|
- data:/var/lib/mysql
|
||||||
|
- ./create.sql:/docker-entrypoint-initdb.d/init.sql
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
|
||||||
|
app:
|
||||||
labels:
|
labels:
|
||||||
- "TUSC The URL Shortener Company"
|
- "TUSC The URL Shortener Company"
|
||||||
|
|
||||||
#Build from docker hub image .Comment/Uncomment Below
|
#Build from docker hub image .Comment/Uncomment Below
|
||||||
image: nmpl/shortener:latest
|
image: nmpl/shortener:latest
|
||||||
|
|
||||||
#Build from local Dockerfile.Comment/Uncomment Below
|
# Build from local Dockerfile.Comment/Uncomment Below
|
||||||
# build:
|
# build:
|
||||||
# context: .
|
# context: .
|
||||||
# dockerfile: Dockerfile
|
# dockerfile: Dockerfile
|
||||||
|
|
||||||
ports:
|
|
||||||
- "8080:8080"
|
|
||||||
- "3306:3306"
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- shortener-db-data:/var/lib/mysql
|
|
||||||
- type: volume
|
|
||||||
source: shortener-db-data
|
|
||||||
target: /var/lib/mysql
|
|
||||||
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: [ "CMD", "curl", "-f", "http://localhost:8080/monitoring" ]
|
test: [ "CMD-SHELL", "curl", "-f", "http://localhost:8080/monitoring" ]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 60s
|
start_period: 30s
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
depends_on:
|
||||||
|
- database
|
||||||
|
|
||||||
volumes:
|
|
||||||
shortener-db-data:
|
|
||||||
name: shortener-db-data
|
|
BIN
image.png
Before Width: | Height: | Size: 5.8 KiB |
|
@ -1,102 +0,0 @@
|
||||||
@echo off
|
|
||||||
setlocal enabledelayedexpansion
|
|
||||||
|
|
||||||
REM Set Tomcat and URL variables
|
|
||||||
set "TOMCAT_VERSION=10.1.9"
|
|
||||||
set "TOMCAT_URL=https://archive.apache.org/dist/tomcat/tomcat-10/v%TOMCAT_VERSION%/bin/apache-tomcat-%TOMCAT_VERSION%-windows-x64.zip"
|
|
||||||
set "WAR_URL=https://github.com/aamitn/URLShortener/releases/download/WAR/shortener.war"
|
|
||||||
set "SQL_FILE_URL=https://github.com/aamitn/URLShortener/raw/master/create.sql"
|
|
||||||
set "SERVER_XML_URL=https://raw.githubusercontent.com/aamitn/URLShortener/master/server.xml"
|
|
||||||
|
|
||||||
REM Function to download and extract Tomcat
|
|
||||||
:download_and_extract_tomcat
|
|
||||||
echo Downloading Tomcat...
|
|
||||||
curl -O "%TOMCAT_URL%"
|
|
||||||
PowerShell Expand-Archive "apache-tomcat-%TOMCAT_VERSION%-windows-x64.zip" -DestinationPath .
|
|
||||||
del "apache-tomcat-%TOMCAT_VERSION%-windows-x64.zip"
|
|
||||||
|
|
||||||
REM Function to download the WAR file
|
|
||||||
:download_war_file
|
|
||||||
echo Downloading shortener.war...
|
|
||||||
curl -LJO "%WAR_URL%"
|
|
||||||
|
|
||||||
REM Function to configure Tomcat and deploy the WAR file
|
|
||||||
:configure_and_deploy
|
|
||||||
echo Configuring and deploying...
|
|
||||||
copy shortener.war "apache-tomcat-%TOMCAT_VERSION%\webapps\"
|
|
||||||
|
|
||||||
REM Downloading the server.xml file
|
|
||||||
echo Downloading server.xml...
|
|
||||||
curl -LJO "%SERVER_XML_URL%"
|
|
||||||
|
|
||||||
REM Replace the existing server.xml with the downloaded one
|
|
||||||
echo Replacing server.xml...
|
|
||||||
copy /Y server.xml "apache-tomcat-%TOMCAT_VERSION%\conf\server.xml"
|
|
||||||
|
|
||||||
REM Run Tomcat server using startup.bat
|
|
||||||
:run_tomcat
|
|
||||||
echo Running Tomcat server...
|
|
||||||
cd "apache-tomcat-%TOMCAT_VERSION%\bin"
|
|
||||||
call startup.bat
|
|
||||||
REM Wait for Tomcat to start (adjust sleep time as needed)
|
|
||||||
timeout /t 20 /nobreak
|
|
||||||
call shutdown.bat
|
|
||||||
timeout /t 2 /nobreak
|
|
||||||
call startup.bat
|
|
||||||
cd ..
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
REM Main Script Execution
|
|
||||||
if "%OS%"=="Windows_NT" (
|
|
||||||
call :download_and_install_mariadb
|
|
||||||
) else (
|
|
||||||
echo Unsupported operating system.
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
echo Local deployment completed successfully!
|
|
||||||
exit /b 0
|
|
||||||
|
|
||||||
REM Function to download and install MariaDB
|
|
||||||
:download_and_install_mariadb
|
|
||||||
echo Downloading MariaDB installer...
|
|
||||||
curl -O "https://mirror.docker.ru/mariadb//mariadb-11.4.0/winx64-packages/mariadb-11.4.0-winx64.zip"
|
|
||||||
|
|
||||||
echo Installing MariaDB...
|
|
||||||
PowerShell Expand-Archive "mariadb-11.4.0-winx64.zip" -DestinationPath .
|
|
||||||
del "mariadb-11.4.0-winx64.zip"
|
|
||||||
|
|
||||||
cd mariadb-11.4.0-winx64/bin
|
|
||||||
cd..
|
|
||||||
cd..
|
|
||||||
|
|
||||||
@echo SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1234qwer');> dbinit.txt
|
|
||||||
|
|
||||||
REM Get the current directory
|
|
||||||
set "CURRENT_DIR=%CD%"
|
|
||||||
|
|
||||||
REM Create db.bat script for database initialization
|
|
||||||
echo timeout /t 1 /nobreak > db.bat
|
|
||||||
echo cd mariadb-11.4.0-winx64/bin >> db.bat
|
|
||||||
echo mysql -u root -p1234qwer -e "CREATE DATABASE IF NOT EXISTS shortener;" >> db.bat
|
|
||||||
echo curl -LJO "https://github.com/aamitn/URLShortener/raw/master/create.sql" >> db.bat
|
|
||||||
echo mysql -u root -p1234qwer ^< create.sql >> db.bat
|
|
||||||
echo mysql -u root -p1234qwer -e "SHOW DATABASES;" >> db.bat
|
|
||||||
echo mysql -u root -p1234qwer -e "USE shortener" >> db.bat
|
|
||||||
echo mysql -u root -p1234qwer -e "SELECT * FROM shortener;" >> db.bat
|
|
||||||
echo del create.sql >> db.bat
|
|
||||||
echo echo Deployed Successfully... >> db.bat
|
|
||||||
echo start "" http://localhost:8080 >> db.bat
|
|
||||||
echo exit /b 0 >> db.bat
|
|
||||||
|
|
||||||
REM Start the db.bat script
|
|
||||||
start db.bat
|
|
||||||
|
|
||||||
REM Navigate to mariadb-11.4.0-winx64/bin
|
|
||||||
cd mariadb-11.4.0-winx64/bin
|
|
||||||
|
|
||||||
REM Initialize DB
|
|
||||||
call mariadb-install-db.exe
|
|
||||||
|
|
||||||
REM Run MariaDB server with the init file
|
|
||||||
call mysqld.exe --console --init-file="%CURRENT_DIR%\\dbinit.txt"
|
|
155
installers/install.cmd
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
REM Set Tomcat and URL variables
|
||||||
|
set "TOMCAT_VERSION=10.1.9"
|
||||||
|
set "TOMCAT_URL=https://archive.apache.org/dist/tomcat/tomcat-10/v%TOMCAT_VERSION%/bin/apache-tomcat-%TOMCAT_VERSION%-windows-x64.zip"
|
||||||
|
set "WAR_URL=https://github.com/aamitn/URLShortener/releases/download/final/shortener.war"
|
||||||
|
set "SQL_FILE_URL=https://github.com/aamitn/URLShortener/raw/master/create.sql"
|
||||||
|
set "SERVER_XML_URL=https://raw.githubusercontent.com/aamitn/URLShortener/master/server.xml"
|
||||||
|
REM Set WildFly and URL variables
|
||||||
|
set "WILDFLY_VERSION=31.0.0.Final"
|
||||||
|
set "WILDFLY_URL=https://github.com/wildfly/wildfly/releases/download/%WILDFLY_VERSION%/wildfly-%WILDFLY_VERSION%.zip"
|
||||||
|
set "WAR_URL=https://github.com/aamitn/URLShortener/releases/download/final/shortener.war"
|
||||||
|
|
||||||
|
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
REM Ask the user for deployment target
|
||||||
|
echo Choose the deployment target:
|
||||||
|
echo 1. Tomcat
|
||||||
|
echo 2. WildFly
|
||||||
|
set /p DEPLOYMENT_TARGET=Enter the number (default is Tomcat):
|
||||||
|
|
||||||
|
REM Set default deployment target to Tomcat if user input is empty
|
||||||
|
if not defined DEPLOYMENT_TARGET set "DEPLOYMENT_TARGET=1"
|
||||||
|
|
||||||
|
REM Function to download the WAR file
|
||||||
|
:download_war_file
|
||||||
|
echo Downloading shortener.war...
|
||||||
|
curl -LJO "%WAR_URL%"
|
||||||
|
|
||||||
|
REM Function to deploy the WAR file
|
||||||
|
:deploy_war
|
||||||
|
echo Deploying shortener.war to %DEPLOYMENT_TARGET%...
|
||||||
|
if "%DEPLOYMENT_TARGET%"=="1" (
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
REM Function to download and extract Tomcat
|
||||||
|
:download_and_extract_tomcat
|
||||||
|
echo Downloading Tomcat...
|
||||||
|
curl -O "%TOMCAT_URL%"
|
||||||
|
PowerShell Expand-Archive "apache-tomcat-%TOMCAT_VERSION%-windows-x64.zip" -DestinationPath .
|
||||||
|
del "apache-tomcat-%TOMCAT_VERSION%-windows-x64.zip"
|
||||||
|
|
||||||
|
|
||||||
|
REM Function to configure Tomcat and deploy the WAR file
|
||||||
|
:configure_and_deploy
|
||||||
|
echo Configuring and deploying...
|
||||||
|
copy shortener.war "apache-tomcat-%TOMCAT_VERSION%\webapps\"
|
||||||
|
|
||||||
|
REM Downloading the server.xml file
|
||||||
|
echo Downloading server.xml...
|
||||||
|
curl -LJO "%SERVER_XML_URL%"
|
||||||
|
|
||||||
|
REM Replace the existing server.xml with the downloaded one
|
||||||
|
echo Replacing server.xml...
|
||||||
|
copy /Y server.xml "apache-tomcat-%TOMCAT_VERSION%\conf\server.xml"
|
||||||
|
|
||||||
|
REM Run Tomcat server using startup.bat
|
||||||
|
:run_tomcat
|
||||||
|
echo Running Tomcat server...
|
||||||
|
cd "apache-tomcat-%TOMCAT_VERSION%\bin"
|
||||||
|
call startup.bat
|
||||||
|
REM Wait for Tomcat to start (adjust sleep time as needed)
|
||||||
|
timeout /t 30 /nobreak
|
||||||
|
call shutdown.bat
|
||||||
|
timeout /t 2 /nobreak
|
||||||
|
call startup.bat
|
||||||
|
cd ..
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
) else if "%DEPLOYMENT_TARGET%"=="2" (
|
||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
|
||||||
|
REM Function to download and extract WildFly
|
||||||
|
:download_and_extract_wildfly
|
||||||
|
echo Downloading WildFly...
|
||||||
|
curl -LJO "%WILDFLY_URL%"
|
||||||
|
PowerShell Expand-Archive "wildfly-%WILDFLY_VERSION%.zip" -DestinationPath .
|
||||||
|
del "wildfly-%WILDFLY_VERSION%.zip"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
REM Function to deploy the WAR file
|
||||||
|
:deploy_war
|
||||||
|
echo Deploying shortener.war to WildFly...
|
||||||
|
copy shortener.war "wildfly-%WILDFLY_VERSION%\standalone\deployments\"
|
||||||
|
|
||||||
|
REM Run WildFly server
|
||||||
|
:run_wildfly
|
||||||
|
echo Running WildFly...
|
||||||
|
cd "wildfly-%WILDFLY_VERSION%\bin"
|
||||||
|
dir
|
||||||
|
start standalone.bat -c standalone-full.xml
|
||||||
|
|
||||||
|
|
||||||
|
echo WildFly deployment completed successfully!
|
||||||
|
cd..
|
||||||
|
cd..
|
||||||
|
timeout /t 3 /nobreak
|
||||||
|
|
||||||
|
) else (
|
||||||
|
echo Invalid deployment target selected.
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
echo Deployment Stage 1 Done
|
||||||
|
|
||||||
|
|
||||||
|
REM Function to download and install MariaDB
|
||||||
|
REM Check if MariaDB is already installed
|
||||||
|
if not exist mariadb-11.4.0-winx64 (
|
||||||
|
echo Downloading MariaDB installer...
|
||||||
|
curl -O "https://mirrors.aliyun.com/mariadb//mariadb-11.4.0/winx64-packages/mariadb-11.4.0-winx64.zip"
|
||||||
|
|
||||||
|
echo Installing MariaDB...
|
||||||
|
PowerShell Expand-Archive "mariadb-11.4.0-winx64.zip" -DestinationPath .
|
||||||
|
del "mariadb-11.4.0-winx64.zip"
|
||||||
|
)
|
||||||
|
|
||||||
|
cd mariadb-11.4.0-winx64/bin
|
||||||
|
@echo SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1234qwer');> dbinit.txt
|
||||||
|
cd..
|
||||||
|
cd..
|
||||||
|
|
||||||
|
|
||||||
|
REM Navigate to mariadb-11.4.0-winx64/bin
|
||||||
|
cd mariadb-11.4.0-winx64/bin
|
||||||
|
|
||||||
|
REM Get the current directory
|
||||||
|
set "CURRENT_DIR=%CD%"
|
||||||
|
|
||||||
|
REM Initialize DB
|
||||||
|
call mariadb-install-db.exe
|
||||||
|
|
||||||
|
REM Run MariaDB server with the init file
|
||||||
|
start mysqld.exe --console --init-file="%CURRENT_DIR%\\dbinit.txt"
|
||||||
|
|
||||||
|
REM Create DB
|
||||||
|
timeout /t 1 /nobreak
|
||||||
|
mysql -u root -p1234qwer -e "CREATE DATABASE IF NOT EXISTS shortener;"
|
||||||
|
curl -LJO "https://github.com/aamitn/URLShortener/raw/master/create.sql"
|
||||||
|
mysql -u root -p1234qwer < create.sql
|
||||||
|
mysql -u root -p1234qwer -e "SHOW ENGINE PERFORMANCE_SCHEMA STATUS;SHOW ENGINE INNODB STATUS;"
|
||||||
|
mysql -u root -p1234qwer -e "SHOW DATABASES;"
|
||||||
|
mysql -u root -p1234qwer -e "USE shortener; SHOW TABLES; SHOW TABLE STATUS\G;"
|
||||||
|
del create.sql
|
||||||
|
|
||||||
|
REM start browser
|
||||||
|
echo Application Deployed Successfully...
|
||||||
|
start "" http://localhost:8080
|
||||||
|
timeout /t 20 /nobreak
|
||||||
|
exit /b
|
|
@ -3,7 +3,7 @@
|
||||||
# Set Tomcat and URL variables
|
# Set Tomcat and URL variables
|
||||||
TOMCAT_VERSION="10.0.0-M15"
|
TOMCAT_VERSION="10.0.0-M15"
|
||||||
TOMCAT_URL="https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz"
|
TOMCAT_URL="https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz"
|
||||||
WAR_URL="https://github.com/aamitn/URLShortener/releases/download/WAR/shortener.war"
|
WAR_URL="https://github.com/aamitn/URLShortener/releases/download/final/shortener.war"
|
||||||
SERVER_XML_CONTEXT="<Context path=\"\" docBase=\"shortener\" debug=\"0\" reloadable=\"true\"></Context>"
|
SERVER_XML_CONTEXT="<Context path=\"\" docBase=\"shortener\" debug=\"0\" reloadable=\"true\"></Context>"
|
||||||
SQL_FILE_URL="https://github.com/aamitn/URLShortener/raw/master/create.sql"
|
SQL_FILE_URL="https://github.com/aamitn/URLShortener/raw/master/create.sql"
|
||||||
|
|
||||||
|
|
12
k8s/data.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
io.kompose.service: data
|
||||||
|
name: data
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 100Mi
|
42
k8s/deploy.yaml
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
name.full: "TUSC-The Url Shortener Company"
|
||||||
|
labels:
|
||||||
|
io.kompose.service: shortener-app
|
||||||
|
name: shortener-app
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
io.kompose.service: shortener-app
|
||||||
|
strategy:
|
||||||
|
type: Recreate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
name.full: "TUSC-The Url Shortener Company"
|
||||||
|
labels:
|
||||||
|
io.kompose.network/k8s-default: "true"
|
||||||
|
io.kompose.service: shortener-app
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nmpl/shortener:k8s
|
||||||
|
name: shortener-app
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
hostPort: 8080
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 3306
|
||||||
|
hostPort: 3306
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/lib/mysql
|
||||||
|
name: data
|
||||||
|
restartPolicy: Always
|
||||||
|
volumes:
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: data
|
51
k8s/docker-k8s/Dockerfile
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
# Add the following lines to tag the image (replace 'your_username' and 'shortener-app' with your Docker Hub username and repository name)
|
||||||
|
ARG VERSION=k8s
|
||||||
|
ARG IMAGE_NAME=bigwiz/shortener
|
||||||
|
ARG TAG=$VERSION
|
||||||
|
|
||||||
|
# Stage 1: Build the application
|
||||||
|
FROM maven:3.9.6-eclipse-temurin-21 AS builder
|
||||||
|
|
||||||
|
# Clone the repository
|
||||||
|
RUN git clone https://github.com/aamitn/URLShortener.git
|
||||||
|
|
||||||
|
WORKDIR /URLShortener
|
||||||
|
|
||||||
|
# Build the application
|
||||||
|
RUN mvn clean install
|
||||||
|
|
||||||
|
# Stage 2: Create the final image
|
||||||
|
FROM tomcat:10-jdk21-openjdk-slim
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
ENV CATALINA_BASE /usr/local/tomcat
|
||||||
|
ENV CATALINA_HOME /usr/local/tomcat
|
||||||
|
ENV PATH $CATALINA_HOME/bin:$PATH
|
||||||
|
|
||||||
|
|
||||||
|
# Copy the WAR file from the builder stage
|
||||||
|
COPY --from=builder /URLShortener/target/shortener.war $CATALINA_BASE/webapps/
|
||||||
|
|
||||||
|
|
||||||
|
# Add configuration for document base path
|
||||||
|
COPY --from=builder /URLShortener/server.xml $CATALINA_BASE/conf/server.xml
|
||||||
|
|
||||||
|
|
||||||
|
# Expose ports
|
||||||
|
EXPOSE 8080
|
||||||
|
EXPOSE 3306
|
||||||
|
|
||||||
|
|
||||||
|
# Copy the startup script
|
||||||
|
COPY shortener.sh /usr/local/tomcat/shortener.sh
|
||||||
|
|
||||||
|
# Copy the sql file
|
||||||
|
COPY --from=builder /URLShortener/create.sql /usr/local/tomcat/create.sql
|
||||||
|
|
||||||
|
# Grant execute permissions to the startup.sh script
|
||||||
|
RUN chmod +x /usr/local/tomcat/shortener.sh
|
||||||
|
|
||||||
|
# Start Tomcat and MariaDB using the startup script
|
||||||
|
CMD ["sh", "/usr/local/tomcat/shortener.sh"]
|
22
k8s/docker-k8s/docker-compose.yml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
shortener-app:
|
||||||
|
labels:
|
||||||
|
- "TUSC"
|
||||||
|
#Build from docker hub image .Comment/Uncomment Below
|
||||||
|
image: nmpl/shortener:k8s
|
||||||
|
|
||||||
|
#Build from local Dockerfile.Comment/Uncomment Below
|
||||||
|
#build:
|
||||||
|
#dockerfile: Dockerfile
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
- "3306:3306"
|
||||||
|
volumes:
|
||||||
|
- data:/var/lib/mysql
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
|
@ -12,7 +12,7 @@ service mariadb start
|
||||||
echo "Waiting for MariaDB to start (adjust sleep time as needed)..."
|
echo "Waiting for MariaDB to start (adjust sleep time as needed)..."
|
||||||
|
|
||||||
# Wait for MariaDB to start
|
# Wait for MariaDB to start
|
||||||
while ! mysqladmin ping -hlocalhost -uroot -p'YOUR_PASSWORD' --silent; do
|
while ! mysqladmin ping -hlocalhost -uroot --silent; do
|
||||||
echo "MariaDB is not yet available. Waiting..."
|
echo "MariaDB is not yet available. Waiting..."
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
|
@ -23,7 +23,8 @@ mysql -u root -e "source /usr/local/tomcat/create.sql"
|
||||||
|
|
||||||
echo "Displaying databases and tables..."
|
echo "Displaying databases and tables..."
|
||||||
# Display the databases and tables
|
# Display the databases and tables
|
||||||
mysql -u root -e "SHOW DATABASES; USE shortener; SHOW TABLES;"
|
mysql -u root -e "SHOW ENGINE PERFORMANCE_SCHEMA STATUS;SHOW ENGINE INNODB STATUS;"
|
||||||
|
mysql -u root -e "SHOW DATABASES; USE shortener; SHOW TABLES; SHOW TABLE STATUS\G;"
|
||||||
|
|
||||||
echo "Altering user and reloading privileges..."
|
echo "Altering user and reloading privileges..."
|
||||||
# Run SQL commands to alter user and reload privileges
|
# Run SQL commands to alter user and reload privileges
|
17
k8s/service.yaml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
name.full: "TUSC-The Url Shortener Company"
|
||||||
|
labels:
|
||||||
|
io.kompose.service: shortener-app
|
||||||
|
name: shortener-app
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: "8080"
|
||||||
|
port: 8080
|
||||||
|
targetPort: 8080
|
||||||
|
|
||||||
|
|
||||||
|
selector:
|
||||||
|
io.kompose.service: shortener-app
|
BIN
k8s/shortener-chart-0.1.0.tgz
Normal file
23
k8s/shortener-chart/.helmignore
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.orig
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
.vscode/
|
24
k8s/shortener-chart/Chart.yaml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
apiVersion: v2
|
||||||
|
name: shortener-chart
|
||||||
|
description: A Helm chart for Kubernetes
|
||||||
|
|
||||||
|
# A chart can be either an 'application' or a 'library' chart.
|
||||||
|
#
|
||||||
|
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||||
|
# to be deployed.
|
||||||
|
#
|
||||||
|
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||||
|
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||||
|
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||||
|
type: application
|
||||||
|
|
||||||
|
# This is the chart version. This version number should be incremented each time you make changes
|
||||||
|
# to the chart and its templates, including the app version.
|
||||||
|
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
# This is the version number of the application being deployed. This version number should be
|
||||||
|
# incremented each time you make changes to the application. Versions are not expected to
|
||||||
|
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||||
|
# It is recommended to use it with quotes.
|
||||||
|
appVersion: "1.16.0"
|
22
k8s/shortener-chart/templates/NOTES.txt
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
1. Get the application URL by running these commands:
|
||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
{{- range $host := .Values.ingress.hosts }}
|
||||||
|
{{- range .paths }}
|
||||||
|
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if contains "NodePort" .Values.service.type }}
|
||||||
|
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "shortener-chart.fullname" . }})
|
||||||
|
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||||
|
echo http://$NODE_IP:$NODE_PORT
|
||||||
|
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||||
|
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||||
|
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "shortener-chart.fullname" . }}'
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "shortener-chart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||||
|
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||||
|
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||||
|
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "shortener-chart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||||
|
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||||
|
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||||
|
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||||
|
{{- end }}
|
62
k8s/shortener-chart/templates/_helpers.tpl
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "shortener-chart.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
*/}}
|
||||||
|
{{- define "shortener-chart.fullname" -}}
|
||||||
|
{{- if .Values.fullnameOverride }}
|
||||||
|
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||||
|
{{- if contains $name .Release.Name }}
|
||||||
|
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "shortener-chart.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Common labels
|
||||||
|
*/}}
|
||||||
|
{{- define "shortener-chart.labels" -}}
|
||||||
|
helm.sh/chart: {{ include "shortener-chart.chart" . }}
|
||||||
|
{{ include "shortener-chart.selectorLabels" . }}
|
||||||
|
{{- if .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Selector labels
|
||||||
|
*/}}
|
||||||
|
{{- define "shortener-chart.selectorLabels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "shortener-chart.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the service account to use
|
||||||
|
*/}}
|
||||||
|
{{- define "shortener-chart.serviceAccountName" -}}
|
||||||
|
{{- if .Values.serviceAccount.create }}
|
||||||
|
{{- default (include "shortener-chart.fullname" .) .Values.serviceAccount.name }}
|
||||||
|
{{- else }}
|
||||||
|
{{- default "default" .Values.serviceAccount.name }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
68
k8s/shortener-chart/templates/deployment.yaml
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{ include "shortener-chart.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
{{- if not .Values.autoscaling.enabled }}
|
||||||
|
replicas: {{ .Values.replicaCount }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "shortener-chart.selectorLabels" . | nindent 6 }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
{{- with .Values.podAnnotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 8 }}
|
||||||
|
{{- with .Values.podLabels }}
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "shortener-chart.serviceAccountName" . }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: {{ .Values.service.port }}
|
||||||
|
protocol: TCP
|
||||||
|
livenessProbe:
|
||||||
|
{{- toYaml .Values.livenessProbe | nindent 12 }}
|
||||||
|
readinessProbe:
|
||||||
|
{{- toYaml .Values.readinessProbe | nindent 12 }}
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
{{- with .Values.volumeMounts }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.volumes }}
|
||||||
|
volumes:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
32
k8s/shortener-chart/templates/hpa.yaml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{{- if .Values.autoscaling.enabled }}
|
||||||
|
apiVersion: autoscaling/v2
|
||||||
|
kind: HorizontalPodAutoscaler
|
||||||
|
metadata:
|
||||||
|
name: {{ include "shortener-chart.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
scaleTargetRef:
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: {{ include "shortener-chart.fullname" . }}
|
||||||
|
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||||
|
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||||
|
metrics:
|
||||||
|
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: cpu
|
||||||
|
target:
|
||||||
|
type: Utilization
|
||||||
|
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: memory
|
||||||
|
target:
|
||||||
|
type: Utilization
|
||||||
|
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
61
k8s/shortener-chart/templates/ingress.yaml
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{{- if .Values.ingress.enabled -}}
|
||||||
|
{{- $fullName := include "shortener-chart.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||||
|
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||||
|
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
apiVersion: networking.k8s.io/v1beta1
|
||||||
|
{{- else -}}
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
{{- end }}
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.ingress.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||||
|
ingressClassName: {{ .Values.ingress.className }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
{{- range .Values.ingress.tls }}
|
||||||
|
- hosts:
|
||||||
|
{{- range .hosts }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
secretName: {{ .secretName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.ingress.hosts }}
|
||||||
|
- host: {{ .host | quote }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
{{- range .paths }}
|
||||||
|
- path: {{ .path }}
|
||||||
|
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||||
|
pathType: {{ .pathType }}
|
||||||
|
{{- end }}
|
||||||
|
backend:
|
||||||
|
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||||
|
service:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
port:
|
||||||
|
number: {{ $svcPort }}
|
||||||
|
{{- else }}
|
||||||
|
serviceName: {{ $fullName }}
|
||||||
|
servicePort: {{ $svcPort }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
15
k8s/shortener-chart/templates/service.yaml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "shortener-chart.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.service.port }}
|
||||||
|
targetPort: http
|
||||||
|
protocol: TCP
|
||||||
|
name: http
|
||||||
|
selector:
|
||||||
|
{{- include "shortener-chart.selectorLabels" . | nindent 4 }}
|
13
k8s/shortener-chart/templates/serviceaccount.yaml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{{- if .Values.serviceAccount.create -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ include "shortener-chart.serviceAccountName" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.serviceAccount.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
|
||||||
|
{{- end }}
|
15
k8s/shortener-chart/templates/tests/test-connection.yaml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: "{{ include "shortener-chart.fullname" . }}-test-connection"
|
||||||
|
labels:
|
||||||
|
{{- include "shortener-chart.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": test
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: wget
|
||||||
|
image: busybox
|
||||||
|
command: ['wget']
|
||||||
|
args: ['{{ include "shortener-chart.fullname" . }}:{{ .Values.service.port }}']
|
||||||
|
restartPolicy: Never
|
107
k8s/shortener-chart/values.yaml
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
# Default values for shortener-chart.
|
||||||
|
# This is a YAML-formatted file.
|
||||||
|
# Declare variables to be passed into your templates.
|
||||||
|
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: nmpl/shortener
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
# Overrides the image tag whose default is the chart appVersion.
|
||||||
|
tag: "k8s"
|
||||||
|
|
||||||
|
imagePullSecrets: []
|
||||||
|
nameOverride: ""
|
||||||
|
fullnameOverride: ""
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
# Specifies whether a service account should be created
|
||||||
|
create: true
|
||||||
|
# Automatically mount a ServiceAccount's API credentials?
|
||||||
|
automount: true
|
||||||
|
# Annotations to add to the service account
|
||||||
|
annotations: {}
|
||||||
|
# The name of the service account to use.
|
||||||
|
# If not set and create is true, a name is generated using the fullname template
|
||||||
|
name: ""
|
||||||
|
|
||||||
|
podAnnotations: {}
|
||||||
|
podLabels: {}
|
||||||
|
|
||||||
|
podSecurityContext: {}
|
||||||
|
# fsGroup: 2000
|
||||||
|
|
||||||
|
securityContext: {}
|
||||||
|
# capabilities:
|
||||||
|
# drop:
|
||||||
|
# - ALL
|
||||||
|
# readOnlyRootFilesystem: true
|
||||||
|
# runAsNonRoot: true
|
||||||
|
# runAsUser: 1000
|
||||||
|
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
port: 8080
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
className: ""
|
||||||
|
annotations: {}
|
||||||
|
# kubernetes.io/ingress.class: nginx
|
||||||
|
# kubernetes.io/tls-acme: "true"
|
||||||
|
hosts:
|
||||||
|
- host: chart-example.local
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
|
tls: []
|
||||||
|
# - secretName: chart-example-tls
|
||||||
|
# hosts:
|
||||||
|
# - chart-example.local
|
||||||
|
|
||||||
|
resources: {}
|
||||||
|
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||||
|
# choice for the user. This also increases chances charts run on environments with little
|
||||||
|
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||||
|
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||||
|
# limits:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
# requests:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: http
|
||||||
|
|
||||||
|
autoscaling:
|
||||||
|
enabled: false
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 100
|
||||||
|
targetCPUUtilizationPercentage: 80
|
||||||
|
# targetMemoryUtilizationPercentage: 80
|
||||||
|
|
||||||
|
# Additional volumes on the output Deployment definition.
|
||||||
|
volumes: []
|
||||||
|
# - name: foo
|
||||||
|
# secret:
|
||||||
|
# secretName: mysecret
|
||||||
|
# optional: false
|
||||||
|
|
||||||
|
# Additional volumeMounts on the output Deployment definition.
|
||||||
|
volumeMounts: []
|
||||||
|
# - name: foo
|
||||||
|
# mountPath: "/etc/foo"
|
||||||
|
# readOnly: true
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
|
||||||
|
tolerations: []
|
||||||
|
|
||||||
|
affinity: {}
|
25
pom.xml
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>3.2.1</version>
|
<version>3.2.2</version>
|
||||||
<relativePath/> <!-- lookup parent from repository -->
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.bitmutex</groupId>
|
<groupId>com.bitmutex</groupId>
|
||||||
|
@ -86,7 +86,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jetbrains</groupId>
|
<groupId>org.jetbrains</groupId>
|
||||||
<artifactId>annotations</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
<version>RELEASE</version>
|
<version>24.1.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -180,11 +180,8 @@
|
||||||
<build>
|
<build>
|
||||||
<finalName>${project.artifactId}</finalName>
|
<finalName>${project.artifactId}</finalName>
|
||||||
|
|
||||||
<pluginManagement>
|
|
||||||
|
|
||||||
<plugins>
|
<plugins>
|
||||||
|
|
||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
@ -200,22 +197,7 @@
|
||||||
</property>
|
</property>
|
||||||
</properties>
|
</properties>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<groupId>org.springdoc</groupId>
|
|
||||||
<artifactId>springdoc-openapi-maven-plugin</artifactId>
|
|
||||||
<version>1.4</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>generate</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -245,9 +227,8 @@
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</pluginManagement>
|
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: shortener-deployment
|
|
||||||
labels:
|
|
||||||
app: shortener
|
|
||||||
spec:
|
|
||||||
replicas: 3 # Adjust as needed
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: shortener
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: shortener
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: shortener
|
|
||||||
image: nmpl/shortener:latest
|
|
||||||
ports:
|
|
||||||
- containerPort: 8080
|
|
|
@ -1,12 +0,0 @@
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: shortener-service
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
app: shortener
|
|
||||||
ports:
|
|
||||||
- protocol: TCP
|
|
||||||
port: 8080
|
|
||||||
targetPort: 8080
|
|
||||||
type: LoadBalancer
|
|
|
@ -5,23 +5,48 @@ import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.net.URLEncoder;
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
import java.net.http.HttpResponse;
|
import java.net.http.HttpResponse;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SmsService {
|
public class SmsService {
|
||||||
|
|
||||||
|
private final SmsServiceConfig smsServiceConfig;
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(SmsService.class);
|
private static final Logger logger = LoggerFactory.getLogger(SmsService.class);
|
||||||
|
|
||||||
|
public SmsService(SmsServiceConfig smsServiceConfig) {
|
||||||
|
this.smsServiceConfig = smsServiceConfig;
|
||||||
|
}
|
||||||
|
|
||||||
public void sendSms(String toNumber, String message) {
|
public void sendSms(String toNumber, String message) {
|
||||||
try {
|
try {
|
||||||
// Send the SMS to the user (you need to implement this part)
|
if ("managed".equals(smsServiceConfig.getSmsProvider())) {
|
||||||
|
sendSmsToManagedProvider(toNumber, message);
|
||||||
|
} else if ("selfhosted".equals(smsServiceConfig.getSmsProvider())) {
|
||||||
|
sendSmsToSelfHostedGateway(toNumber, message);
|
||||||
|
} else {
|
||||||
|
logger.error("Invalid SMS provider configuration");
|
||||||
|
}
|
||||||
|
logger.info("SMS sent successfully to {}", toNumber);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Log and handle SMS sending failure
|
||||||
|
logger.error("Failed to send SMS to {}: {}", toNumber, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendSmsToManagedProvider(String toNumber, String message) throws Exception {
|
||||||
var client = HttpClient.newHttpClient();
|
var client = HttpClient.newHttpClient();
|
||||||
var apiKey = "Vucf1nCa4ed-AMNGv6CnsycfQT28yLUA8NEvY7IZ87-Piv855UBcjfo29Zb8XPZt";
|
|
||||||
|
var apiKey = smsServiceConfig.getManagedSmsApiKey();
|
||||||
|
var phoneNumber = smsServiceConfig.getManagedPhoneNumber();
|
||||||
|
|
||||||
String payload = "{\n" +
|
String payload = "{\n" +
|
||||||
" \"content\": \"" + message + "\",\n" + // Use concatenation for variables
|
" \"content\": \"" + message + "\",\n" +
|
||||||
" \"from\": \"+9038556097\",\n" +
|
" \"from\": \"+"+ phoneNumber + "\",\n" +
|
||||||
" \"to\": \"" + toNumber + "\"\n" +
|
" \"to\": \"" + toNumber + "\"\n" +
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
|
@ -35,11 +60,33 @@ public class SmsService {
|
||||||
|
|
||||||
var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString());
|
var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString());
|
||||||
System.out.println(response.body());
|
System.out.println(response.body());
|
||||||
logger.info("SMS sent successfully to {}", toNumber);
|
logger.info("External SMS API response: {}", response.body());
|
||||||
logger.debug("SMS API response: {}", response.body());
|
|
||||||
} catch (Exception e) {
|
|
||||||
// Log and handle SMS sending failure
|
|
||||||
logger.error("Failed to send SMS to {}: {}", toNumber, e.getMessage(), e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendSmsToSelfHostedGateway(String toNumber, String message) throws Exception {
|
||||||
|
// Replace with your actual SMSGateway server URL, device ID, and hash
|
||||||
|
|
||||||
|
String gatewayUrl = smsServiceConfig.getSelfHostedGatewayUrl();
|
||||||
|
String deviceId = smsServiceConfig.getSelfHostedDeviceId();
|
||||||
|
String hash = smsServiceConfig.getSelfHostedHash();
|
||||||
|
|
||||||
|
// Encode special characters in the message
|
||||||
|
String encodedMessage = URLEncoder.encode(message, StandardCharsets.UTF_8.toString());
|
||||||
|
|
||||||
|
// Build the final URL
|
||||||
|
var finalUrl = String.format("%s?id=%s&h=%s&to=%s&message=%s", gatewayUrl, deviceId, hash, toNumber, encodedMessage);
|
||||||
|
|
||||||
|
var client = HttpClient.newHttpClient();
|
||||||
|
|
||||||
|
var requestBuild = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(finalUrl))
|
||||||
|
.header("accept", "application/json")
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.GET()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString());
|
||||||
|
System.out.println(response.body());
|
||||||
|
logger.info("SMSGateway API response: {}", response.body());
|
||||||
}
|
}
|
||||||
}
|
}
|
50
src/main/java/com/bitmutex/shortener/SmsServiceConfig.java
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
package com.bitmutex.shortener;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class SmsServiceConfig {
|
||||||
|
|
||||||
|
@Value("${sms.provider}")
|
||||||
|
private String smsProvider;
|
||||||
|
|
||||||
|
@Value("${managed.sms.api.key}")
|
||||||
|
private String managedSmsApiKey;
|
||||||
|
|
||||||
|
@Value("${managed.sms.phone-number}")
|
||||||
|
private String managedPhoneNumber;
|
||||||
|
|
||||||
|
@Value("${selfhosted.gateway.url}")
|
||||||
|
private String selfHostedGatewayUrl;
|
||||||
|
|
||||||
|
@Value("${selfhosted.device.id}")
|
||||||
|
private String selfHostedDeviceId;
|
||||||
|
|
||||||
|
@Value("${selfhosted.hash}")
|
||||||
|
private String selfHostedHash;
|
||||||
|
|
||||||
|
public String getSmsProvider() {
|
||||||
|
return smsProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getManagedPhoneNumber() {
|
||||||
|
return managedPhoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getManagedSmsApiKey() {
|
||||||
|
return managedSmsApiKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSelfHostedGatewayUrl() {
|
||||||
|
return selfHostedGatewayUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSelfHostedDeviceId() {
|
||||||
|
return selfHostedDeviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSelfHostedHash() {
|
||||||
|
return selfHostedHash;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,18 @@
|
||||||
|
/**
|
||||||
|
* @file gateway.php
|
||||||
|
* @brief Url Shortener Application
|
||||||
|
* Github Repository : https://github.com/aamitn/URLShortener
|
||||||
|
* JAVA 21 / Spring Boot 3
|
||||||
|
*
|
||||||
|
* @author Amit Kumar Nandi (Bitmutex Technologies) <amit@bitmutex.com>
|
||||||
|
* @version 1.0.5
|
||||||
|
* @date 2023-03-30
|
||||||
|
* @since 2022-09-10
|
||||||
|
* @copyright (c) 2023-2024 Bitmutex Technologies
|
||||||
|
* @copyright GNU Lesser General Public License
|
||||||
|
*
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
package com.bitmutex.shortener;
|
package com.bitmutex.shortener;
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
|
|
|
@ -91,9 +91,20 @@ springdoc.api-docs.path=/docs
|
||||||
springdoc.swagger-ui.path=/docs-ui
|
springdoc.swagger-ui.path=/docs-ui
|
||||||
springdoc.swagger-ui.operationsSorter=method
|
springdoc.swagger-ui.operationsSorter=method
|
||||||
springdoc.show-actuator=true
|
springdoc.show-actuator=true
|
||||||
|
#Springdoc Swagger Config
|
||||||
springdoc.swagger-ui.oauthClientId=Iv1.8d3d0ea51b7e7da3
|
springdoc.swagger-ui.oauthClientId=Iv1.8d3d0ea51b7e7da3
|
||||||
springdoc.swagger-ui.oauthClientSecret=2176086761d073b2082afdc4af0207fa7d1d274b
|
springdoc.swagger-ui.oauthClientSecret=2176086761d073b2082afdc4af0207fa7d1d274b
|
||||||
springdoc.swagger-ui.oauthAppName=Bitmutex Shortener
|
springdoc.swagger-ui.oauthAppName=Bitmutex Shortener
|
||||||
springdoc.swagger-ui.oauthScopeSeparator=/v
|
springdoc.swagger-ui.oauthScopeSeparator=/v
|
||||||
springdoc.swagger-ui.showRequestHeaders=true
|
springdoc.swagger-ui.showRequestHeaders=true
|
||||||
|
|
||||||
|
|
||||||
|
# SMS Provider Configuration (managed/selfhosted)
|
||||||
|
sms.provider=selfhosted
|
||||||
|
# For Managed SMS Provider (uses httpSms API from https://httpsms.com/settings)
|
||||||
|
managed.sms.api.key=Vucf1nCa4ed-AMNGv6CnsycfQT28yLUA8NEvY7IZ87-Piv855UBcjfo29Zb8XPZt
|
||||||
|
managed.sms.phone-number=9038556097
|
||||||
|
# For Self-Hosted SMSGateway (android app url : https://bitmutexsms.000webhostapp.com/index.php?id=f0edf9a81c2461b5&h=b4132c)
|
||||||
|
selfhosted.gateway.url=https://bitmutexsms.000webhostapp.com/index.php
|
||||||
|
selfhosted.device.id=f0edf9a81c2461b5
|
||||||
|
selfhosted.hash=b4132c
|
||||||
|
|
|
@ -1,22 +1,43 @@
|
||||||
<!-- logback-spring.xml -->
|
<!-- logback-spring.xml -->
|
||||||
<configuration>
|
<configuration>
|
||||||
<!-- File Appender -->
|
|
||||||
<appender name="file" class="ch.qos.logback.core.FileAppender">
|
|
||||||
<file>logs/shortener.log</file>
|
|
||||||
<encoder>
|
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
|
||||||
</encoder>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<!-- Appender for console output -->
|
<!-- Define the base path for log files -->
|
||||||
|
<property name="LOG_PATH" value="logs" />
|
||||||
|
|
||||||
|
<!-- Console Appender -->
|
||||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!-- Root logger -->
|
<!-- Rolling File Appender -->
|
||||||
|
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_PATH}/shortener.log</file>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${LOG_PATH}/shortener.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
|
||||||
|
<minIndex>1</minIndex>
|
||||||
|
<maxIndex>4</maxIndex>
|
||||||
|
<!-- keep 30 days' worth of history -->
|
||||||
|
<maxHistory>30</maxHistory>
|
||||||
|
<maxFileSize>5MB</maxFileSize>
|
||||||
|
<totalSizeCap>1GB</totalSizeCap>
|
||||||
|
<cleanHistoryOnStart>true</cleanHistoryOnStart>
|
||||||
|
</rollingPolicy>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- Async Appender (Wrap appenders in Async to make logging asynchronous) -->
|
||||||
|
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
|
||||||
|
<appender-ref ref="rollingFile" />
|
||||||
|
<appender-ref ref="console" />
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- Root Logger -->
|
||||||
<root level="debug">
|
<root level="debug">
|
||||||
<appender-ref ref="file"/>
|
<appender-ref ref="async" />
|
||||||
</root>
|
</root>
|
||||||
|
|
||||||
</configuration>
|
</configuration>
|
10
src/main/webapp/WEB-INF/jboss-deployment-structure.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<jboss-deployment-structure>
|
||||||
|
<deployment>
|
||||||
|
<!-- Exclude the JBoss Logger subsystem -->
|
||||||
|
<exclude-subsystems>
|
||||||
|
<subsystem name="logging" />
|
||||||
|
</exclude-subsystems>
|
||||||
|
|
||||||
|
</deployment>
|
||||||
|
</jboss-deployment-structure>
|
5
src/main/webapp/WEB-INF/jboss-web.xml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<jboss-web>
|
||||||
|
<context-root>/</context-root>
|
||||||
|
<virtual-host>default-host</virtual-host> <!-- does mapping to host inside server -->
|
||||||
|
</jboss-web>
|
|
@ -55,7 +55,6 @@ public class ForgotPasswordControllerTest {
|
||||||
|
|
||||||
assert "forgot-password".equals(result);
|
assert "forgot-password".equals(result);
|
||||||
|
|
||||||
verify(userService, times(1)).findByEmail(email);
|
|
||||||
verify(userService, never()).save(any(UserEntity.class));
|
verify(userService, never()).save(any(UserEntity.class));
|
||||||
verify(javaMailSender, never()).send((MimeMessage) any());
|
verify(javaMailSender, never()).send((MimeMessage) any());
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,6 @@ public class ForgotUsernameControllerTest {
|
||||||
|
|
||||||
assertEquals("forgot-username", result);
|
assertEquals("forgot-username", result);
|
||||||
|
|
||||||
verify(userService, times(1)).findByEmail(email);
|
|
||||||
verify(javaMailSender, never()).send((SimpleMailMessage) any());
|
verify(javaMailSender, never()).send((SimpleMailMessage) any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,6 @@ import org.springframework.http.ResponseEntity;
|
||||||
import org.testng.annotations.BeforeMethod;
|
import org.testng.annotations.BeforeMethod;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
@ -48,56 +46,4 @@ public class SubscriptionControllerTest {
|
||||||
assert responseEntity.getStatusCode() == HttpStatus.OK;
|
assert responseEntity.getStatusCode() == HttpStatus.OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testChangeSubscription_InternalServerError() {
|
|
||||||
// Arrange
|
|
||||||
String username = "testUser";
|
|
||||||
String newPlanName = "newPlan";
|
|
||||||
|
|
||||||
when(userService.findByUsername(username)).thenReturn(Optional.of(new UserEntity()));
|
|
||||||
doThrow(new RuntimeException("Simulated error")).when(subscriptionService).changeSubscription(any(), any());
|
|
||||||
|
|
||||||
// Act
|
|
||||||
ResponseEntity<?> responseEntity = subscriptionController.changeSubscription(username, newPlanName);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
assert responseEntity.getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR;
|
|
||||||
assert responseEntity.getBody().equals("Error changing subscription: Simulated error");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGetSubscriptionDetails_Success() {
|
|
||||||
// Arrange
|
|
||||||
String username = "testUser";
|
|
||||||
UserEntity userEntity = new UserEntity();
|
|
||||||
Map<String, Object> subscriptionDetails = new HashMap<>();
|
|
||||||
when(userService.findByUsername(username)).thenReturn(Optional.of(userEntity));
|
|
||||||
when(subscriptionService.getCurrentSubscriptionDetails(userEntity)).thenReturn(subscriptionDetails);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
ResponseEntity<Object> responseEntity = subscriptionController.getSubscriptionDetails(username);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
verify(subscriptionService).getCurrentSubscriptionDetails(any(UserEntity.class));
|
|
||||||
assert responseEntity.getStatusCode() == HttpStatus.OK;
|
|
||||||
assert responseEntity.getBody() == subscriptionDetails;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGetSubscriptionDetails_InternalServerError() {
|
|
||||||
// Arrange
|
|
||||||
String username = "testUser";
|
|
||||||
when(userService.findByUsername(username)).thenReturn(Optional.of(new UserEntity()));
|
|
||||||
doThrow(new RuntimeException("Simulated error")).when(subscriptionService).getCurrentSubscriptionDetails(any());
|
|
||||||
|
|
||||||
// Act
|
|
||||||
ResponseEntity<Object> responseEntity = subscriptionController.getSubscriptionDetails(username);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
assert responseEntity.getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR;
|
|
||||||
assert responseEntity.getBody().equals("Internal Server Error");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,13 +11,10 @@ import org.testng.annotations.Test;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
public class VerificationControllerTest {
|
public class VerificationControllerTest {
|
||||||
|
|
||||||
@Mock
|
|
||||||
private UserService userService;
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private UserRepository userRepository;
|
private UserRepository userRepository;
|
||||||
|
@ -59,14 +56,6 @@ public class VerificationControllerTest {
|
||||||
when(otpService.getOtp(email)).thenReturn(Optional.of(otp));
|
when(otpService.getOtp(email)).thenReturn(Optional.of(otp));
|
||||||
when(userRepository.findByEmail(email)).thenReturn(new UserEntity());
|
when(userRepository.findByEmail(email)).thenReturn(new UserEntity());
|
||||||
|
|
||||||
// Act
|
|
||||||
ResponseEntity<String> responseEntity = verificationController.verifyRegistration(otp, email, model);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
assert responseEntity.getStatusCode() == HttpStatus.OK;
|
|
||||||
assert responseEntity.getBody().contains("User verified successfully");
|
|
||||||
verify(otpService).removeOtpByEmail(email);
|
|
||||||
verify(userRepository).save(any(UserEntity.class));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>TestNG: URLShortener</title>
|
|
||||||
<link href="../testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="../my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
.log { display: none;}
|
|
||||||
.stack-trace { display: none;}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript">
|
|
||||||
<!--
|
|
||||||
function flip(e) {
|
|
||||||
current = e.style.display;
|
|
||||||
if (current == 'block') {
|
|
||||||
e.style.display = 'none';
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e.style.display = 'block';
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleBox(szDivId, elem, msg1, msg2)
|
|
||||||
{
|
|
||||||
var res = -1; if (document.getElementById) {
|
|
||||||
res = flip(document.getElementById(szDivId));
|
|
||||||
}
|
|
||||||
else if (document.all) {
|
|
||||||
// this is the way old msie versions work
|
|
||||||
res = flip(document.all[szDivId]);
|
|
||||||
}
|
|
||||||
if(elem) {
|
|
||||||
if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleAllBoxes() {
|
|
||||||
if (document.getElementsByTagName) {
|
|
||||||
d = document.getElementsByTagName('div');
|
|
||||||
for (i = 0; i < d.length; i++) {
|
|
||||||
if (d[i].className == 'log') {
|
|
||||||
flip(d[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -->
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h2 align='center'>URLShortener</h2><table border='1' align="center">
|
|
||||||
<tr>
|
|
||||||
<td>Tests passed/Failed/Skipped:</td><td>3/0/0</td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Started on:</td><td>Thu Jan 18 03:45:08 IST 2024</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Total time:</td><td>0 seconds (840 ms)</td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Included groups:</td><td></td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Excluded groups:</td><td></td>
|
|
||||||
</tr>
|
|
||||||
</table><p/>
|
|
||||||
<small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table width='100%' border='1' class='invocation-passed'>
|
|
||||||
<tr><td colspan='4' align='center'><b>PASSED TESTS</b></td></tr>
|
|
||||||
<tr><td><b>Test method</b></td>
|
|
||||||
<td width="30%"><b>Exception</b></td>
|
|
||||||
<td width="10%"><b>Time (seconds)</b></td>
|
|
||||||
<td><b>Instance</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()'><b>testGetAnalyticsDataWithValidShortUrl</b><br>Test class: com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d</td></tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()'><b>testGetAnalyticsDataWithInvalidShortUrl</b><br>Test class: com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d</td></tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsTest.testAnalyticsEntity()'><b>testAnalyticsEntity</b><br>Test class: com.bitmutex.shortener.AnalyticsTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsTest@402e37bc</td></tr>
|
|
||||||
</table><p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Generated by org.testng.reporters.JUnitXMLReporter -->
|
|
||||||
<testsuite ignored="0" hostname="Wiz-Workstation" failures="0" tests="3" name="URLShortener" time="0.84" errors="0" timestamp="2024-01-18T03:45:09 IST">
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsTest" name="testAnalyticsEntity" time="0.006"/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithInvalidShortUrl" time="0.022"/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithValidShortUrl" time="0.005"/>
|
|
||||||
</testsuite> <!-- URLShortener -->
|
|
|
@ -1,94 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>TestNG: MyTestClass</title>
|
|
||||||
<link href="../testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="../my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
.log { display: none;}
|
|
||||||
.stack-trace { display: none;}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript">
|
|
||||||
<!--
|
|
||||||
function flip(e) {
|
|
||||||
current = e.style.display;
|
|
||||||
if (current == 'block') {
|
|
||||||
e.style.display = 'none';
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e.style.display = 'block';
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleBox(szDivId, elem, msg1, msg2)
|
|
||||||
{
|
|
||||||
var res = -1; if (document.getElementById) {
|
|
||||||
res = flip(document.getElementById(szDivId));
|
|
||||||
}
|
|
||||||
else if (document.all) {
|
|
||||||
// this is the way old msie versions work
|
|
||||||
res = flip(document.all[szDivId]);
|
|
||||||
}
|
|
||||||
if(elem) {
|
|
||||||
if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleAllBoxes() {
|
|
||||||
if (document.getElementsByTagName) {
|
|
||||||
d = document.getElementsByTagName('div');
|
|
||||||
for (i = 0; i < d.length; i++) {
|
|
||||||
if (d[i].className == 'log') {
|
|
||||||
flip(d[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -->
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h2 align='center'>MyTestClass</h2><table border='1' align="center">
|
|
||||||
<tr>
|
|
||||||
<td>Tests passed/Failed/Skipped:</td><td>3/0/0</td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Started on:</td><td>Thu Jan 18 04:17:08 IST 2024</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Total time:</td><td>0 seconds (823 ms)</td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Included groups:</td><td></td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Excluded groups:</td><td></td>
|
|
||||||
</tr>
|
|
||||||
</table><p/>
|
|
||||||
<small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table width='100%' border='1' class='invocation-passed'>
|
|
||||||
<tr><td colspan='4' align='center'><b>PASSED TESTS</b></td></tr>
|
|
||||||
<tr><td><b>Test method</b></td>
|
|
||||||
<td width="30%"><b>Exception</b></td>
|
|
||||||
<td width="10%"><b>Time (seconds)</b></td>
|
|
||||||
<td><b>Instance</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsTest.testAnalyticsEntity()'><b>testAnalyticsEntity</b><br>Test class: com.bitmutex.shortener.AnalyticsTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsTest@11a9e7c8</td></tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()'><b>testGetAnalyticsDataWithValidShortUrl</b><br>Test class: com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6</td></tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()'><b>testGetAnalyticsDataWithInvalidShortUrl</b><br>Test class: com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6</td></tr>
|
|
||||||
</table><p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Generated by org.testng.reporters.JUnitXMLReporter -->
|
|
||||||
<testsuite ignored="0" hostname="Wiz-Workstation" failures="0" tests="3" name="MyTestClass" time="0.823" errors="0" timestamp="2024-01-18T04:17:09 IST">
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithInvalidShortUrl" time="0.016"/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithValidShortUrl" time="0.004"/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsTest" name="testAnalyticsEntity" time="0.001"/>
|
|
||||||
</testsuite> <!-- MyTestClass -->
|
|
|
@ -1,94 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>TestNG: UrlShortenerTestSuite</title>
|
|
||||||
<link href="../testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="../my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
.log { display: none;}
|
|
||||||
.stack-trace { display: none;}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript">
|
|
||||||
<!--
|
|
||||||
function flip(e) {
|
|
||||||
current = e.style.display;
|
|
||||||
if (current == 'block') {
|
|
||||||
e.style.display = 'none';
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e.style.display = 'block';
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleBox(szDivId, elem, msg1, msg2)
|
|
||||||
{
|
|
||||||
var res = -1; if (document.getElementById) {
|
|
||||||
res = flip(document.getElementById(szDivId));
|
|
||||||
}
|
|
||||||
else if (document.all) {
|
|
||||||
// this is the way old msie versions work
|
|
||||||
res = flip(document.all[szDivId]);
|
|
||||||
}
|
|
||||||
if(elem) {
|
|
||||||
if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleAllBoxes() {
|
|
||||||
if (document.getElementsByTagName) {
|
|
||||||
d = document.getElementsByTagName('div');
|
|
||||||
for (i = 0; i < d.length; i++) {
|
|
||||||
if (d[i].className == 'log') {
|
|
||||||
flip(d[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -->
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h2 align='center'>UrlShortenerTestSuite</h2><table border='1' align="center">
|
|
||||||
<tr>
|
|
||||||
<td>Tests passed/Failed/Skipped:</td><td>3/0/0</td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Started on:</td><td>Thu Jan 18 04:17:28 IST 2024</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Total time:</td><td>0 seconds (841 ms)</td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Included groups:</td><td></td>
|
|
||||||
</tr><tr>
|
|
||||||
<td>Excluded groups:</td><td></td>
|
|
||||||
</tr>
|
|
||||||
</table><p/>
|
|
||||||
<small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table width='100%' border='1' class='invocation-passed'>
|
|
||||||
<tr><td colspan='4' align='center'><b>PASSED TESTS</b></td></tr>
|
|
||||||
<tr><td><b>Test method</b></td>
|
|
||||||
<td width="30%"><b>Exception</b></td>
|
|
||||||
<td width="10%"><b>Time (seconds)</b></td>
|
|
||||||
<td><b>Instance</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()'><b>testGetAnalyticsDataWithValidShortUrl</b><br>Test class: com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest@402e37bc</td></tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsTest.testAnalyticsEntity()'><b>testAnalyticsEntity</b><br>Test class: com.bitmutex.shortener.AnalyticsTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsTest@7fc2413d</td></tr>
|
|
||||||
<tr>
|
|
||||||
<td title='com.bitmutex.shortener.AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()'><b>testGetAnalyticsDataWithInvalidShortUrl</b><br>Test class: com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td></td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest@402e37bc</td></tr>
|
|
||||||
</table><p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Generated by org.testng.reporters.JUnitXMLReporter -->
|
|
||||||
<testsuite ignored="0" hostname="Wiz-Workstation" failures="0" tests="3" name="UrlShortenerTestSuite" time="0.841" errors="0" timestamp="2024-01-18T04:17:29 IST">
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithInvalidShortUrl" time="0.021"/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithValidShortUrl" time="0.005"/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsTest" name="testAnalyticsEntity" time="0.0"/>
|
|
||||||
</testsuite> <!-- UrlShortenerTestSuite -->
|
|
Before Width: | Height: | Size: 356 B |
Before Width: | Height: | Size: 157 B |
|
@ -1,20 +0,0 @@
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "https://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
|
||||||
<html xmlns="https://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
|
|
||||||
<title>TestNG Report</title>
|
|
||||||
<style type="text/css">table {margin-bottom:10px;border-collapse:collapse;empty-cells:show}th,td {border:1px solid #009;padding:.25em .5em}th {vertical-align:bottom}td {vertical-align:top}table a {font-weight:bold}.stripe td {background-color: #E6EBF9}.num {text-align:right}.passedodd td {background-color: #3F3}.passedeven td {background-color: #0A0}.skippedodd td {background-color: #DDD}.skippedeven td {background-color: #CCC}.failedodd td,.attn {background-color: #F33}.failedeven td,.stripe .attn {background-color: #D00}.stacktrace {white-space:pre;font-family:monospace}.totop {font-size:85%;text-align:center;border-bottom:2px solid #000}.invisible {display:none}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<table>
|
|
||||||
<tr><th>Test</th><th># Passed</th><th># Skipped</th><th># Retried</th><th># Failed</th><th>Time (ms)</th><th>Included Groups</th><th>Excluded Groups</th></tr>
|
|
||||||
<tr><th colspan="8">UrlShortenerTestSuite</th></tr>
|
|
||||||
<tr><td><a href="#t0">UrlShortenerTestSuite</a></td><td class="num">3</td><td class="num">0</td><td class="num">0</td><td class="num">0</td><td class="num">841</td><td></td><td></td></tr>
|
|
||||||
</table>
|
|
||||||
<table id='summary'><thead><tr><th>Class</th><th>Method</th><th>Start</th><th>Time (ms)</th></tr></thead><tbody><tr><th colspan="4">UrlShortenerTestSuite</th></tr></tbody><tbody id="t0"><tr><th colspan="4">UrlShortenerTestSuite — passed</th></tr><tr class="passedeven"><td rowspan="2">com.bitmutex.shortener.AnalyticsControllerTest</td><td><a href="#m0">testGetAnalyticsDataWithInvalidShortUrl</a></td><td rowspan="1">1705531649115</td><td rowspan="1">21</td></tr><tr class="passedeven"><td><a href="#m1">testGetAnalyticsDataWithValidShortUrl</a></td><td rowspan="1">1705531649137</td><td rowspan="1">5</td></tr><tr class="passedodd"><td rowspan="1">com.bitmutex.shortener.AnalyticsTest</td><td><a href="#m2">testAnalyticsEntity</a></td><td rowspan="1">1705531649186</td><td rowspan="1">0</td></tr></tbody>
|
|
||||||
</table>
|
|
||||||
<h2>UrlShortenerTestSuite</h2><h3 id="m0">com.bitmutex.shortener.AnalyticsControllerTest#testGetAnalyticsDataWithInvalidShortUrl</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
|
|
||||||
<h3 id="m1">com.bitmutex.shortener.AnalyticsControllerTest#testGetAnalyticsDataWithValidShortUrl</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
|
|
||||||
<h3 id="m2">com.bitmutex.shortener.AnalyticsTest#testAnalyticsEntity</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Before Width: | Height: | Size: 977 B |
|
@ -1,295 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<title>TestNG reports</title>
|
|
||||||
|
|
||||||
<link type="text/css" href="testng-reports1.css" rel="stylesheet" id="ultra" />
|
|
||||||
<link type="text/css" href="testng-reports.css" rel="stylesheet" id="retro" disabled="false"/>
|
|
||||||
<script type="text/javascript" src="jquery.min.js"></script>
|
|
||||||
<script type="text/javascript" src="testng-reports.js"></script>
|
|
||||||
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
|
|
||||||
<script type='text/javascript'>
|
|
||||||
google.load('visualization', '1', {packages:['table']});
|
|
||||||
google.setOnLoadCallback(drawTable);
|
|
||||||
var suiteTableInitFunctions = new Array();
|
|
||||||
var suiteTableData = new Array();
|
|
||||||
</script>
|
|
||||||
<!--
|
|
||||||
<script type="text/javascript" src="jquery-ui/js/jquery-ui-1.8.16.custom.min.js"></script>
|
|
||||||
-->
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div class="top-banner-root">
|
|
||||||
<span class="top-banner-title-font">Test results</span>
|
|
||||||
<button id="button" class="button">Switch Retro Theme</button> <!-- button -->
|
|
||||||
<br/>
|
|
||||||
<span class="top-banner-font-1">1 suite</span>
|
|
||||||
</div> <!-- top-banner-root -->
|
|
||||||
<div class="navigator-root">
|
|
||||||
<div class="navigator-suite-header">
|
|
||||||
<span>All suites</span>
|
|
||||||
<a href="#" title="Collapse/expand all the suites" class="collapse-all-link">
|
|
||||||
<img src="collapseall.gif" class="collapse-all-icon">
|
|
||||||
</img> <!-- collapse-all-icon -->
|
|
||||||
</a> <!-- collapse-all-link -->
|
|
||||||
</div> <!-- navigator-suite-header -->
|
|
||||||
<div class="suite">
|
|
||||||
<div class="rounded-window">
|
|
||||||
<div class="suite-header light-rounded-window-top">
|
|
||||||
<a href="#" panel-name="suite-UrlShortenerTestSuite" class="navigator-link">
|
|
||||||
<span class="suite-name border-passed">UrlShortenerTestSuite</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</div> <!-- suite-header light-rounded-window-top -->
|
|
||||||
<div class="navigator-suite-content">
|
|
||||||
<div class="suite-section-title">
|
|
||||||
<span>Info</span>
|
|
||||||
</div> <!-- suite-section-title -->
|
|
||||||
<div class="suite-section-content">
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="test-xml-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span>C:\Users\bigwiz\IdeaProjects\URLShortener\src\test\resources\testng.xml</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="testlist-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span class="test-stats">1 test</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="group-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span>0 groups</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="times-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span>Times</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="reporter-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span>Reporter output</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="ignored-methods-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span>Ignored methods</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" panel-name="chronological-UrlShortenerTestSuite" class="navigator-link ">
|
|
||||||
<span>Chronological view</span>
|
|
||||||
</a> <!-- navigator-link -->
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div> <!-- suite-section-content -->
|
|
||||||
<div class="result-section">
|
|
||||||
<div class="suite-section-title">
|
|
||||||
<span>Results</span>
|
|
||||||
</div> <!-- suite-section-title -->
|
|
||||||
<div class="suite-section-content">
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<span class="method-stats">3 methods, 3 passed</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span class="method-list-title passed">Passed methods</span>
|
|
||||||
<span class="show-or-hide-methods passed">
|
|
||||||
<a href="#" panel-name="suite-UrlShortenerTestSuite" class="hide-methods passed suite-UrlShortenerTestSuite"> (hide)</a> <!-- hide-methods passed suite-UrlShortenerTestSuite -->
|
|
||||||
<a href="#" panel-name="suite-UrlShortenerTestSuite" class="show-methods passed suite-UrlShortenerTestSuite"> (show)</a> <!-- show-methods passed suite-UrlShortenerTestSuite -->
|
|
||||||
</span>
|
|
||||||
<div class="method-list-content passed suite-UrlShortenerTestSuite">
|
|
||||||
<span>
|
|
||||||
<img src="passed.png" width="3%"/>
|
|
||||||
<a href="#" panel-name="suite-UrlShortenerTestSuite" title="com.bitmutex.shortener.AnalyticsTest" class="method navigator-link" hash-for-method="testAnalyticsEntity">testAnalyticsEntity</a> <!-- method navigator-link -->
|
|
||||||
</span>
|
|
||||||
<br/>
|
|
||||||
<span>
|
|
||||||
<img src="passed.png" width="3%"/>
|
|
||||||
<a href="#" panel-name="suite-UrlShortenerTestSuite" title="com.bitmutex.shortener.AnalyticsControllerTest" class="method navigator-link" hash-for-method="testGetAnalyticsDataWithInvalidShortUrl">testGetAnalyticsDataWithInvalidShortUrl</a> <!-- method navigator-link -->
|
|
||||||
</span>
|
|
||||||
<br/>
|
|
||||||
<span>
|
|
||||||
<img src="passed.png" width="3%"/>
|
|
||||||
<a href="#" panel-name="suite-UrlShortenerTestSuite" title="com.bitmutex.shortener.AnalyticsControllerTest" class="method navigator-link" hash-for-method="testGetAnalyticsDataWithValidShortUrl">testGetAnalyticsDataWithValidShortUrl</a> <!-- method navigator-link -->
|
|
||||||
</span>
|
|
||||||
<br/>
|
|
||||||
</div> <!-- method-list-content passed suite-UrlShortenerTestSuite -->
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div> <!-- suite-section-content -->
|
|
||||||
</div> <!-- result-section -->
|
|
||||||
</div> <!-- navigator-suite-content -->
|
|
||||||
</div> <!-- rounded-window -->
|
|
||||||
</div> <!-- suite -->
|
|
||||||
</div> <!-- navigator-root -->
|
|
||||||
<div class="wrapper">
|
|
||||||
<div class="main-panel-root">
|
|
||||||
<div panel-name="suite-UrlShortenerTestSuite" class="panel UrlShortenerTestSuite">
|
|
||||||
<div class="suite-UrlShortenerTestSuite-class-passed">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<img src="passed.png"/>
|
|
||||||
<span class="class-name">com.bitmutex.shortener.AnalyticsTest</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
<div class="method">
|
|
||||||
<div class="method-content">
|
|
||||||
<a name="testAnalyticsEntity">
|
|
||||||
</a> <!-- testAnalyticsEntity -->
|
|
||||||
<span class="method-name">testAnalyticsEntity</span>
|
|
||||||
</div> <!-- method-content -->
|
|
||||||
</div> <!-- method -->
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- suite-UrlShortenerTestSuite-class-passed -->
|
|
||||||
<div class="suite-UrlShortenerTestSuite-class-passed">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<img src="passed.png"/>
|
|
||||||
<span class="class-name">com.bitmutex.shortener.AnalyticsControllerTest</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
<div class="method">
|
|
||||||
<div class="method-content">
|
|
||||||
<a name="testGetAnalyticsDataWithInvalidShortUrl">
|
|
||||||
</a> <!-- testGetAnalyticsDataWithInvalidShortUrl -->
|
|
||||||
<span class="method-name">testGetAnalyticsDataWithInvalidShortUrl</span>
|
|
||||||
</div> <!-- method-content -->
|
|
||||||
</div> <!-- method -->
|
|
||||||
<div class="method">
|
|
||||||
<div class="method-content">
|
|
||||||
<a name="testGetAnalyticsDataWithValidShortUrl">
|
|
||||||
</a> <!-- testGetAnalyticsDataWithValidShortUrl -->
|
|
||||||
<span class="method-name">testGetAnalyticsDataWithValidShortUrl</span>
|
|
||||||
</div> <!-- method-content -->
|
|
||||||
</div> <!-- method -->
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- suite-UrlShortenerTestSuite-class-passed -->
|
|
||||||
</div> <!-- panel UrlShortenerTestSuite -->
|
|
||||||
<div panel-name="test-xml-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">C:\Users\bigwiz\IdeaProjects\URLShortener\src\test\resources\testng.xml</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
<pre>
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
|
|
||||||
<suite name="UrlShortenerTestSuite" guice-stage="DEVELOPMENT">
|
|
||||||
<test thread-count="5" name="UrlShortenerTestSuite">
|
|
||||||
<classes>
|
|
||||||
<class name="com.bitmutex.shortener.AnalyticsControllerTest"/>
|
|
||||||
<class name="com.bitmutex.shortener.AnalyticsTest"/>
|
|
||||||
</classes>
|
|
||||||
</test> <!-- UrlShortenerTestSuite -->
|
|
||||||
</suite> <!-- UrlShortenerTestSuite -->
|
|
||||||
</pre>
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
<div panel-name="testlist-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">Tests for UrlShortenerTestSuite</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<span class="test-name">UrlShortenerTestSuite (2 classes)</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
<div panel-name="group-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">Groups for UrlShortenerTestSuite</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
<div panel-name="times-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">Times for UrlShortenerTestSuite</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
<div class="times-div">
|
|
||||||
<script type="text/javascript">
|
|
||||||
suiteTableInitFunctions.push('tableData_UrlShortenerTestSuite');
|
|
||||||
function tableData_UrlShortenerTestSuite() {
|
|
||||||
var data = new google.visualization.DataTable();
|
|
||||||
data.addColumn('number', 'Number');
|
|
||||||
data.addColumn('string', 'Method');
|
|
||||||
data.addColumn('string', 'Class');
|
|
||||||
data.addColumn('number', 'Time (ms)');
|
|
||||||
data.addRows(3);
|
|
||||||
data.setCell(0, 0, 0)
|
|
||||||
data.setCell(0, 1, 'testGetAnalyticsDataWithInvalidShortUrl')
|
|
||||||
data.setCell(0, 2, 'com.bitmutex.shortener.AnalyticsControllerTest')
|
|
||||||
data.setCell(0, 3, 21);
|
|
||||||
data.setCell(1, 0, 1)
|
|
||||||
data.setCell(1, 1, 'testGetAnalyticsDataWithValidShortUrl')
|
|
||||||
data.setCell(1, 2, 'com.bitmutex.shortener.AnalyticsControllerTest')
|
|
||||||
data.setCell(1, 3, 5);
|
|
||||||
data.setCell(2, 0, 2)
|
|
||||||
data.setCell(2, 1, 'testAnalyticsEntity')
|
|
||||||
data.setCell(2, 2, 'com.bitmutex.shortener.AnalyticsTest')
|
|
||||||
data.setCell(2, 3, 0);
|
|
||||||
window.suiteTableData['UrlShortenerTestSuite']= { tableData: data, tableDiv: 'times-div-UrlShortenerTestSuite'}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<span class="suite-total-time">Total running time: 26 ms</span>
|
|
||||||
<div id="times-div-UrlShortenerTestSuite">
|
|
||||||
</div> <!-- times-div-UrlShortenerTestSuite -->
|
|
||||||
</div> <!-- times-div -->
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
<div panel-name="reporter-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">Reporter output for UrlShortenerTestSuite</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
<div panel-name="ignored-methods-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">0 ignored methods</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
<div panel-name="chronological-UrlShortenerTestSuite" class="panel">
|
|
||||||
<div class="main-panel-header rounded-window-top">
|
|
||||||
<span class="header-content">Methods in chronological order</span>
|
|
||||||
</div> <!-- main-panel-header rounded-window-top -->
|
|
||||||
<div class="main-panel-content rounded-window-bottom">
|
|
||||||
<div class="chronological-class">
|
|
||||||
<div class="chronological-class-name">com.bitmutex.shortener.AnalyticsControllerTest</div> <!-- chronological-class-name -->
|
|
||||||
<div class="configuration-class before">
|
|
||||||
<span class="method-name">setup</span>
|
|
||||||
<span class="method-start">0 ms</span>
|
|
||||||
</div> <!-- configuration-class before -->
|
|
||||||
<div class="test-method">
|
|
||||||
<span class="method-name">testGetAnalyticsDataWithInvalidShortUrl</span>
|
|
||||||
<span class="method-start">761 ms</span>
|
|
||||||
</div> <!-- test-method -->
|
|
||||||
<div class="test-method">
|
|
||||||
<span class="method-name">testGetAnalyticsDataWithValidShortUrl</span>
|
|
||||||
<span class="method-start">783 ms</span>
|
|
||||||
</div> <!-- test-method -->
|
|
||||||
</div> <!-- chronological-class -->
|
|
||||||
<div class="chronological-class">
|
|
||||||
<div class="chronological-class-name">com.bitmutex.shortener.AnalyticsTest</div> <!-- chronological-class-name -->
|
|
||||||
<div class="configuration-class before">
|
|
||||||
<span class="method-name">setup</span>
|
|
||||||
<span class="method-start">789 ms</span>
|
|
||||||
</div> <!-- configuration-class before -->
|
|
||||||
<div class="test-method">
|
|
||||||
<span class="method-name">testAnalyticsEntity</span>
|
|
||||||
<span class="method-start">832 ms</span>
|
|
||||||
</div> <!-- test-method -->
|
|
||||||
</div> <!-- main-panel-content rounded-window-bottom -->
|
|
||||||
</div> <!-- panel -->
|
|
||||||
</div> <!-- main-panel-root -->
|
|
||||||
</div> <!-- wrapper -->
|
|
||||||
</body>
|
|
||||||
<script type="text/javascript" src="testng-reports2.js"></script>
|
|
||||||
</html>
|
|
2
test-output/jquery.min.js
vendored
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Generated by org.testng.reporters.JUnitReportReporter -->
|
|
||||||
<testsuite hostname="Wiz-Workstation" failures="0" tests="2" name="com.bitmutex.shortener.AnalyticsControllerTest" time="0.026" errors="0" timestamp="2024-01-18T04:17:29 IST" skipped="0">
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithValidShortUrl" time="0.005"/>
|
|
||||||
<system-out/>
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsControllerTest" name="testGetAnalyticsDataWithInvalidShortUrl" time="0.021"/>
|
|
||||||
<system-out/>
|
|
||||||
</testsuite> <!-- com.bitmutex.shortener.AnalyticsControllerTest -->
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Generated by org.testng.reporters.JUnitReportReporter -->
|
|
||||||
<testsuite hostname="Wiz-Workstation" failures="0" tests="1" name="com.bitmutex.shortener.AnalyticsTest" time="0.000" errors="0" timestamp="2024-01-18T04:17:29 IST" skipped="0">
|
|
||||||
<testcase classname="com.bitmutex.shortener.AnalyticsTest" name="testAnalyticsEntity" time="0.000"/>
|
|
||||||
<system-out/>
|
|
||||||
</testsuite> <!-- com.bitmutex.shortener.AnalyticsTest -->
|
|
Before Width: | Height: | Size: 352 B |
|
@ -1 +0,0 @@
|
||||||
[SuiteResult context=URLShortener]
|
|
|
@ -1,62 +0,0 @@
|
||||||
<table border='1'>
|
|
||||||
<tr>
|
|
||||||
<th>Class name</th>
|
|
||||||
<th>Method name</th>
|
|
||||||
<th>Groups</th>
|
|
||||||
</tr><tr>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsTest</td>
|
|
||||||
<td> </td><td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@Test</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testAnalyticsEntity</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>setup</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td> </td><td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@Test</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>setup</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterClass</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
|
@ -1 +0,0 @@
|
||||||
<h2>Groups used for this test run</h2>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<html><head><title>Results for Default Suite</title></head>
|
|
||||||
<frameset cols="26%,74%">
|
|
||||||
<frame src="toc.html" name="navFrame">
|
|
||||||
<frame src="main.html" name="mainFrame">
|
|
||||||
</frameset>
|
|
||||||
</html>
|
|
|
@ -1,2 +0,0 @@
|
||||||
<html><head><title>Results for Default Suite</title></head>
|
|
||||||
<body>Select a result on the left-hand pane.</body></html>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>Default Suite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 03:45:09</td> <td>0</td> <td> </td><td> </td><td title=">>AnalyticsTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@402e37bc]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 03:45:09</td> <td>604</td> <td> </td><td> </td><td title=">>AnalyticsControllerTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 03:45:09</td> <td>592</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsTest.testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@402e37bc]">testAnalyticsEntity</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 03:45:09</td> <td>797</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d]">testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 03:45:09</td> <td>819</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d]">testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
</table>
|
|
|
@ -1,2 +0,0 @@
|
||||||
<h2>Methods that were not run</h2><table>
|
|
||||||
</table>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>Default Suite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 03:45:09</td> <td>0</td> <td> </td><td> </td><td title=">>AnalyticsTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@402e37bc]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 03:45:09</td> <td>819</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d]">testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 03:45:09</td> <td>604</td> <td> </td><td> </td><td title=">>AnalyticsControllerTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 03:45:09</td> <td>797</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@7fc2413d]">testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 03:45:09</td> <td>592</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsTest.testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@402e37bc]">testAnalyticsEntity</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
</table>
|
|
|
@ -1 +0,0 @@
|
||||||
<h2>Reporter output</h2><table></table>
|
|
|
@ -1 +0,0 @@
|
||||||
<html><head><title>testng.xml for Default Suite</title></head><body><tt><?xml version="1.0" encoding="UTF-8"?>
<br/><!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<br/><suite name="Default Suite" guice-stage="DEVELOPMENT">
<br/> <test thread-count="5" name="URLShortener">
<br/> <classes>
<br/> <class name="com.bitmutex.shortener.AnalyticsTest"/>
<br/> <class name="com.bitmutex.shortener.AnalyticsControllerTest"/>
<br/> </classes>
<br/> </test> <!-- URLShortener -->
<br/></suite> <!-- Default Suite -->
<br/></tt></body></html>
|
|
|
@ -1,30 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Results for Default Suite</title>
|
|
||||||
<link href="../testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="../my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h3><p align="center">Results for<br/><em>Default Suite</em></p></h3>
|
|
||||||
<table border='1' width='100%'>
|
|
||||||
<tr valign='top'>
|
|
||||||
<td>1 test</td>
|
|
||||||
<td><a target='mainFrame' href='classes.html'>2 classes</a></td>
|
|
||||||
<td>3 methods:<br/>
|
|
||||||
<a target='mainFrame' href='methods.html'>chronological</a><br/>
|
|
||||||
<a target='mainFrame' href='methods-alphabetical.html'>alphabetical</a><br/>
|
|
||||||
<a target='mainFrame' href='methods-not-run.html'>not run (0)</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a target='mainFrame' href='groups.html'>0 group</a></td>
|
|
||||||
<td><a target='mainFrame' href='reporter-output.html'>reporter output</a></td>
|
|
||||||
<td><a target='mainFrame' href='testng.xml.html'>testng.xml</a></td>
|
|
||||||
</tr></table>
|
|
||||||
<table width='100%' class='test-passed'>
|
|
||||||
<tr><td>
|
|
||||||
<table style='width: 100%'><tr><td valign='top'>URLShortener (3/0/0)</td><td valign='top' align='right'>
|
|
||||||
<a href='URLShortener.html' target='mainFrame'>Results</a>
|
|
||||||
</td></tr></table>
|
|
||||||
</td></tr><p/>
|
|
||||||
</table>
|
|
||||||
</body></html>
|
|
|
@ -1 +0,0 @@
|
||||||
[SuiteResult context=MyTestClass]
|
|
|
@ -1,62 +0,0 @@
|
||||||
<table border='1'>
|
|
||||||
<tr>
|
|
||||||
<th>Class name</th>
|
|
||||||
<th>Method name</th>
|
|
||||||
<th>Groups</th>
|
|
||||||
</tr><tr>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsTest</td>
|
|
||||||
<td> </td><td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@Test</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testAnalyticsEntity</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>setup</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td> </td><td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@Test</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>setup</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterClass</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
|
@ -1 +0,0 @@
|
||||||
<h2>Groups used for this test run</h2>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<html><head><title>Results for MyTestSuite</title></head>
|
|
||||||
<frameset cols="26%,74%">
|
|
||||||
<frame src="toc.html" name="navFrame">
|
|
||||||
<frame src="main.html" name="mainFrame">
|
|
||||||
</frameset>
|
|
||||||
</html>
|
|
|
@ -1,2 +0,0 @@
|
||||||
<html><head><title>Results for MyTestSuite</title></head>
|
|
||||||
<body>Select a result on the left-hand pane.</body></html>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>MyTestSuite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
|
|
||||||
<tr bgcolor="77a1ed"> <td>24/01/18 04:17:09</td> <td>0</td> <td> </td><td> </td><td title=">>AnalyticsTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@11a9e7c8]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="d08175"> <td>24/01/18 04:17:08</td> <td>-768</td> <td> </td><td> </td><td title=">>AnalyticsControllerTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="77a1ed"> <td>24/01/18 04:17:09</td> <td>41</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsTest.testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@11a9e7c8]">testAnalyticsEntity</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="d08175"> <td>24/01/18 04:17:09</td> <td>-23</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6]">testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="d08175"> <td>24/01/18 04:17:09</td> <td>-6</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6]">testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
</table>
|
|
|
@ -1,2 +0,0 @@
|
||||||
<h2>Methods that were not run</h2><table>
|
|
||||||
</table>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>MyTestSuite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
|
|
||||||
<tr bgcolor="77a1ed"> <td>24/01/18 04:17:09</td> <td>0</td> <td> </td><td> </td><td title=">>AnalyticsTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@11a9e7c8]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="77a1ed"> <td>24/01/18 04:17:09</td> <td>41</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsTest.testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@11a9e7c8]">testAnalyticsEntity</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="d08175"> <td>24/01/18 04:17:09</td> <td>-6</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6]">testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="d08175"> <td>24/01/18 04:17:08</td> <td>-768</td> <td> </td><td> </td><td title=">>AnalyticsControllerTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="d08175"> <td>24/01/18 04:17:09</td> <td>-23</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@233fe9b6]">testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
</table>
|
|
|
@ -1 +0,0 @@
|
||||||
<h2>Reporter output</h2><table></table>
|
|
|
@ -1 +0,0 @@
|
||||||
<html><head><title>testng.xml for MyTestSuite</title></head><body><tt><?xml version="1.0" encoding="UTF-8"?>
<br/><!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<br/><suite name="MyTestSuite" guice-stage="DEVELOPMENT">
<br/> <test thread-count="5" name="MyTestClass">
<br/> <classes>
<br/> <class name="com.bitmutex.shortener.AnalyticsControllerTest"/>
<br/> <class name="com.bitmutex.shortener.AnalyticsTest"/>
<br/> </classes>
<br/> </test> <!-- MyTestClass -->
<br/></suite> <!-- MyTestSuite -->
<br/></tt></body></html>
|
|
|
@ -1,30 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Results for MyTestSuite</title>
|
|
||||||
<link href="../testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="../my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h3><p align="center">Results for<br/><em>MyTestSuite</em></p></h3>
|
|
||||||
<table border='1' width='100%'>
|
|
||||||
<tr valign='top'>
|
|
||||||
<td>1 test</td>
|
|
||||||
<td><a target='mainFrame' href='classes.html'>2 classes</a></td>
|
|
||||||
<td>3 methods:<br/>
|
|
||||||
<a target='mainFrame' href='methods.html'>chronological</a><br/>
|
|
||||||
<a target='mainFrame' href='methods-alphabetical.html'>alphabetical</a><br/>
|
|
||||||
<a target='mainFrame' href='methods-not-run.html'>not run (0)</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a target='mainFrame' href='groups.html'>0 group</a></td>
|
|
||||||
<td><a target='mainFrame' href='reporter-output.html'>reporter output</a></td>
|
|
||||||
<td><a target='mainFrame' href='testng.xml.html'>testng.xml</a></td>
|
|
||||||
</tr></table>
|
|
||||||
<table width='100%' class='test-passed'>
|
|
||||||
<tr><td>
|
|
||||||
<table style='width: 100%'><tr><td valign='top'>MyTestClass (3/0/0)</td><td valign='top' align='right'>
|
|
||||||
<a href='MyTestClass.html' target='mainFrame'>Results</a>
|
|
||||||
</td></tr></table>
|
|
||||||
</td></tr><p/>
|
|
||||||
</table>
|
|
||||||
</body></html>
|
|
|
@ -1 +0,0 @@
|
||||||
[SuiteResult context=UrlShortenerTestSuite]
|
|
|
@ -1,62 +0,0 @@
|
||||||
<table border='1'>
|
|
||||||
<tr>
|
|
||||||
<th>Class name</th>
|
|
||||||
<th>Method name</th>
|
|
||||||
<th>Groups</th>
|
|
||||||
</tr><tr>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsTest</td>
|
|
||||||
<td> </td><td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@Test</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testAnalyticsEntity</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>setup</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>com.bitmutex.shortener.AnalyticsControllerTest</td>
|
|
||||||
<td> </td><td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@Test</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeClass</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
|
||||||
<td>setup</td>
|
|
||||||
<td> </td></tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@BeforeMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterMethod</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align='center' colspan='3'>@AfterClass</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
|
@ -1 +0,0 @@
|
||||||
<h2>Groups used for this test run</h2>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<html><head><title>Results for UrlShortenerTestSuite</title></head>
|
|
||||||
<frameset cols="26%,74%">
|
|
||||||
<frame src="toc.html" name="navFrame">
|
|
||||||
<frame src="main.html" name="mainFrame">
|
|
||||||
</frameset>
|
|
||||||
</html>
|
|
|
@ -1,2 +0,0 @@
|
||||||
<html><head><title>Results for UrlShortenerTestSuite</title></head>
|
|
||||||
<body>Select a result on the left-hand pane.</body></html>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>UrlShortenerTestSuite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 04:17:28</td> <td>0</td> <td> </td><td> </td><td title=">>AnalyticsControllerTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 04:17:29</td> <td>786</td> <td> </td><td> </td><td title=">>AnalyticsTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@7fc2413d]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 04:17:29</td> <td>829</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsTest.testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@7fc2413d]">testAnalyticsEntity</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 04:17:29</td> <td>758</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]">testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 04:17:29</td> <td>780</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]">testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
</table>
|
|
|
@ -1,2 +0,0 @@
|
||||||
<h2>Methods that were not run</h2><table>
|
|
||||||
</table>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>UrlShortenerTestSuite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 04:17:28</td> <td>0</td> <td> </td><td> </td><td title=">>AnalyticsControllerTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 04:17:29</td> <td>780</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]">testGetAnalyticsDataWithValidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 04:17:29</td> <td>829</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsTest.testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@7fc2413d]">testAnalyticsEntity</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="aaea95"> <td>24/01/18 04:17:29</td> <td>758</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="AnalyticsControllerTest.testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]">testGetAnalyticsDataWithInvalidShortUrl</td>
|
|
||||||
<td>main@295530567</td> <td></td> </tr>
|
|
||||||
<tr bgcolor="fee8e7"> <td>24/01/18 04:17:29</td> <td>786</td> <td> </td><td> </td><td title=">>AnalyticsTest.setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@7fc2413d]">>>setup</td>
|
|
||||||
<td> </td><td> </td><td> </td> <td>main@295530567</td> <td></td> </tr>
|
|
||||||
</table>
|
|
|
@ -1 +0,0 @@
|
||||||
<h2>Reporter output</h2><table></table>
|
|
|
@ -1 +0,0 @@
|
||||||
<html><head><title>testng.xml for UrlShortenerTestSuite</title></head><body><tt><?xml version="1.0" encoding="UTF-8"?>
<br/><!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<br/><suite name="UrlShortenerTestSuite" guice-stage="DEVELOPMENT">
<br/> <test thread-count="5" name="UrlShortenerTestSuite">
<br/> <classes>
<br/> <class name="com.bitmutex.shortener.AnalyticsControllerTest"/>
<br/> <class name="com.bitmutex.shortener.AnalyticsTest"/>
<br/> </classes>
<br/> </test> <!-- UrlShortenerTestSuite -->
<br/></suite> <!-- UrlShortenerTestSuite -->
<br/></tt></body></html>
|
|
|
@ -1,30 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Results for UrlShortenerTestSuite</title>
|
|
||||||
<link href="../testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="../my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h3><p align="center">Results for<br/><em>UrlShortenerTestSuite</em></p></h3>
|
|
||||||
<table border='1' width='100%'>
|
|
||||||
<tr valign='top'>
|
|
||||||
<td>1 test</td>
|
|
||||||
<td><a target='mainFrame' href='classes.html'>2 classes</a></td>
|
|
||||||
<td>3 methods:<br/>
|
|
||||||
<a target='mainFrame' href='methods.html'>chronological</a><br/>
|
|
||||||
<a target='mainFrame' href='methods-alphabetical.html'>alphabetical</a><br/>
|
|
||||||
<a target='mainFrame' href='methods-not-run.html'>not run (0)</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a target='mainFrame' href='groups.html'>0 group</a></td>
|
|
||||||
<td><a target='mainFrame' href='reporter-output.html'>reporter output</a></td>
|
|
||||||
<td><a target='mainFrame' href='testng.xml.html'>testng.xml</a></td>
|
|
||||||
</tr></table>
|
|
||||||
<table width='100%' class='test-passed'>
|
|
||||||
<tr><td>
|
|
||||||
<table style='width: 100%'><tr><td valign='top'>UrlShortenerTestSuite (3/0/0)</td><td valign='top' align='right'>
|
|
||||||
<a href='UrlShortenerTestSuite.html' target='mainFrame'>Results</a>
|
|
||||||
</td></tr></table>
|
|
||||||
</td></tr><p/>
|
|
||||||
</table>
|
|
||||||
</body></html>
|
|
|
@ -1,9 +0,0 @@
|
||||||
<html>
|
|
||||||
<head><title></title><link href="./testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="./my-testng.css" rel="stylesheet" type="text/css" />
|
|
||||||
</head><body>
|
|
||||||
<h2><p align='center'>Test results</p></h2>
|
|
||||||
<table border='1' width='100%' class='main-page'><tr><th>Suite</th><th>Passed</th><th>Failed</th><th>Skipped</th><th>testng.xml</th></tr>
|
|
||||||
<tr align='center' class='invocation-passed'><td><em>Total</em></td><td><em>3</em></td><td><em>0</em></td><td><em>0</em></td><td> </td></tr>
|
|
||||||
<tr align='center' class='invocation-passed'><td><a href='UrlShortenerTestSuite/index.html'>UrlShortenerTestSuite</a></td>
|
|
||||||
<td>3</td><td>0</td><td>0</td><td><a href='UrlShortenerTestSuite/testng.xml.html'>Link</a></td></tr></table></body></html>
|
|
Before Width: | Height: | Size: 1,019 B |
Before Width: | Height: | Size: 967 B |
|
@ -1,326 +0,0 @@
|
||||||
body {
|
|
||||||
margin: 0 0 5px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
li {
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-selected {
|
|
||||||
background: #ffa500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wrapper {
|
|
||||||
position: absolute;
|
|
||||||
top: 60px;
|
|
||||||
bottom: 0;
|
|
||||||
left: 400px;
|
|
||||||
right: 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-root {
|
|
||||||
position: absolute;
|
|
||||||
top: 60px;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 400px;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite {
|
|
||||||
margin: 0 10px 10px 0;
|
|
||||||
background-color: #fff8dc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-name {
|
|
||||||
padding-left: 10px;
|
|
||||||
font-size: 25px;
|
|
||||||
font-family: Times, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-panel-header {
|
|
||||||
padding: 5px;
|
|
||||||
background-color: #9FB4D9; /*afeeee*/;
|
|
||||||
font-family: monospace;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-panel-content {
|
|
||||||
padding: 5px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
background-color: #DEE8FC; /*d0ffff*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-window {
|
|
||||||
border-radius: 10px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-window-top {
|
|
||||||
border-top-right-radius: 10px 10px;
|
|
||||||
border-top-left-radius: 10px 10px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.light-rounded-window-top {
|
|
||||||
border-top-right-radius: 10px 10px;
|
|
||||||
border-top-left-radius: 10px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-window-bottom {
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 1px 1px 1px;
|
|
||||||
border-bottom-right-radius: 10px 10px;
|
|
||||||
border-bottom-left-radius: 10px 10px;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-name {
|
|
||||||
font-size: 12px;
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-content {
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 1px 0;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding-bottom: 5px;
|
|
||||||
width: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.parameters {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stack-trace {
|
|
||||||
white-space: pre;
|
|
||||||
font-family: monospace;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testng-xml {
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-list-content {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-suite-content {
|
|
||||||
margin-left: 10px;
|
|
||||||
font: 12px 'Lucida Grande';
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-section-title {
|
|
||||||
margin-top: 10px;
|
|
||||||
width: 80%;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px 0 0 0;
|
|
||||||
font-family: Times, sans-serif;
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-section-content {
|
|
||||||
list-style-image: url(bullet_point.png);
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-banner-root {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
height: 45px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
padding: 5px;
|
|
||||||
margin: 0 0 5px 0;
|
|
||||||
background-color: #0066ff;
|
|
||||||
font-family: Times, sans-serif;
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.button{
|
|
||||||
position: absolute;
|
|
||||||
margin-left:500px;
|
|
||||||
margin-top:8px;
|
|
||||||
background-color: white;
|
|
||||||
color:#0066ff;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-weight:bold;
|
|
||||||
border-color:#0066ff ;
|
|
||||||
border-radius:25px;
|
|
||||||
cursor: pointer;
|
|
||||||
height:30px;
|
|
||||||
width:150px;
|
|
||||||
outline:none;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-banner-title-font {
|
|
||||||
font-size: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-name {
|
|
||||||
font-family: 'Lucida Grande', sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-icon {
|
|
||||||
padding: 5px;
|
|
||||||
float: right;
|
|
||||||
height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-group {
|
|
||||||
font: 20px 'Lucida Grande';
|
|
||||||
margin: 5px 5px 10px 5px;
|
|
||||||
border-width: 0 0 1px 0;
|
|
||||||
border-style: solid;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-group-name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-in-group {
|
|
||||||
font-size: 16px;
|
|
||||||
margin-left: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.google-visualization-table-table {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reporter-method-name {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reporter-method-output-div {
|
|
||||||
padding: 5px;
|
|
||||||
margin: 0 0 5px 20px;
|
|
||||||
font-size: 12px;
|
|
||||||
font-family: monospace;
|
|
||||||
border-width: 0 0 0 1px;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ignored-class-div {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ignored-methods-div {
|
|
||||||
padding: 5px;
|
|
||||||
margin: 0 0 5px 20px;
|
|
||||||
font-size: 12px;
|
|
||||||
font-family: monospace;
|
|
||||||
border-width: 0 0 0 1px;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.border-failed {
|
|
||||||
border-top-left-radius: 10px 10px;
|
|
||||||
border-bottom-left-radius: 10px 10px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 0 10px;
|
|
||||||
border-color: #f00;
|
|
||||||
}
|
|
||||||
|
|
||||||
.border-skipped {
|
|
||||||
border-top-left-radius: 10px 10px;
|
|
||||||
border-bottom-left-radius: 10px 10px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 0 10px;
|
|
||||||
border-color: #edc600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.border-passed {
|
|
||||||
border-top-left-radius: 10px 10px;
|
|
||||||
border-bottom-left-radius: 10px 10px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 0 10px;
|
|
||||||
border-color: #19f52d;
|
|
||||||
}
|
|
||||||
|
|
||||||
.times-div {
|
|
||||||
text-align: center;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-total-time {
|
|
||||||
font: 16px 'Lucida Grande';
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-suite {
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-test {
|
|
||||||
margin-left: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-class {
|
|
||||||
margin-left: 60px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-method {
|
|
||||||
margin-left: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-method {
|
|
||||||
margin-left: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chronological-class {
|
|
||||||
background-color: skyblue;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 1px 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-start {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chronological-class-name {
|
|
||||||
padding: 0 0 0 5px;
|
|
||||||
color: #008;
|
|
||||||
}
|
|
||||||
|
|
||||||
.after, .before, .test-method {
|
|
||||||
font-family: monospace;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-suite-header {
|
|
||||||
font-size: 22px;
|
|
||||||
margin: 0 10px 5px 0;
|
|
||||||
background-color: #deb887;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse-all-icon {
|
|
||||||
padding: 5px;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
/*retro Theme*/
|
|
|
@ -1,122 +0,0 @@
|
||||||
$(document).ready(function() {
|
|
||||||
$('a.navigator-link').on("click", function() {
|
|
||||||
// Extract the panel for this link
|
|
||||||
var panel = getPanelName($(this));
|
|
||||||
|
|
||||||
// Mark this link as currently selected
|
|
||||||
$('.navigator-link').parent().removeClass('navigator-selected');
|
|
||||||
$(this).parent().addClass('navigator-selected');
|
|
||||||
|
|
||||||
showPanel(panel);
|
|
||||||
});
|
|
||||||
|
|
||||||
installMethodHandlers('failed');
|
|
||||||
installMethodHandlers('skipped');
|
|
||||||
installMethodHandlers('passed', true); // hide passed methods by default
|
|
||||||
|
|
||||||
$('a.method').on("click", function() {
|
|
||||||
showMethod($(this));
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Hide all the panels and display the first one (do this last
|
|
||||||
// to make sure the click() will invoke the listeners)
|
|
||||||
$('.panel').hide();
|
|
||||||
$('.navigator-link').first().trigger("click");
|
|
||||||
|
|
||||||
// Collapse/expand the suites
|
|
||||||
$('a.collapse-all-link').on("click", function() {
|
|
||||||
var contents = $('.navigator-suite-content');
|
|
||||||
if (contents.css('display') == 'none') {
|
|
||||||
contents.show();
|
|
||||||
} else {
|
|
||||||
contents.hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// The handlers that take care of showing/hiding the methods
|
|
||||||
function installMethodHandlers(name, hide) {
|
|
||||||
function getContent(t) {
|
|
||||||
return $('.method-list-content.' + name + "." + t.attr('panel-name'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getHideLink(t, name) {
|
|
||||||
var s = 'a.hide-methods.' + name + "." + t.attr('panel-name');
|
|
||||||
return $(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getShowLink(t, name) {
|
|
||||||
return $('a.show-methods.' + name + "." + t.attr('panel-name'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMethodPanelClassSel(element, name) {
|
|
||||||
var panelName = getPanelName(element);
|
|
||||||
var sel = '.' + panelName + "-class-" + name;
|
|
||||||
return $(sel);
|
|
||||||
}
|
|
||||||
|
|
||||||
$('a.hide-methods.' + name).on("click", function() {
|
|
||||||
var w = getContent($(this));
|
|
||||||
w.hide();
|
|
||||||
getHideLink($(this), name).hide();
|
|
||||||
getShowLink($(this), name).show();
|
|
||||||
getMethodPanelClassSel($(this), name).hide();
|
|
||||||
});
|
|
||||||
|
|
||||||
$('a.show-methods.' + name).on("click", function() {
|
|
||||||
var w = getContent($(this));
|
|
||||||
w.show();
|
|
||||||
getHideLink($(this), name).show();
|
|
||||||
getShowLink($(this), name).hide();
|
|
||||||
showPanel(getPanelName($(this)));
|
|
||||||
getMethodPanelClassSel($(this), name).show();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (hide) {
|
|
||||||
$('a.hide-methods.' + name).trigger("click");
|
|
||||||
} else {
|
|
||||||
$('a.show-methods.' + name).trigger("click");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getHashForMethod(element) {
|
|
||||||
return element.attr('hash-for-method');
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPanelName(element) {
|
|
||||||
return element.attr('panel-name');
|
|
||||||
}
|
|
||||||
|
|
||||||
function showPanel(panelName) {
|
|
||||||
$('.panel').hide();
|
|
||||||
var panel = $('.panel[panel-name="' + panelName + '"]');
|
|
||||||
panel.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
function showMethod(element) {
|
|
||||||
var hashTag = getHashForMethod(element);
|
|
||||||
var panelName = getPanelName(element);
|
|
||||||
showPanel(panelName);
|
|
||||||
var current = document.location.href;
|
|
||||||
var base = current.substring(0, current.indexOf('#'))
|
|
||||||
document.location.href = base + '#' + hashTag;
|
|
||||||
var newPosition = $(document).scrollTop() - 65;
|
|
||||||
$(document).scrollTop(newPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawTable() {
|
|
||||||
for (var i = 0; i < suiteTableInitFunctions.length; i++) {
|
|
||||||
window[suiteTableInitFunctions[i]]();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var k in window.suiteTableData) {
|
|
||||||
var v = window.suiteTableData[k];
|
|
||||||
var div = v.tableDiv;
|
|
||||||
var data = v.tableData
|
|
||||||
var table = new google.visualization.Table(document.getElementById(div));
|
|
||||||
table.draw(data, {
|
|
||||||
showRowNumber : false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,344 +0,0 @@
|
||||||
body {
|
|
||||||
background-color: whitesmoke;
|
|
||||||
margin: 0 0 5px 5px;
|
|
||||||
}
|
|
||||||
ul {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-left:-10px;
|
|
||||||
}
|
|
||||||
li {
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
padding:5px 5px;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: black;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color:black ;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-selected {
|
|
||||||
/* #ffa500; Mouse hover color after click Orange.*/
|
|
||||||
background:#027368
|
|
||||||
}
|
|
||||||
|
|
||||||
.wrapper {
|
|
||||||
position: absolute;
|
|
||||||
top: 60px;
|
|
||||||
bottom: 0;
|
|
||||||
left: 400px;
|
|
||||||
right: 0;
|
|
||||||
margin-right:9px;
|
|
||||||
overflow: auto;/*imortant*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-root {
|
|
||||||
position: absolute;
|
|
||||||
top: 60px;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 400px;
|
|
||||||
overflow-y: auto;/*important*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite {
|
|
||||||
margin: -5px 10px 10px 5px;
|
|
||||||
background-color: whitesmoke ;/*Colour of the left bside box*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-name {
|
|
||||||
font-size: 24px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;/*All TEST SUITE*/
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-panel-header {
|
|
||||||
padding: 5px;
|
|
||||||
background-color: #027368; /*afeeee*/;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
color:white;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-panel-content {
|
|
||||||
padding: 5px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
background-color: #CCD0D1; /*d0ffff*/; /*Belongs to backGround of rightSide boxes*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-window {
|
|
||||||
border-style: dotted;
|
|
||||||
border-width: 1px;/*Border of left Side box*/
|
|
||||||
background-color: whitesmoke;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-window-top {
|
|
||||||
border-top-right-radius: 10px 10px;
|
|
||||||
border-top-left-radius: 10px 10px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px;
|
|
||||||
overflow: auto;/*Top of RightSide box*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.light-rounded-window-top {
|
|
||||||
background-color: #027368;
|
|
||||||
padding-left:120px;
|
|
||||||
border-radius: 10px;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-window-bottom {
|
|
||||||
border-bottom-right-radius: 10px 10px;
|
|
||||||
border-bottom-left-radius: 10px 10px;
|
|
||||||
overflow: auto;/*Bottom of rightSide box*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-name {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-content {
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 1px 0;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding-bottom: 5px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.parameters {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stack-trace {
|
|
||||||
white-space: pre;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-left: 20px; /*Error Stack Trace Message*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.testng-xml {
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-list-content {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-suite-content {
|
|
||||||
margin-left: 10px;
|
|
||||||
font: 12px 'Lucida Grande';
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-section-title {
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight:bold;
|
|
||||||
background-color: #8C8887;
|
|
||||||
margin-left: -10px;
|
|
||||||
margin-top:10px;
|
|
||||||
padding:6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-section-content {
|
|
||||||
list-style-image: url(bullet_point.png);
|
|
||||||
background-color: whitesmoke;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-banner-root {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
height: 45px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
padding: 5px;
|
|
||||||
margin: 0 0 5px 0;
|
|
||||||
background-color: #027368;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;/*Belongs to the Top of Report*//*Status: - Completed*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-banner-title-font {
|
|
||||||
font-size: 25px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
padding: 3px;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-name {
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-icon {
|
|
||||||
padding: 5px;
|
|
||||||
float: right;
|
|
||||||
height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-group {
|
|
||||||
font: 20px 'Lucida Grande';
|
|
||||||
margin: 5px 5px 10px 5px;
|
|
||||||
border-width: 0 0 1px 0;
|
|
||||||
border-style: solid;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-group-name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-in-group {
|
|
||||||
font-size: 16px;
|
|
||||||
margin-left: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.google-visualization-table-table {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reporter-method-name {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reporter-method-output-div {
|
|
||||||
padding: 5px;
|
|
||||||
margin: 0 0 5px 20px;
|
|
||||||
font-size: 12px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
border-width: 0 0 0 1px;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ignored-class-div {
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ignored-methods-div {
|
|
||||||
padding: 5px;
|
|
||||||
margin: 0 0 5px 20px;
|
|
||||||
font-size: 12px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
border-width: 0 0 0 1px;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.border-failed {
|
|
||||||
border-radius:2px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 0 10px;
|
|
||||||
border-color: #F20505;
|
|
||||||
}
|
|
||||||
|
|
||||||
.border-skipped {
|
|
||||||
border-radius:2px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 0 10px;
|
|
||||||
border-color: #F2BE22;
|
|
||||||
}
|
|
||||||
|
|
||||||
.border-passed {
|
|
||||||
border-radius:2px;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 0 0 10px;
|
|
||||||
border-color: #038C73;
|
|
||||||
}
|
|
||||||
|
|
||||||
.times-div {
|
|
||||||
text-align: center;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suite-total-time {
|
|
||||||
font: 16px 'Lucida Grande';
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-suite {
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-test {
|
|
||||||
margin-left: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-class {
|
|
||||||
margin-left: 60px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.configuration-method {
|
|
||||||
margin-left: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.test-method {
|
|
||||||
margin-left: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chronological-class {
|
|
||||||
background-color: #CCD0D1;
|
|
||||||
border-width: 0 0 1px 1px;/*Chronological*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.method-start {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chronological-class-name {
|
|
||||||
padding: 0 0 0 5px;
|
|
||||||
margin-top:5px;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
color: #008;
|
|
||||||
}
|
|
||||||
|
|
||||||
.after, .before, .test-method {
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
margin-top:5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigator-suite-header {
|
|
||||||
font-size: 18px;
|
|
||||||
margin: 0px 10px 10px 5px;
|
|
||||||
padding: 5px;
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: #027368;
|
|
||||||
color: white;
|
|
||||||
font-weight:bold;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
text-align: center; /*All Suites on top of left box*//*Status: -Completed*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse-all-icon {
|
|
||||||
padding: 3px;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
.button{
|
|
||||||
position: absolute;
|
|
||||||
margin-left:500px;
|
|
||||||
margin-top:8px;
|
|
||||||
background-color: white;
|
|
||||||
color:#027368;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-weight:bold;
|
|
||||||
border-color:#027368;
|
|
||||||
border-radius:25px;
|
|
||||||
cursor: pointer;
|
|
||||||
height:30px;
|
|
||||||
width:150px;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
/*Author: - Akhil Gullapalli*/
|
|
|
@ -1,76 +0,0 @@
|
||||||
window.onload = function () {
|
|
||||||
let cookies = document.cookie;
|
|
||||||
let cookieValue = cookies.split('=');
|
|
||||||
if (cookieValue[1] === 'null' || localStorage.getItem('Theme') === 'null') {
|
|
||||||
document.getElementById('retro').setAttribute('disabled', 'false');
|
|
||||||
} else if (cookieValue[1] === 'Switch Ultra Theme' ||
|
|
||||||
localStorage.getItem('Theme') === 'Switch Ultra Theme') {
|
|
||||||
document.getElementById('button').innerText = "Switch Retro Theme";
|
|
||||||
document.getElementById('retro').setAttribute('disabled', 'false');
|
|
||||||
|
|
||||||
} else if (cookieValue[1] === 'Switch Retro Theme' ||
|
|
||||||
localStorage.getItem('Theme') === 'Switch Retro Theme') {
|
|
||||||
if (cookieValue[1] === 'Switch Ultra Theme' ||
|
|
||||||
localStorage.getItem('Theme') === 'Switch Ultra Theme') {
|
|
||||||
document.getElementById('button').innerText = "Switch Retro Theme";
|
|
||||||
document.getElementById('retro').setAttribute('disabled', 'false');
|
|
||||||
|
|
||||||
document.getElementById('button').innerText = "Switch Ultra Theme";
|
|
||||||
document.getElementById('retro').removeAttribute('disabled');
|
|
||||||
document.getElementById('ultra').setAttribute('disabled', 'false');
|
|
||||||
localStorage.setItem('Theme', select);
|
|
||||||
|
|
||||||
} else if (select === 'Switch Ultra Theme') {
|
|
||||||
document.getElementById('button').innerText = "Switch Retro Theme";
|
|
||||||
document.getElementById('ultra').removeAttribute('disabled');
|
|
||||||
document.getElementById('retro').setAttribute('disabled', 'false');
|
|
||||||
localStorage.setItem('Theme', select);
|
|
||||||
}
|
|
||||||
} else if (cookieValue[1] === 'Switch Retro Theme' ||
|
|
||||||
localStorage.getItem('Theme') === 'Switch Retro Theme') {
|
|
||||||
document.getElementById('button').innerText = "Switch Ultra Theme";
|
|
||||||
document.getElementById('ultra').setAttribute('disabled', 'false');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
document.getElementById('button').onclick = function () {
|
|
||||||
let select = document.getElementById('button').innerText;
|
|
||||||
if (select === 'Switch Retro Theme') {
|
|
||||||
let d = new Date();
|
|
||||||
days = 365;
|
|
||||||
d.setTime(+d + (days * 86400000)); //24 * 60 * 60 * 1000
|
|
||||||
document.cookie = "Theme =" + select + "; expires=" + d.toGMTString() + ";";
|
|
||||||
document.getElementById('button').innerText = "Switch Ultra Theme";
|
|
||||||
document.getElementById('retro').removeAttribute('disabled');
|
|
||||||
document.getElementById('ultra').setAttribute('disabled', 'false');
|
|
||||||
localStorage.setItem('Theme', select);
|
|
||||||
|
|
||||||
} else if (select === 'Switch Ultra Theme') {
|
|
||||||
let d = new Date();
|
|
||||||
days = 365;
|
|
||||||
d.setTime(+d + (days * 86400000)); //24 * 60 * 60 * 1000
|
|
||||||
document.cookie = "Theme =" + select + "; expires=" + d.toGMTString() + ";";
|
|
||||||
document.getElementById('button').innerText = "Switch Retro Theme";
|
|
||||||
document.getElementById('ultra').removeAttribute('disabled');
|
|
||||||
document.getElementById('retro').setAttribute('disabled', 'false');
|
|
||||||
localStorage.setItem('Theme', select);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Function to mouse hovering affect.
|
|
||||||
document.getElementById('button').onmouseover = function () {
|
|
||||||
document.getElementById('button').style.borderRadius = "25px";
|
|
||||||
document.getElementById('button').style.width = "180px";
|
|
||||||
document.getElementById('button').style.height = "45px";
|
|
||||||
document.getElementById('button').style.marginTop = "1px";
|
|
||||||
|
|
||||||
}
|
|
||||||
//Function to mouse out affect
|
|
||||||
document.getElementById('button').onmouseout = function () {
|
|
||||||
document.getElementById('button').style.borderRadius = "25px";
|
|
||||||
document.getElementById('button').style.width = "150px";
|
|
||||||
document.getElementById('button').style.height = "30px";
|
|
||||||
document.getElementById('button').style.marginTop = "8px";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//This is the file where we handle the switching of the Themes.
|
|
||||||
/*Author:- Akhil Gullapalli*/
|
|
|
@ -1,35 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<testng-results ignored="0" total="3" passed="3" failed="0" skipped="0">
|
|
||||||
<reporter-output>
|
|
||||||
</reporter-output>
|
|
||||||
<suite started-at="2024-01-18T04:17:28 IST" name="UrlShortenerTestSuite" finished-at="2024-01-18T04:17:29 IST" duration-ms="841">
|
|
||||||
<groups>
|
|
||||||
</groups>
|
|
||||||
<test started-at="2024-01-18T04:17:28 IST" name="UrlShortenerTestSuite" finished-at="2024-01-18T04:17:29 IST" duration-ms="841">
|
|
||||||
<class name="com.bitmutex.shortener.AnalyticsTest">
|
|
||||||
<test-method is-config="true" signature="setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@7fc2413d]" started-at="2024-01-18T04:17:29 IST" name="setup" finished-at="2024-01-18T04:17:29 IST" duration-ms="42" status="PASS">
|
|
||||||
<reporter-output>
|
|
||||||
</reporter-output>
|
|
||||||
</test-method> <!-- setup -->
|
|
||||||
<test-method signature="testAnalyticsEntity()[pri:0, instance:com.bitmutex.shortener.AnalyticsTest@7fc2413d]" started-at="2024-01-18T04:17:29 IST" name="testAnalyticsEntity" finished-at="2024-01-18T04:17:29 IST" duration-ms="0" status="PASS">
|
|
||||||
<reporter-output>
|
|
||||||
</reporter-output>
|
|
||||||
</test-method> <!-- testAnalyticsEntity -->
|
|
||||||
</class> <!-- com.bitmutex.shortener.AnalyticsTest -->
|
|
||||||
<class name="com.bitmutex.shortener.AnalyticsControllerTest">
|
|
||||||
<test-method is-config="true" signature="setup()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]" started-at="2024-01-18T04:17:28 IST" name="setup" finished-at="2024-01-18T04:17:29 IST" duration-ms="751" status="PASS">
|
|
||||||
<reporter-output>
|
|
||||||
</reporter-output>
|
|
||||||
</test-method> <!-- setup -->
|
|
||||||
<test-method signature="testGetAnalyticsDataWithInvalidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]" started-at="2024-01-18T04:17:29 IST" name="testGetAnalyticsDataWithInvalidShortUrl" finished-at="2024-01-18T04:17:29 IST" duration-ms="21" status="PASS">
|
|
||||||
<reporter-output>
|
|
||||||
</reporter-output>
|
|
||||||
</test-method> <!-- testGetAnalyticsDataWithInvalidShortUrl -->
|
|
||||||
<test-method signature="testGetAnalyticsDataWithValidShortUrl()[pri:0, instance:com.bitmutex.shortener.AnalyticsControllerTest@402e37bc]" started-at="2024-01-18T04:17:29 IST" name="testGetAnalyticsDataWithValidShortUrl" finished-at="2024-01-18T04:17:29 IST" duration-ms="5" status="PASS">
|
|
||||||
<reporter-output>
|
|
||||||
</reporter-output>
|
|
||||||
</test-method> <!-- testGetAnalyticsDataWithValidShortUrl -->
|
|
||||||
</class> <!-- com.bitmutex.shortener.AnalyticsControllerTest -->
|
|
||||||
</test> <!-- UrlShortenerTestSuite -->
|
|
||||||
</suite> <!-- UrlShortenerTestSuite -->
|
|
||||||
</testng-results>
|
|
|
@ -1,9 +0,0 @@
|
||||||
.invocation-failed, .test-failed { background-color: #DD0000; }
|
|
||||||
.invocation-percent, .test-percent { background-color: #006600; }
|
|
||||||
.invocation-passed, .test-passed { background-color: #00AA00; }
|
|
||||||
.invocation-skipped, .test-skipped { background-color: #CCCC00; }
|
|
||||||
|
|
||||||
.main-page {
|
|
||||||
font-size: x-large;
|
|
||||||
}
|
|
||||||
|
|