Skip to content

Commit bb1529f

Browse files
authored
Merge pull request #469 from TESTARtool/dependabot/gradle/org.seleniumhq.selenium-selenium-java-4.41.0
Bump org.seleniumhq.selenium:selenium-java from 4.40.0 to 4.41.0
2 parents dae9961 + 1b087de commit bb1529f

9 files changed

Lines changed: 104 additions & 11 deletions

File tree

CHANGELOG

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#TESTAR v2.7.21 (24-Feb-2026)
2+
- Bump org.seleniumhq.selenium:selenium-java from 4.40.0 to 4.41.0
3+
- Update devtools dependencies to v145
4+
- Ignore dynamic numbers when deduplicating AndroidLogcatOracle messages
5+
6+
17
#TESTAR v2.7.21 (17-Feb-2026)
28
- Add logic to detect Android logcat suspicious messages
39
- Refactor the GenerateMode logic to report initialState issues

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.7.21
1+
2.7.22

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ subprojects {
3333
implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.15.0'
3434
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.15.0'
3535
// https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
36-
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.40.0'
36+
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.41.0'
3737
// https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager
3838
implementation group: 'io.github.bonigarcia', name: 'webdrivermanager', version: '6.3.3'
3939
// https://mvnrepository.com/artifact/io.appium/java-client

testar/resources/settings/webdriver_security_analysis/Protocol_webdriver_security_analysis.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.openqa.selenium.WebElement;
3434
import org.openqa.selenium.devtools.DevTools;
3535
import org.openqa.selenium.devtools.HasDevTools;
36-
import org.openqa.selenium.devtools.v144.network.Network;
36+
import org.openqa.selenium.devtools.v145.network.Network;
3737
import org.openqa.selenium.interactions.Actions;
3838
import org.openqa.selenium.remote.RemoteWebDriver;
3939
import org.testar.SutVisualization;

testar/src/org/testar/monkey/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464

6565
public class Main {
6666

67-
public static final String TESTAR_VERSION = "v2.7.21 (17-Feb-2026)";
67+
public static final String TESTAR_VERSION = "v2.7.22 (24-Feb-2026)";
6868

6969
//public static final String TESTAR_DIR_PROPERTY = "DIRNAME"; //Use the OS environment to obtain TESTAR directory
7070
public static final String SETTINGS_FILE = "test.settings";

testar/src/org/testar/oracles/log/AndroidLogcatOracle.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,22 +185,52 @@ private List<String> detectRegexMatches(List<String> lines, String regex) {
185185

186186
// logcat threadtime format:
187187
// 02-09 08:59:33.844 17550 17575 E Accessibility exception content...
188-
private static final Pattern THREADTIME_PATTERN = Pattern.compile(
188+
private final Pattern THREADTIME_PATTERN = Pattern.compile(
189189
"^\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\s+\\d+\\s+\\d+\\s+([VDIWEAF])\\s+([^:]+):\\s*(.*)$"
190190
);
191191

192-
private static String normalizeThreadtimeLine(String line) {
192+
private String normalizeThreadtimeLine(String line) {
193193
if (line == null) return "";
194194
line = line.trim();
195195
Matcher m = THREADTIME_PATTERN.matcher(line);
196196
if (!m.matches()) {
197-
return line.replaceAll("\\s+", " ");
197+
return normalizeNumbers(line.replaceAll("\\s+", " "));
198198
}
199199

200200
String tag = m.group(2).trim();
201-
String msg = m.group(3).trim().replaceAll("\\s+", " ");
201+
String msg = normalizeNumbers(m.group(3).trim().replaceAll("\\s+", " "));
202202

203203
return tag + ": " + msg;
204204
}
205205

206+
private String normalizeNumbers(String text) {
207+
if (text == null || text.isEmpty()) {
208+
return "";
209+
}
210+
Matcher matcher = Pattern.compile("\\d+").matcher(text);
211+
StringBuffer sb = new StringBuffer();
212+
while (matcher.find()) {
213+
String num = matcher.group();
214+
if (isHttpFailureStatus(num)) {
215+
matcher.appendReplacement(sb, num);
216+
} else {
217+
matcher.appendReplacement(sb, "<num>");
218+
}
219+
}
220+
matcher.appendTail(sb);
221+
return sb.toString();
222+
}
223+
224+
private boolean isHttpFailureStatus(String num) {
225+
if (num.length() != 3) {
226+
return false;
227+
}
228+
try {
229+
int value = Integer.parseInt(num);
230+
return value >= 300 && value <= 599;
231+
} catch (NumberFormatException e) {
232+
return false;
233+
}
234+
}
235+
206236
}

testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
package org.testar.securityanalysis.oracles;
3232

3333
import org.openqa.selenium.devtools.DevTools;
34-
import org.openqa.selenium.devtools.v144.network.Network;
35-
import org.openqa.selenium.devtools.v144.network.model.Headers;
34+
import org.openqa.selenium.devtools.v145.network.Network;
35+
import org.openqa.selenium.devtools.v145.network.model.Headers;
3636
import org.testar.monkey.alayer.Verdict;
3737
import org.testar.monkey.alayer.webdriver.WdDriver;
3838
import org.testar.securityanalysis.NetworkCollector;

testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
package org.testar.securityanalysis.oracles;
3232

3333
import org.openqa.selenium.devtools.DevTools;
34-
import org.openqa.selenium.devtools.v144.network.Network;
34+
import org.openqa.selenium.devtools.v145.network.Network;
3535
import org.openqa.selenium.remote.RemoteWebDriver;
3636
import org.testar.monkey.alayer.*;
3737
import org.testar.monkey.alayer.actions.WdSecurityInjectionAction;

testar/test/org/testar/oracles/log/TestAndroidLogcatOracle.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,63 @@ public void generateModeVerdict_DeduplicatesAndOrdersMatches() {
146146
}
147147
}
148148

149+
@Test
150+
public void generateModeVerdict_DeduplicatesNumbersInMatches() {
151+
OutputStructure.logsOutputDir = Path.of("target").toString();
152+
OutputStructure.startInnerLoopDateString = "YYYY-MM-DD_hh-mm-ss";
153+
OutputStructure.executedSUTname = "test-sut";
154+
155+
Settings settings = buildSettings(RuntimeControlsProtocol.Modes.Generate, "(?i)(.*Exception.*)");
156+
AndroidLogcatOracle androidLogcatOracle = new AndroidLogcatOracle(settings);
157+
State state = Mockito.mock(State.class);
158+
159+
String line1 = "02-09 08:59:33.844 17550 17575 E ViewRootImpl: Exception @1:207875, unable to find 3421 viewState";
160+
String line2 = "02-09 08:59:33.845 17550 17575 E ViewRootImpl: Exception @1:204868, unable to find 9008 viewState";
161+
162+
try (MockedStatic<AndroidAppiumFramework> mocked = Mockito.mockStatic(AndroidAppiumFramework.class)) {
163+
mocked.when(AndroidAppiumFramework::getAppPackageFromCapabilitiesOrCurrent).thenReturn("org.testar.app");
164+
mocked.when(() -> AndroidAppiumFramework.dumpLogcatThreadtimeForPackage("org.testar.app"))
165+
.thenReturn(line1 + "\n" + line2);
166+
167+
androidLogcatOracle.initialize();
168+
Verdict verdict = androidLogcatOracle.getVerdict(state);
169+
170+
Assert.assertEquals(Verdict.Severity.SUSPICIOUS_LOG.getValue(), verdict.severity(), 0.0);
171+
String expected = "Suspicious Android logcat line(s) detected "
172+
+ "ViewRootImpl: Exception @<num>:<num>, unable to find <num> viewState";
173+
Assert.assertEquals(expected, verdict.info());
174+
}
175+
}
176+
177+
@Test
178+
public void generateModeVerdict_KeepsHttpStatusCodes() {
179+
OutputStructure.logsOutputDir = Path.of("target").toString();
180+
OutputStructure.startInnerLoopDateString = "YYYY-MM-DD_hh-mm-ss";
181+
OutputStructure.executedSUTname = "test-sut";
182+
183+
Settings settings = buildSettings(RuntimeControlsProtocol.Modes.Generate, "(?i)(.*Exception.*)");
184+
AndroidLogcatOracle androidLogcatOracle = new AndroidLogcatOracle(settings);
185+
State state = Mockito.mock(State.class);
186+
187+
String line1 = "02-09 08:59:33.844 17550 17575 E ViewRootImpl: Exception, http status 404";
188+
String line2 = "02-09 08:59:33.845 17550 17575 E ViewRootImpl: Exception, http status 503";
189+
190+
try (MockedStatic<AndroidAppiumFramework> mocked = Mockito.mockStatic(AndroidAppiumFramework.class)) {
191+
mocked.when(AndroidAppiumFramework::getAppPackageFromCapabilitiesOrCurrent).thenReturn("org.testar.app");
192+
mocked.when(() -> AndroidAppiumFramework.dumpLogcatThreadtimeForPackage("org.testar.app"))
193+
.thenReturn(line1 + "\n" + line2);
194+
195+
androidLogcatOracle.initialize();
196+
Verdict verdict = androidLogcatOracle.getVerdict(state);
197+
198+
Assert.assertEquals(Verdict.Severity.SUSPICIOUS_LOG.getValue(), verdict.severity(), 0.0);
199+
String expected = "Suspicious Android logcat line(s) detected "
200+
+ "ViewRootImpl: Exception, http status 404"
201+
+ " | ViewRootImpl: Exception, http status 503";
202+
Assert.assertEquals(expected, verdict.info());
203+
}
204+
}
205+
149206
private Settings buildSettings(RuntimeControlsProtocol.Modes mode, String regex) {
150207
List<Pair<?, ?>> tags = new ArrayList<>();
151208
tags.add(Pair.from(ConfigTags.Mode, mode));

0 commit comments

Comments
 (0)