Skip to content

Commit 6131a92

Browse files
Piotr Zawadzkizawadz88
authored andcommitted
- added sanity unit tests
- added Checkstyle, PMD, Findbugs, unit tests (+ test coverage) & Lint checks - fixed issues reported after running the checks above
1 parent f94d5d7 commit 6131a92

25 files changed

+691
-48
lines changed

.travis.yml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
language: android
22
jdk: oraclejdk8
33
sudo: false
4+
45
env:
56
global:
67
- ANDROID_API_LEVEL=25
78
- ANDROID_BUILD_TOOLS_VERSION=25.0.2
9+
810
android:
911
components:
1012
# use the latest revision of Android SDK Tools
13+
- tools
14+
1115
- platform-tools
1216
- tools
1317

1418
# The BuildTools version used by your project
1519
- build-tools-${ANDROID_BUILD_TOOLS_VERSION}
1620

21+
# Android platform
1722
- android-${ANDROID_API_LEVEL}
1823

1924
# Support library
2025
- extra-android-support
26+
2127
# Latest artifacts in local repository
2228
- extra-google-m2repository
2329
- extra-android-m2repository
@@ -26,4 +32,17 @@ before_script:
2632
- printf 'bintray.user=dummy_user\nbintray.apikey=dummy_api_key' > local.properties
2733

