diff --git a/CHANGELOG b/CHANGELOG index 50bef0361..af41d0499 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +#TESTAR v2.7.20 (3-Feb-2026) +- Fix android SPY is displayed property +- Add Rect overlap method +- Add Visualizer join method + #TESTAR v2.7.19 (27-Jan-2026) - Bump org.seleniumhq.selenium:selenium-java from 4.39.0 to 4.40.0 - Update devtools dependencies to v144 diff --git a/VERSION b/VERSION index 2e30274b2..12eda4d84 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.7.19 \ No newline at end of file +2.7.20 \ No newline at end of file diff --git a/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java b/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java index 745b82ec7..98c5c4376 100644 --- a/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java +++ b/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2020 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2020 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2020 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2020 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -389,7 +389,7 @@ private void displayWidgetInfo(Widget nodeWidget) { infoPaneRight.add(new JLabel(String.valueOf(selectedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); infoPaneLeft.add(new JLabel("Displayed: ")).setFont(new Font("SansSerif", Font.BOLD, fontSize)); - infoPaneRight.add(new JLabel(String.valueOf(selectedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); + infoPaneRight.add(new JLabel(String.valueOf(displayedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); infoPaneLeft.add(new JLabel("Current Activity: ")).setFont(new Font("SansSerif", Font.BOLD, fontSize)); infoPaneRight.add(new JLabel(String.valueOf(activityWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); diff --git a/core/src/org/testar/monkey/alayer/Rect.java b/core/src/org/testar/monkey/alayer/Rect.java index a933eacfd..117849514 100644 --- a/core/src/org/testar/monkey/alayer/Rect.java +++ b/core/src/org/testar/monkey/alayer/Rect.java @@ -1,6 +1,7 @@ /*************************************************************************************************** * -* Copyright (c) 2013, 2014, 2015, 2016, 2017 Universitat Politecnica de Valencia - www.upv.es +* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es +* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -27,10 +28,6 @@ * POSSIBILITY OF SUCH DAMAGE. *******************************************************************************************************/ - -/** - * @author Sebastian Bauersfeld - */ package org.testar.monkey.alayer; import org.testar.monkey.Assert; @@ -47,6 +44,14 @@ public static boolean intersect(Rect r1, Rect r2) { r2.y() + r2.height() < r1.y()); } + public static boolean overlap(Rect r1, Rect r2) { + Assert.notNull(r1, r2); + return !(r1.x() + r1.width() <= r2.x() || + r1.y() + r1.height() <= r2.y() || + r2.x() + r2.width() <= r1.x() || + r2.y() + r2.height() <= r1.y()); + } + public static boolean contains(Rect r1, Rect r2) { Assert.notNull(r1, r2); return r2.x() >= r1.x() && r2.x() + r2.width() <= r1.x() + r1.width() && @@ -102,7 +107,6 @@ public void paint(Canvas canvas, Pen pen) { canvas.rect(pen, x, y, width, height); } - // by urueda @Override public boolean equals(Object o){ if (o == this) return true; diff --git a/core/src/org/testar/monkey/alayer/Verdict.java b/core/src/org/testar/monkey/alayer/Verdict.java index 82f55a9ef..edf29514b 100644 --- a/core/src/org/testar/monkey/alayer/Verdict.java +++ b/core/src/org/testar/monkey/alayer/Verdict.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -213,7 +213,7 @@ public Verdict join(Verdict verdict) { String joinedInfo = this.info.contains(verdict.info()) ? this.info : (this.severity == Severity.OK.getValue() ? "" : this.info + "\n") + verdict.info(); - Visualizer joinedVisualizer = (this.severity >= verdict.severity()) ? this.visualizer() : verdict.visualizer(); + Visualizer joinedVisualizer = Visualizer.join(this.visualizer(), verdict.visualizer()); return new Verdict(joinedSeverity, joinedInfo, joinedVisualizer); } diff --git a/core/src/org/testar/monkey/alayer/Visualizer.java b/core/src/org/testar/monkey/alayer/Visualizer.java index 1c20c16fe..060a1af41 100644 --- a/core/src/org/testar/monkey/alayer/Visualizer.java +++ b/core/src/org/testar/monkey/alayer/Visualizer.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -31,13 +31,42 @@ package org.testar.monkey.alayer; import java.io.Serializable; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.testar.monkey.Assert; +import org.testar.monkey.Util; + public interface Visualizer extends Serializable { void run(State state, Canvas canvas, Pen pen); default List getShapes() { return Arrays.asList(Rect.from(0, 0, 0, 0)); } + + static Visualizer join(Visualizer first, Visualizer second) { + if (first == second) return first; + if (first == Util.NullVisualizer) return second; + if (second == Util.NullVisualizer) return first; + + return new Visualizer() { + private static final long serialVersionUID = 1L; + + @Override + public void run(State state, Canvas canvas, Pen pen) { + Assert.notNull(state, canvas, pen); + first.run(state, canvas, pen); + second.run(state, canvas, pen); + } + + @Override + public List getShapes() { + ArrayList merged = new ArrayList<>(); + merged.addAll(first.getShapes()); + merged.addAll(second.getShapes()); + return merged; + } + }; + } } diff --git a/core/test/org/testar/monkey/alayer/VerdictTest.java b/core/test/org/testar/monkey/alayer/VerdictTest.java index f2554b7b4..1a5892a16 100644 --- a/core/test/org/testar/monkey/alayer/VerdictTest.java +++ b/core/test/org/testar/monkey/alayer/VerdictTest.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -32,7 +32,11 @@ import static org.junit.Assert.*; +import java.util.Arrays; + import org.junit.Test; +import org.testar.monkey.alayer.visualizers.RegionsVisualizer; +import org.testar.monkey.alayer.visualizers.ShapeVisualizer; public class VerdictTest { @@ -43,10 +47,17 @@ public class VerdictTest { public void run(State s, Canvas c, Pen pen) {} }; - private final Visualizer failVisualizer = new Visualizer(){ - private static final long serialVersionUID = -2732461936562344367L; - public void run(State s, Canvas c, Pen pen) {} - }; + private final Visualizer failVisualizer = new ShapeVisualizer( + Pen.PEN_RED, + Rect.from(0, 0, 10, 10), + "Fail Visualizer", + 0.5, 0.5); + + private final Visualizer issueVisualizer = new RegionsVisualizer( + Pen.PEN_RED, + Arrays.asList(Rect.from(0, 0, 10, 10)), + "Issue Visualizer", + 0.5, 0.5); @Test public void testToString() { @@ -60,6 +71,7 @@ public void testJoin() { Verdict v1 = new Verdict(Verdict.Severity.OK, "Foo Bar"); Verdict v2 = new Verdict(Verdict.Severity.FAIL, "Bar", failVisualizer); Verdict v3 = new Verdict(Verdict.Severity.OK, "Baz", dummyVisualizer); + Verdict v4 = new Verdict(Verdict.Severity.FAIL, "Exception", issueVisualizer); assertTrue("Joining two Verdicts shall create a new Verdict", v1 != v1.join(v2)); @@ -79,11 +91,17 @@ public void testJoin() { "then both infos shall be included separated by a line break", "Bar\nBaz", v2.join(v3).info()); - assertTrue("Joining two Verdicts shall use the Visualizer of the Verdict with high severity", + assertTrue("Joining an OK and Fail Verdicts shall use the Visualizer of the Verdict with high severity", v2.join(v1).visualizer() == failVisualizer); - assertTrue("Joining two Verdicts shall use the Visualizer of the Verdict with high severity", + assertTrue("Joining an OK and Fail Verdicts shall use the Visualizer of the Verdict with high severity", v1.join(v2).visualizer() == failVisualizer); + + assertTrue("Joining Fail and Issue Verdicts must contain Fail Shapes", + v2.join(v4).visualizer().getShapes().containsAll(failVisualizer.getShapes())); + + assertTrue("Joining Fail and Issue Verdicts must contain Issue Shapes", + v2.join(v4).visualizer().getShapes().containsAll(issueVisualizer.getShapes())); } @Test diff --git a/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java b/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java index 8ed0eecad..cbbdd388c 100644 --- a/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java +++ b/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java @@ -1,6 +1,6 @@ /** - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl - * Copyright (c) 2019 - 2025 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl + * Copyright (c) 2019 - 2026 Universitat Politecnica de Valencia - www.upv.es * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -227,6 +227,8 @@ private boolean containsVerdictInfo(List listOfDetectedErroneousVerdicts } public Verdict leafWidgetsOverlapping(State state) { + Verdict finalVerdict = Verdict.OK; + // Prepare a list that contains all the Rectangles from the leaf widgets List> leafWidgetsRects = new ArrayList<>(); for (Widget w : state) { @@ -242,7 +244,7 @@ public Verdict leafWidgetsOverlapping(State state) { Rect rectOne = leafWidgetsRects.get(i).right(); Rect rectTwo = leafWidgetsRects.get(j).right(); - if (Rect.intersect(rectOne, rectTwo)) { + if (Rect.overlap(rectOne, rectTwo)) { Widget firstWidget = leafWidgetsRects.get(i).left(); Widget secondWidget = leafWidgetsRects.get(j).left(); @@ -259,12 +261,16 @@ public Verdict leafWidgetsOverlapping(State state) { "Invariant Fault", 0.5, 0.5); - return new Verdict(Verdict.Severity.WARNING_UI_VISUAL_OR_RENDERING_FAULT, verdictMsg, visualizer); + Verdict clashVerdict = new Verdict( + Verdict.Severity.WARNING_UI_VISUAL_OR_RENDERING_FAULT, + verdictMsg, + visualizer); + finalVerdict = finalVerdict.join(clashVerdict); } } } - return Verdict.OK; + return finalVerdict; } private Pen getRedPen() { diff --git a/testar/src/org/testar/monkey/Main.java b/testar/src/org/testar/monkey/Main.java index 675099dd5..697540641 100644 --- a/testar/src/org/testar/monkey/Main.java +++ b/testar/src/org/testar/monkey/Main.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -62,7 +62,7 @@ public class Main { - public static final String TESTAR_VERSION = "v2.7.19 (27-Jan-2026)"; + public static final String TESTAR_VERSION = "v2.7.20 (3-Feb-2026)"; //public static final String TESTAR_DIR_PROPERTY = "DIRNAME"; //Use the OS environment to obtain TESTAR directory public static final String SETTINGS_FILE = "test.settings"; diff --git a/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java b/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java index 4f6b0c4b1..d9537b5a6 100644 --- a/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java +++ b/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2022 - 2025 Open Universiteit - www.ou.nl - * Copyright (c) 2022 - 2025 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2022 - 2026 Open Universiteit - www.ou.nl + * Copyright (c) 2022 - 2026 Universitat Politecnica de Valencia - www.upv.es * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java b/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java index c7db07718..c8419d761 100644 --- a/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java +++ b/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2022 - 2025 Open Universiteit - www.ou.nl - * Copyright (c) 2022 - 2025 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2022 - 2026 Open Universiteit - www.ou.nl + * Copyright (c) 2022 - 2026 Universitat Politecnica de Valencia - www.upv.es * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: