Skip to content

Commit 1f18bbc

Browse files
committedMay 9, 2020
init
0 parents  commit 1f18bbc

File tree

16 files changed

+604
-0
lines changed

16 files changed

+604
-0
lines changed
 

‎.gitignore

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Gradle
2+
# ------
3+
.gradle
4+
/build
5+
/buildSrc/build
6+
/buildSrc/subprojects/*/build
7+
/subprojects/*/build
8+
/subprojects/docs/src/samples/**/build
9+
/subprojects/docs/src/snippets/**/build
10+
/subprojects/internal-android-performance-testing/build-android-libs
11+
12+
# IDEA
13+
# ----
14+
!/.idea
15+
/.idea/*
16+
!/.idea/codeStyles
17+
!/.idea/inspectionProfiles
18+
!/.idea/icon.png
19+
!/.idea/icon_dark.png
20+
*/**/.idea
21+
.shelf
22+
/*.iml
23+
/*.ipr
24+
/*.iws
25+
/buildSrc/.idea
26+
/buildSrc/.shelf
27+
/buildSrc/*.iml
28+
/buildSrc/*.ipr
29+
/buildSrc/*.iws
30+
/buildSrc/out
31+
/buildSrc/subprojects/*/*.iml
32+
/buildSrc/subprojects/*/out
33+
/out
34+
/subprojects/*/*.iml
35+
/subprojects/*/out
36+
/.teamcity/*.iml
37+
/.teamcity/target
38+
39+
# Eclipse
40+
# -------
41+
*.classpath
42+
*.project
43+
*.settings
44+
/bin
45+
/subprojects/*/bin
46+
atlassian-ide-plugin.xml
47+
.metadata/
48+
49+
# NetBeans
50+
# --------
51+
.nb-gradle
52+
.nb-gradle-properties
53+
54+
# Vim
55+
# ---
56+
*.sw[nop]
57+
58+
# Emacs
59+
# -----
60+
*~
61+
\#*\#
62+
.\#*
63+
64+
# Textmate
65+
# --------
66+
.textmate
67+
68+
# Sublime Text
69+
# ------------
70+
*.sublime-*
71+
72+
# jEnv
73+
# ----
74+
.java-version
75+
76+
# macOS
77+
# ----
78+
.DS_Store
79+
80+
# HPROF
81+
# -----
82+
*.hprof
83+
84+
# Work dirs
85+
# ---------
86+
/incoming-distributions
87+
/intTestHomeDir
88+
89+
# Logs
90+
# ----
91+
/*.log
92+
93+
# oh-my-zsh gradle plugin
94+
.gradletasknamecache

‎build.gradle

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
group 'io.visual-regression-tracker.sdk-java'
2+
version '1.0-SNAPSHOT'
3+
4+
apply plugin: 'java'
5+
apply plugin: "io.freefair.lombok"
6+
apply plugin: "com.github.johnrengelman.shadow"
7+
8+
repositories {
9+
mavenCentral()
10+
}
11+
12+
13+
buildscript {
14+
repositories {
15+
maven {
16+
url "https://plugins.gradle.org/m2/"
17+
}
18+
19+
}
20+
dependencies {
21+
classpath "io.freefair.gradle:lombok-plugin:5.0.0-rc6"
22+
classpath "com.github.jengelman.gradle.plugins:shadow:5.2.0"
23+
}
24+
}
25+
26+
dependencies {
27+
implementation 'com.google.code.gson:gson:2.8.6'
28+
testImplementation group: 'org.testng', name: 'testng', version: '7.1.0'
29+
testImplementation 'commons-io:commons-io:2.6'
30+
}
31+
32+
test{
33+
useTestNG()
34+
}

‎gradle/wrapper/gradle-wrapper.jar

57.3 KB
Binary file not shown.
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#Sat May 09 22:38:23 CEST 2020
2+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-all.zip
3+
distributionBase=GRADLE_USER_HOME
4+
distributionPath=wrapper/dists
5+
zipStorePath=wrapper/dists
6+
zipStoreBase=GRADLE_USER_HOME

‎gradlew

+183
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
#!/usr/bin/env sh
2+
3+
#
4+
# Copyright 2015 the original author or authors.
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# https://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
#
18+
19+
##############################################################################
20+
##
21+
## Gradle start up script for UN*X
22+
##
23+
##############################################################################
24+
25+
# Attempt to set APP_HOME
26+
# Resolve links: $0 may be a link
27+
PRG="$0"
28+
# Need this for relative symlinks.
29+
while [ -h "$PRG" ] ; do
30+
ls=`ls -ld "$PRG"`
31+
link=`expr "$ls" : '.*-> \(.*\)$'`
32+
if expr "$link" : '/.*' > /dev/null; then
33+
PRG="$link"
34+
else
35+
PRG=`dirname "$PRG"`"/$link"
36+
fi
37+
done
38+
SAVED="`pwd`"
39+
cd "`dirname \"$PRG\"`/" >/dev/null
40+
APP_HOME="`pwd -P`"
41+
cd "$SAVED" >/dev/null
42+
43+
APP_NAME="Gradle"
44+
APP_BASE_NAME=`basename "$0"`
45+
46+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47+
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48+
49+
# Use the maximum available, or set MAX_FD != -1 to use that value.
50+
MAX_FD="maximum"
51+
52+
warn () {
53+
echo "$*"
54+
}
55+
56+
die () {
57+
echo
58+
echo "$*"
59+
echo
60+
exit 1
61+
}
62+
63+
# OS specific support (must be 'true' or 'false').
64+
cygwin=false
65+
msys=false
66+
darwin=false
67+
nonstop=false
68+
case "`uname`" in
69+
CYGWIN* )
70+
cygwin=true
71+
;;
72+
Darwin* )
73+
darwin=true
74+
;;
75+
MINGW* )
76+
msys=true
77+
;;
78+
NONSTOP* )
79+
nonstop=true
80+
;;
81+
esac
82+
83+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84+
85+
# Determine the Java command to use to start the JVM.
86+
if [ -n "$JAVA_HOME" ] ; then
87+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88+
# IBM's JDK on AIX uses strange locations for the executables
89+
JAVACMD="$JAVA_HOME/jre/sh/java"
90+
else
91+
JAVACMD="$JAVA_HOME/bin/java"
92+
fi
93+
if [ ! -x "$JAVACMD" ] ; then
94+
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95+
96+
Please set the JAVA_HOME variable in your environment to match the
97+
location of your Java installation."
98+
fi
99+
else
100+
JAVACMD="java"
101+
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102+
103+
Please set the JAVA_HOME variable in your environment to match the
104+
location of your Java installation."
105+
fi
106+
107+
# Increase the maximum file descriptors if we can.
108+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109+
MAX_FD_LIMIT=`ulimit -H -n`
110+
if [ $? -eq 0 ] ; then
111+
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112+
MAX_FD="$MAX_FD_LIMIT"
113+
fi
114+
ulimit -n $MAX_FD
115+
if [ $? -ne 0 ] ; then
116+
warn "Could not set maximum file descriptor limit: $MAX_FD"
117+
fi
118+
else
119+
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120+
fi
121+
fi
122+
123+
# For Darwin, add options to specify how the application appears in the dock
124+
if $darwin; then
125+
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126+
fi
127+
128+
# For Cygwin or MSYS, switch paths to Windows format before running java
129+
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
130+
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131+
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132+
JAVACMD=`cygpath --unix "$JAVACMD"`
133+
134+
# We build the pattern for arguments to be converted via cygpath
135+
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136+
SEP=""
137+
for dir in $ROOTDIRSRAW ; do
138+
ROOTDIRS="$ROOTDIRS$SEP$dir"
139+
SEP="|"
140+
done
141+
OURCYGPATTERN="(^($ROOTDIRS))"
142+
# Add a user-defined pattern to the cygpath arguments
143+
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144+
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145+
fi
146+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
147+
i=0
148+
for arg in "$@" ; do
149+
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150+
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151+
152+
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153+
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154+
else
155+
eval `echo args$i`="\"$arg\""
156+
fi
157+
i=`expr $i + 1`
158+
done
159+
case $i in
160+
0) set -- ;;
161+
1) set -- "$args0" ;;
162+
2) set -- "$args0" "$args1" ;;
163+
3) set -- "$args0" "$args1" "$args2" ;;
164+
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165+
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166+
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167+
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168+
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169+
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170+
esac
171+
fi
172+
173+
# Escape application args
174+
save () {
175+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176+
echo " "
177+
}
178+
APP_ARGS=`save "$@"`
179+
180+
# Collect all arguments for the java command, following the shell quoting and substitution rules
181+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182+
183+
exec "$JAVACMD" "$@"

‎gradlew.bat

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
@rem
2+
@rem Copyright 2015 the original author or authors.
3+
@rem
4+
@rem Licensed under the Apache License, Version 2.0 (the "License");
5+
@rem you may not use this file except in compliance with the License.
6+
@rem You may obtain a copy of the License at
7+
@rem
8+
@rem https://www.apache.org/licenses/LICENSE-2.0
9+
@rem
10+
@rem Unless required by applicable law or agreed to in writing, software
11+
@rem distributed under the License is distributed on an "AS IS" BASIS,
12+
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
@rem See the License for the specific language governing permissions and
14+
@rem limitations under the License.
15+
@rem
16+
17+
@if "%DEBUG%" == "" @echo off
18+
@rem ##########################################################################
19+
@rem
20+
@rem Gradle startup script for Windows
21+
@rem
22+
@rem ##########################################################################
23+
24+
@rem Set local scope for the variables with windows NT shell
25+
if "%OS%"=="Windows_NT" setlocal
26+
27+
set DIRNAME=%~dp0
28+
if "%DIRNAME%" == "" set DIRNAME=.
29+
set APP_BASE_NAME=%~n0
30+
set APP_HOME=%DIRNAME%
31+
32+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
33+
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
34+
35+
@rem Find java.exe
36+
if defined JAVA_HOME goto findJavaFromJavaHome
37+
38+
set JAVA_EXE=java.exe
39+
%JAVA_EXE% -version >NUL 2>&1
40+
if "%ERRORLEVEL%" == "0" goto init
41+
42+
echo.
43+
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
44+
echo.
45+
echo Please set the JAVA_HOME variable in your environment to match the
46+
echo location of your Java installation.
47+
48+
goto fail
49+
50+
:findJavaFromJavaHome
51+
set JAVA_HOME=%JAVA_HOME:"=%
52+
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
53+
54+
if exist "%JAVA_EXE%" goto init
55+
56+
echo.
57+
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
58+
echo.
59+
echo Please set the JAVA_HOME variable in your environment to match the
60+
echo location of your Java installation.
61+
62+
goto fail
63+
64+
:init
65+
@rem Get command-line arguments, handling Windows variants
66+
67+
if not "%OS%" == "Windows_NT" goto win9xME_args
68+
69+
:win9xME_args
70+
@rem Slurp the command line arguments.
71+
set CMD_LINE_ARGS=
72+
set _SKIP=2
73+
74+
:win9xME_args_slurp
75+
if "x%~1" == "x" goto execute
76+
77+
set CMD_LINE_ARGS=%*
78+
79+
:execute
80+
@rem Setup the command line
81+
82+
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
83+
84+
@rem Execute Gradle
85+
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
86+
87+
:end
88+
@rem End local scope for the variables with windows NT shell
89+
if "%ERRORLEVEL%"=="0" goto mainEnd
90+
91+
:fail
92+
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
93+
rem the _cmd.exe /c_ return code!
94+
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
95+
exit /b 1
96+
97+
:mainEnd
98+
if "%OS%"=="Windows_NT" endlocal
99+
100+
:omega

‎lombok.config

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# This file is generated by the 'io.freefair.lombok' Gradle plugin
2+
config.stopBubbling = true

‎settings.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
rootProject.name = 'sdk-java'
2+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.visual_regression_tracker.sdk_java;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Builder
7+
@Getter
8+
public class Config {
9+
String apiUrl;
10+
String branchName;
11+
String projectId;
12+
String token;
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.visual_regression_tracker.sdk_java;
2+
3+
class TestRunException extends RuntimeException {
4+
public TestRunException(String errorMessage) {
5+
super(errorMessage);
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package io.visual_regression_tracker.sdk_java;
2+
3+
import com.google.gson.Gson;
4+
import io.visual_regression_tracker.sdk_java.dto.BuildDTO;
5+
import io.visual_regression_tracker.sdk_java.dto.TestResultDTO;
6+
import io.visual_regression_tracker.sdk_java.dto.TestRun;
7+
8+
import java.io.IOException;
9+
import java.net.URI;
10+
import java.net.http.HttpClient;
11+
import java.net.http.HttpRequest;
12+
import java.net.http.HttpResponse;
13+
import java.util.HashMap;
14+
import java.util.Map;
15+
16+
public class VisualRegressionTracker {
17+
Config config;
18+
String buildId;
19+
HttpClient client;
20+
21+
public VisualRegressionTracker(Config config) {
22+
this.config = config;
23+
24+
this.client = HttpClient.newHttpClient();
25+
}
26+
27+
void startBuild() throws IOException, InterruptedException {
28+
if (this.buildId == null) {
29+
Map<String, String> data = new HashMap<>();
30+
data.put("projectId", this.config.projectId);
31+
data.put("branchName", this.config.branchName);
32+
33+
HttpRequest request = HttpRequest.newBuilder()
34+
.uri(URI.create(this.config.apiUrl.concat("/builds")))
35+
.header("apiKey", this.config.token)
36+
.header("Content-Type", "application/json")
37+
.POST(HttpRequest.BodyPublishers.ofString(new Gson().toJson(data)))
38+
.build();
39+
40+
HttpResponse<String> response = this.client.send(request, HttpResponse.BodyHandlers.ofString());
41+
BuildDTO buildDTO = new Gson().fromJson(response.body(), BuildDTO.class);
42+
43+
this.buildId = buildDTO.getId();
44+
}
45+
}
46+
47+
TestResultDTO submitTestRun(TestRun testRun) throws IOException, InterruptedException {
48+
Map<String, Object> data = new HashMap<>();
49+
data.put("projectId", this.config.projectId);
50+
data.put("buildId", this.buildId);
51+
data.put("name", testRun.getName());
52+
data.put("imageBase64", testRun.getImageBase64());
53+
data.put("os", testRun.getOs());
54+
data.put("browser", testRun.getBrowser());
55+
data.put("viewport", testRun.getViewport());
56+
data.put("device", testRun.getDevice());
57+
data.put("diffTollerancePercent", testRun.getDiffTollerancePercent());
58+
59+
60+
HttpRequest request = HttpRequest.newBuilder()
61+
.uri(URI.create(this.config.apiUrl.concat("/test")))
62+
.header("apiKey", this.config.token)
63+
.header("Content-Type", "application/json")
64+
.POST(HttpRequest.BodyPublishers.ofString(new Gson().toJson(data)))
65+
.build();
66+
67+
HttpResponse<String> response = this.client.send(request, HttpResponse.BodyHandlers.ofString());
68+
69+
System.out.println(response.body());
70+
return new Gson().fromJson(response.body(), TestResultDTO.class);
71+
}
72+
73+
public void track(TestRun testRun) throws IOException, InterruptedException {
74+
this.startBuild();
75+
76+
TestResultDTO testResultDTO = this.submitTestRun(testRun);
77+
78+
if(testResultDTO.getStatus().equals("new")) {
79+
throw new TestRunException("No baseline: ".concat(testResultDTO.getUrl()));
80+
}
81+
82+
if(testResultDTO.getStatus().equals("unresolved")) {
83+
throw new TestRunException("Difference found: ".concat(testResultDTO.getUrl()));
84+
}
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.visual_regression_tracker.sdk_java.dto;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public
7+
class BuildDTO {
8+
String id;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.visual_regression_tracker.sdk_java.dto;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public
7+
class TestResultDTO {
8+
String url;
9+
String status;
10+
Integer pixelMisMatchCount;
11+
Float diffPercent;
12+
Float diffTollerancePercent;
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.visual_regression_tracker.sdk_java.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
@Builder
8+
@Getter
9+
public class TestRun {
10+
String name;
11+
String imageBase64;
12+
String os;
13+
String browser;
14+
String viewport;
15+
String device;
16+
@Builder.Default
17+
Integer diffTollerancePercent = 1;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.visual_regression_tracker.sdk_java;
2+
3+
import io.visual_regression_tracker.sdk_java.dto.TestRun;
4+
import org.apache.commons.io.FileUtils;
5+
import org.testng.annotations.Test;
6+
7+
import java.io.File;
8+
import java.io.IOException;
9+
import java.util.Base64;
10+
11+
public class Example {
12+
Config config = Config.builder()
13+
.apiUrl("http://localhost:4200")
14+
.branchName("develop")
15+
.projectId("76f0c443-9811-4f4f-b1c2-7c01c5775d9a")
16+
.token("F5Z2H0H2SNMXZVHX0EA4YQM1MGDD")
17+
.build();
18+
19+
@Test
20+
public void asdas() throws IOException, InterruptedException {
21+
VisualRegressionTracker visualRegressionTracker = new VisualRegressionTracker(config);
22+
23+
24+
byte[] fileContent = FileUtils.readFileToByteArray(
25+
new File(
26+
getClass()
27+
.getClassLoader()
28+
.getResource("home_page.png")
29+
.getFile()
30+
));
31+
32+
visualRegressionTracker.track(TestRun.builder()
33+
.name("Java test")
34+
.imageBase64(Base64.getEncoder().encodeToString(fileContent))
35+
.build());
36+
}
37+
}

‎src/test/resources/home_page.png

52.6 KB
Loading

0 commit comments

Comments
 (0)
Please sign in to comment.