2834
script:
29-
- ./gradlew assembleDebug
35+
- ./gradlew check
36+
37+
after_success:
38+
- bash <(curl -s https://codecov.io/bash)
39+
40+
after_failure:
41+
- echo 'Checkstyle report:'
42+
- cat material-stepper/build/reports/checkstyle/checkstyle.xml || echo "Report missing"
43+
- echo 'Findbugs report:'
44+
- cat material-stepper/build/reports/findbugs/findbugs.xml || echo "Report missing"
45+
- echo 'PMD report:'
46+
- cat material-stepper/build/reports/pmd/pmd.xml || echo "Report missing"
47+
- echo 'Lint report:'
48+
- cat material-stepper/build/reports/lint-results.xml || echo "Report missing"

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ configure(allprojects) {
2525
androidBuildToolsVersion = "25.0.2"
2626
androidSupportLibraryVersion = "25.2.0"
2727

28+
junitVersion = "4.12"
29+
mockitoVersion = "1.10.19"
30+
robolectricVersion = "3.3.1"
31+
assertjVersion = "1.1.1"
32+
2833
/* Sample only */
2934
butterknifeVersion = "7.0.1"
3035
calligraphyVersion = "2.2.0"
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
<?xml version="1.0"?>
2+
<!DOCTYPE module PUBLIC
3+
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
4+
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
5+
6+
<module name = "Checker">
7+
8+
<property name="charset" value="UTF-8"/>
9+
10+
<property name="severity" value="error"/>
11+
12+
<module name="FileTabCharacter">
13+
<property name="eachLine" value="true"/>
14+
</module>
15+
16+
<module name="TreeWalker">
17+
18+
<!-- Imports -->
19+
20+
<module name="RedundantImport">
21+
<property name="severity" value="error"/>
22+
</module>
23+
24+
<module name="AvoidStarImport">
25+
<property name="severity" value="error"/>
26+
</module>
27+
28+
<!-- General Code Style -->
29+
30+
<module name="LineLength">
31+
<property name="max" value="150"/>
32+
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
33+
</module>
34+
35+
<module name="EmptyBlock">
36+
<property name="option" value="TEXT"/>
37+
<property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
38+
</module>
39+
40+
<module name="EmptyCatchBlock">
41+
<property name="exceptionVariableName" value="expected"/>
42+
</module>
43+
44+
<module name="LeftCurly">
45+
<property name="maxLineLength" value="100"/>
46+
</module>
47+
48+
<module name="RightCurly">
49+
<property name="option" value="alone"/>
50+
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
51+
</module>
52+
53+
<module name="RightCurly">
54+
<property name="option" value="same"/>
55+
</module>
56+
57+
<module name="NoFinalizer"/>
58+
59+
<module name="ArrayTypeStyle"/>
60+
61+
<module name="ModifierOrder"/>
62+
63+
<module name="Indentation">
64+
<property name="basicOffset" value="4"/>
65+
<property name="braceAdjustment" value="0"/>
66+
<property name="caseIndent" value="4"/>
67+
<property name="throwsIndent" value="4"/>
68+
<property name="lineWrappingIndentation" value="8"/>
69+
<property name="arrayInitIndent" value="2"/>
70+
</module>
71+
72+
<!-- White Space -->
73+
74+
<module name="GenericWhitespace">
75+
<message key="ws.followed"
76+
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
77+
<message key="ws.preceded"
78+
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
79+
<message key="ws.illegalFollow"
80+
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
81+
<message key="ws.notPreceded"
82+
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
83+
</module>
84+
85+
<module name="WhitespaceAround">
86+
<property name="allowEmptyConstructors" value="true"/>
87+
<property name="allowEmptyMethods" value="false"/>
88+
<property name="allowEmptyTypes" value="false"/>
89+
<property name="allowEmptyLoops" value="false"/>
90+
<message key="ws.notFollowed"
91+
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
92+
<message key="ws.notPreceded"
93+
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
94+
<property name="severity" value="error"/>
95+
</module>
96+
97+
<module name="WhitespaceAfter">
98+
<property name="tokens" value="COMMA, SEMI, TYPECAST"/>
99+
</module>
100+
101+
<module name="NoWhitespaceBefore">
102+
<property name="tokens" value="SEMI, DOT, POST_DEC, POST_INC"/>
103+
<property name="allowLineBreaks" value="true"/>
104+
</module>
105+
106+
<module name="NoWhitespaceAfter">
107+
<property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS"/>
108+
<property name="allowLineBreaks" value="true"/>
109+
</module>
110+
111+
<!-- Naming -->
112+
113+
<module name="PackageName">
114+
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
115+
<message key="name.invalidPattern"
116+
value="Package name ''{0}'' must match pattern ''{1}''."/>
117+
</module>
118+
119+
<module name="MethodName">
120+
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
121+
<message key="name.invalidPattern"
122+
value="Method name ''{0}'' must match pattern ''{1}''."/>
123+
</module>
124+
125+
<module name="TypeName">
126+
<message key="name.invalidPattern"
127+
value="Type name ''{0}'' must match pattern ''{1}''."/>
128+
</module>
129+
130+
<module name="MemberName">
131+
<property name="applyToPublic" value="false" />
132+
<property name="applyToPackage" value="false" />
133+
<property name="applyToProtected" value="false" />
134+
<property name="format" value="^m[A-Z][a-z0-9][a-zA-Z0-9]*$"/>
135+
<message key="name.invalidPattern"
136+
value="Member name ''{0}'' must match pattern ''{1}''."/>
137+
</module>
138+
139+
<module name="ParameterName">
140+
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
141+
<message key="name.invalidPattern"
142+
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
143+
</module>
144+
145+
<module name="LocalVariableName">
146+
<property name="tokens" value="VARIABLE_DEF"/>
147+
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
148+
<property name="allowOneCharVarInForLoop" value="true"/>
149+
<message key="name.invalidPattern"
150+
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
151+
</module>
152+
153+
<module name="ClassTypeParameterName">
154+
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
155+
<message key="name.invalidPattern"
156+
value="Class type name ''{0}'' must match pattern ''{1}''."/>
157+
</module>
158+
159+
<module name="MethodTypeParameterName">
160+
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
161+
<message key="name.invalidPattern"
162+
value="Method type name ''{0}'' must match pattern ''{1}''."/>
163+
</module>
164+
165+
</module>
166+
167+
</module>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<FindBugsFilter>
3+
<Match>
4+
<Class name="~.*\.R\$.*"/>
5+
</Match>
6+
<Match>
7+
<Class name="~.*\.Manifest\$.*"/>
8+
</Match>
9+
<!-- All bugs in test classes, except for JUnit-specific bugs -->
10+
<Match>
11+
<Class name="~.*\.*Test" />
12+
<Not>
13+
<Bug code="IJU" />
14+
</Not>
15+
</Match>
16+
17+
18+
</FindBugsFilter>

config/quality/pmd/pmd-ruleset.xml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version="1.0"?>
2+
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Android Application Rules"
3+
xmlns="http://pmd.sf.net/ruleset/1.0.0"
4+
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
5+
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd">
6+
7+
<description>Custom ruleset for Material Stepper</description>
8+
9+
<exclude-pattern>.*/R.java</exclude-pattern>
10+
<exclude-pattern>.*/gen/.*</exclude-pattern>
11+
12+
<rule ref="rulesets/java/android.xml" />
13+
<rule ref="rulesets/java/clone.xml" />
14+
<rule ref="rulesets/java/finalizers.xml" />
15+
<rule ref="rulesets/java/imports.xml">
16+
<!-- Espresso is designed this way !-->
17+
<exclude name="TooManyStaticImports" />
18+
</rule>
19+
<rule ref="rulesets/java/logging-java.xml">
20+
<!-- This rule wasn't working properly and given errors in every var call info -->
21+
<exclude name="GuardLogStatementJavaUtil" />
22+
</rule>
23+
<rule ref="rulesets/java/braces.xml">
24+
<!-- We allow single line if's without braces -->
25+
<exclude name="IfStmtsMustUseBraces" />
26+
</rule>
27+
<rule ref="rulesets/java/strings.xml" >
28+
<!-- Exclude because causes problems with SQL Strings that usually require duplication -->
29+
<exclude name="AvoidDuplicateLiterals"/>
30+
</rule>
31+
<rule ref="rulesets/java/basic.xml" />
32+
<rule ref="rulesets/java/naming.xml">
33+
<exclude name="AbstractNaming" />
34+
<exclude name="LongVariable" />
35+
<exclude name="ShortMethodName" />
36+
<exclude name="ShortVariable" />
37+
<exclude name="ShortClassName" />
38+
<exclude name="VariableNamingConventions" />
39+
</rule>
40+
</ruleset>

config/quality/quality.gradle

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/**
2+
* Set up Checkstyle, Findbugs and PMD to perform extensive code analysis.
3+
*
4+
* Gradle tasks added:
5+
* - checkstyle
6+
* - findbugs
7+
* - pmd
8+
*
9+
* The three tasks above are added as dependencies of the check task so running check will
10+
* run all of them.
11+
*/
12+
13+
apply plugin: 'checkstyle'
14+
apply plugin: 'findbugs'
15+
apply plugin: 'pmd'
16+
17+
dependencies {
18+
checkstyle 'com.puppycrawl.tools:checkstyle:6.11.1'
19+
}
20+
21+
def qualityConfigDir = "$project.rootDir/config/quality";
22+
def reportsDir = "$project.buildDir/reports"
23+
24+
task checkstyle(type: Checkstyle, group: 'Verification', description: 'Runs code style checks') {
25+
configFile file("$qualityConfigDir/checkstyle/checkstyle-config.xml")
26+
source 'src/main'
27+
include '**/*.java'
28+
29+
reports {
30+
xml.enabled = true
31+
xml {
32+
destination "$reportsDir/checkstyle/checkstyle.xml"
33+
}
34+
}
35+
36+
classpath = files( )
37+
}
38+
39+
task findbugs(type: FindBugs,
40+
group: 'Verification',
41+
description: 'Inspect java bytecode for bugs',
42+
dependsOn: ['compileDebugSources','compileReleaseSources']) {
43+
44+
ignoreFailures = false
45+
effort = "max"
46+
reportLevel = "high"
47+
excludeFilter = new File("$qualityConfigDir/findbugs/android-exclude-filter.xml")
48+
classes = files("$project.rootDir/material-stepper/build/intermediates/classes")
49+
50+
source 'src/main'
51+
include '**/*.java'
52+
exclude '**/gen/**'
53+
54+
reports {
55+
xml.enabled = true
56+
html.enabled = false
57+
xml {
58+
destination "$reportsDir/findbugs/findbugs.xml"
59+
}
60+
html {
61+
destination "$reportsDir/findbugs/findbugs.html"
62+
}
63+
}
64+
65+
classpath = files()
66+
}
67+
68+
69+
task pmd(type: Pmd, group: 'Verification', description: 'Inspect sourcecode for bugs') {
70+
ruleSetFiles = files("$qualityConfigDir/pmd/pmd-ruleset.xml")
71+
ignoreFailures = false
72+
ruleSets = []
73+
74+
source 'src/main'
75+
include '**/*.java'
76+
exclude '**/gen/**'
77+
78+
reports {
79+
xml.enabled = true
80+
html.enabled = true
81+
xml {
82+
destination "$reportsDir/pmd/pmd.xml"
83+
}
84+
html {
85+
destination "$reportsDir/pmd/pmd.html"
86+
}
87+
}
88+
}

0 commit comments

Comments
 (0)