create: new folder
This commit is contained in:
parent
29460deb4b
commit
7b7ed2130c
145139
Database.sql
Normal file
145139
Database.sql
Normal file
File diff suppressed because one or more lines are too long
BIN
PPT Presentasi Seminar Hasil Tugas Akhir.pdf
Normal file
BIN
PPT Presentasi Seminar Hasil Tugas Akhir.pdf
Normal file
Binary file not shown.
BIN
PPT Presentasi Seminar Hasil Tugas Akhir.ppt
Normal file
BIN
PPT Presentasi Seminar Hasil Tugas Akhir.ppt
Normal file
Binary file not shown.
BIN
Skripsi_Kevin Natanael Wijaya_signed.docx
Normal file
BIN
Skripsi_Kevin Natanael Wijaya_signed.docx
Normal file
Binary file not shown.
BIN
Skripsi_Kevin Natanael Wijaya_signed.pdf
Normal file
BIN
Skripsi_Kevin Natanael Wijaya_signed.pdf
Normal file
Binary file not shown.
3
test spring boot/.vscode/settings.json
vendored
Normal file
3
test spring boot/.vscode/settings.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"java.configuration.updateBuildConfiguration": "interactive"
|
||||
}
|
||||
33
test spring boot/demo/.gitignore
vendored
Normal file
33
test spring boot/demo/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
19
test spring boot/demo/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
19
test spring boot/demo/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# https://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.
|
||||
wrapperVersion=3.3.2
|
||||
distributionType=only-script
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip
|
||||
259
test spring boot/demo/mvnw
vendored
Normal file
259
test spring boot/demo/mvnw
vendored
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# https://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.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Apache Maven Wrapper startup batch script, version 3.3.2
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
|
||||
# MVNW_REPOURL - repo url base for downloading maven distribution
|
||||
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
|
||||
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
set -euf
|
||||
[ "${MVNW_VERBOSE-}" != debug ] || set -x
|
||||
|
||||
# OS specific support.
|
||||
native_path() { printf %s\\n "$1"; }
|
||||
case "$(uname)" in
|
||||
CYGWIN* | MINGW*)
|
||||
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
|
||||
native_path() { cygpath --path --windows "$1"; }
|
||||
;;
|
||||
esac
|
||||
|
||||
# set JAVACMD and JAVACCMD
|
||||
set_java_home() {
|
||||
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
|
||||
if [ -n "${JAVA_HOME-}" ]; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
JAVACCMD="$JAVA_HOME/jre/sh/javac"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
JAVACCMD="$JAVA_HOME/bin/javac"
|
||||
|
||||
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
|
||||
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
|
||||
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
JAVACMD="$(
|
||||
'set' +e
|
||||
'unset' -f command 2>/dev/null
|
||||
'command' -v java
|
||||
)" || :
|
||||
JAVACCMD="$(
|
||||
'set' +e
|
||||
'unset' -f command 2>/dev/null
|
||||
'command' -v javac
|
||||
)" || :
|
||||
|
||||
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
|
||||
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# hash string like Java String::hashCode
|
||||
hash_string() {
|
||||
str="${1:-}" h=0
|
||||
while [ -n "$str" ]; do
|
||||
char="${str%"${str#?}"}"
|
||||
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
|
||||
str="${str#?}"
|
||||
done
|
||||
printf %x\\n $h
|
||||
}
|
||||
|
||||
verbose() { :; }
|
||||
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
|
||||
|
||||
die() {
|
||||
printf %s\\n "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
trim() {
|
||||
# MWRAPPER-139:
|
||||
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
|
||||
# Needed for removing poorly interpreted newline sequences when running in more
|
||||
# exotic environments such as mingw bash on Windows.
|
||||
printf "%s" "${1}" | tr -d '[:space:]'
|
||||
}
|
||||
|
||||
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
|
||||
while IFS="=" read -r key value; do
|
||||
case "${key-}" in
|
||||
distributionUrl) distributionUrl=$(trim "${value-}") ;;
|
||||
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
|
||||
esac
|
||||
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
|
||||
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
|
||||
|
||||
case "${distributionUrl##*/}" in
|
||||
maven-mvnd-*bin.*)
|
||||
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
|
||||
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
|
||||
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
|
||||
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
|
||||
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
|
||||
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
|
||||
*)
|
||||
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
|
||||
distributionPlatform=linux-amd64
|
||||
;;
|
||||
esac
|
||||
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
|
||||
;;
|
||||
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
|
||||
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
|
||||
esac
|
||||
|
||||
# apply MVNW_REPOURL and calculate MAVEN_HOME
|
||||
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
|
||||
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
|
||||
distributionUrlName="${distributionUrl##*/}"
|
||||
distributionUrlNameMain="${distributionUrlName%.*}"
|
||||
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
|
||||
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
|
||||
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
|
||||
|
||||
exec_maven() {
|
||||
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
|
||||
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
|
||||
}
|
||||
|
||||
if [ -d "$MAVEN_HOME" ]; then
|
||||
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
|
||||
exec_maven "$@"
|
||||
fi
|
||||
|
||||
case "${distributionUrl-}" in
|
||||
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
|
||||
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
|
||||
esac
|
||||
|
||||
# prepare tmp dir
|
||||
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
|
||||
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
|
||||
trap clean HUP INT TERM EXIT
|
||||
else
|
||||
die "cannot create temp dir"
|
||||
fi
|
||||
|
||||
mkdir -p -- "${MAVEN_HOME%/*}"
|
||||
|
||||
# Download and Install Apache Maven
|
||||
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
|
||||
verbose "Downloading from: $distributionUrl"
|
||||
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
|
||||
|
||||
# select .zip or .tar.gz
|
||||
if ! command -v unzip >/dev/null; then
|
||||
distributionUrl="${distributionUrl%.zip}.tar.gz"
|
||||
distributionUrlName="${distributionUrl##*/}"
|
||||
fi
|
||||
|
||||
# verbose opt
|
||||
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
|
||||
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
|
||||
|
||||
# normalize http auth
|
||||
case "${MVNW_PASSWORD:+has-password}" in
|
||||
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
|
||||
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
|
||||
esac
|
||||
|
||||
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
|
||||
verbose "Found wget ... using wget"
|
||||
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
|
||||
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
|
||||
verbose "Found curl ... using curl"
|
||||
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
|
||||
elif set_java_home; then
|
||||
verbose "Falling back to use Java to download"
|
||||
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
|
||||
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
|
||||
cat >"$javaSource" <<-END
|
||||
public class Downloader extends java.net.Authenticator
|
||||
{
|
||||
protected java.net.PasswordAuthentication getPasswordAuthentication()
|
||||
{
|
||||
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
|
||||
}
|
||||
public static void main( String[] args ) throws Exception
|
||||
{
|
||||
setDefault( new Downloader() );
|
||||
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
|
||||
}
|
||||
}
|
||||
END
|
||||
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
|
||||
verbose " - Compiling Downloader.java ..."
|
||||
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
|
||||
verbose " - Running Downloader.java ..."
|
||||
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
|
||||
fi
|
||||
|
||||
# If specified, validate the SHA-256 sum of the Maven distribution zip file
|
||||
if [ -n "${distributionSha256Sum-}" ]; then
|
||||
distributionSha256Result=false
|
||||
if [ "$MVN_CMD" = mvnd.sh ]; then
|
||||
echo "Checksum validation is not supported for maven-mvnd." >&2
|
||||
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
|
||||
exit 1
|
||||
elif command -v sha256sum >/dev/null; then
|
||||
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
|
||||
distributionSha256Result=true
|
||||
fi
|
||||
elif command -v shasum >/dev/null; then
|
||||
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
|
||||
distributionSha256Result=true
|
||||
fi
|
||||
else
|
||||
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
|
||||
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ $distributionSha256Result = false ]; then
|
||||
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
|
||||
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# unzip and move
|
||||
if command -v unzip >/dev/null; then
|
||||
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
|
||||
else
|
||||
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
|
||||
fi
|
||||
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
|
||||
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
|
||||
|
||||
clean || :
|
||||
exec_maven "$@"
|
||||
149
test spring boot/demo/mvnw.cmd
vendored
Normal file
149
test spring boot/demo/mvnw.cmd
vendored
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
<# : batch portion
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM https://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Apache Maven Wrapper startup batch script, version 3.3.2
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM MVNW_REPOURL - repo url base for downloading maven distribution
|
||||
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
|
||||
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
|
||||
@SET __MVNW_CMD__=
|
||||
@SET __MVNW_ERROR__=
|
||||
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
|
||||
@SET PSModulePath=
|
||||
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
|
||||
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
|
||||
)
|
||||
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
|
||||
@SET __MVNW_PSMODULEP_SAVE=
|
||||
@SET __MVNW_ARG0_NAME__=
|
||||
@SET MVNW_USERNAME=
|
||||
@SET MVNW_PASSWORD=
|
||||
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
|
||||
@echo Cannot start maven from wrapper >&2 && exit /b 1
|
||||
@GOTO :EOF
|
||||
: end batch / begin powershell #>
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
if ($env:MVNW_VERBOSE -eq "true") {
|
||||
$VerbosePreference = "Continue"
|
||||
}
|
||||
|
||||
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
|
||||
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
|
||||
if (!$distributionUrl) {
|
||||
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
|
||||
}
|
||||
|
||||
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
|
||||
"maven-mvnd-*" {
|
||||
$USE_MVND = $true
|
||||
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
|
||||
$MVN_CMD = "mvnd.cmd"
|
||||
break
|
||||
}
|
||||
default {
|
||||
$USE_MVND = $false
|
||||
$MVN_CMD = $script -replace '^mvnw','mvn'
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
# apply MVNW_REPOURL and calculate MAVEN_HOME
|
||||
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
|
||||
if ($env:MVNW_REPOURL) {
|
||||
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
|
||||
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
|
||||
}
|
||||
$distributionUrlName = $distributionUrl -replace '^.*/',''
|
||||
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
|
||||
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
|
||||
if ($env:MAVEN_USER_HOME) {
|
||||
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
|
||||
}
|
||||
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
|
||||
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
|
||||
|
||||
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
|
||||
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
|
||||
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
|
||||
exit $?
|
||||
}
|
||||
|
||||
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
|
||||
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
|
||||
}
|
||||
|
||||
# prepare tmp dir
|
||||
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
|
||||
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
|
||||
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
|
||||
trap {
|
||||
if ($TMP_DOWNLOAD_DIR.Exists) {
|
||||
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
|
||||
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
|
||||
}
|
||||
}
|
||||
|
||||
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
|
||||
|
||||
# Download and Install Apache Maven
|
||||
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
|
||||
Write-Verbose "Downloading from: $distributionUrl"
|
||||
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
|
||||
|
||||
$webclient = New-Object System.Net.WebClient
|
||||
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
|
||||
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
|
||||
}
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
|
||||
|
||||
# If specified, validate the SHA-256 sum of the Maven distribution zip file
|
||||
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
|
||||
if ($distributionSha256Sum) {
|
||||
if ($USE_MVND) {
|
||||
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
|
||||
}
|
||||
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
|
||||
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
|
||||
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
|
||||
}
|
||||
}
|
||||
|
||||
# unzip and move
|
||||
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
|
||||
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
|
||||
try {
|
||||
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
|
||||
} catch {
|
||||
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
|
||||
Write-Error "fail to move MAVEN_HOME"
|
||||
}
|
||||
} finally {
|
||||
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
|
||||
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
|
||||
}
|
||||
|
||||
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
|
||||
69
test spring boot/demo/pom.xml
Normal file
69
test spring boot/demo/pom.xml
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>demo</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>demo</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.5.6</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<java.version>11</java.version>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>3.9.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package com.example.demo;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class DemoApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(DemoApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,298 @@
|
|||
package com.example.demo.controller;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.URL;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.file.*;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
@Controller
|
||||
public class MainController {
|
||||
|
||||
public final ExecutorService executorService = Executors.newFixedThreadPool(5); // Sesuaikan jumlah thread sesuai
|
||||
// kebutuhan
|
||||
|
||||
@PostMapping("/submit")
|
||||
public ResponseEntity<Map<String, Object>> submit(@RequestParam("url") String fileURL,
|
||||
@RequestParam("flutterid") String flutterid) {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
try {
|
||||
Future<Map<String, Object>> futureResponse = executorService.submit(new TestTask(fileURL, flutterid));
|
||||
response = futureResponse.get(); // Tunggu hingga tugas selesai
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
response.put("message", "An error occurred: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.add("Access-Control-Allow-Origin", "*"); // Sesuaikan dengan domain yang benar
|
||||
headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
||||
headers.add("Access-Control-Allow-Headers", "*");
|
||||
headers.add("Access-Control-Max-Age", "3600");
|
||||
return ResponseEntity.ok()
|
||||
.headers(headers)
|
||||
.body(response);
|
||||
}
|
||||
|
||||
public class TestTask implements Callable<Map<String, Object>> {
|
||||
public final String fileURL;
|
||||
public final String flutterid;
|
||||
|
||||
public TestTask(String fileURL, String flutterid) {
|
||||
this.fileURL = fileURL;
|
||||
this.flutterid = flutterid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> call() {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
String repoName = extractRepoName(fileURL);
|
||||
String destDirectory = "C:\\Users\\kevin\\Desktop\\Materi kuliah\\SKRIPSI\\unzipped";
|
||||
String zipFilePath = destDirectory + "\\downloaded.zip";
|
||||
String folderToCopy = "C:\\Users\\kevin\\Desktop\\Materi kuliah\\SKRIPSI\\testFile\\" + flutterid
|
||||
+ "\\test";
|
||||
String destinationDir = destDirectory + "\\" + repoName + "-main\\test";
|
||||
|
||||
System.out.println("Received URL: " + fileURL);
|
||||
|
||||
try {
|
||||
// Clear destination directory and previous zip file before download and unzip
|
||||
clearDirectory(new File(destDirectory));
|
||||
Files.deleteIfExists(Paths.get(zipFilePath));
|
||||
// Download and unzip the new file
|
||||
downloadFile(fileURL, zipFilePath);
|
||||
unzip(zipFilePath, destDirectory);
|
||||
copyDirectory(new File(folderToCopy), new File(destinationDir));
|
||||
// Run Flutter tests
|
||||
String testOutput = runFlutterTest(destDirectory + "\\" + repoName + "-main");
|
||||
List<String> successTests = new ArrayList<>();
|
||||
List<String> failedTests = new ArrayList<>();
|
||||
parseTestOutput(testOutput, successTests, failedTests);
|
||||
int totalSuccess = successTests.size();
|
||||
int totalFailed = failedTests.size();
|
||||
// Calculate score
|
||||
int totalTests = totalSuccess + totalFailed;
|
||||
double score = totalTests == 0 ? 0 : ((double) totalSuccess / totalTests) * 100;
|
||||
DecimalFormat df = new DecimalFormat("#.##");
|
||||
String formattedScore = df.format(score);
|
||||
// Prepare response
|
||||
response.put("message", "Download, unzip, and test completed successfully.");
|
||||
response.put("successTests", successTests);
|
||||
response.put("failedTests", failedTests);
|
||||
response.put("totalSuccess", totalSuccess);
|
||||
response.put("totalFailed", totalFailed);
|
||||
response.put("score", formattedScore);
|
||||
} catch (Exception ex) {
|
||||
response.put("message", "An error occurred: " + ex.getMessage());
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
public String extractRepoName(String url) {
|
||||
// Contoh URL:
|
||||
// https://github.com/Kev9794/media_player_flutter_failed/archive/refs/heads/main.zip
|
||||
String pattern = "github\\.com/(.+?)/(\\w+)";
|
||||
Pattern r = Pattern.compile(pattern);
|
||||
Matcher m = r.matcher(url);
|
||||
|
||||
if (m.find()) {
|
||||
String repoName = m.group(2);
|
||||
return repoName;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid GitHub URL format: " + url);
|
||||
}
|
||||
}
|
||||
|
||||
public static void downloadFile(String fileURL, String destination) throws IOException {
|
||||
System.out.println("Downloading from URL: " + fileURL);
|
||||
URL url = new URL(fileURL);
|
||||
ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(destination);
|
||||
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
|
||||
fileOutputStream.close();
|
||||
readableByteChannel.close();
|
||||
System.out.println("File downloaded to " + destination);
|
||||
}
|
||||
|
||||
public static void clearDirectory(File directory) throws IOException {
|
||||
if (directory.exists()) {
|
||||
for (File file : directory.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
clearDirectory(file);
|
||||
}
|
||||
if (!file.delete()) {
|
||||
throw new IOException("Failed to delete " + file);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
directory.mkdirs();
|
||||
}
|
||||
System.out.println("Directory " + directory.getPath() + " is cleared.");
|
||||
}
|
||||
|
||||
public static void unzip(String zipFilePath, String destDirectory) throws IOException {
|
||||
System.out.println("Unzipping file " + zipFilePath + " to " + destDirectory);
|
||||
File destDir = new File(destDirectory);
|
||||
if (!destDir.exists()) {
|
||||
destDir.mkdirs();
|
||||
}
|
||||
byte[] buffer = new byte[1024];
|
||||
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) {
|
||||
ZipEntry zipEntry = zis.getNextEntry();
|
||||
while (zipEntry != null) {
|
||||
File newFile = newFile(destDir, zipEntry);
|
||||
if (zipEntry.isDirectory()) {
|
||||
if (!newFile.isDirectory() && !newFile.mkdirs()) {
|
||||
throw new IOException("Failed to create directory " + newFile);
|
||||
}
|
||||
} else {
|
||||
File parent = newFile.getParentFile();
|
||||
if (!parent.isDirectory() && !parent.mkdirs()) {
|
||||
throw new IOException("Failed to create directory " + parent);
|
||||
}
|
||||
try (FileOutputStream fos = new FileOutputStream(newFile)) {
|
||||
int len;
|
||||
while ((len = zis.read(buffer)) > 0) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
}
|
||||
}
|
||||
zipEntry = zis.getNextEntry();
|
||||
}
|
||||
zis.closeEntry();
|
||||
}
|
||||
System.out.println("Unzip completed.");
|
||||
}
|
||||
|
||||
public static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {
|
||||
File destFile = new File(destinationDir, zipEntry.getName());
|
||||
String destDirPath = destinationDir.getCanonicalPath();
|
||||
String destFilePath = destFile.getCanonicalPath();
|
||||
|
||||
if (!destFilePath.startsWith(destDirPath + File.separator)) {
|
||||
throw new IOException("Entry is outside of the target dir: " + zipEntry.getName());
|
||||
}
|
||||
|
||||
return destFile;
|
||||
}
|
||||
|
||||
public static void copyDirectory(File sourceDir, File destinationDir) throws IOException {
|
||||
if (!sourceDir.isDirectory()) {
|
||||
throw new IOException("Source is not a directory");
|
||||
}
|
||||
|
||||
if (!destinationDir.exists()) {
|
||||
destinationDir.mkdirs();
|
||||
}
|
||||
|
||||
for (String file : sourceDir.list()) {
|
||||
File srcFile = new File(sourceDir, file);
|
||||
File destFile = new File(destinationDir, file);
|
||||
|
||||
if (srcFile.isDirectory()) {
|
||||
copyDirectory(srcFile, destFile);
|
||||
} else {
|
||||
Files.copy(srcFile.toPath(), destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
System.out.println("Directory " + sourceDir.getName() + " copied to " + destinationDir.getPath());
|
||||
}
|
||||
|
||||
public static String runFlutterTest(String projectDir) throws IOException {
|
||||
ProcessBuilder builder = new ProcessBuilder(
|
||||
"cmd.exe", "/c",
|
||||
"cd \"" + projectDir + "\" && flutter test");
|
||||
builder.redirectErrorStream(true);
|
||||
Process p = builder.start();
|
||||
StringBuilder output = new StringBuilder();
|
||||
try (BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
|
||||
String line;
|
||||
while ((line = r.readLine()) != null) {
|
||||
output.append(line).append("\n");
|
||||
}
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
public static void parseTestOutput(String output, List<String> successTests,
|
||||
List<String> failedTests) {
|
||||
String[] lines = output.split("\n");
|
||||
Pattern successPattern = Pattern.compile("\\+\\d+(?: -\\d+)?: .*: (.*)(?<! \\[E\\])$");
|
||||
Pattern failedPattern = Pattern.compile("[\\+\\-]\\d+(?: -\\d+)?: .*: (.*) \\[E\\]");
|
||||
|
||||
Set<String> failedTestsSet = new HashSet<>(failedTests);
|
||||
|
||||
for (String line : lines) {
|
||||
System.out.println("Processing line: " + line); // Debugging line
|
||||
Matcher successMatcher = successPattern.matcher(line);
|
||||
Matcher failedMatcher = failedPattern.matcher(line);
|
||||
|
||||
if (successMatcher.find()) {
|
||||
String testName = successMatcher.group(1).trim();
|
||||
successTests.add(testName);
|
||||
System.out.println("Success test found: " + testName); // Debugging line
|
||||
} else if (failedMatcher.find()) {
|
||||
String testName = failedMatcher.group(1).trim();
|
||||
failedTestsSet.add(testName);
|
||||
failedTests.add(testName + " (failed)");
|
||||
System.out.println("Failed test found: " + testName); // Debugging line
|
||||
}
|
||||
}
|
||||
successTests.removeIf(failedTestsSet::contains);
|
||||
|
||||
}
|
||||
|
||||
// Ubuntu Parsing Output
|
||||
|
||||
// public static void parseTestOutput(String output, List<String> successTests,
|
||||
// List<String> failedTests) {
|
||||
// // Split the output by line
|
||||
// String[] lines = output.split("\n");
|
||||
|
||||
// // Patterns for success and failed tests based on typical Flutter test output
|
||||
// Pattern successPattern = Pattern.compile("\\+\\d+(?: -\\d+)?: .*: (.*)(?<!
|
||||
// \\[E\\])$");
|
||||
// Pattern failedPattern = Pattern.compile("[\\+\\-]\\d+(?: -\\d+)?: .*: (.*)
|
||||
// \\[E\\]");
|
||||
|
||||
// Set<String> failedTestsSet = new HashSet<>(failedTests);
|
||||
|
||||
// for (String line : lines) {
|
||||
// System.out.println("Processing line: " + line); // Debugging line
|
||||
// Matcher successMatcher = successPattern.matcher(line);
|
||||
// Matcher failedMatcher = failedPattern.matcher(line);
|
||||
|
||||
// if (successMatcher.find()) {
|
||||
// String testName = successMatcher.group(1).trim();
|
||||
// successTests.add(testName);
|
||||
// System.out.println("Success test found: " + testName); // Debugging line
|
||||
// } else if (failedMatcher.find()) {
|
||||
// String testName = failedMatcher.group(1).trim();
|
||||
// failedTestsSet.add(testName);
|
||||
// failedTests.add(testName + " (failed)");
|
||||
// System.out.println("Failed test found: " + testName); // Debugging line
|
||||
// }
|
||||
// }
|
||||
// // Remove any successful tests that are also in the failed tests
|
||||
// successTests.removeIf(failedTestsSet::contains);
|
||||
// }
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
spring.application.name=demo
|
||||
spring.mvc.cors.allow-credentials=true
|
||||
spring.mvc.cors.allowed-origins=http://localhost:8000
|
||||
spring.mvc.cors.allowed-methods=GET,POST,PUT,DELETE
|
||||
spring.mvc.cors.allowed-headers=Authorization,Content-Type
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Flutter Test Runner</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Flutter Test Runner</h1>
|
||||
<p>Modul dapat diunduh pada link berikut : <a
|
||||
href="https://drive.google.com/drive/folders/1xlDgPfzkflORsz4fTdRAV1NxvM3Z1oyg">
|
||||
https://drive.google.com/drive/folders/1xlDgPfzkflORsz4fTdRAV1NxvM3Z1oyg</a></p>
|
||||
<p>Langkah-langkah mengupload tugas: <br>
|
||||
1. Upload tugas pada GitHub dengan repository baru.<br>
|
||||
2. Pastikan repository anda bersifat Public.<br>
|
||||
3. Setelah sudah terupload copy link untuk download zip repository.<br>
|
||||
4. Paste link tersebut pada form dibawah ini.<br>
|
||||
</p>
|
||||
<form action="/submit" method="post">
|
||||
<label for="url">GitHub URL:</label>
|
||||
<input type="text" id="url" name="url" required>
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Flutter Test Runner</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Flutter Test Runner</h1>
|
||||
<p th:text="${message}"></p>
|
||||
|
||||
<h2>Test Results:</h2>
|
||||
<p>Total Success: <span th:text="${totalSuccess}"></span></p>
|
||||
<p>Total Failed: <span th:text="${totalFailed}"></span></p>
|
||||
<p>Score: <span th:text="${score}"></span>%</p>
|
||||
|
||||
<h2>Success Tests:</h2>
|
||||
<ul>
|
||||
<li th:each="test : ${successTests}" th:text="${test}"></li>
|
||||
</ul>
|
||||
|
||||
<h2>Failed Tests:</h2>
|
||||
<ul>
|
||||
<li th:each="test : ${failedTests}" th:text="${test}"></li>
|
||||
</ul>
|
||||
|
||||
<a href="/">Go back</a>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package com.example.demo;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class DemoApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,245 @@
|
|||
package com.example.demo.controller;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class MainControllerTest {
|
||||
|
||||
private final MainController mainController = new MainController();
|
||||
|
||||
@Test
|
||||
public void testExtractRepoName_ValidURL() {
|
||||
String url = "https://github.com/user/repo";
|
||||
String expected = "repo";
|
||||
String actual = mainController.extractRepoName(url);
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testExtractRepoName_InvalidURL() {
|
||||
String url = "invalid_url";
|
||||
mainController.extractRepoName(url);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDownloadFile_ValidURL() throws IOException {
|
||||
String fileURL = "https://github.com/Kev9794/modul3/archive/refs/heads/main.zip";
|
||||
String destination = "tempFile.zip";
|
||||
MainController.downloadFile(fileURL, destination);
|
||||
assertTrue(Files.exists(Paths.get(destination)));
|
||||
Files.delete(Paths.get(destination)); // Cleanup
|
||||
}
|
||||
|
||||
@Test(expected = IOException.class)
|
||||
public void testDownloadFile_InvalidURL() throws IOException {
|
||||
String fileURL = "invalid_url";
|
||||
String destination = "tempFile.zip";
|
||||
MainController.downloadFile(fileURL, destination);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnzip_ValidFile() throws IOException {
|
||||
String zipFilePath = "testDir//test.zip";
|
||||
String destDirectory = "testDir";
|
||||
// Assume the zip file exists and contains valid data for the test
|
||||
MainController.unzip(zipFilePath, destDirectory);
|
||||
assertTrue(Files.exists(Paths.get(destDirectory)));
|
||||
// Cleanup
|
||||
Files.walk(Paths.get(destDirectory))
|
||||
.sorted(Comparator.reverseOrder())
|
||||
.map(Path::toFile)
|
||||
.forEach(File::delete);
|
||||
Files.deleteIfExists(Paths.get(zipFilePath));
|
||||
}
|
||||
|
||||
@Test(expected = IOException.class)
|
||||
public void testUnzip_InvalidFile() throws IOException {
|
||||
String zipFilePath = "invalid.zip";
|
||||
String destDirectory = "testDir";
|
||||
MainController.unzip(zipFilePath, destDirectory);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCopyDirectory() throws IOException {
|
||||
Path sourceDir = Files.createTempDirectory("sourceDir");
|
||||
Path destinationDir = Files.createTempDirectory("destinationDir");
|
||||
|
||||
Files.createFile(sourceDir.resolve("testFile.txt"));
|
||||
|
||||
MainController.copyDirectory(sourceDir.toFile(), destinationDir.toFile());
|
||||
|
||||
assertTrue(Files.exists(destinationDir.resolve("testFile.txt")));
|
||||
|
||||
// Cleanup
|
||||
Files.walk(sourceDir).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
|
||||
Files.walk(destinationDir).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRunFlutterTest() throws IOException {
|
||||
String projectDir = "C:\\Users\\kevin\\Desktop\\Materi kuliah\\SKRIPSI\\flutter_testing_app";
|
||||
// Assume the Flutter project exists at the specified path
|
||||
String output = MainController.runFlutterTest(projectDir);
|
||||
assertNotNull(output);
|
||||
assertTrue(output.contains("All tests passed") || output.contains("Some tests failed"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseSuccessTestOutput() {
|
||||
String testOutput = "00:17 +42 -2: C:/Users/kevin/Desktop/Materi kuliah/SKRIPSI/unzipped/media_player_flutter_failed-main/test/scenario/task3a_test.dart: All tests passed";
|
||||
List<String> successTests = new ArrayList<>();
|
||||
List<String> failedTests = new ArrayList<>();
|
||||
MainController.parseTestOutput(testOutput, successTests, failedTests);
|
||||
|
||||
assertTrue(successTests.contains("All tests passed"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseFailedTestOutput() {
|
||||
String testOutput = "00:17 +42 -2: C:/Users/kevin/Desktop/Materi kuliah/SKRIPSI/unzipped/media_player_flutter_failed-main/test/scenario/task3a_test.dart: Some tests failed [E]";
|
||||
List<String> successTests = new ArrayList<>();
|
||||
List<String> failedTests = new ArrayList<>();
|
||||
MainController.parseTestOutput(testOutput, successTests, failedTests);
|
||||
|
||||
assertTrue(failedTests.contains("Some tests failed"));
|
||||
}
|
||||
|
||||
// @Test
|
||||
// public void testLoad() throws InterruptedException {
|
||||
// int numberOfRequests = 100;
|
||||
// ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||
// List<Future<ResponseEntity<Map<String, Object>>>> futures = new
|
||||
// ArrayList<>();
|
||||
|
||||
// for (int i = 0; i < numberOfRequests; i++) {
|
||||
// Future<ResponseEntity<Map<String, Object>>> future =
|
||||
// executorService.submit(() -> {
|
||||
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
|
||||
// String flutterid = "testFlutterID";
|
||||
// return mainController.submit(fileURL, flutterid);
|
||||
// });
|
||||
// futures.add(future);
|
||||
// }
|
||||
|
||||
// for (Future<ResponseEntity<Map<String, Object>>> future : futures) {
|
||||
// try {
|
||||
// ResponseEntity<Map<String, Object>> response = future.get();
|
||||
// assertEquals(HttpStatus.OK, response.getStatusCode());
|
||||
// } catch (ExecutionException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
|
||||
// executorService.shutdown();
|
||||
// executorService.awaitTermination(1, TimeUnit.MINUTES);
|
||||
// }
|
||||
|
||||
// @Test
|
||||
// public void testStress() throws InterruptedException {
|
||||
// int numberOfRequests = 1000; // Increase until failureS
|
||||
// ExecutorService executorService = Executors.newFixedThreadPool(50);
|
||||
// List<Future<ResponseEntity<Map<String, Object>>>> futures = new
|
||||
// ArrayList<>();
|
||||
|
||||
// for (int i = 0; i < numberOfRequests; i++) {
|
||||
// Future<ResponseEntity<Map<String, Object>>> future =
|
||||
// executorService.submit(() -> {
|
||||
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
|
||||
// String flutterid = "testFlutterID";
|
||||
// return mainController.submit(fileURL, flutterid);
|
||||
// });
|
||||
// futures.add(future);
|
||||
// }
|
||||
|
||||
// for (Future<ResponseEntity<Map<String, Object>>> future : futures) {
|
||||
// try {
|
||||
// ResponseEntity<Map<String, Object>> response = future.get();
|
||||
// assertEquals(HttpStatus.OK, response.getStatusCode());
|
||||
// } catch (ExecutionException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
|
||||
// executorService.shutdown();
|
||||
// executorService.awaitTermination(1, TimeUnit.MINUTES);
|
||||
// }
|
||||
|
||||
// @Test
|
||||
// public void testEndurance() throws InterruptedException {
|
||||
// int durationInMinutes = 2; // 2 minutes for endurance test
|
||||
// long endTime = System.currentTimeMillis() + (durationInMinutes * 60 * 1000);
|
||||
// ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||
|
||||
// while (System.currentTimeMillis() < endTime) {
|
||||
// Future<ResponseEntity<Map<String, Object>>> future =
|
||||
// executorService.submit(() -> {
|
||||
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
|
||||
// String flutterid = "testFlutterID";
|
||||
// return mainController.submit(fileURL, flutterid);
|
||||
// });
|
||||
|
||||
// try {
|
||||
// ResponseEntity<Map<String, Object>> response = future.get();
|
||||
// assertEquals(HttpStatus.OK, response.getStatusCode());
|
||||
// } catch (ExecutionException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
|
||||
// executorService.shutdown();
|
||||
// executorService.awaitTermination(10, TimeUnit.MINUTES);
|
||||
// }
|
||||
|
||||
// @Test
|
||||
// public void testThroughput() throws InterruptedException {
|
||||
// int numberOfRequests = 50;
|
||||
// long startTime = System.currentTimeMillis();
|
||||
// ExecutorService executorService = Executors.newFixedThreadPool(50);
|
||||
// List<Future<ResponseEntity<Map<String, Object>>>> futures = new
|
||||
// ArrayList<>();
|
||||
|
||||
// for (int i = 0; i < numberOfRequests; i++) {
|
||||
// Future<ResponseEntity<Map<String, Object>>> future =
|
||||
// executorService.submit(() -> {
|
||||
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
|
||||
// String flutterid = "testFlutterID";
|
||||
// return mainController.submit(fileURL, flutterid);
|
||||
// });
|
||||
// futures.add(future);
|
||||
// }
|
||||
|
||||
// for (Future<ResponseEntity<Map<String, Object>>> future : futures) {
|
||||
// try {
|
||||
// ResponseEntity<Map<String, Object>> response = future.get();
|
||||
// assertEquals(HttpStatus.OK, response.getStatusCode());
|
||||
// } catch (ExecutionException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
|
||||
// long endTime = System.currentTimeMillis();
|
||||
// long duration = endTime - startTime;
|
||||
// double throughput = (double) numberOfRequests / (duration / 1000.0);
|
||||
// System.out.println("Throughput: " + throughput + " requests per second");
|
||||
|
||||
// executorService.shutdown();
|
||||
// executorService.awaitTermination(1, TimeUnit.MINUTES);
|
||||
// }
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user