From 3a9004244f42fd251e921f16dfead1d838640524 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 18 Jun 2024 12:34:50 -0400 Subject: [PATCH 01/36] HPCC-31857 : Develop an automated ECL Watch Test Suite Developed a testing framework using Java, Selenium, and TestNG. The framework is initiated by TestRunner.java, which loads all test classes listed in config/TestClasses.java and executes them sequentially. Each test class contains at least one method annotated with @test, which serves as the entry point for the tests. Initial test cases cover the Activities and ECL Workunit pages, including tests for text presence, link functionality, and sorting order. Additionally, provided comprehensive documentation with UML diagrams and detailed explanations of each method within the classes. Signed-off-by: Nisha Bagdwal --- esp/src/test-ui/tests/framework/README.md | 11 + .../test-ui/tests/framework/TestRunner.java | 98 ++++ .../tests/framework/config/Config.java | 20 + .../tests/framework/config/TestClasses.java | 13 + .../documentation/ActivitiesTest.png | Bin 0 -> 15534 bytes .../documentation/ApplicationValue.png | Bin 0 -> 2919 bytes .../documentation/ApplicationValues.png | Bin 0 -> 2566 bytes .../framework/documentation/BaseTableTest.png | Bin 0 -> 128722 bytes .../tests/framework/documentation/Common.png | Bin 0 -> 6174 bytes .../tests/framework/documentation/Config.png | Bin 0 -> 13193 bytes .../framework/documentation/DesignDocument.md | 464 ++++++++++++++++++ .../documentation/ECLWorkUnitsTest.png | Bin 0 -> 21757 bytes .../framework/documentation/ECLWorkunit.png | Bin 0 -> 21832 bytes .../framework/documentation/LoggerHolder.png | Bin 0 -> 2861 bytes .../documentation/NavigationWebElement.png | Bin 0 -> 10506 bytes .../framework/documentation/TestClass.png | Bin 0 -> 3296 bytes .../framework/documentation/TestClasses.png | Bin 0 -> 2324 bytes .../framework/documentation/TestInjector.png | Bin 0 -> 10050 bytes .../framework/documentation/TestRunner.png | Bin 0 -> 3979 bytes .../framework/documentation/TimeUtils.png | Bin 0 -> 6626 bytes .../documentation/WUQueryResponse.png | Bin 0 -> 12328 bytes .../framework/documentation/WUQueryRoot.png | Bin 0 -> 4085 bytes .../documentation/WebDriverHolder.png | Bin 0 -> 3135 bytes .../framework/documentation/Workunits.png | Bin 0 -> 4176 bytes .../framework/documentation/relationship.png | Bin 0 -> 4857 bytes .../framework/model/ApplicationValue.java | 15 + .../framework/model/ApplicationValues.java | 11 + .../tests/framework/model/ECLWorkunit.java | 100 ++++ .../framework/model/NavigationWebElement.java | 14 + .../tests/framework/model/TestClass.java | 16 + .../framework/model/WUQueryResponse.java | 55 +++ .../tests/framework/model/WUQueryRoot.java | 12 + .../tests/framework/model/Workunits.java | 15 + .../tests/framework/pages/ActivitiesTest.java | 117 +++++ .../tests/framework/pages/BaseTableTest.java | 310 ++++++++++++ .../framework/pages/ECLWorkUnitsTest.java | 155 ++++++ .../tests/framework/setup/LoggerHolder.java | 16 + .../tests/framework/setup/TestInjector.java | 31 ++ .../framework/setup/WebDriverHolder.java | 15 + .../tests/framework/utility/Common.java | 45 ++ .../tests/framework/utility/TimeUtils.java | 63 +++ 41 files changed, 1596 insertions(+) create mode 100644 esp/src/test-ui/tests/framework/README.md create mode 100644 esp/src/test-ui/tests/framework/TestRunner.java create mode 100644 esp/src/test-ui/tests/framework/config/Config.java create mode 100644 esp/src/test-ui/tests/framework/config/TestClasses.java create mode 100644 esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValue.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValues.png create mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Config.png create mode 100644 esp/src/test-ui/tests/framework/documentation/DesignDocument.md create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png create mode 100644 esp/src/test-ui/tests/framework/documentation/LoggerHolder.png create mode 100644 esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestClass.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestClasses.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestInjector.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestRunner.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TimeUtils.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryResponse.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryRoot.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Workunits.png create mode 100644 esp/src/test-ui/tests/framework/documentation/relationship.png create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValue.java create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValues.java create mode 100644 esp/src/test-ui/tests/framework/model/ECLWorkunit.java create mode 100644 esp/src/test-ui/tests/framework/model/NavigationWebElement.java create mode 100644 esp/src/test-ui/tests/framework/model/TestClass.java create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryResponse.java create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryRoot.java create mode 100644 esp/src/test-ui/tests/framework/model/Workunits.java create mode 100644 esp/src/test-ui/tests/framework/pages/ActivitiesTest.java create mode 100644 esp/src/test-ui/tests/framework/pages/BaseTableTest.java create mode 100644 esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java create mode 100644 esp/src/test-ui/tests/framework/setup/LoggerHolder.java create mode 100644 esp/src/test-ui/tests/framework/setup/TestInjector.java create mode 100644 esp/src/test-ui/tests/framework/setup/WebDriverHolder.java create mode 100644 esp/src/test-ui/tests/framework/utility/Common.java create mode 100644 esp/src/test-ui/tests/framework/utility/TimeUtils.java diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md new file mode 100644 index 00000000000..0f56ebe39b8 --- /dev/null +++ b/esp/src/test-ui/tests/framework/README.md @@ -0,0 +1,11 @@ +Project: An Automated ECL Watch Test Suite + +This project's code begins with the TestRunner.java file. The main method in this class loads all the Java classes +created for writing test cases for specific web pages of the ECL Watch UI and then runs the tests in those classes +sequentially. + +The names of the Java classes that the TestRunner class needs to load should be listed in the config/TestClasses.java +file. + +Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The +code for each class starts to run from this method. \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java new file mode 100644 index 00000000000..3be28b05a87 --- /dev/null +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -0,0 +1,98 @@ +package framework; + +import framework.config.Config; +import framework.config.TestClasses; +import framework.model.TestClass; +import framework.setup.TestInjector; +import framework.utility.Common; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.TestNG; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +public class TestRunner { + public static void main(String[] args) { + + Logger logger = setupLogger(); + WebDriver driver = setupWebDriver(); + + TestNG testng = new TestNG(); + testng.setTestClasses(loadClasses()); + testng.addListener(new TestInjector(logger, driver)); + testng.run(); + driver.quit(); + } + + private static WebDriver setupWebDriver() { + + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window. + chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome. + chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only. + + System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver + + WebDriver driver; + + if (Common.isRunningOnLocal()) { + System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable. + try { + driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } else { + System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); + driver = new ChromeDriver(chromeOptions); + } + + //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities(); + //String browserName = caps.getBrowserName(); + //String browserVersion = caps.getBrowserVersion(); + //System.out.println(browserName+" "+browserVersion); + + return driver; + } + + private static Class[] loadClasses() { + + List> classes = new ArrayList<>(); + for (TestClass testClass : TestClasses.testClassesList) { + try { + classes.add(Class.forName(testClass.getPath())); + } catch (ClassNotFoundException e) { + System.err.println(e.getMessage()); + } + } + + return classes.toArray(new Class[0]); + } + + private static Logger setupLogger() { + Logger logger = Logger.getLogger(TestRunner.class.getName()); + try { + FileHandler fileHandler = new FileHandler(Config.LOG_FILE); + SimpleFormatter formatter = new SimpleFormatter(); + fileHandler.setFormatter(formatter); + logger.addHandler(fileHandler); + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + } catch (IOException e) { + System.err.println("Failed to setup logger: " + e.getMessage()); + } + + Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver. + return logger; + } +} diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java new file mode 100644 index 00000000000..98b8311ac28 --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -0,0 +1,20 @@ +package framework.config; + +public class Config { + + public static final String LOG_FILE = "errorLog.log"; + public static final String LOCAL_OS = "Windows"; + public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha"; + public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"; + public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver"; + public static final String PATH_LOCAL_WORKUNITS_JSON = "C:/Users/nisha/Documents/Internship/Work/files/workunits.json"; + public static final String PATH_GH_ACTION_WORKUNITS_JSON = ""; + public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub"; + public static final String LOCAL_IP = "http://192.168.0.221:8010/"; + public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/"; + public static final String ACTIVITIES_URL = "esp/files/index.html#/activities"; + public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits"; + public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000}; + public static final int MALFORMED_TIME_STRING = -1; + public static final int WAIT_TIME_IN_SECONDS = 4; +} diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java new file mode 100644 index 00000000000..2a1a3fb1faf --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/TestClasses.java @@ -0,0 +1,13 @@ +package framework.config; + +import framework.model.TestClass; + +import java.util.List; + +public class TestClasses { + + public static final List testClassesList = List.of( + //new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), + new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest") + ); +} diff --git a/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png b/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b17514907881bf55ec3e7d592f0893847d9c4d GIT binary patch literal 15534 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�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 NIpuBPKfU)a{{z3MCF}qI literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png new file mode 100644 index 0000000000000000000000000000000000000000..47bb55d8d921f2c9f7655e61ff28cd0c7a022b7c GIT binary patch literal 2919 zcmd^BaZnTK6<@?@sTCP&JD$v(-q_A%#_JrmG*-Zba&Rc8l2crA1_NHTQi%nQB?J<) zXzSE-(CT@msYntnLe5P{=7gYRNy43XSUE2d!?Gn10wM+yl2}5rCLy7_;B}_sIn#Fh z<7RIE*!kw$?|bjSaEA<8-5gI zDlaj3%NezUqb0IU zjKJ!5H(L*>1N`zEMMF}EVEZ!(J_EJxKqGxk*Jk&jY3;-73;b8Ccw+#WGN{=IM5F5! zrADFtdK$#B`<11v2P4H9iTa#SRskBh8b=@)GC_`_% z*>pP7du%#-+BuTj);_4;ZBbToa2WF+GDZB)gfg_HJzXR)UbqN~?+t zWibq`O*l}%2eJD{#6_-AT7{>Jtmtk|WYa0k5Irz=w~V23{sGnSxn^x?GAQSD4i{hh zIR{18QNLrys*Is^)vhaue4yI3yAb2IX~(asgW#h(O(G9j=3iKn3&AktE?q#>_-g^u zd4XF>CQ7rH=um=sGGi?BkzIr`tbT?r~0cE`SK@(qw^n@SeV${#N7a82#h&i{kI7Xsqv8F^xV zzrMcy3%!mc#j6`$C~ux|Ii;9n)IAW#8qfMf|De+IJ!a70$W+R+a5Y<>Q1N-KiJ~Us z6WZvFQOGa3qCP=`WH^=TRgoPJu2%EQG1=iN29D_S%c>>)A`8=}vl3bay>L*_Q1$mYVy0q2=VY|U*Bujg(plk#VK&tLzu zQX!brAB!io^UT}yLEXX%jd1}zD%@o}Cha@?eXn_-a$Tg_W)8pFi)4t$Qm4?UuE{pUm0!fy4cx znZFt(P6lE<+K{hIX)M;S@~8zA6xM-b4YG>4}!lNjnyrA zO@tHR=*?S8_Q#1a$GP;UADH;O5uTrUPvTqYf5E*chBYxSql|`@qh{@}Kx*(#cPZ8` zB)&vwp0a23i(u-~i41=ijCck2%$pNbU4Jy*3f2XNn%x-f%Le46;jv zK!m0=e5f*bD%;UBqiEoor`QgGa$?TE)2D=L;vJ})_BZ^uaNOL9iX%n#b~Hof%+hM; zZm?g>)$DcTl?qw9x;O022M@8myRpN{CXTd!-syjb7q6K-W~6fKx%XXe*#1?QXd%>V zmoB1yfhDRVJIlNLyhV!AyZ_{iQ0=l3)OS=1NRiLd7GsAo!(f$uk2L+7d(gh?-#9Sy zY=zk4G!rpQg5~cm`bsY5Q7twS0o^9>)P3ZnX>FlwzMY1Q*!+FYra=c^tDtxPWyyu^ z;MT3p8s<(P%r9q$bqYsEYZzPGBEnJ``Iw(0y?BI+E1Gtuxlya!rTB`HH4I1CO%h=) z4-F5wV^d@jqS9broCP{ixsADLqP8~q>5r43*nuSe*k#D>7KVNH}KX?5P yg7u9x^8Uivo8&X1RLX(l<-K1&$38paE&%XK2RakGhMb%MAotC@Z1o!le*Z6W{vrzi literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa4a5756328c3af6c39de72be3cb2ce924bae11 GIT binary patch literal 2566 zcmeHJYfu|y6pc@`V~4RmI`sjfIM|}`fmIPgwA7|4wc1)p!ERDV)677zT0&y7B$@ik z*lJa-FxmmXYPB?Z{RFmblV~ZgRz*qcJ(F(;|c?fKfdl-`m0cDmM|FC4{=vNz4;A( z^OIw~tmb;*57vwi{2yL8x?zU>khtyTLhf+B1Xx55N`@MPVGag7VP;=qcM z*M#Kh-cY-!ljC$2g7_%{Ca96}x_!xbaz8F7O3AQk%^~a@lh_ ze-##@fHk(ODDNxBe!fa%2lr8 z0DEYZa2Q!&Rz>1)NZR$NFWMl40=wF#1`EN~13a}SCiAW=3UZ~Z5Gc*t4k@~k4ccS< zOldcwN7roED7tXj`2xZ68dRq)R|F`a)|0Rt@b71Gs_n6kJ4<-FcNwOO*;|8DU8F;`84c~3JE2EySyq3CsttVB zUPT&Pl~a#sy28@tPhh5|*`&i(6b#691y~ zd%%$)m!$(x+(`FtmfN`cjQ1OwwRQg*P&S?hslCwR3 z-~Xg$yyH^FV`!v$q#0BWC;5G#FTr#A9(Q4+-kZGq2T`|hAAgWq)=4)38t?I8J6Ysm zP{O;%=_ALKR6V;0nLXWU03z*vbJA0nZ4*gX{v1|te3wAvCW>FFpZ?15zF-TvS6d^Z zEaf{B;hfoK?X2C$9L^!fQH!-ZXdXvxd|#8_>Pd9)qO4A^c82nA^;pBDwb8@EVChU5p1{?Hq&C&6>*kL%Kl2mKpLWrFUR z{<(brg6?@`Gv{Kug(txAL-57{LuqKHmyowN@OA1|>P$_v`czOidOq4&2~HKKlZsX^ zXG3)A`M|yrU7={_$YjtZFEQKqeKgqqd2}x=fZkQ4(Fn^g8$u;rhK^^u<5_(u$kG$rF*ocY zPt$|P&w<>EV|-SofpR6JU13O;`lG%ryNH5GM{y?5G9vLG1~X+uwfT2@u~$v?frBxZ zn_DZ*>MCcUmA9{DMFrlbNe8m$_eQL^uymzPi+pLt;qJdyzZ?Fxd3Lhd8?)$|jYFhU zlB#rSqoZ!y3?~&9GHXVok1PiPW&yx5mv28nTac-V6tkt6(Vho-VcA?L019cR#)YI@ zqL^rkIB>f|yfkj_r)zZ#5Q#8#Hg8OUNEH*zfOJ1iaD)01)Mvm>hRUEFWXhLFd-Mxw zQ)$fIL)`kG1N!K0{zC8sSC`#_D;sk+ihI(w_&@j;Nl;|QC(~i0?%qOgQ-X_swnzE@ c_F*c+&?A#WXLnsm?{^IDGaFW$R&9IpHwH3<*Z=?k literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png new file mode 100644 index 0000000000000000000000000000000000000000..289db16ed4529dafef09e02a9d1daee42a8cd85d GIT binary patch literal 128722 zcmbTeXIxX;+V%@d@4a_KkdE}4B_OCY5u|q%RC@13x=0g|CQU?&(xunXL69OyFM&`( z51|GUk`q{K?X~yw?Dw4Cdp-ekCUcHHuKRyqgV@Kqn&c!bBse%YCFCDjv$NneZi!s zqUn3S!=qqUH+2UZX6B}MvCj;Z0KvK%eaOBe6<7*2JfvX&L5b-HqVygxCa!)yE$q%$ zi@Ev{+Mo&7qI_!|_!u=F0ZHee106q*4#nJS=cRulqQnryo_*<>^yl?Yh(f|%F=c_! zt>jlI^i8i@mL@BQA?kHm(fxdjzeuz}-6eF^-(q z>kGhcaPZ>oj`~@ZwA-V4RCpd^HWykDyEuXU_E1>^#?hSv}(fND1?*wf79c zWjwN*=A-t6W0E8#5v9GhD1I8C9cSlpdQYDJ&X3=-kygsIXYa;g-%Sl zBK6WJ3!$_3Yj)lSTGEhQ+}!pXxb-4>Nl{$!M~epokrK$CbW=C&ONJj=K075DEi4Yc zxqkcY>Ki{Lt8~QB!|Bmy%WUi!vxlpPD{Di`hDI}Grus;=;JTn2KxrQqVDYkFQ7=WQ zLLlH?tLt@_xhXrV07_qR3m?R^PvXt@TC4eZ8&P3)k2twjG3=DZPTz8g`v>-Vx+ctV z%GLNg>esib-|(Rql2wFVmAjgDb1p5SaifaeY@W>}^`_$F4v*S=YNJUbdzkyv`9lLa z1kDRbOEZ>`l@G5kNGtKIu{hae$?f`CBdwH^*ZUYsEGIq4L#t<)0>5($z5m&0;ZOvU z2~PTo?0)e)6yK$f2Ge#Z$!s2L2bJ^UOv-h&aoL$a5L4EjBqD?Fg#icuvpnvEL_*5>k9?e>0g`kQetb3zp$4s zk)MoO;TK!xbTQh^>8F`|7ECe?-{RFCkp$^}{?<$_a_MD4QTD0w31e*`7dmLo@oxS5 z*qkZ-@V7!9v&3WWU!XeEHZ1pAK;Ncf+L5YqHJD<|uCKQmTgy~oSSoZ9N^>zCA z>-9=jrvxk5Q>QdzKKe~nOH30tEC+o-z{>MtUHE7fZLPCyfud?jt<9oj!-RO%OC|x~ z`6C*18GebzJh=$Ty9xMm0RecDLSnrd9VlgsuVSz7-ECH-3L?K+!64<1mA!efmq0WU z6l)`^jHU_~uNbi}!LTn-G4&nvNFt_<;jWHR5Rw2(7-&;cK0i?dcheq0aAyR)Sj0A>!X@(Cvc) zoc6J=zN--X1dl~KHwh?;*?wdk7dj__fMP;#I|=FUMk-14SO^oS#ad4Gs9 zPw1#zc&=ls+!E~Gr9Nf6sa<>a5hZV=jCLA+?s#DB>8R~Xq1P*c9-Yj^FMHV0$OJ(V zDHa{6?H8Q(Z(qGviStx##@v#53ytM@UPFlAO zSXJI;bQ=N6_RwK|@>qm?PnZ>o>4i-hA?l~bywt}@*YS(L1MMAW026rAzs%?!GMss2 zvodnJbOUPy5sMLVUh^5SJ7JIJ3WjS78ZU@E>7u`3%T1$F9RkV57}N%R34Q*lYF=zc z`F;LX(H&{7=5UoB73R4&y+E93|I6hPXHCp;^9&JDS+}e^@w)ur1W|k=B+oKzDofI2 zhA!wrOS1b#xo`3&Z6*8llEoPQ480ap*aioj2gtO zR8~l%FQpD11A^lJCVP@a;**4N-Q6p%fYe!<2(N7Mhs596I2xAF7Jl3@YF) z+nFzeJjzcx?$I+1omQ;u>9e4{~7R`_dLark7V4O#ZfiQH*ZqPMrr(^kaQvO z>uhxC-n<8;ckMuuzuNT}Zx`=D23gl96}H`3aTK@xFamHp4BrISzy6VIB}K>7J=!T5 zui4@bgwNZxm%FXbBKX)~8L?Dm!z*6?&}0EQ)%KJ7@fH=4rgN+7LD0lzD{ZA9j**57 zZyL*f=ar|(Cy>}zcU6cXn0@)RX-ZpB#LQe@G$-#~;R^lEBM2xx^tQcF)6Da(S%1Q$ zDO0^*3X#*z?>vLUW1S%=nvthH=+$C>NTvMT+r(xinh;3B^#Y1eh0B0uVhpz4?F~jL z_ESkjvM0wF+;j5iux(Ifg(lg~jI~6s56SQdk$XJsD;9sn>zQHQ;%^jEiNdZ4->Zj~ zcbxC;&`hUuEj_s&lULFSH~inFQ;{$_hJszS`EOmtcMI*Qqf4-Tel4@ii6+1wg3yQT zU;lt$mDD{dH-@Y6aV60_USF%KtBZt0MIfXqiuhXaNs3>RhwP^*(__f$qOsbJ>y0eV zzw5mJD*pceTm(0$qI6i;FFc+7bF*Ud80d+sT(JH7+{` zc#RJstE}Ro>q0l2v#=YFa1u%mvKMWTxh!0%77$7ywg1TQDPwoZ;M+k>Y?XE?ur)G6 zWtLzL+*RI!PNkoPY-zo%l1hX6NaM(*l75_{W@3%_4UVk%LX){YEu@~kGp?KIDJU2K zvP&1c2qtAI_2keEp=<6FefILh1n*(dil*6`ubskj|0Ip_-R!*smx>j$CKUxvY*DL) zGSK_xa9O7l)k>Az11(k@VKGGwSAK?zU|OXR{2R{Zxg6mJPdo1(^2@b)Rn;DPx4yRD zJ#z;$MPB&G;CLc?4*knQKpOiq$SMMm`Kz6G)SBM+^8nF&*7B6a?cv#(XSU)3#hUM; zIe&aof#0aV`1U5GY}(o@=qBrGx%knkd@61~!A+AaIZCaM>(p3D?R{M!$D?y+le}1D z3krHi1@?Y1k=0B@DTcy!(5^Fn@@<#R>g)CA|I%mk0$2KsTb=t-xlGenJ!T?X^AsUu zLc)ji4;%a`8uj)}&6QVeHBzvD*iDm^v3Q(k;>j%zMzxu{PN1X()|&%{4~zwk1<~0f zA&ww z8en4O8^53{OhHL6&_lV4?RA}ya(TH_l*_4m5y{U;AY7LCQ* z>JpNRrX}0duruxPRWOv2vQl@30-Bj%rzEQ?Y%j@6XhZTN|Gj< zkr^6FOr9rRY0c(;(@KY(4^3_7`sZqIR4)i;K8~uHcXgAd%p&dOD!kQtBaJM{?azY5 zC2XIA6O;!sQ8>31LFHSKF56J?rf|Jmjjp^%Rn3D&&kRC9*j^7cTuz6ZYzf>kYe>Bw z@qV*U#Q5Oc%YP|TJuNq6TJzzfu7qw-(>{mU9=x>40mX@0POnc257 zCH1j}Z~eu#hhkO2`TlzW(ADy=W_yw4Ickk12)?}N{PRnzawD!|)HH1)p3D)6z86tZORVE+>@6_kK z)J(hMsqp$pyGyznH^i6Yt_aV!Z$ADPgav_9*zRdq_%te?>hQ3=K%5eI!zo!CHF3=Q z3l6vIcua$VI62K&u&OuJvOSfkP+IEibGQFsja^mL55+GR8z5rrr+OMFT5@DDKl)G} z!z+FoLZWHFEas~FBI`yKC5F|a8xY+VM1J~fG}%&gWAtYW@lIV{=Q@(C0)3x}RLPF= zd{fYq9}w-e8S&skXEsB>lR;{qsCOROT(aWoQ2iU7t&?@mpB!_Vg??4W-JwG z4ychBB0oX7NKfUUx>P)p?VgPSbO62{tx5#WoV36OZB$*tS#{G1Q@QIy`94Xe#ks!U zy))!W*h$DEp$$AMN5D=BLg5>zRqnSNj#X(d0^pEeChxYKqt<1>M{dIS#^RJ`J-59H z($X0R!kOiY!g-uqi08)?jvdP7l&p`LDz;#MRNCLLz&#psvsE21iN?~GbWO5^`R`Q{9*@UGl|vi# zMb6nt+A_d_v3}c|ob1@GYCLQU)=m%XLnBf+J>V8g-58N~ikF0qniza}5%$N=C8~#F z(1W8ZnJ5tpUQlHBPJ|EFtuEJ1vvx{o8~C7Y)%ZX=`1S6`ad!PWzpjgs{(}W1y~PLtrvEyzUGV0HYUP?cCA#bl@NU)wv zsOzFp^z>XFh#NteX%=-!{J^l{ou<87QEw4yw=J9Q^1%keUxG>luQnM&Y2y|YnGlsF zU`H;TO33J7Ww&I`uy}B_Kl|ce@04VL)uWvelD{E+U4qeBY-3NsU9I344OU_-Wl?Vy zzYG!T$-Cap+rs``KVZ=dwt)XbRQz)h)=qUzc(|6xw1H}QEzhx0#*!d6_O;kqeJ$&+ zo=HJ<#YwL80|e)qQvC0Wvd`fF?@g+4K2vxx=Jc8$wQ*l-m1xiKvfn1fGZiA2n65xoRANi%f{>-HLEU2)Wgr_YR(U8;DxkqOAC+D%zIX%=TZ` z|0P}^?*PVQ5dj#H50T?OCyj0U{iv=WrV{#{Q5G3Zq|CwQqv{@h^4j2^HNzJJ&5wGm z^KNEM5cu@CF^hc3{s=Sm8@4;QWnAcjeTf-)b&mm*^YXAG)1C-sUw@Z;R-E}cIet0* z?HcY~EoaPU7tI;{KYlpMuN=k?I@!zBacIP_GDM_-Wjbsm?xUuNC;Ut~efGqS8c>ZE zO!JQ6azrJy3MRGRFHKP@Z8E_L)j=gAFJ9{~W+qws1x8Sqes}uy6YTW8&eW{|QG*|% z34)W~o59qT5Gk{eAA&BPIyYI&EXyCBR2C>p(vB{=a#LPwlH|i92z&B7*M8p8Elu|X z40RJNXP0~}ndM_Pc}>bPwaR6VOZ+@EakeospMrwAh9j|gU*4kK7$pIUblT;w`k-Jp zr=@|Ck71lu%j;0?o6kbfRpfF%+lpAnkDB*9&09VVAqz4X9;xOVIv_)SlJU3ALUEJ5 zxAIbea5kW4Wo_~hcf?rCBtZ6biNs63^`4heN>3w9X3f<6UY6+6A6%rn-vMM;O(pd< zm6o)9f9=?oYR7R8HTBEO@c7}Ld{lc(u-oO<4Y2!6&+cQ=h0d>u?+|A`{t``%@w5D_ zCZ@;v<%VqJv3y@Frl`G#-BvWDkG^uKnNyA}%10HZK8?2)CV@Fg!5O!H=$EN%ha2!5 z7lt_bdzPzG^);gJ%%ol9s|)9;l_(E4%C`_>x_CCyZ)UK%cH2JGyJtQVy;5u*d?EQ$ zOyxf8+)Dd`@G;vlKtE9MWM$zmvDo1EF_G)^M#u^^>fi~75>0;Px601A6r+{Utkk_8 zlYWWdhEfvqC3~W5-vWVPK#l!(n83(R4=k{S)xfg9w{j}{z#J_L$tdOY>{i{9|jcqNnM>n5Q@d3F#!j( zGrDZluG`r~R0J@$W#?~H6Vf?VI+tv>jjI~gn-g|P*&pKr-v|VSBQUu2(HbvEd>?1s zhd)z&u@N<8WzC(1zO;}ud@uh>_jz>tj)9zRYB+h;PFo&a z##ck>2|XtA1bSc362sdVghVJnJIBsIHULv$M1>(Ry6`zmmifes5sI7z1w$}}4W!io zk=q}KrgdY!n|Qpk6-;SSW?{}6?9^RCGbOxMaJh0@V`PKG06%*wA-csWW1DJ6h-6*H zs5tN)zf_~tfQm#oe_X@k&-UQds1NI<%_nT_r2C&fwZ#ylZ`2H^C&mJbOM5#8Z_FKq zzciiPv^-sX#66VW0l=S+eY0Nkq7sL_hLy?X4%N_*=jTK>=iwuA{weciDZa)F|C`;z z0bKzJw!Pg|Z!zz$aCR<% zA_@(6*@@Q|gKi{vXUus}j>Pi4h&;@2$4JIAWV&xv@IX8DY{*13geW^C0@@7#)sezN063Qbo`$(J6_JTj{L0Jvmvvx;3o9;&CT-hLms1u_S6`; zZfkJ`?n^0eVS@9;V3;pcoiCxV{Jrg%>RqRZhm9r~kK22ef8?xq>-sP;LSQ6or`CNo<3dd8((-@o&SE|x>KMvkCz}ibPq?F z_4pl(5PcLvm1A+|Q7Uu~+$iW9mMLR{J|ENVbbo#85#<)?LME$`aGSd4Ubs*6xAR9yTu*8jR15)n(>JAXcFP~%yA{G~YdicugM=0NUjjkI(U(z&1kt?sCiCR;KmGEj z`>FR=F$2hR?%gHE0b2_U&VHtK$1crLp)mU4Z|hGNd`gnQKXlJWSn#5;4ct27I71c> z$?#s|X`x>&RTGeuT^*TYN+eeHzWFNVCX;K`XFIOfND+uPiJvpm&Q9yWh)Q4l2PAt} zm6`urF1d0pw(f=s*1q}xbLV|4(+9JGZ!dnOH+l`SaUZXEpSSad_}_)yuXq$Q7^Z^| z^?!e)=gLoPcg`m2_FdV|mc3XpYNed`cMaJ50f;FxcRFhJT_b-=u4>3XAVo5uR_(HwCEQQ*7{%EkeIagFeP38k8V3F|xQXaucrKQVXh{u3pFLN` zJXqN<td&k|z(pbTWlg@kJ^@C#D~2eQZ5Bj~oz zDP?z+*131Hz;D1uewLALE)0&AgWPf%b!pV7?JlCMieh%X~O?^nnYBFefS zFf_(skV(BF#kc+NI#{5Q?A zBcM@xUmD-V8MJ(I!bt26^Q-IEEk?S$U=OTe=z4Vax!+v}NO-Xfi5Ccp?Xk9`m>3h9 zVfhx}wR?Z;EEsP(ir_~!NE=lXvyyRvOLmy$2IpDmj8-3nfu zk|c3MkUN20tP*5X^M#Srd^9S`XZ(;f5M^Qtq_7qWdc~75y+pwYa=U+5czB~xOvR#q zpefuYLVz%}jZ$JsUr@IfuNUZ3M0wxgmuApJi;2Z@udosn6tyI16is1B))0 zDH2V`EB5+~uk$jmbX5Y3wC)&hakPCf1;AG%^E={-j#lJRSF-Sp9Q`h3s~dXLzWlyj z0E_H)jIlUOgb|AW)HNH9e^7;yB3Trj(Hi*->tsn&gX9We*I=RvVskOLZqDHZAvTdb zP+HLwHb)bfcCHLxAmWA)HOrSf4b zL!E&Vb|%Fh6%+a`p1lbdrYVEs&=2 z9REgn%=(g0yRcf1$0Hf0M-Z_K+G2E~qB{aD6kl(XS$}UP1Q7O%S=;yxe{p#yImXw& zT}gXg1ksS2zj~m1o-N492(4d%0XXzQ!hSa^^vb(HYyGqs7Ki_Hf;$17_VfF^S_qFv@Fuf&BQ$W21;N z#f#McU|)x=a=$D7nKbb8@#0jBtxINKUo_>()aC_M&%H>=psL@-q}H|vTP0kkMugGx zNpNKZOYnRUTd9sKU609LWnI&9izgcxR?#`M|ESeVic`z21|fMmgdLsA{^eaqC<4m6 z>!Yut6ZNx_U#2QU^9HQgW(JSQ>^biGB=i5U{vdaf6!YYA&n2m<+MV|P`#a%=k29Uc z2Xf;Q{%{K8>!%65fas)*fw;22;jkagn>6d!lpft0Cjin)DBAqiEPl?^lZ#Dx2EB(= z%c3^*yN4TaTPAJYkX+Y<2Odlu!()OzTp*3!0PeA=%Y|?}avFS>vwV5uj{TkP%$)+JqhUML z5>sorbn;(~7}#8bcH`NNKRq4(UXeZ475zW{P`(BL{-poHd=LJN z^oP5yvU-0<`d|`xG3e|HXuZJ#23R{I=JL>vGn@vbeAD?ttA1zc5<-ZP1@(M%|gjo_2w0PMA4nW#qeKZ{?i>Us}L){Y*40olvs|N zQISkK2msS*+T|!8E?1klFV@`L;(q$ zf!TracTbwWZ8N&-pxEk#B*k+=2|9m?V)KH;n;N^2*}#|h$=xnU#kn|1DF7t!?P zQm$}ZiVeJ6#ovK=$?acKj3f>{=4;F!T4A$yPZU#c{p>62{!P$C1C19Wi)e|&0*6EM zeY}<+lYW2oR4>~IG3c4QkMHfL6vetQHf_SGoyw-Rumrf#y@fp&FB4YRNChUpsS>jLv3Id4=5-P;a_(=Qd?80Rha%m(<9`He7Y>?QTflIlV#Tg2YR zC$3g*5c;;~3C_^M9lP=t#iNUdNE?Ty3(LK5)Fhou4lScKh3547&YszK9{Yjc0JEPj^-ex|1Yu2H2v2uLlgABnm)N; z5g|L{yO;HF+0L9#clC#B>Fzy`4;BkyN}&D5CJPdI7-yf9Y>Et7TVi@cMYolZZty*` zgH!h@>ClX36&(wojF4^f3Ab>sqSNi3Rnq*s>PusC^uX-Q-ZU}rW3sy5GLxjoDqHpL z@qOe^WrB1n!$)87-t~I>?&~ys-r?EDG8~?YQ<_a|BV$B6Ie>$8x#u!;sPx>3_h9+# z3a^iQz*i2pbml3-j> z*Qp&tcYh5Vn#06{x=76XQ-HqQLJI9$`dqp-tk!-mu_cw2~ zWh2np;XV+1t42G$1a}It?=dQ2LGcX$_#F#nwSjTMB+4a(h$DvB72IDXJ1H>5tI8F* z$9bT<3UyyP=UYh0>kdKUO5Mx4(WExOd`XsDjUk?H!{9ny^2&wZ82&oSGk+#za`@Rz zJ99nDoe~+DoA=&Lm1Fc%&nc*D4spv_(YBS&`8F@QC1GWMn+cEx-=Qte4iC*38j8yD zx{HRP>XQp_OrZ#SvmL$wAdc6B-%8*auYZwB)a5bri;qjt$|&pZ%VoV*mr8N`6z#>k zf91x;---RrX^P7@--snD8XVbQmnLS80( zF=q5C^@}DcWx5ZZ<&k-#{&4WO{;{c>-hR5aFQ3z|GRAcwS#(Uta@cye3qhIKpmfbBI5|uadAlF;6Ui1 z{RAvtbmO;g;>xc%8JU=#BhyF1@XD5&goH`_g?0z9H(MWd zXNp28QiS|#d=@oMqY@8-YZh`p%s?>wawAj3Ncj-_pD+~jNX_Jr^X}-&B>d%O47W3* zX1?ev0#sLj;}_t+RiUU7Q+SMFmprww45EcMyPKdh2oge`}tcv;kP zAKwK)hvbAehQF=%9@9J5@!2)k(-pPry~ha=I;)nBDL{WV*yM#$grt3UdsLqg z0-CSR5wLnBgAa!W{UA>mquc!?<7AL{H3Iq5Vz;p)&^_ScIfxaGVH-I*fdp&>;P4}t ze9aIeri6&*5TY7>k42`mw3p7VItB8LX_1S|rEY}c9#(AC1FQEju?=L*nimJ&?S!HZ z{Zj7Ho?ifclltmGFw>FALK_jO6dr5v6B?oC!PTNhurd* zlCgQ=h0918H(hvffWL5%OIC^hW5&MWN8&VQp-D3EBTva=z1W5Z9WKpF_10?ta-bzcQ-C~7iZUkj`QLBY6P-7DJ@Ze8s@4Ug} zoi8DhY+&HdCxVGZUue1)Cna=+X(#!0vE=;yAy5{Akz|U9OO$)6EPMtC=bJHr8sdvD zp=rM--L7CQK+LhoOcUsf!mnJQLVj5RU^Y2f=H(!5Gpn9gV-1H?j-J?@^}A3Og^i$4 zS#S%xM)@MHmhQU?TVdp!jonswRqHj(a{PCgMR^6YBzjo))Uwll^M2R-*87XqDPxZ= zsOj6cd6SPVf-;7G@&kA(Bl z^+PXK_|9s2FtEpueKiOmuPMYnRq;;DvgJ05sv(;t1m z>$Vtc5;EG<*L`%DJwiHvd}i}*Br4`me*frmEm65UZ>*?hwaSxuVo2c&$<8W}T_&+z zhAw-79do6M#~^Wf11TmI70ZCh@xG0o3c`9oWRI08`@(?fZ-Bea5{C+Twvys+?ceM3 zi~gTU8rQLVWNUwPb^8b@Y}fwhgC;O8Wt`rNYmj#FLbZEF#w~8RK#-KOC2?ER8ZvT6 z@{8=Edvh>2Sw$)HjK{c8ZN1}mFr(6sbN+@Dyy{?zblF*oxZ{SYoUVf@yzN<-&=>1? z?a`es=LZWZ53lx=*$Kv+2tRKQz3JT5SQvvY=c1`S4YpGejD8|E0XuxT@nChYCUbZ$ zGfy(2#%s*z7fGcXJ!=>ahm}6l^9MI%tli|t-{$w~96yas$oQ)(leZF20}yV%iLQbS z>*nQAw}u$}7Cv6JYg@*PPU~g}EOGN3upCrQ8O41!z)C**;~C5!XWs)*+nJS)-4Q0ErW~uLHAe`)$MNi-#8$TU-?Ai9KyBfTXHuV4mNoz(SQISnz+)J6W@H72T)tLPyv&y1ct% zQ0ilZ(0AI4|IY6`U0!YP+wtAnj~xelhuF=melHtP_F>dRHF!vEmRkIAe;yTJFcUfQ zi?8f3;dSqptwo7YxRvck;WUKTE1^SO-<7GK1TyuxtG_J8wn@rXG&FhSoS3&q*<*B! z9L|Svio{|k_&mX>+m}&Pn6}X0Vmb1_rxSX~L0;m*xe(MQ);MuTbZX_d=;j=dEa-@s z$nI~Cg~*J%wZ<>|#v;(okSZu&13w=hTyHI@o?f1|(xwzZoSI0UH1|o6CCmk7ZxVN& z3u|q_;n3(K^-w6i%3n<3@4HQo;3I7*S zoZD5R`|Sf6QN=Mx*9ted|4Y`aFr*@}KNtqY)q>?lahqc3cEuNlBbZqB-%!EbXQ@?& z#v|p=$>Zx7V%J|TlyF*gwl-L>-FedF(bs=whSVz<+Y4`76TaXmvz5Od3)n3>9I6zf zSkqlH?9hKe-v2!-gL0uicKQ4{NG>KJmb6Mh2{5`pxdEx!Y==Twapz4qA>CbPZ``r&t@G5MUTYWXg_Cll z<1Y{S0a&AnRfbBq<3$LQn$YfEPF4Gngc3?;_#ftohKNyE4xO#Ep0T!To|5FoQoge^ zU}>ionj?Mx7Quh0IbiKhDBsMtAa6 zbR|N~qgy!TTTO!Y;U`UJVB4=*i6(oTVpu^(8w+|N8O2m&q8T8(I?3Oh4Ip{mBur|W`mH5)&d%^hX+JKfb0i)a_ zmmgSN8UX!3l`ibZYrRB(LO)lsB)4%mQ1UE<7Ja32biELlZ+J}zTk3&ti~f9IbaWji z*g}m>4h&@sy^-QWq5VBD$DL`JA{)lw9n+ zM=ax?Eb|vZ)m9{bo|dls5I!UHbCy4qV@+p@zbkhRr(l>Mq3fLIcUBH2=&|niTjqd` ztUgHiutS1Lm9P$&6r73P4}v?6#f7x{S55xzW994)?IbNPX8Cw%UbPg+r^La)G0gRb zD?6V-mcdA3;g%>wag&Jj_y+FrQz2Q%c$k6wSTK-Y#ZB_jVccWGAdYEHXNbO^sr$!U zq0I|ccUwm;b_q|-FEh~X^w<+-5-Zv#;`PcgAq#L zdvUM(EMvcI+c6oS^!%~-nG);O5kYJJ1`fmp^@1-gf0qV#R~}zpOh+lX+24Hq50fp1 z{b6nR?s)#A+=>1sOUt{HXpGQDgQibk*~6+O9xOh6ag@Y!Bz?&bGz{QQ%+Xdb3LzIWKL z8vk^&aWRHvem~KmXO;rIVTQDMd z?3==yL3>rmrPVjnneC!8t*z*2sMwgtMOdn0V-^1=InZZq*K(Y^Ni?xo6XZtE!U3kJ<81Hu#549t$2!i|q9CWGgo+yOQ z$7`oZLndo>+fJ{nS@GZf=65W{>Muzu5=jT7<`MR@LK1b4Wig~mH&+M7A38I!*tQ)J z&Lqk|_r2nx7sB*F-QINOT6W!Od4KC(d(|!GGG|K;SV2#kD5GGh$gY>VRRZfb=TnlW zFO@TyFdRld9{&7#zI5Ki*)1u>0jGH7Yd`u^l-{03R7`;bekhd6&(~$GChrakDJ{fuAjP*w`02q2zPRTg$4`E0 zU8c5fb+76v5#Nwdwz`ZrE8t1wRb)PYhg zYrvDz8P6t!6k}rW<<5)IpFLg;<^$b_-?3-+n83LQ%Q?QR$Ebvu5Ldm8`|Gh<`&6D9 zfC$H3V3!XJ*kOhtN`yyM;anq3#1d>%Y?%dvH&S}}m@sCw2J3l;A+J2|kzOyD6>d*$ z*9@FqlB6kF8k%O}Uy7%vlLBr-4|sw$X&d`PiKlyt-A~B4wK# z@MS-D3pufcUHVmOeqh<5?;!n-t2|QA9jOxC_ElpcPu%xMFYh;{SVT?V+dnO7!IlWm zD+0SUg4{@fa~oyj|IH^~0G`ld{-Set1QYbfBogE?q-A1awhq2j{qeiOCI6c==6iFB zHYD0Pgc6hPh*e8XM%evmDiLw+K9~?eFy`8Z!tVr*p4p89UPH!CR@=k3%3b26Og{(n zytyPRuDA#O#+lRmt6-#gPVr#WGD@q__zeU+z0$h|x$BVUZ1enAO#Kt5v5^t!-u6=E z;;}RLn_7B|;xO=^9=2aiImbHak7ivHC(sPmrq@a;mRl@o$lhz14cHm7rl8!xv^Fv| zFP~*8uwR^Wh|EtNB2Buvl<+%%>GQU&fmTG_4eI&N^DyY7URxFaG|p6OlJs8ny(?(< znafGbb{mP;bPo>w7g4lpjusn2vdU!%`fl@3+jTmeQteX839(dF=`t-Vq5Nhk7q^t6phrrrt?hUZJx*wq3Tv@Qu9kU)_&@6n(tzSB9`&&uRFLc98TsCzajYv#jSP!UJNP3)0B(b&UGu2aeE za`N_J#gZqD>0Yx?4*(WIu=sM?LqG{n+iibp5Jlc;q~-Ph?oZ0sJmy2!Ty*$rgcOMd zk|nd!1%DAq67?2T+Zs=v%G?vK3ZXH^WmFGCk?7kqigW2QyoqaSH;;vOub-F+!;>bD z93f((LNP-*VNTwnb{XkHR+0R-(76xWjT`>s7)5vYM}0f!MpAM-n*jGr+Zi6qmiW6> zj%-@3PK|!oUW}tS0b`c?w?LD9Af8s}W)NHmR5wj@;gFO z%7wE#V1FhNBxv<%7zH!%XO%z0#An}K_wN}JOFMIHi~-^WVJOm`RHqAEAV z;qMK&u|agUxOKHq@eCMEIacQxiNi`!TXVf}m`OI86~nV5 zN5u2A5yjD7+~y^!`Q@dat((ulQWs{qhJiUe}>YTfXZC`K1Ve_ zNQ;wcTu$$nd`F}M~5l)M}}@49f(zRWTzLO2fiC#VI*-G zEJn&x9fgO+=K>WyivX{GRHqov!+&Ja1LxW0f&tO7FdeUenpURJB$#QO*HBrMQ!D)) zG&TH93cx5}#hxBTuVM5)KF7pr*Z*0@P`-y8wb{ZC^+hkg+uLUwzfl4HN;qeY)^f(a zJ2%xt(SLi({Ja+psDUG9(HCC*wkhQLX<#y&i}!M01VA1FvB-)Z%)wJ7v-X6$KTZn1 zw#3nYMX-+AcssEgF#0ty#Biaz+y!OLIGk5PwVw5-EDn)2Gp=yD(rHYpDq~inb53Ns z+Rqaj$BwKam7H5XWzzRbX^T16r>kiGJiD`@4@iqy4`ENbsOB7) z!Q9DCuefI~_F53cIAso+r3Tu%o;6hE{6DO{Wn7eB`|b@Q-Q6M}-5mlWAfU7$-6bL| zD$UTXgp||>NOwqgcZkvwLkvg^Fx0>>^NjxDf8YDFpErB&x5JBz&$ZUN);hk&ah|IJ zZ*sf!voplMdV;GrH1E|l&ue!QRfS%o<7nD;Qfqlb!c;>-Z8XM-#SB_Yuz6EMJ+m!L z+!0!tC)=F%8SgqbVZC*lOde9ryA2B>aU60eA(AZ72&h>@Z8}q-rmP(ZZ@%N$XKExF zc(OFk=xj*q^L_usml5S}ODT&rHbo;c*)8&w9eIlWNPv>Bplt7Az)7BOh;w6Tr_JDz zg;ivcM<{IXONW^chnz0T`_oyAY--3AK0l)QGw;u|JIC)JVRDn9EF2xi3w|FMf6SbJ z;6NVjC=wBSKPJMDJluOFQd1Z5P(aOQ2DT=1%bhL2&Rt5I}N zZfaUZ*xn&2R`a|e|A$Av;-)3xOdnlsH%)?w`Tjb@v3~-b zo#wS&={FanFs8x)ePYc-7TPr~mJ4qL)}mmm?&}PJ15y+UkKSoHNt3jlgphL}ml#%# z-R&C1UWZ5LJwUq9p?*`B$xA%G`0XL#vqEONOhRirvEafVXrs$FKE#V-I`VY+m*-&* zf#Ds}@Q6rta3|vlt#B%MT#JPhLUX+SGfUd?X9RuBm6=&lZS98g?LE0oO)__eIUA8Q z%faab2H?*C#{DcaA5n?u$i6yDU)_%RG~SC2V0iS7cfY7mv z+J<=^#2wl4X*0q=M_6Z7QfW!v8quHXuFXY}3dfSvTii$7S`gJ2@v=3Pe0>>1#a#D( zSff-D^PXlywYqDOb? z*que2#p8o=e2`Lp@fL6O=~Zr(ZTM{v^ztKuLAi0Em`@${1FXivczT2wik}&q(}h*ycGW%Fte{kgP0G!6HoV^`({we8Zl~g zcR_M_=$r99xMx2y{GSSU?dJ^WQuC8*o9njU%}TCGNg)MS&Q@`LsqT1bgQvP!*53aV zz~Pj(5x63s*>@g!)BIbr4pk zfwwB{mCw#jpqgBNm;jLSl@xbaWpg_U-1GaF$az9l8WQC~^I{K}|dYp9IRp zUkR(Rgi9Xup=*ZBLsxC$N2|lH`w16*mFHg!h5r2f%FW%{uATbD#@ng`=6Ou>>UafD znZGN|D04W6{z-u8+$|P(G6;&htSTaH>%W{ z8>4k$u6R)}z!HD}nutn8HZMfQaM(CPL02eMuqJy*OuJAK)>TpkRmHiXxSln`4 zZc;5<8J9w>Qt@c0CLf-WgVKuzyo>s^xU8ZPo4)bHCDDu|r$jeiTh~MUH=44UcZP}m z6pa_$DF8)WkNQzU!UVinsz<^3Nag0pBHIh!bagSU?ch4NnDkO+;$+dpmsp)iGX@dr zrGYDzpkcrw;l%KFU3%g~!pkh9OzTDy+klTwuJ$u2W>9=>=z`pS!jFUm|Ez1MT zxjn++?;0y(3VFVou#AMuUppt3*)?4hH_KiduO%8Jxri7zZY;3gD-OBxbwH2r!pTP- zp32R>6k0= z;pV}gG2q{Q2%iPL?nMqE0^aaZ4Z}|oYBxRZ55ERiHccnze!$h{qK)e3n2$chgExPE zbn4GbXC@V|th3H=L-pZPu}3p*68UO!N^Oe`!!^U?iOzZklIFt^t9?nI&1t!?5Q5-3 z)2iF^hOl|3GvXY~!Tli$coMK;rDO!h_z`em@AEa@tKo9srtmA6 zf>8|w)cd?dGxLS&1a8Gd7pqt1`P-Mwyu>^KF`Hf&V>q?7l#h&_^+)v!iL+PtPEYbr z?)$V=Y1kPr;n{k6QjhUz?D9)_p1fY(soerbSDs7o^OJz%C07kI1!<`dH=7w31}=0B z7LZP7Zr3xGpX1}I%jhD3rIaMeO&jX8fHVD?m%HBvrSYAmY_?(Sb{elaVIPGgU^ez>7v+DcW@Z74_=Tdp48}e_KaK#gx z?sfh0)l6)AHPiG2VG`jkAI_m8R)_6dGVUDd=o>{0B<=j+aAtng6W_&xz0t~J;8TZ) z-m);dVVaYa6#0?K0s+yf8pb;BW1givO?afSQ}9?;WIOKWXdrb^g#T);rtTci+3P1a znK%La<on)jGrdba1Io(C-+QGe+0Oa;D=}*pHTZwH+O}16s3^rJU|}Am9>tpTD`UWCjN9K z-mkG|cGyTMAai7skzuE{Lo8wGxZSpnR<=l&uUw>|BXrKCGxVdQ)J9}ma+d79&KKhL>qjs;u?zY#$%gh#)a4i=4N5WU}s50%3OZwg8- zrbnMuJV9nmzF$ZF!XPk6q7^(n-ToX=Nv8Ho6z*8`Cf`pyxJ5E3B_<`oP%@x`H64^- z00Ez#k?fe(Q?5p>=*1Eq@$lDD2YGDX!&&0BnU6ja!~Zkx*S^_tjRW@~q!9N=X2(U6 zm}&?Wgr&gRfAKQ(`1^|!W&s15U!0A#%ruuN8$7VEt)Dj;N7nn#6|s2eAD}8}RTm@s z8C3nN*Ug`ji08wDJQdUnDTR=v8y&Cj5S*I7Dcrq~@3jwmpTO6wlixL@ieQJ`$g6Xx zZAnw4sUspJ!{=i+V{FXDT&i#HQT1*Jx8OL@t1GyGgIqFP?_BIj2*P}yA+Z`Z2I%4| z2qH&>tcPQmAWHuGP~n{T{%yuP&&*;uGul~{(2|I~@5;&V!t&IuM-I+BK9J-LB&<{< zOSqC`4qr-%c!QNt;X+uI6^3}Jc;|$RJCmi)63FS4xz%or&>s+Lrs;lXO~$b?DhMYO z;Qx;OvTMpv(rBv3A=+x5{4%*lC~Y$o7q*{J^R+RWu`<tfou<(LAerY~mh zlcns01YzSAsg$ANx|!AnVyX1YI{>fN1U)SOOjV*;}|FVCQkf+VstL$}1&+nd!YSq?>RD3c zlz6(39#YhV**HG>CaCx0cGNCC3y!FjyYx(S-VfKav=d_GzbAd|Mk5UiLaKMRJM<<# zy36?EWuFEVPDqP@SI(7KOMNNyeEfmkrj!Q3Y>H@Ey;XOCTG~9y)FU3``2hn_og+xu zkf6RqfhT5*IJ5j~FvmKYjbkK*DIq}ZvFYJb$OAAmGs5mbdweR;_J}X($}G|b7KE3> z;hVXY5#6QFjpPCIP3hSBL+&x;B;DwoDrr#J9|c5`f1*|OTmuqv^}WYC(db<^e3WGr zc2O(gQkM$()sCy>2+Jb@@Tu-R?mHmiWX#Ure?EL@8nNb;>l~uyrk(~O8m2cOq?_DM+CpxU%1mdB$JPwP@K*aNo#mWj9?XF~ zVTV1jX(XR8va42?3w+0QRJEq$DGkDptuI)Jj`lA*ehyDsr{@Y2p(!Xsx*9*8mEZ_u z9q;PX;fjVm%-lEru`qaf#1l@y8aLYAnju zHy=Fx_=U9`E-!k6(;`7&p2-6ii;y?Au|hCz+px6I`r*nu=)ncKzhC$f3Hj;TfDd`& zZq^C4z~)y$m6aNJ+EP9DPZ&)^vGasVl;^`im2%#-tEhM4`~@Yrof9{^ExLFevFAp1 zY8%_07b|SPvXxj^Y`pSl;eN^PyvELMc5fpp>A*YcBj&p_s=vJY-UGz6&sTb$n?3Wf zc_CJCLZ-J6vQ`T@%rAHfw_&6v6=_sAcu#{{)KkQ?3W=WxgKcC&n(JB#UT!|dmXWt{MP z)KcK&LajVdHG>f3`}>iM+P$9*J($&D=W*yiUEO9g%nZ=U2<%;?B77(8#{_weHm!A=5)3*$ImHEERKsYZ0gayMA*d zLf7m{Mpm!;hY=vsd52G0RUu^JFrpSvdj;$KTHh%j8K*TX0;juJ@^!hf_6QJHl?f!b&D-&OaPg=EL-Gi=JMWv$|Ah=H&$oxr1p1 z`%K>Ndu1J0!xt?rFbFB-rCoo**!z6%$-6*@pjJcvW_b$+-}7(oBXe91`rvHk_6{RA z#j4xG>@GL0Ee1bNHvVi4OTL=2QvINPuXey#7ArrIrD{=)!guNoJrJ#!246MEu?up2Pt* zN)R1FJl#%9F2mnX3J3$}ZYauqY~+cQFdb7!hR-6KSw+5GJ2uF8qPP+%-V^Sr$G~px z8)UA46}DG_cwb`OT|48})mctC{G>|nvs0PIVH3nSkBANHmTsQ9bbWCipDqJW4Sg2x zwwCO#K&|hXd$*U++=^=y)j#^!eGgK;iWAlkO(OMUv7dRF?JDVsiH%3Mt%y2`6BP{4 zNInjvxRpNz>-aEBUOZj!2M$<^Q#aSv;p-5iU>`S$3MSMHrYtIitd!^C{A5V+nre8c zl-yh1*zGqf!>+brWe^ee`n-3qDJ{JP2)s^{tUT%G9h*Fx$}?CRb;t!9n^-J&ZkcE{ zem{iGCE=UpKOth+Be<##7G)2E!1 zh9YgvTNNTbp=?E*gBxyg%vpwI$5^M|ppcqy=*L|lY9K*`Ql73Qdo)t-q*#}mieOtJ z^#A?O_Xtmb%;)GQGRqk{@mqn?pTd)7iSamh?x<_r7Ly}kqv+t}0h zPP>+QQZ|Xu>skP*_CjMV9ixfza|ixXrpzv5(P#O$BzqKXvQK-4b(G$AV$rK@0So9| zImA=nt_a%1k7KF~;59({vJb;WArHQByc70c#Ji=4>d>^uhANq5(0b>(?3GE2-AN5w zE0Q4>+J?Vqv{Tqp8^V`3a9q-T+e=01#$Bb>H=sXF=q))*n^$(iX7v81>-?7M|r!na;;m6qAs)|V|cP2FwG(MLJjdF|X!epZdk#bp{w z$+pVs8kyYviMijEZhEn;W{x;lmzXct;Y9S}V8m!tkuQ^p=bfL$y8tVK8lRp0q{VlOEL?L`G zV+BMD55WI254<)c>nT;$Ua6eW!1I|@zITz3MDJ;HO5Uh!`F#KK+qkq;Y_~b1CeLZY znzMZHB<1h-5S77lq*B~Qdla&qag1HtC>&g0)eq$_5Kz(YVsv=n)Ha31KD$0{jTf>v zCj6xtoh9u050tX#`kyG}^^0o8q2ukVNyYe_bmI&B$3Rj6}$tiO`` zBR>9XDc2PGQ9QvbpJ@xTa6fSxQiacdae94UEYt23kZQ$qSbq4#=kWDGK_QX_VO4Y#* zs*??f0nyqy^*?_}yGaXY1#&hqDxfe3`XuQMsNG!Q8)m*Nx76(xdNDZ%#NeYJcN7_1 z5(W>#pR%-d`NUt9Pt+_3Bo3u;P~7W1*Y6dzQB@pbn}fdT9@#Es;4KK@W7(6XJ$RvY z##EbHC8AhNEkTunvwN0VA{28Q*Q7N$#wWM1a9 zh#<_ty`hRnoVjIBUg+~9N5BMq7IvUs5f~N8<$b9y{M*Yx2Ze1o*zglIx~a8D|2(t?+-Y>daJGYKQ zg#@X9F_D(4^7}x$AC{{{K9)`nVG9fRpUb(E(+fRr=8v_trL|AADg@u=gMSgMqMMRk zB;Z}pwCbEnZdDQPcJy7$r5i0o_DRx2F{~3^+OvVzmUjlnf63B7acgUTsdyzlBfH0k zT!F_^?j9emtIC{|5-2~c-+cw@TN>mnGKCdDCig`@mofG2{3KbxR)1w^A? z%7+x@CzjjOIgr2UuwoZudv{8)i`x~sy@Ib`o`n1UMq|NQy+9Jo>nwTzt6m`3d{QR^CZF_`WVFCVh^V68b3gccq~S$*>qR!EZN!X~)01jL3ZXmDwA zwQa2e`vTrMBtg?`Hzw?|dYKn1&bjq3hsyh#Ly_OyP@Gj{fyOuPQn!kLB_mSAXKPhEX>CGx(uYT4*b(@|;o|`S> za&_#L+Rmkaiu#9P&jzDmbjT)CEL3f)Id9{G^u_YXoyB-Ladf8{IKK$~EO8Z-4 z^g>!rXs&BKolbaEhBJ~`u<_*4U0I5#gdqi7c{54a-+U?`lBJH&mlL8WUN^;94pB_O z`(|jUV{6xt*5S?g%TdWiM`eWI7n=XB^l*qR&+haJDXE-t787>9CFQMlQX`Q zR36%9CcjjptDw@%`Wrm8fbN1>P7dAF6q`fa!s0^Z-j`x52FUud2M@gKoEPM4i}+fo z-I

3cz1(Prz;-l{5{_h2cl3@uc)UDmpEDC`V^SU>oRgPd=TX#XBbaX&f-QZYr=V zPIlkYM;pRmSRJLdce-+1dB$dB9I1i34yXd7D_YULZi^W%01a25mB*aRZB$isj!gRg zUMmj*BB{UTCD`sU#|V~C5LVEMR%hkH1o@k~B1?6%zWo_7zKt%jTKAi}d1y>d6U`2K zh#c+xURKG6ZM%N_^7-kK!MmQiW5Q0UNedWeLnyXWd_}g_J{mn;ZlphN?pBc5@w=={ zPc&>GafDERp?B+%tP3Xk%9uvqLlqp3Iwb@KmsbkL`+}S7QVi0L) zeZMM-yiKP;^*dPcuFQeMP^vzyDJiH=a~ToknufSE3FTM+d(Ol>>oWCzBHB1lWdF*jn2TZdaysI*S*?E?*0ITn8@@`u*E}?R>TJmJygv8&<0Q z@U(CD7!_)n>=G!)o`a`|{egHnDyGwP#m}b#^uEIqEFKSWFI#86KSStWrS=A$`5Xwo znE>^@&gAEo!~D74r3?&WoXlN)*{3)PCicqb@2&-raYp{kdo zqM5w~{3~~Qw)cm%6IH)Jprxx>kgZ90=!ie^gP{*rT#45cBM-2bxz10>(2xB3-L(ug zS09cy>Zk`UUXZWp!j1KDEpz=jI0W1Gg$He)|L7u)D{&LrBeX#>2QmDLi2Ivd)jleq za#XAJG#@~zpuR(=(fO2t!Vb8=0n|LKHL>;vm5!k1Pu-At+k#a_)5vAy zPlDc2>oV8a>)nNUFXHRSclNkyo*O6?vGrBb44xogV(*bSoDG ziH8XkcFYRkiNZK&6h!DLf7BG;ueS9hp5lH!pecsAc*?55y1_jo|7Gat#|JhBl8$fS+$SL z!?!EqoM~-rEAaiLl^()D`=v1pQy-|W#}H4%<~KK6j0}nF*S|0CjoB!Jf09mJ8w3dJ zI3%!VAl!ovr0Tqx1fqG`17hlwBL1yh z*P&x|JTD`HK7ErD>g?|_YRmGCmtCP>m)}kw%meTruDrExegh$2mDfOVq@3EW&llYl zS@EF2`5LK& zvrDTDpyO|BhGN|1LuY{N^5xH|s#pQvX?j?89-Q!{-r~g$P9@1m-^<~&IX&uYA-h=) z;6WAkgB}H`B(@y0OfTBavc`S?{=dLAON0y~y#63CAPQY#RMQsq*@;Svz0k)p{#4xU z%DVuz{Y;ybkpO{bvG9jtVWJLE)u&r;ED26sx>XTeu}(|UM4hh%e-EUe9*q`x_q>MEB8b=8EM zHM{tjKyNB92$vj4VnHr=?kiH?5W2V==+oAYML1-Fz*hr90}TcMH7VxqJPeBLZ>1UUvRHK*JaHrRY zTb%7jrc^sy>|J2dswuZkHzRPQz|5K*D-s|cUq!IAgIjX}#B+u!)0OYv_n*8+wQZf4 zCu9MkO3AnJLxU>cLlLUYZ|5TM{QvP3oNe0Ro*7fJP- zX|=2VzyEm+ZDM7)cg8>*y1?$^y7@ZQYSSCxr!2^jumCQ|lMHEv-!P4v%83muG`Dqo z+;NU@e*Ov}DMj1#RyGBdfWjO=Ym!8$ovDDr@Z=6Sy1JmEr*4u)Mt#Lh|~ z)E)Qh_`C5a#4i69Eb~CK@PFY>mvYt(4lmn&#LWuXhEe+ywl9b5b}ph{)M>l0s2IU3 zGhLUs>H^D`w;Vly7ik-)4s$*&6;9+y;#Xoc}ZZdzRKeNQ#w)zGO!q1 zTP~nN=^ywB4u^&$IeEMg4(~p5pzDm1L%+Uig?N5aqoW9q+vfo}uM@AG0q1!c!12m{ z)a;K@G06zj&i>lN&cvHnv4BrgTz%J%SKRACvO?3rXl$?rT&>k_1%ly@wVVm zJtRuBnm%`%`O0WD%>6CBe7e8zCR9!FD#AM3NTjPiE{Q=oTL-;PUh5{ucGVzlzjnWM zBGO<~x6{+2$0?eICf&m|8TZqH-gBg!8Ue{y8;m?i0im36!n5CDhEQY<+t0 zMhN@QI-+-PCug2RHGjq^JNEp~FiO}i6^1{5qq5KGebP*zp6A*K1c>xfOi5TBi-{8o zryX?kc=Jwi@LYQ_*J+}wS4NmfhU@qrLBC%pw&a%Ks1Q2IK#uC_HMJr%G47^UdC2d@ zq6}HTed@ImT3Y%(tI2VTW12LGc&vr8T>yK(=?~Y~M1WoJ2LPo%^>!C=BEFVU*?$jB zf++ojJ4&0rx_ToGK>cA0b`!pIQJ~tB`T{5Vzal86`i~LRHI{S{Q(ciWt9;T%$yo1S zb^^-nsL|LUwEcn5C_2Nz9mXmrLH1WtBa~%g`fs5gz#jRGDj#M^mb=7{?0jxglC?0{ zsEeRBXr^9@s4f>4?D{j`56lp$Kj@Y$6`dskxBOFXy~N%eQd;UC2F`7$TuCO|#X=+A ztKs1oiX2p_g>VGDF;z#jyx}iwUeE2NSbmA;w$k^=jN>5l>V{0|>~bL*xaFUqH^NGd zzU_qa91(LBw;8(;aiYI#5jvNakIxB>nr4U)5WWc6H?jIB-a-ECR-ge#Q4UT|rwZzR zU5ZWL+QD;2a9pDAVl+%Qt1i)PJt@_-=dG8pYy~s=UQA>uTKPmN34iZj;Isx=5?W~> z5NOrjtNoX1m&RkEH7B%wC>%|Z#A07o(ApPvQh0yPXlKT&l&tJ-L=N!T(R%*<9G{c_ z(7_<^=1$9o*`7+(bksM@s|c_VU-u9H1C4bVp-+y#rzY8j0P^%s!`j;5!VfPGdho!* zDh2z8x*rJdjaLJD=a$&q8Vq~$;&cE?Y$pl%Qv;t2N!yVi*4@jE7w47`t=}#S-`_!v zIvdnuFJ!6T?OjW{-|-8o>(_LuoxuuOavl#;Bv_5*U38XUtQ8iR#zVP1&nd`%SShp9 zHFAD&Jn!*2B=ztC^?G_yFPYP>Z7Q_HjDH%cAq}L`fZ|Dwl0mXwPNHX7kWM_E=%}DE zO%Uc+(GS0Cgz04pT3&CxMGItMrOxta(Y`#vU zMumQ$u7Jw*-j*tSPm|`@hvSv@gEVhV|0ACf^DI*MF)*RxADO%GPn_a`TRt{$3QH*d zcXUF!*d@#<4GI@CiK|%n6P>u67_Q4>euBO=t$j_6MfGr94SqaLbO?SWx?+@si2pA6if?dR zfm`;31g8bR_Mh0CV$d%&aALF2W^quva1d^BmX(iM5Udn^$)fqKGNRq9iga?%wL}~d zruiq_PGUK)z<_ZUYpy`qlM+1cp|EvyrlqlE^SZ7Ul)Po0DUMKR{j zluO>bu&brwYR#i?9p|YP-1OQwrisxIwpFe@Em*+(r&agNa{;u<6GUp-kQy$8zAcao zs3?1cQYGsn=CaYPA0oi2;BciocUJ{Ey1QB^d9>n39-Cs6(r!Nj3weQ)(_Lp)+oR=* zvF3VZ&n9td&|q9tqPz1kG?%zK@H5(igap%~n9(W1aQuBCfB8sS`4Zt1)6e`zVM5|D zUK@S}<}8CndEuR(Nh~OX8p&(o&XG-<;3qMFr^N?9ab1QE0Xh-iM?$Rj@BPS!G^9gyP05nJ=eaTofU zgyh3*fXx7cJwuyT#UJK0hc5dKB%1Gc^w30?#CqfNQm&P-I+dCNNg)WUjm%q;s-Cwc z<2PTIdzJ$K=sUlzkd6YYh9yA66`#&#B#<`l5I*DeD_@dGAcAa##Ksjy-n8(gtCMW> zNoE?adDhQv)t6~z+}s>T|62uf=R`_!oSp70U%lpD82U6zLMVi6!;`=AC0g#IT@Y5h z<*5JMFcvrP1LLUjZtciilvG*$MZfWLme|>iS-l?JH}prUK{+22AA^B)wWN@^iW`bs zJoK7sxS~wH?GTbt>$OZfrVQ^L=4MXZBlhg$`SN4%r588|03uRF+jP&aFRz#wXuqXW zKt{f*KeU&<&8>mX3i5C}nKlZSkw_`o{_X!`3mDnz|Kr1hh^OvPsrAk)=gkZtsxiIt zX~!;CJd((XJ`rjWCainWvh1q-9(P)7IF!6{;7)`+DGGZ&Dk^*znnVliC2grqcwT+= zHe%-a`rs(1oP3``7;b{irB}ztwMvq-)6$jlAc3qSIJAm0>vMx_u)mb&T}Yk>N@bto8pM7pyad zRVcIC+5VC)lPM^S#YWDgr)`>MXJCM9*@Aa6{?Yb&lalsbb^!hlIEj7xFlv9wWhh`c zVY0VFv{wR8+oF5Gd!>14DL9r5SJbv~RQ!+kPU%9?zdJVbZeMnk!es(pw{bx@_1^~j z7-oTh9W;-&m~v%vY+V}i5Nbvk>$(P9it1gx1AT`vuWotUdJ?tMoa&5DAs8aG=+&!? zbowp$uWX-e2FH^mI`_Y`k`FH| z<3DPr3h)DloIDN)d2V^jcR;HF-lTT#k!U5;KW>q}W~`YE#H$opHPmdUZI5H~<^@q~Em{ZDVdxov=V`dvf3dNA+ILaZM&rzD45Tq(@ z2Hjf!WsBqJv;F@HE70wNeM8|(+iIbYFIPH4sj=*9QGHorz6FtnuBdm51$4+Ft zi{v>-{FKv>n>&%WePX7bk*#Kr&DysLbVw(U3ydWB5RX$-hMmAiUzg zYZJnWiInMAG+5)!Ya%!CEe*fY)3jlqW+3#G9mJz2YvH{L`X4R*x{jVSFMf`R920** zWd*Z?51OE(wiHc^U+!aI1Y5w z*li}1UZlOp;)U2R%6W?9RA!UP^S;X1Omnvcj!EEHjEiaYmnT6>2LQj~45?`cBZ`N+ zQa13941U3rVW$M7lHQ2s&w}sx4w-{=fd#8#le3}OCNZcqTP5t~-(JURaKCt`SZ4R~r>o2$i z35&VN4xPkAskgTG(U-wsPtKt2XqRKzr*UuCpzwU@fua8XCHMZ+mvs~Z( zaI)5;+fNGex^Vd^Oj6qcuLbmooJ$V6y(}-PBRyKkO?RZbWQN?!kb3am*&vJZk za5F0Op-$1|;O?{m)rCqBLq}Fn18si-MJaFOhSjg|ur_a`1G+J_-HW%(ahG8W#^?Dh z!*q@M5qUW#+4CpwwtqX-l>JMm1OZ4_eiDgp`lASFgnM6CUF3Ept}%m?5)EVSvSb1W zO4+5d+Q!C{%(3CbS0M5qyScSlI5cG2NAox7NbEHR!^V3y zu2qcKq3uS0jOM=8zW+3u6H7As+Zo`w=7{Yo(=&nO2Ez?AQk#+4c$bi$&*AC3a*G}6 z@>WOfFy0;ScOrUr(XjMW1k?OqD-Jlw=>9nB93aRY%p0&$thd3r3}atQJ&^e(9IcI6 zGi3WPoQw4IGn}iFLt6m_0}y6djdbA5=UxX9E)F5R`& zGz~5**Rd&|)c8dj!^oBU6wIZbfWEe^WwQcXnsY6TZRM9ee_xI7T9i6aqaqi?T7YU%-p zeQU3{;z0ZzU%)~Sv2TYdFQnzpjA2j@3)c^ft;w3O`(O}T*OTl}XG|AdoM#jYFJ7Z7 z18N(rMMepaA6q^;atI9X8STK1wZB{N)``(=Qm1Dub9Uh3Os=G6$yzw7^wj$2G7+<{ z+k=3wr0`x=`4)oL*r-5&P&t+T=$HQ%qQ`+TuBXV=9+jTZ{NGZv)q_1LakeG$$A0lu zv#;BgpjO}`ETJ?_Kr6%>^35N=@kVxlkHN{l=WebLp$qc^V zB-Gh2^0n{>=N8W2C0bU}2VE>DI+6zJrD#}XSIcrv;7wF9;nmIeJih?i+*eu$ zV}65Sm6aGYv``zxVS7gNej0p`lUDQYD}a!*=x{*Z#$)zK!=@RtK}h{Vk&p4S0PVkg z)j=nPs(yK4blhK4_aw%b`c%I3%FF3%|4u^ebL8xbyat?Yyelw*tIa3|GIV23)C8nu zyruS3(9Z>JnpUB+>Lw?&=4Ufb4>{eBH>S6pexD+9~1h9vtMTX?6FsNQBJB*{vG`X9kM2^dVMK8 zLffcD5VVbYB5=Oqc9mAm{xF2aTqE#(Wq*Wnm^yO`Z_qDC^y`e5w-YHtTi7b%-;KY~ z_97l4rav#B!+A{qBaQcYejBH?RwqF83;lHU@!scVDb547Qym&eEplfq%nk|B^@1rBPLl?rbN)O4iu>M=e)L|%J5PlmdabLuCadpi&(pFN zyrD>|b+>7I-ZS(RO#0Ny5aw@xLHv53RvM_+uLC$In;fxHO5fZ%bIl&-h=Bp9Iyb>HHY=TgXFaA~jOBa>8njYs zYCG$V!g`>wiFC2o|EB)Q?fy;u7nlE&`j2q=OM2tx@Sezm>=yOjkH$f~A+E3aGzTw_e>Zt2r^!^(4S|IYz z8LBr3edAAf$2b7KF|aE&ZG>YDLfrXKTI@j#&ucvPlG-XXvbv?K`c%D62fr)XL_3J| zVU1g|vwCgNhYAe@Yc$SZ->uq9u$Hx;qAnMAei#o`h;#;vNprIFt+w4wjdA~e%yvU$ z;*BKyL^!pcc}>*Vi7T8!a};Ai0c`e|rKZE}40cA&uRK>Bz1o`c<(0C@Lh3ZPS9Ey+ zqhNEg;({O7bHM|k#GoBW1qg+iWAU7orf+QY_5iw({aDO5gm)OcvHaD2_PdZkdBOOTk}_u3D^v5u z7t-aPfo_yY3Bb_}mT|^zkJJ9Dyrc9~fg>wk7myk18ewY$H7)aSeHV7_kY<+gB=Uq$ z?Vio@{6rzi(l-}&Owt6OQ6%mT}*0VD-ljH2@^4{rReUVjMh;NRftKYRS!_QV;9aE_OZI?Op* zBmIjJcq9L21n5drU^6-H_NqHre*gkbOv2H>Xa8#pHQi)&@$rRtRra|-lI?S@r$HuJ zXd3@5Dj+7!qjiv|k{6jtmx4n#j^p-)>-C4M{pFK<(=&aBPm_1F?)ZO69-dydPP`(P zrd1sk;ri0@5_V|&9R%L&Bq3=5TGy#&lN@Kg~uHp;u^p)0)m7lxvn%!MrYO?(w%wG@0aid#md?z z(mKh*{bOxPIgcrj4()1Ryvt|vayN#m^p@1?zG;YG^hvd54eEmK0sYiYx{EeE^eC={5M;8c>;t@NS(C*f2_S_SX*ts?fbO26?ZG{?p|Dr z6etvTDPAZJDeh28DNrP(P^1(sZo$21aSaw6f=ftF+CI-(@4MF8XYYNT^L3KRMJAb< z_dUk%KZfq#qXc&>jK9ImTF4)JRsgBD3Z_X_?kZm>@xrHa#a%P&G}mfqe1pQk@x7t2Lm z{$tis#4)ueD@Z)z7o5IJ;fSl?t>;=Z&g6trl*4X6Y zkk;!%EGDmHWQt}gC4<}qn%m(+T=JOw(XpqEI8%BN2UO_}9^v&4k8YzmoOE&(n|nrI zjiD5jMzt?v7>2uX;45n7%`QbsUU>$LI&tNfeoL6o+Sj%FxA6lTk21UP{6;!FavgcT zr3YG;kzf0~tG*0)s5q#|AKH_!&do*PdnhUj=`8o2vGa^Xi}oT0g%$*Bm-l*iQGG2% z3lBJi#y%HKCnZ-r`e{fe&sJ?~D`>GJGiSQC{AkT&FkzJ-_7zP0)t3Il-xA3G(I|od zgrb+jsYNcz`vB0rG=iX=x0^des4{!ZmUZa&%QIh-JQH^sWC`7iV3psJ-? zqEWcOfIgfn z$v|97T>#dDv4DYYQFXTuJ#4mUQX=y+kY?iV-l;dAL~lHm8+H?E8w|L2}V#4~@?( z!nj(2O>OQp-5F==6-m`+5C7GQekM&kRQ5xU8~E&xfx3M*SS3q%wRiwQ6FvGk9Z#*n zVumCEBqAQ*s4$&&C87LwPnkB2zU`3Tr+tVBCXZo@IN$)fkE%AC^oGtdnLFCipRYtP zglD=B#3WuY6|t4RdNL2Aq;Y$yHfuWPGI*J*G2nurt$=gbm7t0WBT-&B7q{bqE6t3y zc&M{14HeMZsy}3%HhfOLaM#JwfM*Ol3G|LZ&j@ z>d(c@sw%?T?tXttdnyUK~^H$3nN3;jI1rLMT9@L#boFquxOGDgFn8KUDCax z7H>L_p#Bw+{}wfgKWmZ0^Vg{txGtzQ1M^`191Hr@Q8s`0+yUAmaOH z=MA1d_zX<0`a?Q{K3z~Xy28^mra^Cwj}Vqc&%jo*6w@Iw-eebDtGg8bJP_zu@a=$u z$^2tc--kP#@jYBoi=b$~S6x>I!Ng^nxh0Lw;a7p$P%rV$6@@GH6~Ctahk?gcZ5Lal z_28#O=Ef$z=9y?64i-vTGh>_{T}gC!i2a{24oh40KWqmP1g85g#>O-~lso}N$YhV> zFvNdLb!ZJ5YIX4c;J0QO@UKA;sdv5>y|7VUm6t>y;`c_t0u$NZ-?uE{u2p&`^qfh1 zE>5>>#XsV1<+tQ=$MQ#VdAzD_h6F>jBa^;yk0ukm(x%bDP3ydTrJC3AOmD!@A+ZLt zd8IOyk~IB)ngxjb{9|4iuT!!G?~Bqt50&cU;Ag(qCx6tJ#DUl`ma7!d_HmVYU^YHP zg+8y-B%LRV*AI{KQjR#>_Eg{4r2i8ydtBBr8)K1U)VPTucEv2ue*{c8t6g(sY3E$C zT?%b^YrKObhW<5kgQ4rFcE@UOx_I}aefZ7$r{Ve5bc<4FC3uz2R(724SFx>cYjUMV zZIlu1Efmgdfz=25(Ghd?!rjy-pS0vBf5;E#x+VU!KgA>e4{G1!54F!;)2NdDzoPb~ zk<@+xE_$kyH)-0hl|7f!VEm?`MBvPQ<44u?FDE)(zMQchGdKmViZ*x!ZAP9I%otP? z!7rcpa{@h5U6?21D$V{-`k7PzQ2IV`No7_+-oK+Cyj-Ly{$xM!kN}iP-J^WL`<#hq zS*N$22E)Y^|LZUZLGm>U(|Fny9^)vkXV4ahxjZ+5m-=Lrc+xdBJdN&;RAS85m3|Cb zq}jCl1J)6yPH1P~caUe-{g!7QhmUT zefn;@Cxkr`@8Kfq!IX=2b>fviC(@JGIdB|;yk{PxRL)?h^`aa7jr;%XL*o7|xN7sv zB!4^mVLC&5>aK}1HNI{oK&)yROct(^;)xb7jEoUioopNsCTVr{6xwR@zb7_;a~kEk zthQD>C7Fg*_9sP`dQ(sQp()qC4F!+Qpi7;~^6mWwTCR#Gn@N8mM~W?4z8#Rwe2~0} z*5E_}#>W{x`h@?^)Jrp1Po}%P3tDSmRnC3QC;dC2p}TI=#VPOs(jH)XDh zTssm#&ysZHMgKYU>!Kr#k*IF?9U;P?8y-W3NXs6ep-6r){X@Ly^I4nO^@#0UjBNZD zKjvmnF72NN?#9~ytR&B)7dc1mJ#wOEr)JoQ!irSOYZNoL*Y9>UQU%1_nj7p66@5rGIzj{YLPyecIb; zI9tvC|}o|RTo<^qjEbvs#im{$%saEHpkU*W`nT5o}V!37G0TDc^UuJi^O69~?u zldFpfDih>AU#m#n)s<-0Tpt7_fUtDB?I$6+q{MqGMeipS!`_-5#&P_yz(^srj2zcQl&6yy)zeivm2GRf_{8 zB5paIIQja^-x}42pqRRGtPUsd-w=n9Ucxqd`FV3Aka-)B_xxki1C1~&GjrN-4y-uo z9OL9BVD0DE;#V)w3tfrc|BW1I%bV12*K#96YnD+EN-{sKvlmSGVE4;A7B5uN66E@M z2+Z1(50rMJgW$-Fh8tC6Mnh&R zd;!`4-qHq+0?QxQiGiZ-b6s?ey%~mg!@SmpW%R(?4M?iso#k530Ie=E*w*DxLMasQ z@t?2++g`ydUYeB@D{1`)SBato!UANnK5n1V#g`S?H0xjK>bkK&ren*0|-DyIZ|7g)8(Oz#WdgHh=2S_jQ!0{ z@|R#Z7T2PZ1NmykUPgBs;QsVOOtJMzaQDg>#|pqu!Y5=EdmDzI*PpZ8MfdGMdW~!b zYYgIhS6zMa*NO_n!psGy^`Hr_^Mvk&=0u<)4%0=GwcLpKv^R#nn=;Ht(HJI19++Cm z*8eAvVGH4S{B(6e^0f6BWCM@7Yd*>gP0c$Gv7CZDJfu2onQNLe`c4@^j@vi)M!p^m z9YrwO>Mhh%1hXdb)<55_YB0Hep>3oyPHK1bkdlg7GoVfc zH$5-)@ilB3G7|^mgD=xJ23|{8b4g91l?^f1D&u{ab*vyC6ZS2+K4G8la}N$%}QC3uHU4OyCU>=-QB zLI{AvNVZ6VejrqW5o8r*!{d@s)5nW9AGVtx4(|X5M3`@~u6Yvcgapd&{eqHiHokJ6 zqly0F+=nm-=lqFjUwp1fx8FEeVtr^7iI$SOfjz5d_R&JwisQ{)n8=8>nTlZ{LwCX* zBX7=5-_LcbBc5or4QnEvo38IfF9;|C&qZhAJj>A^X68|K-zG@*8Bk{xjZH$r*M?+pb2vAP-LA!F(9K%w z!qdljLIu9qNw$=j1)M93PaOCEXhK^GETC8AY!Tr4YW9>z2owF@iC_J0L|poy|4xYR zD=3Hzz`4X1e%J%7;e)Rjxy6@yHXTTas}>W-1k||~mNAbOLkPg?`n||tO=hh_g=Uk$ zpW*GMc|}Vv)uhQ6uQRYY5I44glf$Bmk8eh0?#Z8+vkoqf-e+hy_8-(D1>^3S)m4m#87B0bMq=L``lF^BNyZ`HLS?^mX`1-G(FcRDf;gH_$34$>9|b8&r-eo=eO?FFEZlf zB08=3DPl0cBKzbianU0>#g%mL?bpYU2XXrt!uR-y0my?^{Er9?09n^U6v&r&#eTXS z?g9QfFHsS7+L9Ii>pUwO#uB(7)Dd|e`UZjgzx`?q1sG@ybY=hhXECVLt08>wI~!a2 zzObmYT`+sOvU5EPLt^LLF}wLzNy$hI?;xO7h$1L#@3@@|abNT0csSZSFQUTB;A73H zn^+OpPMh5YJzuLPot=#@y1AM<-VF|spwo5;Z~cVPy#0bA#WI2wiIgA8UVI(g>C$3< zbMz38W}4QCoxeYlT2niJ%U=R_owgcR*~zIq!rVrTS0HC39JW2hu2qwtK(G?_LFge{ zirD9G{5Z`d_MN+&;{uz?hD0rV#GMe|_j8sZ3w#lWr)M>lXJdk#Cm1qGkqJlP>Rq#+9;y6f54A?`AOmU5f6nWHOhsWG2 zzHe-bSLBX96>q1N8!qif>`8F(i^c&m>E~`kxE)p3#|CRl=#U87o^Ya6?3lloryxpe zt|5hIYtH`YpljnUPoML}a5ae50B}`)J#`Z-`Aw(y9`7_DvB$h-e!Tcu=lz09rYMzw ziy(v8lK3aDT?wdfPw*2Z(2k{#^m$NlBlAl(14r4I?*(|f=v;(T<>8-$#)_%W9#65% z11xsmjI1k+SX?d66%@|4rX;pM7%Zo7R(|WwOEj54w@3ugJ`5k(i@(rQfTi6$O&QKc z5Fdr9vnz=)7rRC7E|eS78yqO_>FY;qFkgvVb!hO@`XIW!v{j-CRSD%<8azm;d= zy4k=Q`8UV5&TVA*W4qKEn;$6Rqhwn821u#E zM97S3pAXocrm;)sUUHecL|c&0>grPF zi#ZjvGhgvd_$Ja~6$U4>eazDiY{O%led6fXSz?%aY~qx3n|UW;f6X%gEcH%Xch$n@JuG-8ncFAiKqKU6) zt0Yu&cwnR-uJq~mvzm8@3%;upV2v=hpbJdbutRLJ&3Q@^GLy8zB^RcqpaWa$8-L#o zvV*H%$9q>B6eo}&)@+FI#L}@fiWkw6+@EvW$cs`P3z4uI5uB8Uyy6KR-RKuap2`r^ zVg#iGL|?ogfzrol4Z5_uWJIEwZ2F28O}KZPz_n&Lhgm~=blagYJsTsuX#2&aA_9eG z7T75ReSj+=3SJV2uFiPesAt{-yEC(lON$|9VfnT1D-$JJFt$@G*QnS6vTxBxR|wgK z38{tK@U5h8F_T?-X0wq~c0M>mp2%2AkK@@D*CIn)TYFnP8D&B#`xDd;p1gt@&t9P= zc$4c+HN6qz%ZRBIAx((c;UPQa@uQEp65TDAGk%O0^LmNWIZTt3!%-gAMoYJZEK1J3 zlSdXMdld~ZW9yL6Y3sc?y1_d)dF`qIvdC|K$-?~$+B2$XF*IyObK>a9n zoIGIG6JbMXNw#>)W^H;9Loyhg{Mb*d05K~05GNti@{#qZANmU<`uufC=tO4jG1$W< z6#9S{*q)dj_FyySUWXLUdB)T}dQRyLr08DKAn-flUhnLp;Wfb4SCXI=%EXcG>)v7+ zS)o*^V+ZM-OO)(V^)J^w{gxuk9LYwESa8Y4tl+iU2}a3jRzlqPS7?v8y4uw4u4%i` zDKV}C+5~aJ@-$FezCz`71OjtRFABO2I{Z~dRt_sVqKm2WH+VOrj%N+P(Dh3Gd9U1_ zkd`u<{FRre**OE)I#}Z>VO(S$FwyGr0y<_tfHz^YM%4bm3=7EbQvwgkHHX ztJ{Qg?&XSgPsgIMOTuDn%kvXK3=#p4gvsF;qnE6mtiTmZYdJ5a>mMmp!K&+y%5FUn zxi6MMRq6uuBUT}{=s&gxPzqJHbTRddqX-kV7;mp+Sk$;q);ojwa(>od;KE#F4cMJ6 zY9>O1Xbaecu1gfxbk=^p#Nr zqXMXDzvMqWCo59hvPvYDuz3Gdgu?j6lOP9iExowm;Rin3ll~mAw5r^AJ6W8|SL0r6 zvDF`F7-XVQ>I$nxbf~mzi#s`RyucO&?b}*#3&_tbaf#~Wi>k(AT)@^1p}FI+t`=5pw2rrdLiy4-??-M%uIVk#yB=jiHm&-dw@FqCegNe z>LaNtik@3^=u&&&@xGf<*A87L;xm~jEMH1Ke0i7)l!5RW=Ui?3_ieH@Xq4IesayG? zer3iPKTX`Od%oGvrKLpFcn)B{p%We`WHZoz^!bKwH80H7dE(V)?BVpTb73~IPi;*E zZM=1#@TjER&AI#0^n0}N$jTCRC;02)gjrp@JhERi8UXMUf8|E-l^IB4_?Z^_euf}KFvzB`NA4pp z;iWLjpz09;w;249CKiuBCww!gNuH#V0)5qpe@o922^9@_kYfSO-aKPGEOC2jyDs~F z9qe|8N~5m{3s49|JTf=-)#q^2 z=N6_?o{MPA;3Q@!D#7lX6e4uRRg`YcM532B^Qs*ff2Ji6LC>s)dcMX8Kiawf$Z5t6 z7p`EVPeSJzk$j+OA-m%7y8qk7T5(UUq+N?yW1gWHNV!KpN=}6flys@w#{`H2gnM|aeAXxP&J2fU)C4pbL+wkt>gn@8H z>WZIhTLohY)=m989pVJ?b_l$4&04JtIYQq371mA^LE$d_PB*Sty28?M<1q3oh|Iv- zQa#zKM}X`gM|khz`~&2pq{#2POugVU`UnqOY`k;$diPjgw4?8aw$hRx5%R%7?5LCG zhn-g)AZ;8Jc?XxL;j32xzTkk49b0sq_7N`u4^+KNxo!_MQ#D|_GEO`$QT?EJEB466 z-1SAqn_0>n#PiQcgWY@XtmUR*#Qs+uz>LjYMXPK3l4TA>xjoKH+> zrCq)2IvW<>6sihv%WO=R2DbO9L^!!{JdcA}=yLgb&Aer|TV8rGvCU{R(;6vLuDGf3 zz@Z;oi7f)hEL+$3tiCHFJC%8o*iNO0KD_K)J&Ol%6%_~Kj8-plkQ<(OZS{bd7#dko zbfc8nSMn&-p<}IzRD{R!j(GSFQdhpX>vF>ZF?AZ5j$~cC)sFnzeb|niAZO)LdKg)K z^jwoc;0A|jX`|@6qc%us454B+CRe9>yd8Md%c?x>kFrmFHNHnA*P7)7`kshmE{n>l zEl;eiKYO5R^@+R<2Y-B{o$3`Va8*E(g*~$&D|RovJ#p7;&3D8*6^kGOWl>C{q8vZnm0;@X7#O zDJiFZ;Dt>rm~7sE-$4-H-QJe~vdUf(YkImvW!lB*jLJQFJ^nl!BdMqMg&^|#lGSd; z&(>2kcCC+TsqIMKEt$hNzu*Y94;jE6A{qdRhOQI#fY60**7HE)k11GRV>|v}l)0lJ zNdRJeZ-f9Dk@uh|QG*n9z~E6xkSLuccNe8?4?fQ*Fd!6~GP{|3GKoyJ0PS5#d&6sr zESU-b;tDEGls_4+YgUc@t1fD41vDQX22ElvV)c)vY0+@wiGMc-{; zj*=CBUFnmCEvb|of|{FKG0Gbix=Hy>m8<*gtgvSP{^4kS!Dr+-QIfKVQrJSm(-n8H zJ@;Geblz_XGzFXI=vAjDgs}4Sr-`0src$uYxp*hzkE33|wtIqt;#XaG)Hp+Yt9^E= zdj8d49>dGNTWnJ9c!;<@^|0~^i+zF2mq5wja-w=!G7tg$7ah%+8T;)|0mpus$vexA zNouzIg+8jgs_7-^4L5YgkS&!A3dqL7+iS70i`+^&Xo^Sdd)%TD|gO z$ZNAXr;0Q$@@j_a1JimQCvuWZRrugoJj%r{xI_SFEc0t2{aHSB3C^l_{daFn?Yd5O zsJ3WGAKneygb?B5q&H8w@oCg!nONYkg_N=sH56p6hmQZmTaR>_8A!3F+Q#}zw{-=x zzF{UtIDH<=!_mrO#w!zRhLxjHWeyOl8orLI$o4QU%uFh`Sk9{zJ6}@YzeiBH(HN#~ zB7EekE?%J(u@L=Cx}M;fhUV}tXPpS|_XDL!&2s=s{%!$>i346Z zIqehr@al(Lm&7f{0iB!{iVYM&($}m$=M+f1+93lMJNpBx!Pu!fc zZ$)6bw#FrMdnxB6efQ4BG$SM%=?0r38g*R)v%mR#ItaX4HQb>Ij4fZEL-V0&%)8OkJd&-Ll!o7;s(` z=v2{Jtg+XV9)HigaOuC^|LiI9?mQe5^#jyOByt`+H9(NA`LP|7?e@MAS#50UalWBu zFXo_JcB3B!8iIKWrd|(!W8a5vJmTq(di>nzDF4`Ld&b+zt)thJ%NT1pp7(K5j3_)& zxftwBx6Jb z72k8FpD*I3H?mIZ?%(_tbXPKtJIk0?AhXS>6&i_SKqj%r%OqEM0L~!wPf!VS->#qw z0k8Lk5UZt+#Y-RDV95*mEpID6Xs0|kbC!H2@wI{KQ451J+;7cDu+VkkZzYgOrhfVH zlxhCcQ#!tsAbc#)LLI&`wDt`;^zz>ot! z61r`}ZMMEVGo0LM>@Pj{U65>9e7?uIxm|-xPT3*h0Xl>Ac&L4vD*4-pS%sJ87>7SO zgiR>k6G09iOVdd-^`8?V9uBPndXnui#*{frew88@S0#l|1Vv5FeDbg+ZD+M6T(yp| z{Paf`ED53$&!YVy_8fdAT);1dA0SffwL2qubcu;f8IfLD(e}@}na3~T!VsW8DS)!v zqX}$yDqLJWiABnJ{sNvKwMY!pJGdvl`!oC(?a$EFq_oR#P;(4F0*Vs(|Bt%&zZVYi zBd@bbIM1nZF(u7)?>FR5$B)k`@DfsftBmN1R9}A=9RH+(nQA{;8Q<5t0U-F^%iR*< z-^&(FfsJ0g2+p}aqezTEXPfHQGf9|q)l{H}V2GMDOpYH4-nncPd-&_^`&lN)kzQC5 zc=6rIA=s?BR(C$MSAs_SZx}@W64w{1ea&WZ`^YP21j{}NpHtID^7OOIxI^&@Zp@Tu z_qYiD>vwM2emEf0PX&0*Ma~o^todA(NLZ^Pmha(zDvQ|_PZX)Lg66A}rlu850jD>^ zTm?8n`G4_}U|$J>DuY#cK8^;CFHa?D2EW>MaDFLx@*TpH&3{*+MRRykSqZk;#V>~27Dnr5dqF9dC!XKZtqZf} za0+yP+-xuYrKPNX(}lJLavnj$>G9oY#wQ*GYPaUz$F?2`e8VHf>Sywt_x60clrVpL zZr?G;X+?8Stc4c0TOx_T?T1cAZa_Uhs_cx7DY$9XR-5j8XssFQ_tXw~=mOzBXIqVY zy`$NP-uD=goMc*9Ay&*CQ*kBK*cXa5Ovwm$r0_*G)BH)!Q8G4UMae zR=#ywYjYBR!8^K&1AZ1@W6}b(WxI)oI7(bxTgo`1^|3MS>mJpj26Sj&*M zK=H`B(kcG-H`0QS&~t_&^ZK}d?iLQ`2-#cJiIIO%Kf?OuI3Q*%g7C(Meb;p$XS-Fh zq*r1C5CI~;K?g;k2AY_J--1)mx53CIz%85XsCb+rQUy@-niKY4AM2P+IlI;=cEc~X z`+_2vkPxiXnrTownbh>w+4k_2AnhdXb2yE5Hhxp;b+NC)>uqmwsfD-NUE&-;&(;yG zyIkgPvz&E8_hIGv$Wi>qjd0oqF(rU} zct1B=!h>~YTfkLL1^w&YQwGnCT^+zJJIIFCsXuBV^ls55>6X^5sipin0TxSVlx1CQ zY8(7^$f&iPJzDywAq)1Q9DPeTfWo6guHVd$MX)THq5HA5W6Z&HDpB|px8*5g3lor1Gl zgE>G(MvTQ5qItO+EYTcoqHU$l{mKFv8QK&xUfD;#ACoA=a4i{+a(rPpIWva_(f z-pQNJoGz$(-XdeMPC0Tm5D#o8W<13muR5epNzFExUH7QPgH%6_N8)I&U=1I{@aMsd z8evGQ=4<%pT_aCzI2xrskT7Ui*M%5Il^Z?=gk$j2g`oD=>42MWXw4KGJ|#vT>%tn& z7~ZM!461%T_ZL*LqP!zJf+C{5*Fjb<8*ze+#Up%|_hnBG|pQ->8^H!DhLX5KM= zgD(C$4qj{n`hW%5>lx`|RmpxQCzg00!`ko{NIV0pL2ZYN>g!44N>2jlzl(dSnc`V^ zVr{+Rv`4K@uDn`)^n~k|@4JoiTA2RX3s^!6=#`Npaf4$qlCT!b@;=g}Xha2Lzf<>P zNwg=S{fqh1LGN)6k;sh9J#10xMo%_WNQ$AILVF%<|D0`Hs#^g}6W&xF0bJeMwC8`T zu`;9EM^3{w7Pj4m=$K#Wxw?#uhmTd|zKqrqb}biIjw}`q z|CDX)r6RC64|wzmv~fnNoRPHWU65%W5Wcp+SP`Jju=-Ivo{a?_EIA`cbEajJEKC*7 zb;UoYhaV#`%}=t>6Rcw$K9+coQ(SA+rT<9B|28Jglz*>O379k!6==rX z1!(B$xH{T(($Uvv5v3aG@<_e*e#KPb^W3&xjnBvAy=0DyM7ZU>ZjapQeT_yh6X^#n zSlR`w^t!)4DJIRR+dtRfl5HV>+yhVb%=#$15aLI#QT=3|Z7tIT8|Oj!4g#;a@#e%| zAf8PH29&x7#Aw%2=uDhani+6AFXhG~d}Wzq5u&^HBV7`r@$n{1_PyhmCGR=y!sP|BM@rJDnmD;{H16E8 zVgE4CsdbBTv^4Ho|MH5#y#nJ5$6_-!gq>PxO*sK1O>cfRD=_l{qd`EgmH1RyX*OUa zCTok$ztIOH#Bm?|ldXuJA?sRIVDr=MH+*=<7$NS+#*kjVSF`@5X_jYAu+It;9+l-r za*-p&9m+yjDYMMIRUQ8Y+t^6A6htspeILt(RY9hSop4sDNb6hRD?RP*-gS@RJ{3Pv z>>hg^*R~+tUQ6i%5HWPseNJvZ2k_Mb5P3cln#l`C*G4pWTD*wl?dLh)i#JLYSW5_4 z6aS-06~q~whrf+I>`l;PP39l{ZJ0*Y_@)oRc-*j2{ahMJQ5lq%u1FY zKWr*&HiV%^cYTtr1E#nUCp&f;F;Hkt$ujq_kr9sGW5%K0U8<`7M9P$~fASpjs)Zy4Uu6W|Xa&gV<546|@*65>UKGncW{zr`mW--vhOA@o`g9 zXpg;y`0-f5xL}13=-MWt0B$KCye!I@jZ)+9drmtfdjtJd3u6oXDF@{R-%LE_gnB=n99!pr@ z#&f&)h=(^m1JpKltK7S$y4yy8;u@> z^mIMf$S7N_3e`f0PFKG>+k5l#V61Es!wtM|9!rX4T*3I68snaOnBTl+KiA4dW_e4% zuE=?XUyytH1z@s#KGmDC=pWJ~KB)*bDPp;GPZen< z@@*K(jV|Et4=6g}a*j*v*8Y)<@Z@HnVc!o38K*pthWM%5|GY!XaZ^o;$55U*cd

  • 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 B0^I-r literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2b76cc7bb8b8565471fad4f62958cba598e55b GIT binary patch literal 6174 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png new file mode 100644 index 0000000000000000000000000000000000000000..e33466b0fb8d7c95774a976fa76b5eb491869edb GIT binary patch literal 13193 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md new file mode 100644 index 00000000000..268d34458db --- /dev/null +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -0,0 +1,464 @@ +**The Class Design and Code Flow for ECL Watch Test Suite** + +**1. TestRunner.java** + +![img_2.png](TestRunner.png) + +The TestRunner class is responsible for setting up and executing automated tests using the TestNG framework in a +Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the +tests. + +**Methods:** + +1. main Method + +The entry point of the application. It performs the following steps: + +- Calls setupLogger to configure the logging system. +- Logs test execution details to a specified file. +- Calls setupWebDriver to initialize the WebDriver based on the environment (local or remote). +- Creates an instance of TestNG. +- Sets the test classes to be run by calling loadClasses. +- Adds a TestInjector listener to inject dependencies (logger and driver) into the tests. +- Runs the tests using TestNG. +- Quits the WebDriver session after the tests have completed. + +2. setupWebDriver Method + +Initializes and returns a WebDriver instance configured for headless Chrome operation: + +- Configures ChromeDriver to run in headless mode, disables sandbox security, and sets log level to errors only. +- Suppresses logs generated by ChromeDriver. +- Checks if the tests are running locally using Common.isRunningOnLocal. +- If local, sets up the driver to connect to a local Selenium server. +- If not local, initializes a standard ChromeDriver. + +3. loadClasses Method + +Loads the test classes specified in TestClasses.testClassesList: + +- Iterates over the testClassesList and loads each class by its fully qualified name. +- Adds the loaded class to the list classes. +- Catches and prints any ClassNotFoundException. + +4. setupLogger Method + +Configures the logger for logging test execution details: + +- Creates a logger for TestRunner. +- Sets up a FileHandler to log messages to a file specified by Config.LOG_FILE. +- Uses a SimpleFormatter to format the log messages. +- Adds the handler to the logger and sets the log level to ALL. +- Catches and prints any IOException. +- Turns off all logging from the Selenium WebDriver to reduce noise in the logs. + +**2. TestClasses.java** + +![img_4.png](TestClasses.png) + +The TestClasses class in the framework.config package is responsible for maintaining +a list of test classes used in the framework. This class provides a centralized and +immutable collection of test class metadata, which includes the name of each test +class and its fully qualified class name. This setup helps organize and reference +the test classes easily throughout the testing framework. By using the TestClasses +class, the framework can dynamically load and execute tests, enhancing modularity +and maintainability. + +**3. TestClass.java** + +![img_3.png](TestClass.png) + +The TestClass class in the framework.model package is a simple model class designed +to encapsulate metadata about a test class within the testing framework. It contains +the name of the test class and its fully qualified class name (path). This class +provides a structured way to store and retrieve information about each test class, +which can be utilized by other components in the framework for dynamically loading and +executing tests. + +**4. TestInjector.java** + +![img.png](TestInjector.png) + +The TestInjector class in the framework.setup package implements the +IInvokedMethodListener interface from TestNG. This class is designed to inject +dependencies (such as a logger and a WebDriver instance) into test methods before +they are invoked. It ensures that these dependencies are available to the tests when +they are executed. The TestInjector class provides a way to set up the necessary +environment for test execution by using holders to manage the logger and WebDriver +instances. + +**Methods:** + +1. constructor + +An instance of TestInjector is created with a Logger and a WebDriver. + +2. Before Invocation + +- Before a test method is invoked, the beforeInvocation method is called. +- It checks if the method is a test method. +- If it is a test method, it sets the logger and driver instances in their respective holders. + +3. After Invocation + +- After a test method is invoked, the afterInvocation method is called. +- Currently, this method does not perform any actions but can be extended for cleanup operations. + +**5. WebDriverHolder.java** + +![img.png](WebDriverHolder.png) + +The WebDriverHolder class in the framework.setup package is a utility class designed to +manage a singleton instance of WebDriver. This class allows the framework to store and +access the WebDriver instance globally, ensuring that all test methods can utilize the +same driver instance. This class is used in the TestInjector class in the beforeInvocation() method. + +**6. LoggerHolder.java** + +![img.png](LoggerHolder.png) + +The LoggerHolder class in the framework.setup package is a utility class designed to manage a +singleton instance of Logger. This class allows the framework to store and access the +Logger instance globally, ensuring that all test methods and other components can utilize +the same logger instance for consistent logging throughout the application. This class is +used in the TestInjector class in the beforeInvocation() method. + +**7. Config.java** + +![img.png](Config.png) + +The Config class in the framework.config package serves as a centralized configuration +repository for the application. It contains various constants that are used throughout +the framework, providing a single point of reference for configuration settings such as +file paths, IPs, and other constants. This approach enhances the maintainability and +readability of the code by avoiding hard-coded values scattered across different classes. + +**8. Common.java** + +![img.png](Common.png) + +The Common class in the framework.utility package provides a set of utility +methods that are frequently used throughout the testing framework. These +methods handle common tasks such as checking for text presence on a webpage, +opening a webpage, and determining the environment in which the code is +running (local or GitHub Actions). The class leverages constants from the +Config class to maintain consistency and facilitate configuration management. + +**Methods:** + +1. checkTextPresent Method + +Checks if the specified text is present on the current webpage and logs the result. + +- Retrieves the page source using driver.getPageSource(). +- Checks if the page source contains the specified text. +- Logs a success message if the text is found; otherwise, logs an error message and records it using the provided + logger. + +2. openWebPage Method + +Opens the specified URL in the browser and maximizes the window. + +- Navigates to the specified URL using driver.get(url). +- Maximizes the browser window using driver.manage().window().maximize(). +- Calls the sleep method to pause the execution for a short period to allow the page to load completely. + +3. sleep Method + +The sleep method pauses the execution of the program for a specified duration +(4 seconds in this case). This can be useful in scenarios where a delay is required, +such as waiting for a webpage to load completely before proceeding with further actions. + +4. isRunningOnLocal Method + +Determines if the code is running on a local environment. + +- Checks if the operating system name starts with the value of Config.LOCAL_OS. +- Checks if the user profile path starts with the value of Config.LOCAL_USER_PROFILE. +- Returns true if both conditions are met, indicating a local environment; otherwise, returns false. + +5. getUrl Method + +Constructs the full URL based on the environment (local or GitHub Actions). + +- Calls isRunningOnLocal to check the environment. +- If running locally, returns the URL prefixed with Config.LOCAL_IP. +- If running in GitHub Actions, returns the URL prefixed with Config.GITHUB_ACTION_IP. + +**9. TimeUtils.java** + +![img.png](TimeUtils.png) + +The TimeUtils class in the framework.utility package provides utility functions to handle +time strings and convert them into milliseconds. This is useful for standardizing time +representations and performing time-based calculations in a consistent manner. + +TIME_PATTERN: A regular expression pattern used to match various time formats. The supported formats are: + +- d days h:m:s.s +- h:m:s.s +- m:s.s +- s.s + +**Methods:** + +1. convertToMilliseconds Method + +This method converts a time string into milliseconds based on the matched pattern. If the +time string does not match any recognized format, it returns a predefined constant for +malformed time strings. + +- The method first attempts to match the input time string against the TIME_PATTERN. +- If the string matches the pattern, it initializes the time components (days, hours, minutes, seconds, milliseconds) to + zero. +- The method then extracts values based on the matching groups. +- If any parsing errors occur (e.g., NumberFormatException) or if the string does not match the pattern, the method + returns Config.MALFORMED_TIME_STRING. +- If the parsing is successful, the method calculates the total duration in milliseconds + +**10. NavigationWebElement** + +![img.png](NavigationWebElement.png) + +This NavigationWebElement class in the framework.model package, is a record class used to represent a navigation element +within a web application framework. It offers a concise way to store and manage information about such +elements. + +- The class is defined as a record which is a recent addition to Java that simplifies creating immutable data classes. +- It has three properties: + - name: A String representing the name or identifier of the navigation element in the menu bar(e.g., "Activities", " + ECL", "Files). + - hrefValue: A String representing the href attribute value of the element, which typically specifies the URL linked + to by the element. + - webElement: A WebElement object from the Selenium library. This holds the actual WebElement instance representing + the element in the web page. + +- Due to the record nature, a constructor is not explicitly defined. The compiler generates a constructor that takes + arguments for each property and initializes them. +- The NavigationWebElement class offers a structured way to manage data related to navigation elements in a web + application framework. + +**11. Java Classes for Representing Workunit JSON Data** + +This section details the class structure used to map JSON data file of list of "Workunit" +entities into Java objects. These classes provide a clear representation of the data and +allow for easy access to its values throughout the codebase. This structure is particularly +beneficial for writing test cases, as it simplifies working with the data in a well-defined +format. Below are the UML diagram of the classes used for JSON mapping to java objects for +workunits JSON file. + +![img.png](WUQueryRoot.png) +![img.png](WUQueryResponse.png) +![img.png](Workunits.png) +![img.png](ECLWorkunit.png) +![img.png](ApplicationValues.png) +![img.png](ApplicationValue.png) + +**12. ActivitiesTest** + +![img.png](ActivitiesTest.png) + +This ActivitiesTest class in the framework.pages package, implements a TestNG test (@Test) +for the Activities page of ECL Watch UI. It focuses on verifying the following aspects of the +Activities page: + +- Presence of specific text elements +- Functionality of navigation links and their corresponding sub-tabs + +**Class Variables:** + +- textArray: A static final String array containing expected text elements to be present on the Activities page (e.g., " + Target/Wuid", "Graph"). +- navNamesArray: A static final String array containing names used to locate the navigation link WebElements on the + Activities page (e.g., "Activities", "ECL", "Files). +- tabsListMap: A static final Map that defines the expected sub-tabs for each navigation link. The key is the navigation + link name, and the value is a List of expected sub-tabs. + +**Methods:** + +1. testActivitiesPage (Test Method) + +- Obtains the WebDriver instance (WebDriverHolder.getDriver()). +- Opens the Activities page using the URL from Config.ACTIVITIES_URL and Common.openWebPage. +- Retrieves a Logger instance for logging test results (LoggerHolder.getLogger()). +- Calls testForAllText to verify the presence of expected text elements on the page. +- Calls getNavWebElements to retrieve a list of NavigationWebElement objects representing navigation links. +- Calls testForNavigationLinks to verify the functionality of navigation links. + +2. testForAllText Method + +- Iterates through the textArray. +- For each text element, calls Common.checkTextPresent to check its presence on the Activities page using the provided + WebDriver, text element, page name ("Activities Page"), and Logger instance. + +3. testForNavigationLinks Method + +- Takes the WebDriver instance, a list of NavigationWebElement objects, and a Logger instance as arguments. +- Iterates through the list of NavigationWebElement objects: + - Clicks on the WebElement using the webElement().click() method. + - Calls testTabsForNavigationLinks to verify if the expected sub-tabs are present for the clicked link. + - Logs success/failure messages based on the verification result using the Logger instance. + +4. getCurrentPage Method + +- Iterates through the tabsListMap. +- For each entry (navigation link name and its corresponding sub-tabs): + - Checks if all sub-tabs from the list are present in the current page source using driver.getPageSource(). + - If all sub-tabs are found, returns the navigation link name (current page). +- If no matching navigation link is found, returns "Invalid Page". + +5. testTabsForNavigationLinks Method: + +- Takes the WebDriver instance and a NavigationWebElement object as arguments. +- Retrieves the expected sub-tabs list for the navigation element from tabsListMap. +- Gets the current page source using driver.getPageSource(). +- Iterates through the expected sub-tabs list: + - Checks if each sub-tab is present in the page source. + - If any sub-tab is missing, returns false. +- If all sub-tabs are found, returns true. + +6. getNavWebElements Method: + +- Creates an empty list to store NavigationWebElement objects. +- Iterates through the navNamesArray. +- For each navigation link name: + - Finds the WebElement using driver.findElement with By.name strategy. + - Extracts the href attribute value. + - Creates a new NavigationWebElement object with the name, href value, and WebElement reference. + - Adds the NavigationWebElement to the list. +- Returns the list of NavigationWebElement objects. + +**13. BaseTableTest** + +![img.png](BaseTableTest.png) + +This abstract class, `BaseTableTest`, in the framework.pages package, provides a framework for +testing web pages that display tabular data. It defines methods for common functionalities like: + +- Verifying the presence of expected text elements on the page. +- Comparing the content displayed in the table with corresponding data from a JSON file. +- Testing the sorting functionality of the table columns. +- Verifying links within the table cells and their navigation behavior. + +**Abstract Methods:** + +1. `getPageName`: Returns the name of the page under test. +2. `getPageUrl`: Returns the URL of the page under test. +3. `getJsonFilePath`: Returns the file path of the JSON file containing reference data. +4. `getColumnNames`: Returns an array of column names displayed in the table header. +5. `getColumnKeys`: Returns an array of unique keys used to identify table headers. +6. `getUniqueKeyName`: Returns the name of the unique key used to identify table rows. +7. `getUniqueKey`: Returns the unique key value for the current row (used for logging). +8. `getColumnKeysWithLinks`: Returns an array of column keys that contain links within the table cells. +9. `parseDataUIValue`: Parses and pre-processes a data value extracted from the UI table. +10. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the JSON file. +11. `parseJson`: Parses the JSON file and returns a list of objects representing the data. +12. `getColumnDataFromJson`: Extracts a specific data value from a JSON object based on the provided column key. +13. `sortJsonUsingSortOrder`: Sorts the list of JSON objects based on a given column key and sort order. +14. `getCurrentPage`: Retrieves the name of the current page displayed in the browser. + +**Non-Abstract Methods:** + +1. `testPage`: The main test method that orchestrates all other functionalities to test the target web page. + +- Opens the target webpage using the URL obtained from `getPageUrl`. +- Calls `testForAllText` to verify the presence of expected text elements. +- Calls `testContentAndSortingOrder` to compare table data and test sorting functionality. +- Calls `testLinksInTable` to verify links within table cells and their navigation behavior. + +2. `waitForElement`: Waits for an element to be present on the page using explicit wait with a timeout. + +3. `testContentAndSortingOrder`: + +- Retrieves all objects from the JSON file using `getAllObjectsFromJson`. +- Clicks on the dropdown menu to select an appropriate number of items to display in the table. +- Calls `testTableContent` to compare the table data with JSON data. +- Iterates through each column: + - Calls `testTheSortingOrderForOneColumn` to test sorting functionality for the current column. + +4. `testTheSortingOrderForOneColumn`: + +- Gets the current sorting order for the specified column using `getCurrentSortingOrder`. +- Extracts data from the UI table and JSON file for the specified column. +- Sorts the JSON objects based on the current sorting order using `sortJsonUsingSortOrder`. +- Compares the sorted JSON data with the extracted UI data using `compareData`. + +5. `getCurrentSortingOrder`: Gets the current sorting order (ascending/descending/none) for a specified column. + +6. `getDataFromJSONUsingColumnKey`: Extracts a list of data values for a specified column from all JSON objects. + +7. `getDataFromUIUsingColumnKey`: Extracts a list of data values for a specified column from all table cells (UI). + +8. `ascendingSortJson`: Sorts a list of JSON objects in ascending order based on a specified column key. + +9. `descendingSortJson`: Sorts a list of JSON objects in descending order based on a specified column key. + +10. `testTableContent`: + +- Compares the number of items displayed in the UI table with the number of objects retrieved from the JSON file. +- Iterates through each column: + - Extracts data from the UI table and JSON file for the current column. + - Calls `compareData` to compare the extracted data. + +11. `getAllObjectsFromJson`: Parses the JSON file and returns a list of objects representing the data. Handles potential + exceptions during parsing. + +12. `compareData`: Compares a list of data values extracted from the UI table with the corresponding list from the JSON + file. + +- Iterates through each data pair: + - Calls `parseDataUIValue` and `parseDataJSONValue` to pre-process the data (if needed). + - Calls `checkValues` to perform the actual comparison and handle mismatches. + +13. `checkValues`: Compares two data values and logs an error message if they don't match. + +**14. ECLWorkUnitsTest** + +![img.png](ECLWorkUnitsTest.png) + +This class, `ECLWorkUnitsTest`, in the framework.pages package, extends the `BaseTableTest` +class and specifically implements test cases for the ECL Workunits page within the ECL Watch UI. +It inherits functionalities for common table testing procedures and specializes them for the +ECL Workunits data and behavior. + +**Override Methods:** + +1. `getPageName`: Returns the display name of the page under test ("ECL Workunits"). +2. `getPageUrl`: Returns the URL for the ECL Workunits page constructed using `Config.ECL_WORK_UNITS_URL`. +3. `getJsonFilePath`: Determines the file path of the JSON file containing ECL Workunit data based on the test execution + environment (local vs. GitHub Actions). +4. `getColumnNames`: Returns an array of column names displayed in the ECL Workunits table header. +5. `getColumnKeys`: Returns an array of unique keys used to identify ECL Workunit table headers. +6. `getColumnKeysWithLinks`: Returns an array specifying the column key that contains links within table cells ( + currently, only "Wuid" has links). +7. `getUniqueKeyName`: Returns the name of the unique key used to identify ECL Workunit table rows ("WUID"). +8. `getUniqueKey`: Returns the actual value of the unique key for the current row (used for logging). +9. `parseJson`: Parses the JSON file specific to ECL Workunits and returns a list of `ECLWorkunit` objects representing + the data. +10. `getColumnDataFromJson`: Extracts a specific data value from an `ECLWorkunit` object based on the provided column + key. +11. `parseDataUIValue`: Parses and pre-processes a data value extracted from the ECL Workunits UI table. +12. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the ECL Workunits JSON file (if + necessary). +13. `sortJsonUsingSortOrder`: Sorts the list of `ECLWorkunit` objects based on a given column key and sort order, + considering the specific sorting behavior for the ECL Workunits table (default sort is descending by WUID). +14. `getCurrentPage`: Retrieves the title attribute of the "wuid" element to determine the current page displayed. + +**Additional Methods:** + +1. `getCostColumns`: Returns a list of column names that represent cost-related data (Compile Cost, Execution Cost, File + Access Cost). + +**Test Method:** + +1. `testingECLWorkUnitsPage`: Calls the inherited `testPage` method to execute the core test logic for the ECL Workunits + page. + +**Class Relationship Structure:** + +![img.png](relationship.png) + + + + + diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ab0792d8e434dd9e516fc0e3add0792f17ebd GIT binary patch literal 21757 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 I-}?Rk0S&~DegFUf literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbf9018ae624487a62be8bdd4f47a20885873b7 GIT binary patch literal 21832 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 SH>5%zeelV@v)@1d<^KoiLcxCk literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png b/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png new file mode 100644 index 0000000000000000000000000000000000000000..547e7c857c765c7ea8dda03d57d478a7e745a264 GIT binary patch literal 2861 zcmchZdr(t%7RTA?40aXkvbG8sWh@W3wXR5b2sFu7Eg@K;WowiuAO*uCjhI4+l7!6I zEj}tlp{&x7unt6uc_7V8$dag4*ab{TViG~aT}UCC5CRjDKoXL@=uF$u>AKyW-GA=f z`TgdcIrpB=_k7RU4>ORfSB9+&2nbk>O52ka5b&#m;Cs`nf#9>W^UcYCfR*#8J@0*d zBG;-Puj3?3_NbP8+o_$yqzjKbz8$=9AtSjw&6nR9dpV9PP|E!ck%o!z^^quL{^yNt zj0Z=eoF)^n-p6bN)}NnNf4_^=moac5vZKIup83^g zR9633Xv$l=>)Yyjp_N%Rk*JO2qUp9ERDH5j@cE6j=;#!mXRmIFy$4K?q zr6fK<@hFX>6jECS?QTLfTVZLZzNMLJ?M1eRxndKga2NZ$&?pTCUavt5VS;2F9=6vm?glcs{I^)fa5KliZnEf^X103{z4kz3Mt!I;A`WqjC>BhX`$j`~~6A@yVH<*J3d zvGZ@si2%uDdy^Vi&6yiK`gnh;3-3QyP}>b9<|3>G*t=RPLtIu_t)ttwK0QfwucNq( zmu?ORA!JDSbzvv3OW|qZwa3qNPh7+eIoYGrizn&?4q+b*><#HR@|88YQ3eU`8F-z2 z9=msbx+)CWyxgf>-dM1z3P4Ui}mm2y>Z4;C@_POPe)I5+oMyjaEu60nW zMGEq9CYfD!+l8oJ9Yp=Q(uek2M(vWGw(~%Sw?4!jXZ7-YdXcG&hzgZ67ov8|&p7?@ zh7}@ro}MMwM)Ag7Yvs{3sSEkZ5QsW)JSAKn@QVk{bN&D2lj^wy|2Kfto{%NH*zwW6 z7AwQYZ}DxiPtT!3FhnBIn(8w65BASJ!75`o)Civy;czY9FV~pMxl?1o%1teQy0ZU( z3wF&Q(IVa_*P;FB7N3;jUR1ijH%*Qh8)Ag!i&Tif%}p2>8ghPH-JI89cb9}i!6|a= z;}%1U!{|+C>N7o;vk64ts+Ga~@ni%?56K}#GuwG=@=)mp9kM&~rl5aIesK-r_cU(w zWF3yjnu_DJk52n2;-?@+Y-=#%Yl*DMPhmWQ@(udo0`Yb&R@o1N1agbQ^k#P>>z&P1 zSq{cDsx6nTV!`0Q-p$!GLV^fJe+T`}O;CjCSs!H@&)6^id9Oq4JiiREJj|xFYXp`O z2!X{doVjgEnxF{9C<_PIa;k`)d3*R8$5ZTFu@6(@s9cg-g!LoB!`CFD6tl3td#w#n z&`3;HWB1_n$(`XmyxMIZZU4u!A2T2m7J+e>lc3Avv&@b(|2-Y6`K)71cd*P<_JS0Y z14FZii)x*n{GVj0XkS`Gg50SZY>TgJ{fQLlS+!&hG1bx`Q+Dc3uHl#4u5Bfs1XQ8e zc%5ren{2y9oH0P@VL4>&r~YX#mkrTp`y<~aQC8N>|ItImECrKt$@&?UnU+KLp%Io5 zy@t9VIY&!+*|p5zBtt-1NpavO$oViD$3mX9g#&@0wmwOMyw(rxZy#?mu8sLQw|-6o zFN#R*Nux1@(N7!;+xoUQJjJiH0>Cqk8g@|{uJb0~lqfd$uBv`z?#m;^S}m1c>cTrR zcU0A>+#IiSiA}mywz)bqh*wnz%;o*Ts~_%CkgvapCl-BZhqO%NyvOf(6|Up&4xX z>F^IhsMcEk3WrITJvu`0h+COB#!zM|`R#-|-4*L)xVd`;#o9({$r{98t}Yw0T$-`9 z>E1hu97C<^m=XjEbY|#m&X;AIc60dCMi$=pctr&kgck${2ZAGLn#79Uc-IyBNYA37 zO-Tw}L*x1RAc}s1(LZc((y{XGHX7Id%HAenA0dv@^#dfTZxS$wRzu2oHxktQ59gip zA5i2I5Br8WOU@-mr3_8m(^HA@6k1PWa@^Y}iAKi2zq&GrJsbO_B_y%dm_?Sns;;LzX3LBBTj({tSg(Wt7h4cth>oxrWA h#I9TE>V3ZO_jWhWnj(4=!8JGl^?t@4{;ngZ{t3JLE$09L literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png b/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png new file mode 100644 index 0000000000000000000000000000000000000000..b32e3dc1ae1e182fb6fad59ed7efba80101093b2 GIT binary patch literal 10506 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestClass.png b/esp/src/test-ui/tests/framework/documentation/TestClass.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9370dada3720217e4b76ce76377d045fb9ae70 GIT binary patch literal 3296 zcmcIne^gV~9e=0?N{>Rfo}QK|v1j#2R~%L;#u^h^>*`RE9v#F033D#wKq#OgL=qmb z%@sWrSw%piNpwz_gd~+nAqfdO9R3I-0_Md?l1GXVAdtr-KOiAwFW}l*+a24v`^P=+ zym#;S-uwOh_}+K?qdhxTy!f*h0RUK$@aye+0U)RneQtgs813buAG{6#%Nr85zyF&f zl*#)Qr)-F9SfjW5-eeNO=td zl&PPgo0yuJwuZkNX!_FH#)P>@3;?V$?*4ni%!j~xNx5t9ttoy3I3I<5Is2!op8$8O z&W6T?!Y=@$w|kCqkLE1{91kOQKPssPIPPlg#vViniJ zGcsT>%RbSRFw<3c=uL%9IAM&AXF&1lAb|1swGqehHR_ZOnRK2M2ApBgXy^i((d&2) zZ~Y~wR4G=`A)Lb9B*v%qZvp0hZ{ICMqebSzZ>8x>TX4e5CUZ2BmmE?i(D1U*-L`d3 z;x@8)&NpjU(Bk53Ix8I}ecTWR#Mj~U=&25s4_KRDF z=ak!L4AWPa-!yspE{beM(b_rO<^Vye{lOoqu8v)sLb*oGKer-0CeXx(E_0Xp)k}e? z_~*%ir}sItFH$g!1u?)8Eb9|!P4Q4vni5X-WgRT5a9==n=vkl+1YT#*cA@z!Y1Vnk zI>Fzxnh(~{fT_#Ih-8##NxlA`v$PnQkp3}L#X;H>td<>cD3B5Y*GV`VNHPl#it0!xTT(ciAnA_OUTe?C$G)~xf#BaAjim8 z119ouPz;Bv?8LLm2i)WAOsJuVqTpr%Yz8f$9YWTs{n9_}qKlI_nKCiUWMJF}?M?h? z6Wg99BG=G?!NpL03PCwz4g+jl++vm4xAokR8~BTCL3o0{`fEeY>;1uVVZdqJtN*iH zpN8s~_awqdKPYlarjp%3W!=1AqT)KnaVWaK3l4~xr;!@wqwRL`WUsqkdz(&-S2Geb zX!24h=oxzFgFAaaiZXHPb#F9jCBc*8U3 z4tWejZ%9Wxnw)@79)qL(aLSzP{{+a7vf*#zdc30|eW4BQjSG#Z0^jT3-=6p*%fLa_ zP1d7OSRK_KGKUd7LYzsE#mf*}L2C!gXu!@7GxbD+j94<#R9e%~AJtyY>MxCQ;O;uf z8B9Tv)RQjs^p|)L?>#X7xc5ZB-iI`*cACqREaZ$aXg=v2S>>ID-;bAi!Ga2ZtEVKz z88s#?{SxtxAxLzac0cL^IQxW}qoG)LW%+U>LWJwo*zrPoC3Kb0w$-ggT|vZQ@OxYt zhge8Lsxz#8coK zXwwqWWnyPP)!E)^rB#c@b9p@7yyxYF zYbZ4Q9cm{jv4`!PeZWc?xEwC!j^v7nVxAHL<$m1gG*gt~JODMwy!?%|%58`hVrThI zKulk*rFncKE@EHBX ze(P=$UyG?S)>aSwTUWRa96> zBE#-Ic((|OQMX*DDvVyPZramCtFf{5Jbbyysu_P57Fkug2UOVz)bZH@zm93IMrd^te)Gwx#G5_8i8O15z9n~l>F>@&mV(g%t$PH#)9uAC$o5yCJP;1A7@EF_2r%B}k) zVd0nXLS}s&IDd;m3YX61rwmxk?yy!w=j;xwQ5e?)Y*qVu0urd|`or6Np;qfOST+bn zuE?u)b_>dtEeykfnv4yckvkeMq5Esb1P>N19tR#%2>ff@hV)O~RjnUX8sT&_ud04l zyg$J%l`Ur!X9VDo1?~@h|7tG|itv{Ju-a!r*Ze^=`2M^0a}HCwQq~q|U6-<#0N0ju hE(P)( literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestClasses.png b/esp/src/test-ui/tests/framework/documentation/TestClasses.png new file mode 100644 index 0000000000000000000000000000000000000000..913e8d519fa36031a34507ec607ddb3447a9089e GIT binary patch literal 2324 zcmd^BeM}Q)7(b&!XQs=xWF}kGE!%X+tQz7XA3`P?M8zslI)-gcTw$UXw{kscr3@3} z+=n<3>ld&LYV8NDQUU34c8ggSQ8@+bS<00Wg-Va!F|a+_>-Bb;Y|;6z%a-h)_j%sr z$?x|*@B99Kc@A&coH=Lq8?ylbn3J`BZ4LlTyTa#(X2tRA&g#@v05Hpwwf3XDebT_) z+lqV1ugQ7tHufb7q};b5VaN38?z&mt*>YZ{NIJ8JiBs?hA3?OJULYv~kf( zX~31Qf1df1c*PVjwIpsKAk)v^Um1&D{NQ?vrCpk^=h$pux#aYY=NKvfK7(+-4H}|f zj%JTC=dyE#WS5y#Sc#69*%!O3dYT))@JTUrTb(R0J$mV3Meicx-e1XYAf34SY<4|@ z+L5cI1PXVz!jZ5D*0@l~6O~7smLVBB3~_-Hv6(HYHE7uZwUu-cYK2^9>nko`JJnW! z5EnRifhv#^NzuODI`K-X8=&4}Qxr9MAG^UEsT~h?kpuQ{370piuBdIfDiAtIMX3(L z#PMdbzT$pZn=;dz8-WHE8Mn+Y?hQ+{=fk904w3Htt(B&7#Hw=ENUrpN-5OVIcOLGI zm%IGC*{E6|hdYZPo@^Og_$-+})t44WSH>2!4(tf@X@B|k;p($yAtN%R6Jn*Ga_mH`G4?1amzC!oB8xNEBZg z$H=$~`93j|TSt{it_fu2ZL}$(fPHs|6VTAyV3+x%~E>ap)ig^xa{A#pO>rb{EQnx{OgDOSIxTY*pA#&q<`@nVQJVuNoX z$}>%CKz1DlijzHZ43T&xGQGv234QNl0-dmQv>SJuF?1FA`&b1TawwsYAN08s;U^0{ z!=f%#KE5MeE^3Ery*6$BO<`~oLJr_I%!~+i-VRg9I16--OL1q)~pM))i za3W^uA3juePTD|{7|~n84kxTvQXWjlAC0vaj;&rrMYtqHu zHwkPSo3z2fI-qS-J?G+Ifbf!$zQCZ{BN^OUSz3Lb@5&#d#sXF$3_WO3P>(9im_gwr zU67?5_Y7l*f_udrE8&i|WZWc_cRD?qXV|8e`WEKVZp>0|WF*}9ZYhP=nKd{XykRU_ zIap_8;IZ3@Ak~lb52v7Igc3xz(8MVR6p#ic_)>XL%YKXYevqmPk zDR8H=K8qQ3SWTW3{aEhf9)Xh&JkItW#_-qPU+9E;G={MnJHtnWktjrla121 zdG`m|gN3}5sn)atwex>rEB};T{l{>R9N-OFj!b@1uoxJxdUhBYc1B-MjzgPOoA_x5 O$Xd5~t#!@z1AhQwxV?n{ literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestInjector.png b/esp/src/test-ui/tests/framework/documentation/TestInjector.png new file mode 100644 index 0000000000000000000000000000000000000000..e45e93682a7382aa26d7fc47e06ebbb6e4e26ea3 GIT binary patch literal 10050 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TimeUtils.png b/esp/src/test-ui/tests/framework/documentation/TimeUtils.png new file mode 100644 index 0000000000000000000000000000000000000000..342180bc0fe82a8acfaff67afc6fb4b351a884bd GIT binary patch literal 6626 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 W`en>^cknq6?A;R?#(y{A)V~4M-*OTF literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png b/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c4ebf958f666be44ed57b4236632a20f4dc725 GIT binary patch literal 3135 zcmcJSe^gWF8OJZBgRZOE9qYC#j?IEjIig3To`8X^qfoSjPKcQ?3AX-VF)I<0cp)Lc z?D07K#W9E}SqP_sW+ddMP9h{BfzwVs{BDTJRg!QS2!Vto$d3fMB-w@9v#z$A>v8WN z@44^2_kG{zKJVxGKF=+GkC3+F<+U#Z0I(wcos@k55K@R;*S-{n^)vF%egy!pgr%qa zCcBX4x^KA{gFByMme5<_v$H4YY)y8jIWS$P?F5Izm!#wG+ zd}V*cRO3V5vDN7#nR`6aE}Kp1Fq*d;P?lPSJ8UynmzLc(-~wfXGDu*Rq))e97`zE((Q`zhl1s&Xf80Q4Yu+FAs`e}9 z?h`pgSM9=_Mr0I0@uUfF40oH!Y2?#W={+^PQr9$HCnws!5FgWUOj^0OiNuo5FlxI1 z!ZiLydHwG=cq!lJG*`ufV4G~4M(MQCJ^d~@-b2&Q&zyz1*8g@`KJZP^!lrXJ($_&r`>s?7&<*depoVCEq(=ASsL1jG34zhK! zllgPdn3pIB$zGmoP%jX4CVk)+JBehT0xrJM&#SQ0*SHYE!0M?&_UHT z&O{d@)u$2H@p%L%ccsEfW=Ko$nr?dXgHVFNa~AW%e6SD!7B3$eyr0tl=io3tbgEKN zeHf!DuqxOZHf0nPEe*a0TF-^g?^xaf*77dN>4nLR3Jvd~g9bA|LJxhcm&~}>#a88&DpX;MoDSw^OS|O5{URua z=-&CBdFqSb#$}mRnWeTHExa$0{EBE`UilDwAKOFT!k}lsRa@W{9}@&cLXOMLyzOGR z44iA7{AqO6;{FcL*Orx9Rdz2mBf6Tv@%K6=0{g9;OomN90}4tFt8Sa71y1Ku^b>Iz zlFu<`*z=H^1eh8*9+PxG7tQ&l`b^Y_)rBf#eKyk;s(YP2Cky7QW^w&irf~Ne>}+~% z`dkid^JyoUR|a_^^haN^>YG56nXUHR;;xyEeHa>bGw;^^T{t#y)#y)=^VidAd2s(o5^ML)3@DG_^R-Q{i&)9xklMfI%UxvuDV zDoJL|#3PA~jM^o2_d%*O40%u!sblJbRTELw;Dls3M;He-?RnzV+64X(L1^&jQ5y=R zs7Y0MBsNxfkByCz=ZZa_LN>pmg|EPCplo$*VX(4WyL+J+!c@M=TfY3E2DQ=7B}BH= zRU64ZnTXX%<>eu!Y=OFkvd_pFy^NOI6B{7p0N#e2)w<~l9*JVzL1wQZQ;L=d9*eqvJWOx_SR~L^z^RIhsiOXf? zPI7uCDF{6$P6LldxGXF(Xg{G!Biacy3zA6qe! z|NctSy4JNwL*M1%yswoFcg_Wpw=VIXnUHj#Ao#T>->WK#v*wN*uN~5OGIih~^0WoZ zs0Ovg*J$LxuNK|jUUVzC#)@wl$o%Udi6m#Mndo8}DP7-(ZJPk15)&0fJb!CD!0{0M zo3dfZv899GWe;!NH+>MJ%usZlxgH&GIpf*N&TIxq6=piAii9&`Vp$2!6-|Kg274oo z)OTg~zhfKXxw2fSP-eS=<3b8+K#oG!8Q0J}Mf}~P8gg?RR#_0LjkFEAa3bExb@evj zdaMU9bgLn=OQ|xKfqV6=WeXQ56@hl^4Wp`mnILXkqRx}(YZDhpbs!nW`#E=q-3J*J zOG?d7<|5o+Oz2|MLtZWxcPwe&oVet~H{g?6>7E)hN87fhS-FgFGaO&X*wg_iuM~T* zLu0#V>3yms|4>Aa*sLL$#90InPYDXTM=vM3qGhP3QG!W3)z@U!$;QM5?xg*?$|Gf@ zy?PL{SKq&ouW&l%e1799gA3np-|-bQ%HI42uWaEB4WsrCwFjLy;P{&?zLeiHP7^*+ z_VB6W9bgZZdO(prz#JP~M+%*?2@oBoG@hM&Khmw+1%(Z1quY2`wVG32I{ZTWVZi}9 zmV4d~kHZSw(p5uLfk%kF{@)AMr?T_2YxVz7I#Vu0EVVXteD;Sxd)f!>q3yzF=oWGc Yq`9yCl)1MN`!N90-zKC$Zyh@IPlJbg&j0`b literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Workunits.png b/esp/src/test-ui/tests/framework/documentation/Workunits.png new file mode 100644 index 0000000000000000000000000000000000000000..0c50d24564b5366198622c12137dd4f283d639f5 GIT binary patch literal 4176 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 S*`c(wP8sN!YFBCAhW-a@CUa2$ literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValue.java b/esp/src/test-ui/tests/framework/model/ApplicationValue.java new file mode 100644 index 00000000000..67f87f1da0a --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ApplicationValue.java @@ -0,0 +1,15 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ApplicationValue { + + @JsonProperty("Application") + private String application; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Value") + private String value; +} diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValues.java b/esp/src/test-ui/tests/framework/model/ApplicationValues.java new file mode 100644 index 00000000000..d7a1425d1e3 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ApplicationValues.java @@ -0,0 +1,11 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class ApplicationValues { + + @JsonProperty("ApplicationValue") + private List applicationValue; +} diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java new file mode 100644 index 00000000000..6a4cc340fe3 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java @@ -0,0 +1,100 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import framework.utility.TimeUtils; + +public class ECLWorkunit { + + @JsonProperty("Wuid") + private String wuid; + @JsonProperty("Owner") + private String owner; + + @JsonProperty("Cluster") + private String cluster; + + @JsonProperty("Jobname") + private String jobname; + + @JsonProperty("StateID") + private int stateID; + + @JsonProperty("State") + private String state; + + @JsonProperty("Protected") + private boolean isProtected; + + @JsonProperty("Action") + private int action; + + @JsonProperty("ActionEx") + private String actionEx; + + @JsonProperty("IsPausing") + private boolean isPausing; + + @JsonProperty("ThorLCR") + private boolean thorLCR; + + @JsonProperty("TotalClusterTime") + private long totalClusterTime; + + @JsonProperty("ApplicationValues") + private ApplicationValues applicationValues; + + @JsonProperty("ExecuteCost") + private double executeCost; + + @JsonProperty("FileAccessCost") + private double fileAccessCost; + + @JsonProperty("CompileCost") + private double compileCost; + + @JsonProperty("NoAccess") + private boolean noAccess; + + public String getWuid() { + return wuid; + } + + public String getOwner() { + return owner; + } + + public String getCluster() { + return cluster; + } + + public String getJobname() { + return jobname; + } + + public String getState() { + return state; + } + + public long getTotalClusterTime() { + return totalClusterTime; + } + + @JsonSetter("TotalClusterTime") + public void setTotalClusterTime(String totalClusterTime) { + this.totalClusterTime = TimeUtils.convertToMilliseconds(totalClusterTime); + } + + public double getExecuteCost() { + return executeCost; + } + + public double getFileAccessCost() { + return fileAccessCost; + } + + public double getCompileCost() { + return compileCost; + } + +} diff --git a/esp/src/test-ui/tests/framework/model/NavigationWebElement.java b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java new file mode 100644 index 00000000000..cf095ad554f --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java @@ -0,0 +1,14 @@ +package framework.model; + +import org.openqa.selenium.WebElement; + +public record NavigationWebElement(String name, String hrefValue, WebElement webElement) { + + @Override + public String toString() { + return "NavigationWebElement{" + + "name='" + name + '\'' + + ", hrefValue='" + hrefValue + '\'' + + '}'; + } +} diff --git a/esp/src/test-ui/tests/framework/model/TestClass.java b/esp/src/test-ui/tests/framework/model/TestClass.java new file mode 100644 index 00000000000..240cdd98a90 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/TestClass.java @@ -0,0 +1,16 @@ +package framework.model; + +public class TestClass { + + String name; + String path; + + public TestClass(String name, String path) { + this.name = name; + this.path = path; + } + + public String getPath() { + return path; + } +} diff --git a/esp/src/test-ui/tests/framework/model/WUQueryResponse.java b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java new file mode 100644 index 00000000000..eb1a9aa3a7d --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java @@ -0,0 +1,55 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class WUQueryResponse { + + @JsonProperty("Type") + private String type; + + @JsonProperty("LogicalFileSearchType") + private String logicalFileSearchType; + + @JsonProperty("Count") + private int count; + + @JsonProperty("PageSize") + private int pageSize; + + @JsonProperty("NextPage") + private int nextPage; + + @JsonProperty("LastPage") + private int lastPage; + + @JsonProperty("NumWUs") + private int numWUs; + + @JsonProperty("First") + private boolean first; + + @JsonProperty("PageStartFrom") + private int pageStartFrom; + + @JsonProperty("PageEndAt") + private int pageEndAt; + + @JsonProperty("Descending") + private boolean descending; + + @JsonProperty("BasicQuery") + private String basicQuery; + + @JsonProperty("Filters") + private String filters; + + @JsonProperty("CacheHint") + private long cacheHint; + + @JsonProperty("Workunits") + private Workunits workunits; + + public Workunits getWorkunits() { + return workunits; + } +} diff --git a/esp/src/test-ui/tests/framework/model/WUQueryRoot.java b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java new file mode 100644 index 00000000000..c5a1c54993d --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java @@ -0,0 +1,12 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class WUQueryRoot { + @JsonProperty("WUQueryResponse") + private WUQueryResponse wuQueryResponse; + + public WUQueryResponse getWUQueryResponse() { + return wuQueryResponse; + } +} diff --git a/esp/src/test-ui/tests/framework/model/Workunits.java b/esp/src/test-ui/tests/framework/model/Workunits.java new file mode 100644 index 00000000000..d52b00c5682 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/Workunits.java @@ -0,0 +1,15 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class Workunits { + + @JsonProperty("ECLWorkunit") + private List eclWorkunit; + + public List getECLWorkunit() { + return eclWorkunit; + } +} diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java new file mode 100644 index 00000000000..50b0ac82213 --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -0,0 +1,117 @@ +package framework.pages; + +import framework.config.Config; +import framework.model.NavigationWebElement; +import framework.setup.LoggerHolder; +import framework.setup.WebDriverHolder; +import framework.utility.Common; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +public class ActivitiesTest { + + static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"}; + static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"}; + static final Map> tabsListMap = Map.of( + "Activities", List.of("Activities", "Event Scheduler"), + "ECL", List.of("Workunits", "Playground"), + "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"), + "Published Queries", List.of("Queries", "Package Maps"), + "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)") + //"DummyNavName", List.of("DummyTab1", "DummyTab2") + ); + + @Test + public void testActivitiesPage() { + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, Common.getUrl(Config.ACTIVITIES_URL)); + + Logger logger = LoggerHolder.getLogger(); + + testForAllText(logger, driver); + + List navWebElements = getNavWebElements(driver); + + testForNavigationLinks(driver, navWebElements, logger); + } + + private void testForNavigationLinks(WebDriver driver, List navWebElements, Logger logger) { + + for (NavigationWebElement element : navWebElements) { + element.webElement().click(); + + if (testTabsForNavigationLinks(driver, element)) { + String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue(); + System.out.println(msg); + } else { + String currentPage = getCurrentPage(driver); + String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue(); + System.err.println(errorMsg); + logger.severe(errorMsg); + } + } + } + + private String getCurrentPage(WebDriver driver) { + + for (var entry : tabsListMap.entrySet()) { + + List tabs = entry.getValue(); + boolean allTabsPresent = true; + for (String tab : tabs) { + if (!driver.getPageSource().contains(tab)) { + allTabsPresent = false; + break; + } + } + + if (allTabsPresent) { + return entry.getKey(); + } + } + + return "Invalid Page"; + } + + private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) { + List tabsList = tabsListMap.get(element.name()); + String pageSource = driver.getPageSource(); + + for (String tab : tabsList) { + if (!pageSource.contains(tab)) { + return false; + } + } + + return true; + } + + private List getNavWebElements(WebDriver driver) { + + List navWebElements = new ArrayList<>(); + + for (String navName : navNamesArray) { + WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a")); + String hrefValue = webElement.getAttribute("href"); + navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement)); + } + + //navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement())); + + return navWebElements; + } + + private void testForAllText(Logger logger, WebDriver driver) { + + for (String text : textArray) { + Common.checkTextPresent(driver, text, "Activities Page", logger); + } + } +} diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java new file mode 100644 index 00000000000..6468196aff5 --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -0,0 +1,310 @@ +package framework.pages; + +import framework.config.Config; +import framework.setup.LoggerHolder; +import framework.setup.WebDriverHolder; +import framework.utility.Common; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Function; +import java.util.logging.Logger; + +public abstract class BaseTableTest { + + protected abstract String getPageName(); + + protected abstract String getPageUrl(); + + protected abstract String getJsonFilePath(); + + protected abstract String[] getColumnNames(); + + protected abstract String[] getColumnKeys(); + + protected abstract String getUniqueKeyName(); + + protected abstract String getUniqueKey(); + + protected abstract String[] getColumnKeysWithLinks(); + + protected abstract Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger); + + protected abstract Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger); + + protected abstract List parseJson(String filePath) throws Exception; + + protected abstract Object getColumnDataFromJson(T object, String columnKey); + + protected abstract void sortJsonUsingSortOrder(String currentSortOrder, List jsonObjects, String columnKey); + + protected abstract String getCurrentPage(WebDriver driver); + + protected void testPage() { + try { + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, getPageUrl()); + Logger logger = LoggerHolder.getLogger(); + + testForAllText(driver, logger); + testContentAndSortingOrder(driver, logger); + testLinksInTable(driver, logger); + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + } + + private void testLinksInTable(WebDriver driver, Logger logger) { + + for (String columnKey : getColumnKeysWithLinks()) { + + List values = getDataFromUIUsingColumnKey(driver, columnKey); + + int i = 1; + + for (Object value : values) { + String name = value.toString().trim(); + //WebElement element = driver.findElement(By.xpath("//div[contains(text(), '"+name+"')]/..")); + WebElement element = waitForElement(driver, By.xpath("//div[contains(text(), '" + name + "')]/..")); + String href = element.findElement(By.tagName("a")).getAttribute("href"); + + String dropdownValueBefore = getSelectedDropdownValue(driver); + + element.click(); + + if (driver.getPageSource().contains(name)) { + String msg = "Success: " + getPageName() + ": Link Test Pass for " + i++ + ". " + name + ". URL : " + href; + System.out.println(msg); + } else { + String currentPage = getCurrentPage(driver); + String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + i++ + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href; + System.err.println(errorMsg); + logger.severe(errorMsg); + } + + driver.navigate().to(getPageUrl()); + driver.navigate().refresh(); + + String dropdownValueAfter = getSelectedDropdownValue(driver); + + // Log error if the dropdown value has changed + if (!dropdownValueBefore.equals(dropdownValueAfter)) { + String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter; + System.err.println(dropdownErrorMsg); + logger.severe(dropdownErrorMsg); + } + } + } + } + + protected WebElement waitForElement(WebDriver driver, By locator) { + return new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + private void testContentAndSortingOrder(WebDriver driver, Logger logger) { + List jsonObjects = getAllObjectsFromJson(logger); + + if (jsonObjects != null) { + int numOfItemsJSON = jsonObjects.size(); + clickDropdown(driver, numOfItemsJSON); + + if (testTableContent(driver, logger, jsonObjects)) { + for (int i = 0; i < getColumnKeys().length; i++) { + testTheSortingOrderForOneColumn(driver, logger, jsonObjects, getColumnKeys()[i], getColumnNames()[i]); + } + } + } + } + + private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List jsonObjects, String columnKey, String columnName) { + for (int i = 0; i < 3; i++) { + + String currentSortOrder = getCurrentSortingOrder(driver, columnKey); + List columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey); + + sortJsonUsingSortOrder(currentSortOrder, jsonObjects, columnKey); + + List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, jsonObjects); + List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + + if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) { + System.out.println("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); + } else { + String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName; + System.err.println(errMsg); + logger.severe(errMsg); + } + } + } + + private String getCurrentSortingOrder(WebDriver driver, String columnKey) { + + WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + columnHeader.click(); + + Common.sleep(); + + columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + + return columnHeader.getAttribute("aria-sort"); + } + + private List getDataFromJSONUsingColumnKey(String columnKey, List jsonObjects) { + List columnDataFromJSON = new ArrayList<>(); + for (T jsonObject : jsonObjects) { + columnDataFromJSON.add(getColumnDataFromJson(jsonObject, columnKey)); + } + return columnDataFromJSON; + } + + private List getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) { + List elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']")); + List columnData = new ArrayList<>(); + for (WebElement element : elements) { + columnData.add(element.getText()); + } + return columnData; + } + + void ascendingSortJson(List jsonObjects, String columnKey) { + jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + } + + void descendingSortJson(List jsonObjects, String columnKey) { + jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + } + + private boolean testTableContent(WebDriver driver, Logger logger, List jsonObjects) { + System.out.println("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + + List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + + if (jsonObjects.size() != columnDataIDFromUI.size()) { + Common.sleep(); + columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + } + + System.out.println("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + + if (jsonObjects.size() != columnDataIDFromUI.size()) { + String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + + "\nNumber of Objects from Json: " + jsonObjects.size() + + "\nNumber of Objects from UI: " + columnDataIDFromUI.size(); + System.out.println(errMsg); + logger.severe(errMsg); + return false; + } + + boolean pass = true; + + for (int i = 0; i < getColumnKeys().length; i++) { + List columnDataFromUI = getDataFromUIUsingColumnKey(driver, getColumnKeys()[i]); + List columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i], jsonObjects); + if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, getColumnNames()[i])) { + pass = false; + } + } + + return pass; + } + + private List getAllObjectsFromJson(Logger logger) { + String filePath = getJsonFilePath(); + try { + return parseJson(filePath); + } catch (Exception e) { + System.err.println("Exception: " + e.getMessage()); + logger.severe("Failure: Exception: " + e.getMessage()); + } + + logger.severe("Failure: Error in JSON Parsing: " + filePath); + return null; + } + + private boolean compareData(List dataUI, List dataJSON, List dataIDUI, Logger logger, String columnName) { + + boolean pass = true; + + for (int i = 0; i < dataUI.size(); i++) { + + Object dataUIValue = dataUI.get(i); + Object dataJSONValue = dataJSON.get(i); + Object dataIDUIValue = dataIDUI.get(i); + + dataUIValue = parseDataUIValue(dataUIValue, columnName, dataIDUIValue, logger); + dataJSONValue = parseDataJSONValue(dataJSONValue, columnName, dataIDUIValue, logger); + + if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) { + pass = false; + } + } + + if (pass) { + System.out.println("Success: " + getPageName() + ": Content test passed for column: " + columnName); + } + + return pass; + } + + private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, Logger logger, String columnName) { + if (!dataUIValue.equals(dataJSONValue)) { + String errMsg = "Failure: " + getPageName() + ": Incorrect " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue + ". Correct " + columnName + " is: " + dataJSONValue; + System.out.println(errMsg); + logger.severe(errMsg); + return false; + } + + return true; + } + + private void clickDropdown(WebDriver driver, int numOfItemsJSON) { + WebElement dropdown = driver.findElement(By.id("pageSize")); + dropdown.click(); + + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); + List options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item"))); + + int selectedValue = Config.dropdownValues[0]; + + // the smallest dropdown value greater than numOfItemsJSON + for (int value : Config.dropdownValues) { + if (numOfItemsJSON < value) { + selectedValue = value; + break; + } + } + + System.out.println("Dropdown selected: " + selectedValue); + + for (WebElement option : options) { + if (option.getText().equals(String.valueOf(selectedValue))) { + option.click(); + break; + } + } + + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item"))); + driver.navigate().refresh(); + Common.sleep(); + } + + private String getSelectedDropdownValue(WebDriver driver) { + WebElement dropdown = waitForElement(driver, By.id("pageSize")); + return dropdown.getText().trim(); + } + + private void testForAllText(WebDriver driver, Logger logger) { + for (String text : getColumnNames()) { + Common.checkTextPresent(driver, text, getPageName(), logger); + } + } +} + diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java new file mode 100644 index 00000000000..b5837fb4d6b --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -0,0 +1,155 @@ +package framework.pages; + +import com.fasterxml.jackson.databind.ObjectMapper; +import framework.config.Config; +import framework.model.ECLWorkunit; +import framework.model.WUQueryResponse; +import framework.model.WUQueryRoot; +import framework.utility.Common; +import framework.utility.TimeUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; + +public class ECLWorkUnitsTest extends BaseTableTest { + + @Test + public void testingECLWorkUnitsPage() { + testPage(); + } + + @Override + protected String getPageName() { + return "ECL Workunits"; + } + + @Override + protected String getPageUrl() { + return Common.getUrl(Config.ECL_WORK_UNITS_URL); + } + + @Override + protected String getJsonFilePath() { + return Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON; + } + + @Override + protected String[] getColumnNames() { + return new String[]{"WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost"}; + } + + @Override + protected String[] getColumnKeys() { + return new String[]{"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"}; + } + + @Override + protected String[] getColumnKeysWithLinks() { + return new String[]{"Wuid"}; + } + + @Override + protected String getUniqueKeyName() { + return "WUID"; + } + + @Override + protected String getUniqueKey() { + return "Wuid"; + } + + private List getCostColumns() { + return Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost"); + } + + @Override + protected List parseJson(String filePath) throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class); + WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse(); + return wuQueryResponse.getWorkunits().getECLWorkunit(); + } + + @Override + protected Object getColumnDataFromJson(ECLWorkunit workunit, String columnKey) { + return switch (columnKey) { + case "Wuid" -> workunit.getWuid(); + case "Owner" -> workunit.getOwner(); + case "Jobname" -> workunit.getJobname(); + case "Cluster" -> workunit.getCluster(); + case "State" -> workunit.getState(); + case "TotalClusterTime" -> workunit.getTotalClusterTime(); + case "Compile Cost" -> workunit.getCompileCost(); + case "Execution Cost" -> workunit.getExecuteCost(); + case "File Access Cost" -> workunit.getFileAccessCost(); + default -> null; + }; + } + + @Override + protected Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger) { + if (getCostColumns().contains(columnName)) { + dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]); + } else if (columnName.equals("Total Cluster Time")) { + long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue); + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue; + System.out.println(errMsg); + logger.severe(errMsg); + return dataUIValue; + } + + return timeInMilliSecs; + } else if (dataUIValue instanceof String) { + dataUIValue = ((String) dataUIValue).trim(); + } + + return dataUIValue; + } + + @Override + protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger) { + if (columnName.equals("Total Cluster Time")) { + long timeInMilliSecs = (long) dataJSONValue; + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " in JSON for " + getUniqueKeyName() + " : " + dataIDUIValue; + System.out.println(errMsg); + logger.severe(errMsg); + return dataJSONValue; + } + + return timeInMilliSecs; + } + + return dataJSONValue; + } + + @Override + protected void sortJsonUsingSortOrder(String currentSortOrder, List workunitsJson, String columnKey) { + switch (currentSortOrder) { + case "ascending" -> ascendingSortJson(workunitsJson, columnKey); + case "descending" -> descendingSortJson(workunitsJson, columnKey); + case "none" -> descendingSortJson(workunitsJson, getUniqueKey()); + } + } + + @Override + protected String getCurrentPage(WebDriver driver) { + try { + WebElement element = waitForElement(driver, By.id("wuid")); + if (element != null) { + return element.getAttribute("title"); + } + } catch (NoSuchElementException e) { + return "Invalid Page"; + } + return "Invalid Page"; + } +} \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/setup/LoggerHolder.java b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java new file mode 100644 index 00000000000..b80c46f471f --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java @@ -0,0 +1,16 @@ +package framework.setup; + +import java.util.logging.Logger; + +public class LoggerHolder { + private static Logger logger; + + public static Logger getLogger() { + return logger; + } + + public static void setLogger(Logger logger) { + LoggerHolder.logger = logger; + } +} + diff --git a/esp/src/test-ui/tests/framework/setup/TestInjector.java b/esp/src/test-ui/tests/framework/setup/TestInjector.java new file mode 100644 index 00000000000..48742c85d51 --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/TestInjector.java @@ -0,0 +1,31 @@ +package framework.setup; + +import org.openqa.selenium.WebDriver; +import org.testng.IInvokedMethod; +import org.testng.IInvokedMethodListener; +import org.testng.ITestResult; + +import java.util.logging.Logger; + +public class TestInjector implements IInvokedMethodListener { + private final Logger logger; + private final WebDriver driver; + + public TestInjector(Logger logger, WebDriver driver) { + this.logger = logger; + this.driver = driver; + } + + @Override + public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { + if (method.isTestMethod()) { + LoggerHolder.setLogger(logger); + WebDriverHolder.setDriver(driver); + } + } + + @Override + public void afterInvocation(IInvokedMethod method, ITestResult testResult) { + // Optionally, clean up if necessary + } +} diff --git a/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java new file mode 100644 index 00000000000..0daf2f245aa --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java @@ -0,0 +1,15 @@ +package framework.setup; + +import org.openqa.selenium.WebDriver; + +public class WebDriverHolder { + private static WebDriver driver; + + public static WebDriver getDriver() { + return driver; + } + + public static void setDriver(WebDriver driver) { + WebDriverHolder.driver = driver; + } +} diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java new file mode 100644 index 00000000000..2fb12970a09 --- /dev/null +++ b/esp/src/test-ui/tests/framework/utility/Common.java @@ -0,0 +1,45 @@ +package framework.utility; + +import framework.config.Config; +import org.openqa.selenium.WebDriver; + +import java.time.Duration; +import java.util.logging.Logger; + +public class Common { + + public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) { + if (driver.getPageSource().contains(text)) { + String msg = "Success: " + page + ": Text present: " + text; + System.out.println(msg); + } else { + String errorMsg = "Failure: " + page + ": Text not present: " + text; + System.err.println(errorMsg); + logger.severe(errorMsg); + } + } + + public static void openWebPage(WebDriver driver, String url) { + + driver.get(url); + driver.manage().window().maximize(); + sleep(); + } + + public static void sleep() { + try { + Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS)); + } catch (InterruptedException e) { + System.err.println(e.getMessage()); + } + } + + public static boolean isRunningOnLocal() { + return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE); + } + + public static String getUrl(String url) { + + return isRunningOnLocal() ? Config.LOCAL_IP + url : Config.GITHUB_ACTION_IP + url; + } +} diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java new file mode 100644 index 00000000000..d15f72b2a13 --- /dev/null +++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java @@ -0,0 +1,63 @@ +package framework.utility; + +import framework.config.Config; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TimeUtils { + private static final Pattern TIME_PATTERN = Pattern.compile( + "\\s*(\\d+)\\s+days\\s+(\\d+):(\\d+):(\\d+).(\\d+)|" + + "(\\d+):(\\d+):(\\d+).(\\d+)|" + + "(\\d+):(\\d+).(\\d+)|" + + "(\\d+).(\\d+)\\s*"); + + private static final long MILLISECONDS_IN_A_SECOND = 1000; + private static final long MILLISECONDS_IN_A_MINUTE = 60 * MILLISECONDS_IN_A_SECOND; + private static final long MILLISECONDS_IN_AN_HOUR = 60 * MILLISECONDS_IN_A_MINUTE; + private static final long MILLISECONDS_IN_A_DAY = 24 * MILLISECONDS_IN_AN_HOUR; + + public static long convertToMilliseconds(String time) { + Matcher matcher = TIME_PATTERN.matcher(time); + if (matcher.matches()) { + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + int milliSeconds = 0; + + try { + if (matcher.group(1) != null) { // Matches d days h:m:s.s + days = Integer.parseInt(matcher.group(1)); + hours = Integer.parseInt(matcher.group(2)); + minutes = Integer.parseInt(matcher.group(3)); + seconds = Integer.parseInt(matcher.group(4)); + milliSeconds = Integer.parseInt(matcher.group(5)); + } else if (matcher.group(6) != null) { // Matches h:m:s.s + hours = Integer.parseInt(matcher.group(6)); + minutes = Integer.parseInt(matcher.group(7)); + seconds = Integer.parseInt(matcher.group(8)); + milliSeconds = Integer.parseInt(matcher.group(9)); + } else if (matcher.group(10) != null) { // Matches m:s.s + minutes = Integer.parseInt(matcher.group(10)); + seconds = Integer.parseInt(matcher.group(11)); + milliSeconds = Integer.parseInt(matcher.group(12)); + } else if (matcher.group(13) != null) { // Matches s.s + seconds = Integer.parseInt(matcher.group(13)); + milliSeconds = Integer.parseInt(matcher.group(14)); + } + } catch (NumberFormatException e) { + return Config.MALFORMED_TIME_STRING; + } + + return days * MILLISECONDS_IN_A_DAY + + hours * MILLISECONDS_IN_AN_HOUR + + minutes * MILLISECONDS_IN_A_MINUTE + + seconds * MILLISECONDS_IN_A_SECOND + + milliSeconds; + + } else { + return Config.MALFORMED_TIME_STRING; + } + } +} From c1e126473e625f52d8f92a0b4bae003bace41e75 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 18 Jun 2024 12:34:50 -0400 Subject: [PATCH 02/36] HPCC-31857 : Develop an automated ECL Watch Test Suite Developed a testing framework using Java, Selenium, and TestNG. The framework is initiated by TestRunner.java, which loads all test classes listed in config/TestClasses.java and executes them sequentially. Each test class contains at least one method annotated with @test, which serves as the entry point for the tests. Initial test cases cover the Activities and ECL Workunit pages, including tests for text presence, link functionality, and sorting order. Additionally, provided comprehensive documentation with UML diagrams and detailed explanations of each method within the classes. Signed-off-by: Nisha Bagdwal --- esp/src/test-ui/tests/framework/README.md | 11 + .../test-ui/tests/framework/TestRunner.java | 98 ++++ .../tests/framework/config/Config.java | 20 + .../tests/framework/config/TestClasses.java | 13 + .../documentation/ActivitiesTest.png | Bin 0 -> 15534 bytes .../documentation/ApplicationValue.png | Bin 0 -> 2919 bytes .../documentation/ApplicationValues.png | Bin 0 -> 2566 bytes .../framework/documentation/BaseTableTest.png | Bin 0 -> 128722 bytes .../tests/framework/documentation/Common.png | Bin 0 -> 6174 bytes .../tests/framework/documentation/Config.png | Bin 0 -> 13193 bytes .../framework/documentation/DesignDocument.md | 464 ++++++++++++++++++ .../documentation/ECLWorkUnitsTest.png | Bin 0 -> 21757 bytes .../framework/documentation/ECLWorkunit.png | Bin 0 -> 21832 bytes .../framework/documentation/LoggerHolder.png | Bin 0 -> 2861 bytes .../documentation/NavigationWebElement.png | Bin 0 -> 10506 bytes .../framework/documentation/TestClass.png | Bin 0 -> 3296 bytes .../framework/documentation/TestClasses.png | Bin 0 -> 2324 bytes .../framework/documentation/TestInjector.png | Bin 0 -> 10050 bytes .../framework/documentation/TestRunner.png | Bin 0 -> 3979 bytes .../framework/documentation/TimeUtils.png | Bin 0 -> 6626 bytes .../documentation/WUQueryResponse.png | Bin 0 -> 12328 bytes .../framework/documentation/WUQueryRoot.png | Bin 0 -> 4085 bytes .../documentation/WebDriverHolder.png | Bin 0 -> 3135 bytes .../framework/documentation/Workunits.png | Bin 0 -> 4176 bytes .../framework/documentation/relationship.png | Bin 0 -> 4857 bytes .../framework/model/ApplicationValue.java | 15 + .../framework/model/ApplicationValues.java | 11 + .../tests/framework/model/ECLWorkunit.java | 100 ++++ .../framework/model/NavigationWebElement.java | 14 + .../tests/framework/model/TestClass.java | 16 + .../framework/model/WUQueryResponse.java | 55 +++ .../tests/framework/model/WUQueryRoot.java | 12 + .../tests/framework/model/Workunits.java | 15 + .../tests/framework/pages/ActivitiesTest.java | 117 +++++ .../tests/framework/pages/BaseTableTest.java | 310 ++++++++++++ .../framework/pages/ECLWorkUnitsTest.java | 155 ++++++ .../tests/framework/setup/LoggerHolder.java | 16 + .../tests/framework/setup/TestInjector.java | 31 ++ .../framework/setup/WebDriverHolder.java | 15 + .../tests/framework/utility/Common.java | 45 ++ .../tests/framework/utility/TimeUtils.java | 63 +++ 41 files changed, 1596 insertions(+) create mode 100644 esp/src/test-ui/tests/framework/README.md create mode 100644 esp/src/test-ui/tests/framework/TestRunner.java create mode 100644 esp/src/test-ui/tests/framework/config/Config.java create mode 100644 esp/src/test-ui/tests/framework/config/TestClasses.java create mode 100644 esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValue.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValues.png create mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Config.png create mode 100644 esp/src/test-ui/tests/framework/documentation/DesignDocument.md create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png create mode 100644 esp/src/test-ui/tests/framework/documentation/LoggerHolder.png create mode 100644 esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestClass.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestClasses.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestInjector.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestRunner.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TimeUtils.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryResponse.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryRoot.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Workunits.png create mode 100644 esp/src/test-ui/tests/framework/documentation/relationship.png create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValue.java create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValues.java create mode 100644 esp/src/test-ui/tests/framework/model/ECLWorkunit.java create mode 100644 esp/src/test-ui/tests/framework/model/NavigationWebElement.java create mode 100644 esp/src/test-ui/tests/framework/model/TestClass.java create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryResponse.java create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryRoot.java create mode 100644 esp/src/test-ui/tests/framework/model/Workunits.java create mode 100644 esp/src/test-ui/tests/framework/pages/ActivitiesTest.java create mode 100644 esp/src/test-ui/tests/framework/pages/BaseTableTest.java create mode 100644 esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java create mode 100644 esp/src/test-ui/tests/framework/setup/LoggerHolder.java create mode 100644 esp/src/test-ui/tests/framework/setup/TestInjector.java create mode 100644 esp/src/test-ui/tests/framework/setup/WebDriverHolder.java create mode 100644 esp/src/test-ui/tests/framework/utility/Common.java create mode 100644 esp/src/test-ui/tests/framework/utility/TimeUtils.java diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md new file mode 100644 index 00000000000..0f56ebe39b8 --- /dev/null +++ b/esp/src/test-ui/tests/framework/README.md @@ -0,0 +1,11 @@ +Project: An Automated ECL Watch Test Suite + +This project's code begins with the TestRunner.java file. The main method in this class loads all the Java classes +created for writing test cases for specific web pages of the ECL Watch UI and then runs the tests in those classes +sequentially. + +The names of the Java classes that the TestRunner class needs to load should be listed in the config/TestClasses.java +file. + +Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The +code for each class starts to run from this method. \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java new file mode 100644 index 00000000000..3be28b05a87 --- /dev/null +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -0,0 +1,98 @@ +package framework; + +import framework.config.Config; +import framework.config.TestClasses; +import framework.model.TestClass; +import framework.setup.TestInjector; +import framework.utility.Common; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.TestNG; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +public class TestRunner { + public static void main(String[] args) { + + Logger logger = setupLogger(); + WebDriver driver = setupWebDriver(); + + TestNG testng = new TestNG(); + testng.setTestClasses(loadClasses()); + testng.addListener(new TestInjector(logger, driver)); + testng.run(); + driver.quit(); + } + + private static WebDriver setupWebDriver() { + + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window. + chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome. + chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only. + + System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver + + WebDriver driver; + + if (Common.isRunningOnLocal()) { + System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable. + try { + driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } else { + System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); + driver = new ChromeDriver(chromeOptions); + } + + //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities(); + //String browserName = caps.getBrowserName(); + //String browserVersion = caps.getBrowserVersion(); + //System.out.println(browserName+" "+browserVersion); + + return driver; + } + + private static Class[] loadClasses() { + + List> classes = new ArrayList<>(); + for (TestClass testClass : TestClasses.testClassesList) { + try { + classes.add(Class.forName(testClass.getPath())); + } catch (ClassNotFoundException e) { + System.err.println(e.getMessage()); + } + } + + return classes.toArray(new Class[0]); + } + + private static Logger setupLogger() { + Logger logger = Logger.getLogger(TestRunner.class.getName()); + try { + FileHandler fileHandler = new FileHandler(Config.LOG_FILE); + SimpleFormatter formatter = new SimpleFormatter(); + fileHandler.setFormatter(formatter); + logger.addHandler(fileHandler); + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + } catch (IOException e) { + System.err.println("Failed to setup logger: " + e.getMessage()); + } + + Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver. + return logger; + } +} diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java new file mode 100644 index 00000000000..98b8311ac28 --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -0,0 +1,20 @@ +package framework.config; + +public class Config { + + public static final String LOG_FILE = "errorLog.log"; + public static final String LOCAL_OS = "Windows"; + public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha"; + public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"; + public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver"; + public static final String PATH_LOCAL_WORKUNITS_JSON = "C:/Users/nisha/Documents/Internship/Work/files/workunits.json"; + public static final String PATH_GH_ACTION_WORKUNITS_JSON = ""; + public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub"; + public static final String LOCAL_IP = "http://192.168.0.221:8010/"; + public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/"; + public static final String ACTIVITIES_URL = "esp/files/index.html#/activities"; + public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits"; + public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000}; + public static final int MALFORMED_TIME_STRING = -1; + public static final int WAIT_TIME_IN_SECONDS = 4; +} diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java new file mode 100644 index 00000000000..2a1a3fb1faf --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/TestClasses.java @@ -0,0 +1,13 @@ +package framework.config; + +import framework.model.TestClass; + +import java.util.List; + +public class TestClasses { + + public static final List testClassesList = List.of( + //new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), + new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest") + ); +} diff --git a/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png b/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b17514907881bf55ec3e7d592f0893847d9c4d GIT binary patch literal 15534 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�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 NIpuBPKfU)a{{z3MCF}qI literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png new file mode 100644 index 0000000000000000000000000000000000000000..47bb55d8d921f2c9f7655e61ff28cd0c7a022b7c GIT binary patch literal 2919 zcmd^BaZnTK6<@?@sTCP&JD$v(-q_A%#_JrmG*-Zba&Rc8l2crA1_NHTQi%nQB?J<) zXzSE-(CT@msYntnLe5P{=7gYRNy43XSUE2d!?Gn10wM+yl2}5rCLy7_;B}_sIn#Fh z<7RIE*!kw$?|bjSaEA<8-5gI zDlaj3%NezUqb0IU zjKJ!5H(L*>1N`zEMMF}EVEZ!(J_EJxKqGxk*Jk&jY3;-73;b8Ccw+#WGN{=IM5F5! zrADFtdK$#B`<11v2P4H9iTa#SRskBh8b=@)GC_`_% z*>pP7du%#-+BuTj);_4;ZBbToa2WF+GDZB)gfg_HJzXR)UbqN~?+t zWibq`O*l}%2eJD{#6_-AT7{>Jtmtk|WYa0k5Irz=w~V23{sGnSxn^x?GAQSD4i{hh zIR{18QNLrys*Is^)vhaue4yI3yAb2IX~(asgW#h(O(G9j=3iKn3&AktE?q#>_-g^u zd4XF>CQ7rH=um=sGGi?BkzIr`tbT?r~0cE`SK@(qw^n@SeV${#N7a82#h&i{kI7Xsqv8F^xV zzrMcy3%!mc#j6`$C~ux|Ii;9n)IAW#8qfMf|De+IJ!a70$W+R+a5Y<>Q1N-KiJ~Us z6WZvFQOGa3qCP=`WH^=TRgoPJu2%EQG1=iN29D_S%c>>)A`8=}vl3bay>L*_Q1$mYVy0q2=VY|U*Bujg(plk#VK&tLzu zQX!brAB!io^UT}yLEXX%jd1}zD%@o}Cha@?eXn_-a$Tg_W)8pFi)4t$Qm4?UuE{pUm0!fy4cx znZFt(P6lE<+K{hIX)M;S@~8zA6xM-b4YG>4}!lNjnyrA zO@tHR=*?S8_Q#1a$GP;UADH;O5uTrUPvTqYf5E*chBYxSql|`@qh{@}Kx*(#cPZ8` zB)&vwp0a23i(u-~i41=ijCck2%$pNbU4Jy*3f2XNn%x-f%Le46;jv zK!m0=e5f*bD%;UBqiEoor`QgGa$?TE)2D=L;vJ})_BZ^uaNOL9iX%n#b~Hof%+hM; zZm?g>)$DcTl?qw9x;O022M@8myRpN{CXTd!-syjb7q6K-W~6fKx%XXe*#1?QXd%>V zmoB1yfhDRVJIlNLyhV!AyZ_{iQ0=l3)OS=1NRiLd7GsAo!(f$uk2L+7d(gh?-#9Sy zY=zk4G!rpQg5~cm`bsY5Q7twS0o^9>)P3ZnX>FlwzMY1Q*!+FYra=c^tDtxPWyyu^ z;MT3p8s<(P%r9q$bqYsEYZzPGBEnJ``Iw(0y?BI+E1Gtuxlya!rTB`HH4I1CO%h=) z4-F5wV^d@jqS9broCP{ixsADLqP8~q>5r43*nuSe*k#D>7KVNH}KX?5P yg7u9x^8Uivo8&X1RLX(l<-K1&$38paE&%XK2RakGhMb%MAotC@Z1o!le*Z6W{vrzi literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa4a5756328c3af6c39de72be3cb2ce924bae11 GIT binary patch literal 2566 zcmeHJYfu|y6pc@`V~4RmI`sjfIM|}`fmIPgwA7|4wc1)p!ERDV)677zT0&y7B$@ik z*lJa-FxmmXYPB?Z{RFmblV~ZgRz*qcJ(F(;|c?fKfdl-`m0cDmM|FC4{=vNz4;A( z^OIw~tmb;*57vwi{2yL8x?zU>khtyTLhf+B1Xx55N`@MPVGag7VP;=qcM z*M#Kh-cY-!ljC$2g7_%{Ca96}x_!xbaz8F7O3AQk%^~a@lh_ ze-##@fHk(ODDNxBe!fa%2lr8 z0DEYZa2Q!&Rz>1)NZR$NFWMl40=wF#1`EN~13a}SCiAW=3UZ~Z5Gc*t4k@~k4ccS< zOldcwN7roED7tXj`2xZ68dRq)R|F`a)|0Rt@b71Gs_n6kJ4<-FcNwOO*;|8DU8F;`84c~3JE2EySyq3CsttVB zUPT&Pl~a#sy28@tPhh5|*`&i(6b#691y~ zd%%$)m!$(x+(`FtmfN`cjQ1OwwRQg*P&S?hslCwR3 z-~Xg$yyH^FV`!v$q#0BWC;5G#FTr#A9(Q4+-kZGq2T`|hAAgWq)=4)38t?I8J6Ysm zP{O;%=_ALKR6V;0nLXWU03z*vbJA0nZ4*gX{v1|te3wAvCW>FFpZ?15zF-TvS6d^Z zEaf{B;hfoK?X2C$9L^!fQH!-ZXdXvxd|#8_>Pd9)qO4A^c82nA^;pBDwb8@EVChU5p1{?Hq&C&6>*kL%Kl2mKpLWrFUR z{<(brg6?@`Gv{Kug(txAL-57{LuqKHmyowN@OA1|>P$_v`czOidOq4&2~HKKlZsX^ zXG3)A`M|yrU7={_$YjtZFEQKqeKgqqd2}x=fZkQ4(Fn^g8$u;rhK^^u<5_(u$kG$rF*ocY zPt$|P&w<>EV|-SofpR6JU13O;`lG%ryNH5GM{y?5G9vLG1~X+uwfT2@u~$v?frBxZ zn_DZ*>MCcUmA9{DMFrlbNe8m$_eQL^uymzPi+pLt;qJdyzZ?Fxd3Lhd8?)$|jYFhU zlB#rSqoZ!y3?~&9GHXVok1PiPW&yx5mv28nTac-V6tkt6(Vho-VcA?L019cR#)YI@ zqL^rkIB>f|yfkj_r)zZ#5Q#8#Hg8OUNEH*zfOJ1iaD)01)Mvm>hRUEFWXhLFd-Mxw zQ)$fIL)`kG1N!K0{zC8sSC`#_D;sk+ihI(w_&@j;Nl;|QC(~i0?%qOgQ-X_swnzE@ c_F*c+&?A#WXLnsm?{^IDGaFW$R&9IpHwH3<*Z=?k literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png new file mode 100644 index 0000000000000000000000000000000000000000..289db16ed4529dafef09e02a9d1daee42a8cd85d GIT binary patch literal 128722 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

  • 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 B0^I-r literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2b76cc7bb8b8565471fad4f62958cba598e55b GIT binary patch literal 6174 zcmc&&e^gp$n!cG%n|7w1?CzXw+a$)*U&*F+ZS%v}pvZR9PO34|h7eZtLfh21LZeOe zf`C9ebN1vk+nBZ{HPHagHcAlTc4BT+E?ssf`CNXHc51J&@^^cM1hRf}oqH z2AK!mZvkIE+ZG)@b72E`D+w-c+n~D-f{wCij1%8yTDvbatxkO&zZ+PD)(t+?G%}lE zBr9_xqYWMD$BFYZxl_Q*)au}Zta$J6YCMe&WuxR5d(?1X)OyS#^Y}TPROBC4K~PUN zU3s!lP$XKl2=j!)Jv_aRw?`5}Off zBonE0a3*Lw~J!VGenN@+A!8+s*` z?eg{2M9bnZEYIWwrs+fRts8WkBv)zzEMomoLb%MiQrm;chnq%DnTNVln=cZb zu@*xtYhkl-VY&vM2oXlHT{Iyz4ArYN32o;9aW1P=4o9WPUW-?I&|{_risYPD*TpC) zZHx31RW+PBp3pN!5Y;JX!nob=a=^0NA_jQzMy}Bfqq9#S{8$0eGr*GDLj*glnWRtj zn+Qt0KqF_2>Eo3$F&(M-!x`tN!G{pv#5X+Il z_bjh*bAxkTdL;hh=uW#T=;RqoR_5FFvGI)6{hUg}uTK#Iyq+%Vu1~MD8wOv5d|W3tbXqaO(t@sH+uWu;LwI zST!^T?-z=Fj;*|f`y0JgCyZBG5*<|~VGRIcu8a-Wb}L$B6$axKmfJG%waWFiK(9kv zCPz}i*k&Up4!S%}0WU7jjR>&7!)WJw3DZ*+o9QGj;ppiq*jnpfuQCS6WL{m2D-&rN zRI?O7wjy;9A7TYYG7&LSyAi7#vg_h1S4(IWi+ZynTo?|!dYbmslJ9Kvn6ogNx;W~R zs#w1G>3I5dqfD#BiR)pDi)`FDY`&~9MNH`fgB#mogw;eDqBItTk5D6rv4K^?W-h-k zr&WMnBoJ`>rR*q~D2b(z^6<=O+fWw~U?G_JYj6PXdt!G-qm64(dXzEJjPFOrd$$Bw zp=7CZdY|m;5J$MU?sk0T4~yHhgN2M4P>a^pifVDQ9$6o4?`2Wn6sa#=Q#s=22S-o* z&g`M2VPf#~4$YBqSv+!KKo}FG!;x1zEdOE@2U3n( zJ_D(1)WeE1lgLJ@Vn6gDgYS zB$9kKl*b8_pLOfxxZ|TSJBrb)za5RcW0s}+5YXj3kAg)V9|P8kqm@ns4JCLP%ytQ; zF3?olbc$VWo8DjlP zYFxjOU}BJ&T(ovS%V{DJLy&*%}z;>extI^qvbbC&_nM@XaH)A!zjPX3@Iu0U(Dzo<^moUP1%({{# zvKLG3C#Sn4mR$z7_rRdO9Yc$#s&o!9>6F?RN{7S%h8lA_E2S^cxj*5GRC*aEVg!q z0$KEklB52#$&>W?#TFU8{)Gg+5ir7|=*+zAGA}aQh%kC>wwqd|0;j?=N)Jgzj?6b- z@XepO(9Wh-HGNAs{fVj19Zl9|K*j*WJU6sZ1!xI))7B~000RJ5-K5fhI|1DF&7y$z zzngYg+E8K(ca4SPxmK;Fzj6U-a5<8@HLbq;AkF(J>vG12li7WlH%$@a_ECFTD+-VvW?z&$ZUHh@l?AMsqoSQ{S8vz^r%x-a1{=3Oa_y(Zrhw<#r&E( zU!S(dLYETKSW%i*f(|E;61LD&@3sMCHm0Acz`D!uRuK5Qh+udP;st0AOX%TnzgK7| zlgT}H8`tM-&k32uI-+fwOo0@*Tz!csjgN=Z{mIsla6cavD09)qNXRv=OPcl)>x0RvEt!%DdxjOjqSb@G#fbjLDGyxziz z;~hzIj^D=*_J|YR_|H7v+fcSUsY@D@jLC+*urgO&u8LP7nct$B`>>rHu@;ThWH2#M zoUnT!v`EPZLG^@V7NKJwT+JaycED-USJ>?4W}v3d8$LlZ)6~lmAo*t}+bGvza3tmq z(vk#)4ikyNpVX|wX0)wk8V8e?O($ta(ZZ`O93q&svXW0$*^qqaGM+%@Cn@<78OR^L z1BI+W9R`m3=X>JB{$ZU#W*4m1}!Me2Sqe_6$c+DF38y(1yxjJ)~ zJPWHs#5Ph49r9=)MC*$98LLFOD$VsqD>s0+HuzU^4%v#Fcy z46}F!DKR*wUoKm!J~3LQGsezAYw-qlzu3DpprD z&){AMc^{z;0SC-xD8>}l8(EsZEX(!jzewUEk&ea{N0URoVUW?jue9L+Zkdsohklx2 z)A`yIeB^#;yg8)?kdhGerB_oM!$G}4^RN8Wx}(X(_)4gOmsp#(L0832pTU=OYpg6A zs&AeZS9~w@_zq-z{$Fb~AEVW);4nYNvH~SEziB8seLLm#1(wum&wA5XOgj^jAUnIb(w@37J3 zd8}epj%IQN^a=me@=SK@Eo;Gtk-De}B#F-{TG;H3;7m!U}Q?}lMoZzAhn>U^S?B$UP&3+&7@=~tZxOYKEZBNoOmz1(PtZzq5 zQchWT<`_-eczfy5?50fgVo16d0L)wS#eC>iDj7mav%O2v@ywGv@wn*WzBV~OySk6Gqwc?a^YHqWiMP-3CZ8JOwGBc%( zYnPRQxLlPJnQS`@DjU%9*?eM?9_3&*D_L9%x&ntVudTJLi&p7Y0`A?<5`A7>(-fmK zg;U;iHlujd2xx<0U^j89EP=PN#V(;B*EHxkt9Rv8-XZsiz@+&kW9&vnO{2B+g=nW>bOLPE& zcui__8J*`cOsOm^Z=#Pl#n@U9vGObjJa47P?s zFpwY~1^%5O-f;bkQ^rl2gwWDRv=D^&9Ri4yai?qQr9g2EIcKao(c-a#3K3!>*fE`= zug>whG}C!Hp5tF;Puv3;+D;>gy68}s6STn!B2Oz*9$7>H0+V$i-~{m1;N_$NF6OE@y*}DCWJCKIH)9S2Rb?h3}lsM~@k4$%Yv67e$L4j<| zgrHLC&z8axh`xBlebo z#~G1e-IK7PQQsm4`fzHpSYlXuDL=clS9)^r%RIxE&iyQYj$KC$69>wLyQtN}CQhdY z?*0X*Y>(WzO*_X#0UKEXz1y}-7_V)W!%X?#Oc~i3oE+bYjktuxBk<{4Av05-yf`6f z&IDQk#JNa22Zwl}o-zNiDxQH6U04A{#E?gryYY51hfHLXA+8#nFe@@J4ni2aK}SH zjp<_viP1!@k8z3#vQCaJiAt_=GI|&E$_MHt4h(e3hvM;WuhOnP_US2lu>_76dF^?V zB`!4?yIgH=m*hES^XrmR#S%~Sbc3pUtr*K8t~xHp%}<79Ilm`1RzM#&-(K>cBGz=4 zBI-@Aj^$lEutoDA^a(wVA`G&m>SXN1JbV-T$Bk f|EC7j(~bF(ueSV^{51d)P~i(D&l~^#m0$h`xuGJM literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png new file mode 100644 index 0000000000000000000000000000000000000000..e33466b0fb8d7c95774a976fa76b5eb491869edb GIT binary patch literal 13193 zcmdsedsI_*zHc1w$V^-1p4B_2$68?K%veS_#i>Y9V#u+!Qc#H%LXMG;xzhqdET|At z5=fkJrk>6?a4k}XM?$SYWQSx=g$T(ei5;i)2qsA4PRb(*t%Z5)qMhLC_4Dk44Gc!17;&hOly-aa6xkel+#wtIq?L4B z)UN9R3y9~hpFig2Dr02|SUus!xZErO6U&RA5{tzin`IB1qexH59+}X8?-IKqoCxll zVXPfW-p!5ITlGk|U1d&aT)lx&tQ}OQxRlZ=OE!ASH_s#;U#bs32mTs1#(i=ox>>5O zpY}|%M8-T$gRTAyY|LxmY(iNydJ;k*-NlUdT`iqcnPW#)gzlR&w?x)$ zbSb1zlQovK$aR*T+iN;jG^?^EvIXcKNUES(^-35YlU+C)(By95Rg}q-W&AD=A8H=4 z)!QE@347-IMmmePWr$j3)o#@Uj&D6pV~OYmWOAZ?%HtjMb|`%l+F0~j_X^U|+mU-d z_hInjN&gQ?;e^m@y~WHAMYkpHo0{((U&<7%1KWDLETH?%?J_KQS@1td%6UIn{+k`) zcNh)dYN?o^roP9K!W)SeA`#08@4>!L}X85NYGyJ`c z)9QhijB*xx4(ju9JDa@$q(Yb4=qu_}8n8VnZ8J7C?2s4Y`s zQ6+&q=Yl-slWgRYVt!jsG1D_KD$|}qG+h|2xvg6kH0C$(l!Y062gOpXm@S}dcNbYz zynF`!X#jDUM%yNDge0lM+5EUJ8<$u1`h`blGux6t02;&^l_}IZ5qCpDb#AjPlv?yT z2mB_DhtDKiRkHH_eDELJ>1m{#2g~@!LY``?fzJP9!gQ%p=aV&YE#jhdC4_**_B7MYp;j24IAKP> ztz#kA@WPl?bOEs!j9K`ZHK8uJ?IqoKZ7F+LUe2_m;&fOC1?XiB!Y3MOspq%_eK6Ou zGHdteo}mIp@);Z*wwkZU|HG-mr2;G7Yisa9d0vJ{ZQ*epM?&~aMN>G->g^GT8BRr4 zD98S>;q(R9OG%v0{b~Jckm=5q5oZI-2>Kr zu;-;$YEJj^l)269uH=@9Q?g{_U){M?=(-6?vHR2kv4ub8=1|=8JWo0ngI2*VpHif> zp>A&I{elzIfwba$Tmo)1uF$NnsF`e!L_}JF@J*c0VVApk=_z(+VP$}ot9Mpgbk7f; zb&MRIW?}<|in%OqY=Fn<1mGB=fnT3MPhOT(+C0o{7 zc**CuGC&;I=)7mJa zD@5|l!*}2^4qX$&^9vENf9l4mxr(L#1vba4MpCwqeqZ>9dCH$b_H7?+xze31o38k< zAi(cHQcYr=OJ3vWcQ|saIK9DHYv#a%&_HvB$Ftg_=IEM7f{McFybDP;bAo6Hn=oj+ z(|?~WqL%})AA$B^-t=xPxk51}=Vzl9iH8RlxsSQ&3-2T`;k;aMu0bcCafcO%ofvUr zDsC1w*tJ$VZV9sKA*e6Y`@5ld@re4uxJ8Yv5bceu$n(t7$zvuyy$xiypUOZFAZ=}?j`V8YNI zfx^5;fK>Uj*$jM^TSLd+uxgRM7+z)8j6xR5VPxsIT7{OlyytSN0{*=VlZCw!b@&%O zrJdMHQO3h=XYLzP1(B zhO>Buy>OCRrZV(vW%xdN*|D{^813F)?={__&5aA=TKneKjy4^Yc$O+We%{~xt}(p( zy&*;F(b~5E3fU4@hTocJf!GLVWQ9k*edP%N{7Zc!M{CEt1^QgjBG)EWNlF#(fNS(u8I;%YK4xuwMIHEI;* zHVC7!(gN7g2G4f6w_o7h83@U2(0I1>6p=@A4a+Ja7ojj;mf(jM+LOQ&DED3d~ z!)NXk^Gc0X3{EcID@@U7%^Rn(Q=}o8*Pk0ickv&H;1FaxRSKiI1X?3(p z(dN%Lj_SJGHLU2o%Yu_-r_)Y=f?OYde-eD|?v6ULKd^`R-nU~955sQoZKv1PA5QRm ze6`B!SwY ztHo|qc>?pe)Ri`GpRA?1zejyB&`K;qRQkHVj9FA-OFVxk>QyuqGRAn05xeN5fhxCW zz^qW1xs+qSBbWg-$YRxed^Pb_cKfi3I8TplUucJ-K=t0A#w{PC zE#=cU9VI`cmGr&Tc9du(^&0&8VMa5ziu)Q44PZQp0b%w)QXFyO%G?cYAZ*z+x=OBq zB|0*?Z;Ij34MwG$16g&liJQcVySvxum>}v*5j-}MPf#LN^{a_-`3)SA96;gJkp&Z8 z>+*l}vYR3&TU&h=^jrgVH0p6vhj7YQ1So-DBBS(%5%#nok^Gz2Y%8wrw;a^3ywI-946N_43cr(B!e9L-Kx<0)AhtfGx@Fv_7C z3jwN}7!9qN(Y+tjHuinn`kE}j5y|nsiAKbQmGVQs=U?%7JIcub?OzwtrRClkUoVU& zIF<7}vBo}mP#FCgqPqWWo=-8G)59rq;0dmnSEOSyzRcr4@2eD?knG0DY6@{9-lL4M zCI`B+T+HHzl1-Kbt9SaX5@{-Ikk{xHUjS70pGR(tfj#kJT?|sbv)O%2vq?POg;-;- zS`WwFKDrU+@8r?~b5JQQ$n^FHZPDd@}?o>Frtzs88 zSjxr}QPnN;+kj{RSeR+kEI9N&*D-gS;_*-ngGnyFI4HC2v(|?Ppz(Df{O%S_l$<^& zEzJs|0v*JEb3Ee!x4kJjdqdpBDYFSI*M+UL|7*=IVh?#fNDQS^gt~^5B6Ze>i~K_u z6Z8ZzFo&zxP(oF!d7eWnF+6V^W?$E18hESsk##qTnN^y z?BfNOK*rFCjB%Xuj`JsG8*_m|M)Vtjo_tcs-YiipnNcNxAJPkJU+os1Cm8e_t zw9sgbMf3q>`!=tYLh?3fWdv1_3FhiX_!XezJNNX-EavJ)$t#pPpEv*J4>cEUC(Jx? z>M*NK8_uzw46mEG-Nhn#Piu+26Eob!9+#)?6-%5tOt)4oX9eWnfwj5*CM#~mIt3-B z-ifLY@*DNSMw#o^$=r}kJ$HzW#dyNv-lSpK$>~(Y72tHj47FXq9?jzBiw_2yS^6SP zVFULfpVf82HHKF8uDVrY^n<;vQiji7f2Fa-eF2ZAUohm%(Y>{v?SO1wLH!jCVHWiD zFo|SeUqd6JRO(YK{u6eGp4#T?1+4UsVSaTpc1r{BnH)1-S@9*6|C0YDdv;_I zO}(;^z6nLt8inYCtyjczIRYA%1>loXv6<*&>hR=+9pxITUS=}^#DDpkx=9f|DQNeC zoFIz*FS$Pl6kWpi^gqwD;vO|Zrt-!J!l3aw+5H+{M`b zH~eev#u#}Yfuk@|`++(|#Ynd(MxODzAjK;$#k7UTH!GHYFL?c!4H4X}F&4c~bVzQQ z@FUB)`a<)bA~j2MaT=)*QR*aY$Nau#tku_RmJIcp_wXv6RcZ{&Yh)a-m{=+BC^DnO zW50-XKJmZQMsO{I%(sQd^-p1eofi991m!BsnRAfY{|=y?<#d%VHI?B`>jJ7I4PzKN z?g1(l?OTj}pgsM;{?nQ@1Ve{E!Y+(@kI_RrTGioNu@z`y0Gf+KTaspdvT`o9UaWHQ z6Wl6hlDlI7;++B<-LM^wZN_FH3~tiqJB2BYIb^hoTk7UiCb!{0R2p@0I|d;R!!h!t zC_C^}gilAm8;eXFZj`fs`>MEWT4wu^({H;fwgQo-8PF0N_tP&Hu>NPHyZ;#-Hw6@6-3$-H@|dzJxP zB;+N;Nx4_M?NvI(v4IG|<=^fB! z0{Mt+iK%JaMs|qeAM_Y!=scecl7iZQ`23v&KRZI?@5O(eZvFDcOMO}9X1XSa{7SBa zdVt|ia{KV=1_cZSx3Pxv(YRiqHhrw{euI>{za*`ReZjR4P?qiZ#Cse=CBnCHcL|!2 zrj2Z@A(B9SKHf}?Q(|j05DDlVLnH{$0R!V zK=t*e01<}hy9V206gyhk;yhbL_ZrI&EnQvURn9*-2Cqpur`{6;`f4|(5)QIo=9I;k zC-rEb9~L+kQ%$&17^UgVKZqe&Vuymp7D1k!ORGJ1Z+ObyvPCTyP&rUa*i|g_P04P5 zHsERAPZhekF?^Mq!A<2!TeuFven2XrRPih416EtLoXnTYD*7NrRvbMp{Z8)TP#o?D#=!%qmu; z8ipJ;md|FA=LYzP6g@J9t`LZ0L2KTAca8&9DdADH+RVv4P$aW7Y?LWj;&e>6Q4 zd7pJbDKTrqHfwD*OVEfcHIcuL)P!Di)+{S|2cwm9XV*qfgzt8x;nmD|siC1zHsD%~ zQk=svYEvkO9|Bsyx_cMhFlF*gywk&En43zq%_D7X@7`Af*qRg>)YvaRLr-r$kkk+n zf89PMP`}u3+3r=&>61re#fc`ZIV)MF$%*&)O=B57^nCmcC6$dWUk$}^F1lMK11vL; zJt(!Rb`&WU?fzHJ7tTARGxr%1!>fl}?wLrZJ39zZh#Cm>;U2FEv+I|GCBX-EyH+DL z^2fzGCK>Ja?FVu+fR|p^ZDx6qp^}Q@QjR|eel{qZD|XKurZY4Mm#dA5_e;!T09pgW zZYXHIuRZfc%?yq7J`-DlGrT82Kh2ms(HXZ@UnxkGxq!stQ&vKwkR#AcPiig(y_2o~ zSt^Xr(jAqdL<`^DA#7GPV^v(<$#E-1)Cknk(c8<^>W)&^0+)9w_?*fYl~R92(XL?X zIiwjog(1vnI{tKHXno|=Rvp*5JoYPyK=->~h~;Z+_k(7)mK26S4QN|#zoTFS9wqYo zZo-H5%MorBGzwlNfMQfLkmGF2Kx zKrxiI@r)#XG<`ZimsAK8j=%=di*k+ln*Lhg5sFtlhwZUg0x|Q={MY2(RIUU`106~o z9ZKoHnT>3X50ODL<7K&vDFW8gAO>X_2c{L3x^xsk$=Xtew-|3Xcf07^)GPaNM6Ut>@v??PiTp2jt>o4!U4&=ofWa%a^e*dy0wc z2&rz6Q#BPpWF_a$F^(-i)EOF5e!@_~%J5#^-R2|?S2opC4>%wh+laLIi*XF^l)MA zd|4!cpZI+wfBjFr4$n(~_VyhpgO@}#filMfX%KV=&4mcRZ;AU)d>_&j+swcdDJOkx zt)ilI_-x2^BncV<^o{r#G6yS>(gub`2`5U~>uo6m7k6XnZ+bQqK|V)<4;e?a|i zu+YUbstPJfhUT(7fd{$?SuG2~-3aEqmWlmUEOQl8=pnJq6lj=d25iH&vRj`Q-@mw~ zd-j^^l$l&9)MfewxdKG9W4HrXh!2QW`#I0)g#l;2*C>|Zy(YL&@hM&N%It)-e7Xw1 zo>#?XuE$5_`V3od;Q*(jUf&ViveDBo`#CLyGnQY z5lfHRrYId2_qZ4uv>|AzHm;Q?fDVSlh7&Zj&vH74$Z1YG%(6-)H0;wGD&t{r2xryt zA=N8IxkV74vPCwdsiaylmO2}?hG6x-S?yWc@(^!CaQ&WqKPO~ORqoG?DK6CKL^Q_U zaSNb}chmWG5r#6>5@)Weh=2p4cZ&P%gqHe1k>L?rEMr}SJX{AJqxJ#-vjMxKpt|#y zSo5*H%TlJ)f9^~BbXxeClUoM<*YmuzImrLOb-QUd20`Lf8yA1$$MiO~`JBx~D)3H4CU@+CBCl|v*X6EqO9_*BnB9`%c zL@#n{W6GsSUDuE$T>6zv`3+G!5g=r@u`enJjkbk6ZywQ9a8l<+LHUp2dd5hJJ5GO)&J{W zs)N#3PA=Z%Jv*4E8-!;Ru%l9moCInihh3zuigyo0o-Mv{8DhLR4sNG4CvoqihZ|Lu!d7=%pe!|@QT`w}^w3!Z*#7xkS9GrhBcf_s>Mk*EL@rcj@XSni? z7}NdXf!-wcV;lSGzc9pc#sAXME}~X2-1<#J+f!Mc1O#St^qtFKqgSfzNs=WgDo3F} zh?j3a8&sGNH(W^c2238@{-SrsvK%GkQz2XJm)LPPk$Z>yIgm{~0GQW)@ysHbqklT( z9QP9g9gig9g+xmj<)1{f+26pG(C!ZKKv1R?3;${U(X*qa!v%Er%r>iH=#7mu3NH_J zmwabw>OCD66NxoR_k=?##DB0K40zm)b=o7zn?H5c-WHEgn}QnF8{W6V^2nc_x$Q5c z99iwPf-kQIieP-`FN9lhWU+OneSN5fXxsm|S*HVbMeqTnj>>CD;}GWw#MhzTSTPt< zNHw`#%48rwF&UaflPXd7Jdevx(n}L9R_j^|yV$1Jyp_)Yb1q-%bT7-XLstBxLbuzG z3v$MQ?p3 zvN)mOR{!uG4t`v0VHRu4Mc7gL7*A!+<_=qDZ%mDWak92|{O>3;7jEc_shYSiarDm2 zuO-IOTF1)Sg9PMFE;JKn;0q2g+{BSr+M?s#{c{|ON=#_8IihA;-94Rn-p0_xEL#mZ z3k|`CPfB&&lX>4XU^q+oF2Q-0RbClh`(F7y+d^licLHbs;jTq}WF%qX%))xbnyCwC z2eXG`7+j>MvWlCtkcnmSY#S|FU}6A|KFQH5Rkf&GS8a<w~L3e=e09?LE+H|Z0^HZJQNqhUIp2gxL zyfu2LiIE97ry|>-!c2fT1h0!ukkgcpPEsPCfocw-=vmg#(OIHrbp-j;1YR8cjs;SD zVe;ekx_Js=hyiXAVUYNxW`dUbU7_{gm0tluT4ouT({^XgRyxk}Wu-K3lG?73D1E>v z_O#N$1eRh#H(hTy#2R&TtT?HeHlf6nHr#H3Y;kfCRJK5wPus7-Jhoe}K5=Q; z0y^ecF5kl6Nn~UP8t$DgzL@0m%yxc@fu!T!`pDVJ@aW$yI}D=pk}-{gzz|k{0rywm z%uAj`B90O<)YCxyRVosTK;?8`*DB1jkN*vaSYH}nfSv|cPDk~TBqj|oA}O%6fFE^! z+2#$N1FWurK`G*CTTDWTy7#`PCJgxHUup{6H^m}DMX94=?=+$QKU-!Yu%Do7SRNb+kaAXGJ-%(488yU?VdFxU@paf zC+_dVr2c>Gm4?)}m)Xo#n_w$|GGF!X!*{@Q{x7_d@&CbHeg4gWw(pUS!w-4WC3b>D sTKw_${uQLVJ6=Dsl633Dq9`}+4^MLw3L)@{4JqTrtQQo||MEBg4bN@U6#xJL literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md new file mode 100644 index 00000000000..268d34458db --- /dev/null +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -0,0 +1,464 @@ +**The Class Design and Code Flow for ECL Watch Test Suite** + +**1. TestRunner.java** + +![img_2.png](TestRunner.png) + +The TestRunner class is responsible for setting up and executing automated tests using the TestNG framework in a +Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the +tests. + +**Methods:** + +1. main Method + +The entry point of the application. It performs the following steps: + +- Calls setupLogger to configure the logging system. +- Logs test execution details to a specified file. +- Calls setupWebDriver to initialize the WebDriver based on the environment (local or remote). +- Creates an instance of TestNG. +- Sets the test classes to be run by calling loadClasses. +- Adds a TestInjector listener to inject dependencies (logger and driver) into the tests. +- Runs the tests using TestNG. +- Quits the WebDriver session after the tests have completed. + +2. setupWebDriver Method + +Initializes and returns a WebDriver instance configured for headless Chrome operation: + +- Configures ChromeDriver to run in headless mode, disables sandbox security, and sets log level to errors only. +- Suppresses logs generated by ChromeDriver. +- Checks if the tests are running locally using Common.isRunningOnLocal. +- If local, sets up the driver to connect to a local Selenium server. +- If not local, initializes a standard ChromeDriver. + +3. loadClasses Method + +Loads the test classes specified in TestClasses.testClassesList: + +- Iterates over the testClassesList and loads each class by its fully qualified name. +- Adds the loaded class to the list classes. +- Catches and prints any ClassNotFoundException. + +4. setupLogger Method + +Configures the logger for logging test execution details: + +- Creates a logger for TestRunner. +- Sets up a FileHandler to log messages to a file specified by Config.LOG_FILE. +- Uses a SimpleFormatter to format the log messages. +- Adds the handler to the logger and sets the log level to ALL. +- Catches and prints any IOException. +- Turns off all logging from the Selenium WebDriver to reduce noise in the logs. + +**2. TestClasses.java** + +![img_4.png](TestClasses.png) + +The TestClasses class in the framework.config package is responsible for maintaining +a list of test classes used in the framework. This class provides a centralized and +immutable collection of test class metadata, which includes the name of each test +class and its fully qualified class name. This setup helps organize and reference +the test classes easily throughout the testing framework. By using the TestClasses +class, the framework can dynamically load and execute tests, enhancing modularity +and maintainability. + +**3. TestClass.java** + +![img_3.png](TestClass.png) + +The TestClass class in the framework.model package is a simple model class designed +to encapsulate metadata about a test class within the testing framework. It contains +the name of the test class and its fully qualified class name (path). This class +provides a structured way to store and retrieve information about each test class, +which can be utilized by other components in the framework for dynamically loading and +executing tests. + +**4. TestInjector.java** + +![img.png](TestInjector.png) + +The TestInjector class in the framework.setup package implements the +IInvokedMethodListener interface from TestNG. This class is designed to inject +dependencies (such as a logger and a WebDriver instance) into test methods before +they are invoked. It ensures that these dependencies are available to the tests when +they are executed. The TestInjector class provides a way to set up the necessary +environment for test execution by using holders to manage the logger and WebDriver +instances. + +**Methods:** + +1. constructor + +An instance of TestInjector is created with a Logger and a WebDriver. + +2. Before Invocation + +- Before a test method is invoked, the beforeInvocation method is called. +- It checks if the method is a test method. +- If it is a test method, it sets the logger and driver instances in their respective holders. + +3. After Invocation + +- After a test method is invoked, the afterInvocation method is called. +- Currently, this method does not perform any actions but can be extended for cleanup operations. + +**5. WebDriverHolder.java** + +![img.png](WebDriverHolder.png) + +The WebDriverHolder class in the framework.setup package is a utility class designed to +manage a singleton instance of WebDriver. This class allows the framework to store and +access the WebDriver instance globally, ensuring that all test methods can utilize the +same driver instance. This class is used in the TestInjector class in the beforeInvocation() method. + +**6. LoggerHolder.java** + +![img.png](LoggerHolder.png) + +The LoggerHolder class in the framework.setup package is a utility class designed to manage a +singleton instance of Logger. This class allows the framework to store and access the +Logger instance globally, ensuring that all test methods and other components can utilize +the same logger instance for consistent logging throughout the application. This class is +used in the TestInjector class in the beforeInvocation() method. + +**7. Config.java** + +![img.png](Config.png) + +The Config class in the framework.config package serves as a centralized configuration +repository for the application. It contains various constants that are used throughout +the framework, providing a single point of reference for configuration settings such as +file paths, IPs, and other constants. This approach enhances the maintainability and +readability of the code by avoiding hard-coded values scattered across different classes. + +**8. Common.java** + +![img.png](Common.png) + +The Common class in the framework.utility package provides a set of utility +methods that are frequently used throughout the testing framework. These +methods handle common tasks such as checking for text presence on a webpage, +opening a webpage, and determining the environment in which the code is +running (local or GitHub Actions). The class leverages constants from the +Config class to maintain consistency and facilitate configuration management. + +**Methods:** + +1. checkTextPresent Method + +Checks if the specified text is present on the current webpage and logs the result. + +- Retrieves the page source using driver.getPageSource(). +- Checks if the page source contains the specified text. +- Logs a success message if the text is found; otherwise, logs an error message and records it using the provided + logger. + +2. openWebPage Method + +Opens the specified URL in the browser and maximizes the window. + +- Navigates to the specified URL using driver.get(url). +- Maximizes the browser window using driver.manage().window().maximize(). +- Calls the sleep method to pause the execution for a short period to allow the page to load completely. + +3. sleep Method + +The sleep method pauses the execution of the program for a specified duration +(4 seconds in this case). This can be useful in scenarios where a delay is required, +such as waiting for a webpage to load completely before proceeding with further actions. + +4. isRunningOnLocal Method + +Determines if the code is running on a local environment. + +- Checks if the operating system name starts with the value of Config.LOCAL_OS. +- Checks if the user profile path starts with the value of Config.LOCAL_USER_PROFILE. +- Returns true if both conditions are met, indicating a local environment; otherwise, returns false. + +5. getUrl Method + +Constructs the full URL based on the environment (local or GitHub Actions). + +- Calls isRunningOnLocal to check the environment. +- If running locally, returns the URL prefixed with Config.LOCAL_IP. +- If running in GitHub Actions, returns the URL prefixed with Config.GITHUB_ACTION_IP. + +**9. TimeUtils.java** + +![img.png](TimeUtils.png) + +The TimeUtils class in the framework.utility package provides utility functions to handle +time strings and convert them into milliseconds. This is useful for standardizing time +representations and performing time-based calculations in a consistent manner. + +TIME_PATTERN: A regular expression pattern used to match various time formats. The supported formats are: + +- d days h:m:s.s +- h:m:s.s +- m:s.s +- s.s + +**Methods:** + +1. convertToMilliseconds Method + +This method converts a time string into milliseconds based on the matched pattern. If the +time string does not match any recognized format, it returns a predefined constant for +malformed time strings. + +- The method first attempts to match the input time string against the TIME_PATTERN. +- If the string matches the pattern, it initializes the time components (days, hours, minutes, seconds, milliseconds) to + zero. +- The method then extracts values based on the matching groups. +- If any parsing errors occur (e.g., NumberFormatException) or if the string does not match the pattern, the method + returns Config.MALFORMED_TIME_STRING. +- If the parsing is successful, the method calculates the total duration in milliseconds + +**10. NavigationWebElement** + +![img.png](NavigationWebElement.png) + +This NavigationWebElement class in the framework.model package, is a record class used to represent a navigation element +within a web application framework. It offers a concise way to store and manage information about such +elements. + +- The class is defined as a record which is a recent addition to Java that simplifies creating immutable data classes. +- It has three properties: + - name: A String representing the name or identifier of the navigation element in the menu bar(e.g., "Activities", " + ECL", "Files). + - hrefValue: A String representing the href attribute value of the element, which typically specifies the URL linked + to by the element. + - webElement: A WebElement object from the Selenium library. This holds the actual WebElement instance representing + the element in the web page. + +- Due to the record nature, a constructor is not explicitly defined. The compiler generates a constructor that takes + arguments for each property and initializes them. +- The NavigationWebElement class offers a structured way to manage data related to navigation elements in a web + application framework. + +**11. Java Classes for Representing Workunit JSON Data** + +This section details the class structure used to map JSON data file of list of "Workunit" +entities into Java objects. These classes provide a clear representation of the data and +allow for easy access to its values throughout the codebase. This structure is particularly +beneficial for writing test cases, as it simplifies working with the data in a well-defined +format. Below are the UML diagram of the classes used for JSON mapping to java objects for +workunits JSON file. + +![img.png](WUQueryRoot.png) +![img.png](WUQueryResponse.png) +![img.png](Workunits.png) +![img.png](ECLWorkunit.png) +![img.png](ApplicationValues.png) +![img.png](ApplicationValue.png) + +**12. ActivitiesTest** + +![img.png](ActivitiesTest.png) + +This ActivitiesTest class in the framework.pages package, implements a TestNG test (@Test) +for the Activities page of ECL Watch UI. It focuses on verifying the following aspects of the +Activities page: + +- Presence of specific text elements +- Functionality of navigation links and their corresponding sub-tabs + +**Class Variables:** + +- textArray: A static final String array containing expected text elements to be present on the Activities page (e.g., " + Target/Wuid", "Graph"). +- navNamesArray: A static final String array containing names used to locate the navigation link WebElements on the + Activities page (e.g., "Activities", "ECL", "Files). +- tabsListMap: A static final Map that defines the expected sub-tabs for each navigation link. The key is the navigation + link name, and the value is a List of expected sub-tabs. + +**Methods:** + +1. testActivitiesPage (Test Method) + +- Obtains the WebDriver instance (WebDriverHolder.getDriver()). +- Opens the Activities page using the URL from Config.ACTIVITIES_URL and Common.openWebPage. +- Retrieves a Logger instance for logging test results (LoggerHolder.getLogger()). +- Calls testForAllText to verify the presence of expected text elements on the page. +- Calls getNavWebElements to retrieve a list of NavigationWebElement objects representing navigation links. +- Calls testForNavigationLinks to verify the functionality of navigation links. + +2. testForAllText Method + +- Iterates through the textArray. +- For each text element, calls Common.checkTextPresent to check its presence on the Activities page using the provided + WebDriver, text element, page name ("Activities Page"), and Logger instance. + +3. testForNavigationLinks Method + +- Takes the WebDriver instance, a list of NavigationWebElement objects, and a Logger instance as arguments. +- Iterates through the list of NavigationWebElement objects: + - Clicks on the WebElement using the webElement().click() method. + - Calls testTabsForNavigationLinks to verify if the expected sub-tabs are present for the clicked link. + - Logs success/failure messages based on the verification result using the Logger instance. + +4. getCurrentPage Method + +- Iterates through the tabsListMap. +- For each entry (navigation link name and its corresponding sub-tabs): + - Checks if all sub-tabs from the list are present in the current page source using driver.getPageSource(). + - If all sub-tabs are found, returns the navigation link name (current page). +- If no matching navigation link is found, returns "Invalid Page". + +5. testTabsForNavigationLinks Method: + +- Takes the WebDriver instance and a NavigationWebElement object as arguments. +- Retrieves the expected sub-tabs list for the navigation element from tabsListMap. +- Gets the current page source using driver.getPageSource(). +- Iterates through the expected sub-tabs list: + - Checks if each sub-tab is present in the page source. + - If any sub-tab is missing, returns false. +- If all sub-tabs are found, returns true. + +6. getNavWebElements Method: + +- Creates an empty list to store NavigationWebElement objects. +- Iterates through the navNamesArray. +- For each navigation link name: + - Finds the WebElement using driver.findElement with By.name strategy. + - Extracts the href attribute value. + - Creates a new NavigationWebElement object with the name, href value, and WebElement reference. + - Adds the NavigationWebElement to the list. +- Returns the list of NavigationWebElement objects. + +**13. BaseTableTest** + +![img.png](BaseTableTest.png) + +This abstract class, `BaseTableTest`, in the framework.pages package, provides a framework for +testing web pages that display tabular data. It defines methods for common functionalities like: + +- Verifying the presence of expected text elements on the page. +- Comparing the content displayed in the table with corresponding data from a JSON file. +- Testing the sorting functionality of the table columns. +- Verifying links within the table cells and their navigation behavior. + +**Abstract Methods:** + +1. `getPageName`: Returns the name of the page under test. +2. `getPageUrl`: Returns the URL of the page under test. +3. `getJsonFilePath`: Returns the file path of the JSON file containing reference data. +4. `getColumnNames`: Returns an array of column names displayed in the table header. +5. `getColumnKeys`: Returns an array of unique keys used to identify table headers. +6. `getUniqueKeyName`: Returns the name of the unique key used to identify table rows. +7. `getUniqueKey`: Returns the unique key value for the current row (used for logging). +8. `getColumnKeysWithLinks`: Returns an array of column keys that contain links within the table cells. +9. `parseDataUIValue`: Parses and pre-processes a data value extracted from the UI table. +10. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the JSON file. +11. `parseJson`: Parses the JSON file and returns a list of objects representing the data. +12. `getColumnDataFromJson`: Extracts a specific data value from a JSON object based on the provided column key. +13. `sortJsonUsingSortOrder`: Sorts the list of JSON objects based on a given column key and sort order. +14. `getCurrentPage`: Retrieves the name of the current page displayed in the browser. + +**Non-Abstract Methods:** + +1. `testPage`: The main test method that orchestrates all other functionalities to test the target web page. + +- Opens the target webpage using the URL obtained from `getPageUrl`. +- Calls `testForAllText` to verify the presence of expected text elements. +- Calls `testContentAndSortingOrder` to compare table data and test sorting functionality. +- Calls `testLinksInTable` to verify links within table cells and their navigation behavior. + +2. `waitForElement`: Waits for an element to be present on the page using explicit wait with a timeout. + +3. `testContentAndSortingOrder`: + +- Retrieves all objects from the JSON file using `getAllObjectsFromJson`. +- Clicks on the dropdown menu to select an appropriate number of items to display in the table. +- Calls `testTableContent` to compare the table data with JSON data. +- Iterates through each column: + - Calls `testTheSortingOrderForOneColumn` to test sorting functionality for the current column. + +4. `testTheSortingOrderForOneColumn`: + +- Gets the current sorting order for the specified column using `getCurrentSortingOrder`. +- Extracts data from the UI table and JSON file for the specified column. +- Sorts the JSON objects based on the current sorting order using `sortJsonUsingSortOrder`. +- Compares the sorted JSON data with the extracted UI data using `compareData`. + +5. `getCurrentSortingOrder`: Gets the current sorting order (ascending/descending/none) for a specified column. + +6. `getDataFromJSONUsingColumnKey`: Extracts a list of data values for a specified column from all JSON objects. + +7. `getDataFromUIUsingColumnKey`: Extracts a list of data values for a specified column from all table cells (UI). + +8. `ascendingSortJson`: Sorts a list of JSON objects in ascending order based on a specified column key. + +9. `descendingSortJson`: Sorts a list of JSON objects in descending order based on a specified column key. + +10. `testTableContent`: + +- Compares the number of items displayed in the UI table with the number of objects retrieved from the JSON file. +- Iterates through each column: + - Extracts data from the UI table and JSON file for the current column. + - Calls `compareData` to compare the extracted data. + +11. `getAllObjectsFromJson`: Parses the JSON file and returns a list of objects representing the data. Handles potential + exceptions during parsing. + +12. `compareData`: Compares a list of data values extracted from the UI table with the corresponding list from the JSON + file. + +- Iterates through each data pair: + - Calls `parseDataUIValue` and `parseDataJSONValue` to pre-process the data (if needed). + - Calls `checkValues` to perform the actual comparison and handle mismatches. + +13. `checkValues`: Compares two data values and logs an error message if they don't match. + +**14. ECLWorkUnitsTest** + +![img.png](ECLWorkUnitsTest.png) + +This class, `ECLWorkUnitsTest`, in the framework.pages package, extends the `BaseTableTest` +class and specifically implements test cases for the ECL Workunits page within the ECL Watch UI. +It inherits functionalities for common table testing procedures and specializes them for the +ECL Workunits data and behavior. + +**Override Methods:** + +1. `getPageName`: Returns the display name of the page under test ("ECL Workunits"). +2. `getPageUrl`: Returns the URL for the ECL Workunits page constructed using `Config.ECL_WORK_UNITS_URL`. +3. `getJsonFilePath`: Determines the file path of the JSON file containing ECL Workunit data based on the test execution + environment (local vs. GitHub Actions). +4. `getColumnNames`: Returns an array of column names displayed in the ECL Workunits table header. +5. `getColumnKeys`: Returns an array of unique keys used to identify ECL Workunit table headers. +6. `getColumnKeysWithLinks`: Returns an array specifying the column key that contains links within table cells ( + currently, only "Wuid" has links). +7. `getUniqueKeyName`: Returns the name of the unique key used to identify ECL Workunit table rows ("WUID"). +8. `getUniqueKey`: Returns the actual value of the unique key for the current row (used for logging). +9. `parseJson`: Parses the JSON file specific to ECL Workunits and returns a list of `ECLWorkunit` objects representing + the data. +10. `getColumnDataFromJson`: Extracts a specific data value from an `ECLWorkunit` object based on the provided column + key. +11. `parseDataUIValue`: Parses and pre-processes a data value extracted from the ECL Workunits UI table. +12. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the ECL Workunits JSON file (if + necessary). +13. `sortJsonUsingSortOrder`: Sorts the list of `ECLWorkunit` objects based on a given column key and sort order, + considering the specific sorting behavior for the ECL Workunits table (default sort is descending by WUID). +14. `getCurrentPage`: Retrieves the title attribute of the "wuid" element to determine the current page displayed. + +**Additional Methods:** + +1. `getCostColumns`: Returns a list of column names that represent cost-related data (Compile Cost, Execution Cost, File + Access Cost). + +**Test Method:** + +1. `testingECLWorkUnitsPage`: Calls the inherited `testPage` method to execute the core test logic for the ECL Workunits + page. + +**Class Relationship Structure:** + +![img.png](relationship.png) + + + + + diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ab0792d8e434dd9e516fc0e3add0792f17ebd GIT binary patch literal 21757 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 I-}?Rk0S&~DegFUf literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbf9018ae624487a62be8bdd4f47a20885873b7 GIT binary patch literal 21832 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 SH>5%zeelV@v)@1d<^KoiLcxCk literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png b/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png new file mode 100644 index 0000000000000000000000000000000000000000..547e7c857c765c7ea8dda03d57d478a7e745a264 GIT binary patch literal 2861 zcmchZdr(t%7RTA?40aXkvbG8sWh@W3wXR5b2sFu7Eg@K;WowiuAO*uCjhI4+l7!6I zEj}tlp{&x7unt6uc_7V8$dag4*ab{TViG~aT}UCC5CRjDKoXL@=uF$u>AKyW-GA=f z`TgdcIrpB=_k7RU4>ORfSB9+&2nbk>O52ka5b&#m;Cs`nf#9>W^UcYCfR*#8J@0*d zBG;-Puj3?3_NbP8+o_$yqzjKbz8$=9AtSjw&6nR9dpV9PP|E!ck%o!z^^quL{^yNt zj0Z=eoF)^n-p6bN)}NnNf4_^=moac5vZKIup83^g zR9633Xv$l=>)Yyjp_N%Rk*JO2qUp9ERDH5j@cE6j=;#!mXRmIFy$4K?q zr6fK<@hFX>6jECS?QTLfTVZLZzNMLJ?M1eRxndKga2NZ$&?pTCUavt5VS;2F9=6vm?glcs{I^)fa5KliZnEf^X103{z4kz3Mt!I;A`WqjC>BhX`$j`~~6A@yVH<*J3d zvGZ@si2%uDdy^Vi&6yiK`gnh;3-3QyP}>b9<|3>G*t=RPLtIu_t)ttwK0QfwucNq( zmu?ORA!JDSbzvv3OW|qZwa3qNPh7+eIoYGrizn&?4q+b*><#HR@|88YQ3eU`8F-z2 z9=msbx+)CWyxgf>-dM1z3P4Ui}mm2y>Z4;C@_POPe)I5+oMyjaEu60nW zMGEq9CYfD!+l8oJ9Yp=Q(uek2M(vWGw(~%Sw?4!jXZ7-YdXcG&hzgZ67ov8|&p7?@ zh7}@ro}MMwM)Ag7Yvs{3sSEkZ5QsW)JSAKn@QVk{bN&D2lj^wy|2Kfto{%NH*zwW6 z7AwQYZ}DxiPtT!3FhnBIn(8w65BASJ!75`o)Civy;czY9FV~pMxl?1o%1teQy0ZU( z3wF&Q(IVa_*P;FB7N3;jUR1ijH%*Qh8)Ag!i&Tif%}p2>8ghPH-JI89cb9}i!6|a= z;}%1U!{|+C>N7o;vk64ts+Ga~@ni%?56K}#GuwG=@=)mp9kM&~rl5aIesK-r_cU(w zWF3yjnu_DJk52n2;-?@+Y-=#%Yl*DMPhmWQ@(udo0`Yb&R@o1N1agbQ^k#P>>z&P1 zSq{cDsx6nTV!`0Q-p$!GLV^fJe+T`}O;CjCSs!H@&)6^id9Oq4JiiREJj|xFYXp`O z2!X{doVjgEnxF{9C<_PIa;k`)d3*R8$5ZTFu@6(@s9cg-g!LoB!`CFD6tl3td#w#n z&`3;HWB1_n$(`XmyxMIZZU4u!A2T2m7J+e>lc3Avv&@b(|2-Y6`K)71cd*P<_JS0Y z14FZii)x*n{GVj0XkS`Gg50SZY>TgJ{fQLlS+!&hG1bx`Q+Dc3uHl#4u5Bfs1XQ8e zc%5ren{2y9oH0P@VL4>&r~YX#mkrTp`y<~aQC8N>|ItImECrKt$@&?UnU+KLp%Io5 zy@t9VIY&!+*|p5zBtt-1NpavO$oViD$3mX9g#&@0wmwOMyw(rxZy#?mu8sLQw|-6o zFN#R*Nux1@(N7!;+xoUQJjJiH0>Cqk8g@|{uJb0~lqfd$uBv`z?#m;^S}m1c>cTrR zcU0A>+#IiSiA}mywz)bqh*wnz%;o*Ts~_%CkgvapCl-BZhqO%NyvOf(6|Up&4xX z>F^IhsMcEk3WrITJvu`0h+COB#!zM|`R#-|-4*L)xVd`;#o9({$r{98t}Yw0T$-`9 z>E1hu97C<^m=XjEbY|#m&X;AIc60dCMi$=pctr&kgck${2ZAGLn#79Uc-IyBNYA37 zO-Tw}L*x1RAc}s1(LZc((y{XGHX7Id%HAenA0dv@^#dfTZxS$wRzu2oHxktQ59gip zA5i2I5Br8WOU@-mr3_8m(^HA@6k1PWa@^Y}iAKi2zq&GrJsbO_B_y%dm_?Sns;;LzX3LBBTj({tSg(Wt7h4cth>oxrWA h#I9TE>V3ZO_jWhWnj(4=!8JGl^?t@4{;ngZ{t3JLE$09L literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png b/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png new file mode 100644 index 0000000000000000000000000000000000000000..b32e3dc1ae1e182fb6fad59ed7efba80101093b2 GIT binary patch literal 10506 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestClass.png b/esp/src/test-ui/tests/framework/documentation/TestClass.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9370dada3720217e4b76ce76377d045fb9ae70 GIT binary patch literal 3296 zcmcIne^gV~9e=0?N{>Rfo}QK|v1j#2R~%L;#u^h^>*`RE9v#F033D#wKq#OgL=qmb z%@sWrSw%piNpwz_gd~+nAqfdO9R3I-0_Md?l1GXVAdtr-KOiAwFW}l*+a24v`^P=+ zym#;S-uwOh_}+K?qdhxTy!f*h0RUK$@aye+0U)RneQtgs813buAG{6#%Nr85zyF&f zl*#)Qr)-F9SfjW5-eeNO=td zl&PPgo0yuJwuZkNX!_FH#)P>@3;?V$?*4ni%!j~xNx5t9ttoy3I3I<5Is2!op8$8O z&W6T?!Y=@$w|kCqkLE1{91kOQKPssPIPPlg#vViniJ zGcsT>%RbSRFw<3c=uL%9IAM&AXF&1lAb|1swGqehHR_ZOnRK2M2ApBgXy^i((d&2) zZ~Y~wR4G=`A)Lb9B*v%qZvp0hZ{ICMqebSzZ>8x>TX4e5CUZ2BmmE?i(D1U*-L`d3 z;x@8)&NpjU(Bk53Ix8I}ecTWR#Mj~U=&25s4_KRDF z=ak!L4AWPa-!yspE{beM(b_rO<^Vye{lOoqu8v)sLb*oGKer-0CeXx(E_0Xp)k}e? z_~*%ir}sItFH$g!1u?)8Eb9|!P4Q4vni5X-WgRT5a9==n=vkl+1YT#*cA@z!Y1Vnk zI>Fzxnh(~{fT_#Ih-8##NxlA`v$PnQkp3}L#X;H>td<>cD3B5Y*GV`VNHPl#it0!xTT(ciAnA_OUTe?C$G)~xf#BaAjim8 z119ouPz;Bv?8LLm2i)WAOsJuVqTpr%Yz8f$9YWTs{n9_}qKlI_nKCiUWMJF}?M?h? z6Wg99BG=G?!NpL03PCwz4g+jl++vm4xAokR8~BTCL3o0{`fEeY>;1uVVZdqJtN*iH zpN8s~_awqdKPYlarjp%3W!=1AqT)KnaVWaK3l4~xr;!@wqwRL`WUsqkdz(&-S2Geb zX!24h=oxzFgFAaaiZXHPb#F9jCBc*8U3 z4tWejZ%9Wxnw)@79)qL(aLSzP{{+a7vf*#zdc30|eW4BQjSG#Z0^jT3-=6p*%fLa_ zP1d7OSRK_KGKUd7LYzsE#mf*}L2C!gXu!@7GxbD+j94<#R9e%~AJtyY>MxCQ;O;uf z8B9Tv)RQjs^p|)L?>#X7xc5ZB-iI`*cACqREaZ$aXg=v2S>>ID-;bAi!Ga2ZtEVKz z88s#?{SxtxAxLzac0cL^IQxW}qoG)LW%+U>LWJwo*zrPoC3Kb0w$-ggT|vZQ@OxYt zhge8Lsxz#8coK zXwwqWWnyPP)!E)^rB#c@b9p@7yyxYF zYbZ4Q9cm{jv4`!PeZWc?xEwC!j^v7nVxAHL<$m1gG*gt~JODMwy!?%|%58`hVrThI zKulk*rFncKE@EHBX ze(P=$UyG?S)>aSwTUWRa96> zBE#-Ic((|OQMX*DDvVyPZramCtFf{5Jbbyysu_P57Fkug2UOVz)bZH@zm93IMrd^te)Gwx#G5_8i8O15z9n~l>F>@&mV(g%t$PH#)9uAC$o5yCJP;1A7@EF_2r%B}k) zVd0nXLS}s&IDd;m3YX61rwmxk?yy!w=j;xwQ5e?)Y*qVu0urd|`or6Np;qfOST+bn zuE?u)b_>dtEeykfnv4yckvkeMq5Esb1P>N19tR#%2>ff@hV)O~RjnUX8sT&_ud04l zyg$J%l`Ur!X9VDo1?~@h|7tG|itv{Ju-a!r*Ze^=`2M^0a}HCwQq~q|U6-<#0N0ju hE(P)( literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestClasses.png b/esp/src/test-ui/tests/framework/documentation/TestClasses.png new file mode 100644 index 0000000000000000000000000000000000000000..913e8d519fa36031a34507ec607ddb3447a9089e GIT binary patch literal 2324 zcmd^BeM}Q)7(b&!XQs=xWF}kGE!%X+tQz7XA3`P?M8zslI)-gcTw$UXw{kscr3@3} z+=n<3>ld&LYV8NDQUU34c8ggSQ8@+bS<00Wg-Va!F|a+_>-Bb;Y|;6z%a-h)_j%sr z$?x|*@B99Kc@A&coH=Lq8?ylbn3J`BZ4LlTyTa#(X2tRA&g#@v05Hpwwf3XDebT_) z+lqV1ugQ7tHufb7q};b5VaN38?z&mt*>YZ{NIJ8JiBs?hA3?OJULYv~kf( zX~31Qf1df1c*PVjwIpsKAk)v^Um1&D{NQ?vrCpk^=h$pux#aYY=NKvfK7(+-4H}|f zj%JTC=dyE#WS5y#Sc#69*%!O3dYT))@JTUrTb(R0J$mV3Meicx-e1XYAf34SY<4|@ z+L5cI1PXVz!jZ5D*0@l~6O~7smLVBB3~_-Hv6(HYHE7uZwUu-cYK2^9>nko`JJnW! z5EnRifhv#^NzuODI`K-X8=&4}Qxr9MAG^UEsT~h?kpuQ{370piuBdIfDiAtIMX3(L z#PMdbzT$pZn=;dz8-WHE8Mn+Y?hQ+{=fk904w3Htt(B&7#Hw=ENUrpN-5OVIcOLGI zm%IGC*{E6|hdYZPo@^Og_$-+})t44WSH>2!4(tf@X@B|k;p($yAtN%R6Jn*Ga_mH`G4?1amzC!oB8xNEBZg z$H=$~`93j|TSt{it_fu2ZL}$(fPHs|6VTAyV3+x%~E>ap)ig^xa{A#pO>rb{EQnx{OgDOSIxTY*pA#&q<`@nVQJVuNoX z$}>%CKz1DlijzHZ43T&xGQGv234QNl0-dmQv>SJuF?1FA`&b1TawwsYAN08s;U^0{ z!=f%#KE5MeE^3Ery*6$BO<`~oLJr_I%!~+i-VRg9I16--OL1q)~pM))i za3W^uA3juePTD|{7|~n84kxTvQXWjlAC0vaj;&rrMYtqHu zHwkPSo3z2fI-qS-J?G+Ifbf!$zQCZ{BN^OUSz3Lb@5&#d#sXF$3_WO3P>(9im_gwr zU67?5_Y7l*f_udrE8&i|WZWc_cRD?qXV|8e`WEKVZp>0|WF*}9ZYhP=nKd{XykRU_ zIap_8;IZ3@Ak~lb52v7Igc3xz(8MVR6p#ic_)>XL%YKXYevqmPk zDR8H=K8qQ3SWTW3{aEhf9)Xh&JkItW#_-qPU+9E;G={MnJHtnWktjrla121 zdG`m|gN3}5sn)atwex>rEB};T{l{>R9N-OFj!b@1uoxJxdUhBYc1B-MjzgPOoA_x5 O$Xd5~t#!@z1AhQwxV?n{ literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestInjector.png b/esp/src/test-ui/tests/framework/documentation/TestInjector.png new file mode 100644 index 0000000000000000000000000000000000000000..e45e93682a7382aa26d7fc47e06ebbb6e4e26ea3 GIT binary patch literal 10050 zcmdUVdstgly7#7586A}~GerkV;d45@0k)@21GYfoQ3tdhiWD}1a)~XMRG?tN5H2C9 z<7h|ZqP9Q@CDCCDB|BtGQ%b`np;Li!3A;!`NV$ZPCTR&IBr!K~`*uJbo$ve3`Ob4@ z&Uw!B%nv9Q$hf?6%+h_N_nm zraD+IPXJhW+ck{-zW)t->}CM)69u4a_D^hlIjyewlgqBcGg{tpe~RMew$trbqdidT zOLXL`&XJJE(Py4^3XR|2~;_JJi zwa)}007_bE&8Y(oR@AXUwLTcamUG>nn|bFwh34eUXqNXj)pa!{Px^i0!{LW zJvUcb2KK`6pt83C&OWAGWB4VD&g`fs13+)JLF{uq!K!JwGT43+qKX52#EO7lHg}&J z%fzQQAUU1Wuh)(yVt1jBlyk`FBLzKs*k@K=W}Qwr&rZyYuh%V`57e9M%omNdNztgO z$pa{UQPqx~gnlkMwhB5KbZDn-dvkXsNm$QcZUvnu65dFBiZL~y#+*kIuUr#^fnmmYJ-DCe9_xX2@6nw~s83ZQk-H7gAC!4_B=E`%8I6$+m0&8jS09K!|KgT?gQ%f(4vzv^r9nHweEir_pHAaw;E*9$N z^|%BFq^T||&I$&oj|o2{O&?dp}Qa+&@U?d53sZt1Gp@uVJh&~X0N#2 zirY9ddTHFX4>GRDYDT7GQ+Es*$vy$14*l{ph))hc7-`tNI)pLSz7%+f3y)e(RR^&< z4w;)6m89ru5p`;8kw?28Kfp+O7C5@lwYrX}t5rv35}p}9>e2t?#vz`5N+514D>Dg5 zhk%zpl-=6ETUoOMc|?Uh-X7CFK*3Dff@1t{$AxHEWHxRB&YpkC<&LJ)Xc;-WXfH!| zeti!By!5d_`yVy7hK3Bt8NxHE&KHG!p7WhvtOm2@C1ByOu*)5TvU^*EuvK6yx4O;TR0f(m%%dUMD60C&QVXN8Kr)uMS~ zT96@nDnnR+##-#tK=C$V=XZM&lL;M!2hh~0vsGaurnlP*n!tiUfavBCmj@-5iEYA;E4c}NsDA=bv_P9pXb{^aXvENLbqUt|u2L5iu2t|n z&&pI3%RiJf{QFq_ci=Ai^te+SH0j8I$!52G+Go7+MetfJj9 zkY&e|q;!l7S}ZTehNwhT@caRZhH&e~f)NA(`vPYK5i<)+j&_6d7y)(7AVh6D-wWGy?(J6Vy8Pw&x; z@9&nFx)~VtRpn89`VSND)OuPrBY)c9eP<{saaH;FE7B}%TLlKvcNrV3+o6@oeJGGsar-9u;(t5@6WO5hb- zeqv!R{1Z3dql6C3ory;4bo+yg%Qclt2bhjDuDn2Q-z zStjft9@Je5%gN$r)v>CO6qM8N9ZE1%E`kE1R%!6{K{^O?K8=!XbGL%)ty98ABqt+$ zD5TlqeTYtPs#K5$UfcjObd%opC`q9K9^h=pGpck;)`Yb3J_0gCx2CwRlcuzq8^VVT$j3QU!FP8(ej_YB5N4>VO#FdD{5zF(M`_*)XKt>LL zO4g53%SNlOl~Q6P+pPX@p))Xq$4*sH9BRX5vAqFtwpMb(D(J__0sMMMf*cpsT9@e~ z54)R-c_Z}3$$4$7mFh0WXofVMIXxzqO&w#6QkC4h@hI?Qvs2&^&_K%D719$)Z;GYW zCX3^_l_E*)m|_|?-&5eoO`4RnNTWj^gN2z?)@Tmm zJPj9C$L7Ugvu@|*i_Mz+p69|@DpOsjkG zpIS8Qz}%rz^9@V1gpMU&-t4Q&D01&dh`Y;1dtv?0S;U1}_H`}lwdt(^Ov2o&aRbow ztzcYfjQAo+U($X=$-^HLr+%!6$P~0KI;N>}t{Jo|om_UZJ9yM_vUu)HpV$(MgCj~) z2NJ9TmM*ActVTmN=I=|F#x&PSjO}&A-nT%T8CTjl*`K0wH#G>27OD}l|@2&Z}s~5qMi7x5230dA|o=A42GvmwW5M|;v2tn zR6tO;k(sSIg7)cb%fr6w67j`r>|rXo33cLpf@GTlgHs~~&53Ffb&DFbPB`LWNcRqS z-nw+SugM-XrfgJ17W^xE6^<-dg&%JTJ<*utxu{xrT_bq3bxM0g)U!;Zfy-Z35UX^D zac(^YRT0jRX4C(*y76z_TJDUtCSl3NsYdbBYi~Ln+{O}phd!i8)9P_itos`n0gf13j||s zPAfcFGzYmu-y7XhWyBG(9`+Td&Ve z-Q7hjC_9S};tCst$IkO{td3<;YUV+66II3%$Ln&N8EJ00BXLTpX6J=aYDbGrm^wLR zzmlgMzqk`_G-PlQQm`$F;3Jw-UBy>q=3PJ%#3Xt=3(MOurGoX2)aDXQJ=O;v#8>Kh z#je9MwJ9(H!qC*#0l0KvdLkktZx>7FH}ikYCTo(K`7onOxF)#To?Yz4a&vEK%R<+5 z*`>i3JT->7`?brh>o9*azr*}eRfLz>>Rdfynq0U0M>SbLhH*MME?fg)oh>o&9AqAa zR5o>*qolV~P)i_c#ReS_ClRhR7<74 zuiO_pw2rFzJIrZm_`(Ky7l8GxJ*?Qwd;Bke9Z zDB@)mDzKzZZAiCi_dG{W9}t_*bXJ>Jtt_;$)aF(6$hj9q5u<(Iv~msEu90$~8kb<; z>U+{6WFVyG>b3eMwaE~Xrn3L&Nstx8a>V$gQnt9RE#V6G5nxs)Bgi0iU6>%R*NKqU zJ{i3Vacz*;a11w}mok+RZU9l8t^0^KJorBVx~U(n`|pPC_dg}BhOs+9j#QMnyyU3P zF0el&d(Vheoq=d2dmW_gs54)%wp5tY4P@6k8uM(>;JE&f1Vn2_f;`IFYeIjJtgz7r z;ja(iyCq^_Uu7n~irWA~iONDQ;i8D3$TAZKuCfjYF|I)RW!dr|C0tot#1vZsg>Dv% z&!mx@p!0}OT4mxz>Bl}o`+q>;UG3bk5fXKZrHJg9 zLM*$dAbqo~EsY?bWbZVH$)#ad^b|u!t57E0Dz%B6-iNZpXn|v0@2){5q69a5hjL^n zTb4TP?CDp%g}(B_AF^)zhM(afi8By&Ahhg{Aop(gIv0O#>%ioalY~|QcY%YyPH?nT z)XcwGmRj{j5)Z}G!2~PhpRTD?w-46n(N5u$s>MC&JS520Hi9T~j#DpaGet-7g+A!T zCwdEiGt|zNL3*FE78XAqtw@GU0pAyKdh^t2oxVf`jtZPP0zKSx&6M4O0oRbw({4p4%K~}EC4r53qvF1@6hA_cfR>> zxA(pC@=9^2bK8_0-Qy)jT1wgN$0qw?5%% z*giU}??05Y`V=4599)Q?_AI`xN}CZRzM^X-MeL&!#I*6p9zT3yA1KIo1S^ zcRAswxW2tdH0@!}6mOI52C8e%je*}S3*VpF+&`iJl%KtNgfHY?%MM=kll=y$uJarR zKcIi+coNaAcr2W+Y5dAnio7@7c}&V+LlW#x9soUR6PiIO+cq&Y?mgd9|2$842Zlmn5NoX z^b#=p;EUUD*oOc?L+Ud?%)2i?c+L6p;>`3gu=-oiSC1-dwhP|h_B60>;VnzP+O=;h zsscSCZ3b>!Ui(rZd;9d+mQsIvB>;4R`0I9@decF%VS%*SvMZjLxRAfu=K1Kn$%<}5iU7!VF*v| zV#mqM#MpMkZ9yBp>UGCZX}Q#dbUU7R3NFVwk8&9FokNvt($ePQ;|fBgoMf)E3h1G- z#;TkGlmcdeGYCWD~Aj$2Z*s`vi9u1!M29%}&gw*<3I1ChJ5QV+smrQ^xs4mb)OetK6^v`Q z^HZJF?lVeFBe_N3@7HP*ByJDu>~9F)H7{>KI(=uJ{nLx}o|Cbhk|O&pv5r@KJ;-`# zm*Qf!eRrB7*_Dk`akEK|z$q2OZ*qto0=?NV%4njdZI>T1Z5Ed~eLSwm6FHy71>pMq zk&h*1N=$iHFx+wc1JIeIWzsXr4v^^r%hS;4%@o(O7i(U4`~~c5=yQ9E>SLYmjyUr(>5po;QW#_C-%#oB9U1{ZaNS!2D2QJ<|cK`o=^=M^t*? zMhojRVt{aM+padx{r#j8&9RPs0Ml?c?(VCoZbqU zBaEAkz!R2WBsFW<>uedbw6xSxAWnyS3xq#V{4>wmKJqTx{I)DEW?X1mC^tI<=!q5G z(aaom&Y?0+i0q*wzM}zL2^2!zt{`*oNX_iFA>qK`f)C3#eWhw^RT9e{3T!l4gbRdh ziKvJ#maM2C=fx`Os9|V>?zR=yuyx8M4i@rQ~7AnsL&yxwLn$f{a zsnzBjz>TQXY1LcB?VQ1QtCVaIaKDa}oN^^#34>;SuW4CkI;{G&A`)AEno%X9s!6n+ zL#@3uV!dvRfCcvw%|%0`XC#){=@UXA#c+4BKy@NnoRwSj)`*2ul#xJGtW5_JjdAma zhh#NrnJvD7iWGW-^K8kTgie&4 zpdwF4LsEIzSDB6CKL<{YQe~*(STvA5yPM^1?Y9m@vSwZ#%~TsuzU6E`zR$MDfHuNm z)*wgLa{+x_bpgX2Vm}_Oy5|71j9NW=LI#XQ7%$A0-2Tz(j^NPG(@~NuGh;$4QagM@ z|80(mF1;ltsopUkEXfcpIW7lbIaWXZ=)A|T%a)$x8_u?8yLA$!zoSyL=;b3jba%b= zh6{We2g)dh?>Qo54vSNe4A>WOBj&4Ftt@_JyPmKX?JfLeqY* zm08{6C5bARW%0*I(dyQT>7D3RUEL`cTh7Jey6sQKbfUP}$(|Ht#z?AfbDR7tDKZL|Bz3o_Zz~u7JHXHx!?*nzV_|Q zkGqp2ZJ4&n0=F_h@^1lH3jQc0jRTy!H(BDsDJ7n^r(T+ii}@F?*t1CY+U$zU^($=j zq~P++p773|+@tG*eaAgl3B_F9(U_IJjlWvpad8xQ%ERu>%;}ws>lsyUws0V14k82e z4^_U}Z|`bGTurU$zY0vwq5<*Yv%Yf8NmBvhDb?y*>*+aa z;aoo^&I(rfp&3>*NIIQas|7oG>Y9^Yp#4a&EKb=7=`KM=gVFmCLBLfGcXRlYNaAI7 z5~?pwA-~33D>u$;#m}F8uQF3eP_U<82OB$*gxhxWjO%X@E`=F_cpVK;HY1QJXY1Ur z80O7zFY_I;Tk4CK4FBZi$1Mi(@%okA8NdG}Ta;)j1GyDd@tr;!aWA$s*|$N~DE7U; zx~n^FBC+M6GYTdhpIefB7Rc(DbKbs^XA-%zkX+F>Gw#;(#huqdSTIkFOeI&fWtWOCp&b(KI*y6$ z%bpEpVH=XgU_lCso)dod+2>b}xbJvv<<>0-cA*MBt~}yxk@@qDQ^*hSPb+s2kS_fr zwMUMizW4mxk9-e5_bl?Z>`z~dLaqKFdH37t zrJ2)u`&ql>g)_GU!L8h#*ysLQ_m>PPmwrOsj`~L<^Tkc{((~-lvQsPk{AH-pKZeDl zYIl?>iT z4QxuPXb~1~M-?Y)UWT`<4?}^2MK^w<$b6Kv$y%v-CK2#?$<*d3Pk|^$lIS{8QSMhGiU=5bq&|C&CubibFr7F8u zv%dv0v*5N&F>qMmlCoqXUG9E8vAs|wdXS0d5&V!#nyId7&=T!5iaNJNrI|sKJd{*#0QB&LXs$8smmyeqP z(mvs_cJdeBaq~T@N0y&9Qw2EZ54EH#XT)FGY{FJ5b5?Ev`CXT6q9bCosI{N!;b1c;!inK~?#sqTZC%(#Xrl}9uoYyj z(ZjD`TPDP4%j}dZ%+TIHG{(_)%!R>=(L(zRFosX5Hr%`~ZZ_5-$3phf{GGg6=S?K5 zp<`V!UlM%Vjv?6zp@X773~UY1pFR+t3Y;k0*Q{Bi&nNxvNn!a^ta(Z$@+7th?;l1U z1#{C=E7-?allrip7ia{HcRPloX&Fl1aqkAqdy-Um%Z3eeRBH#j_w)Qq6{qCOLB7PC z&bb3O0E>4!H1~CZ>%}}gAu(~v|0kn7bOz&QjHp{vEmH-6xC*OnPt1R$gC))no^GI1 z`@eyMs5sH=20;C-YT7|kleEXdIz7i8#Y~WFm1(+!F6lgHNE0(HvK51Ov{Qv=$*EDk z!?+enZ#3=pBIFpl?7t>)tkiGaNqSHzXIMTvXeybBZ-jAtx)|E zOhk{gbze9wi}#v=kCeTF!f2gj`R)h~fej*^7+rF^$tKp_iruC^p09Q8rCXAwvs+ve zS`=2#)d45^R{{G4Wc*A*v4%G7vsm;IYJeJ{U*xBFk0WHkySH8wJWEf^@C2cM5w$H7 z^PtsxYV?leGz@V5NdQ5KuHU^>h(`z`o*Qx=rMFYszVU_rpYr?Blq>}hvhdjZ@fi-YWQ4^S@omwaYoIRiYGA z!fY~E_bR0tfEv=KYBy4P-x@Q{kjo@M+N1zZ#1+!*u#uV#YRL;SD#~_fJ2UD=OkfxLGX$z z;*kbGBPJ3!4Sh=rHU*mSAz^x1wE+~h*vuWe2a<_l#>Gd+6Au_D-e&x@>~=ZE>5^>V zrG|u;y^TPtN+=xd{gk&ot{yZ*TMkZ#j?Qur^$zJFN?tfTWrLWX&sV0oD+if}kUac* z-eumG8%$68qKIg@g%NlfCW$eyucSv+N_;eQKY4oC<{ zuLuf)qi*>Jo@n@`ljnnZ2wBdz`zRWJidNck6<`mB5riz7VL9g^sduqBQrbzlwPP;JJQH7`KsUw}y~$G7ow^j*5+ICppSwiXwE z9LzgOZhDoO3ETTm1`0UxTUq4EjotA~SP#m~SGOx%KVtAlEo9V*j?@E-SNq~;JDmdSNmi>V zQ?)$nR02*W9lJODQ@9e}lrP$d+Sk;%+&M}n1z#Y88p;Im(?u?RL^UDMjc%_p7D&7| z$sykffZGFUh%rdW>L6j&^aKR|?DRZCOFN`|nAuPJMR6ogD-V0T z$jk!dyk50T@kRh#LX^=31u}~~z7lOrdMj;!=0D{BE+>V(dI=uwUF8Z>vd1*?BBJ?UQ3^gQB)T@9K*Cn(%o<2F#LSPbOS|;kj{#L2;=9PT!V#CkN zr}cY{Vl6eNBe>HMd=46oFHsRF%?o6ilrPKy9I^JO1@zZRTYluPuddqRLaFzXzoSuf zWc0Lmudx$xGPQc+0Z-Q8BjVyN&Frs`z!*?8Wh?0<4AJdw*ukKxi>nc7DI)E>i2eRT zTD3Vr-!L??#ihE^`I8{8DWokk4Sz}UjSCQ0E=u&N>@!l2r>tHf)p2@aMP5at=qLIa zU>d(-@-0RabtBCk&VM#A=*>f-{Nm)EZKM=8zd^+rl4ws<6XF2wAV)WL)1DM7l!<}7 zaK&V?v&upDtdw%hy*t#8)=Rmw;1Xx$dmNS|gR?eNNiGTZXY(!brkS;akEU!kOv5^@ zEdF9@x)|wB2}zpGHJWp*)TLys12sE@gfE;243^s7ach9bG;Eh=T literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TimeUtils.png b/esp/src/test-ui/tests/framework/documentation/TimeUtils.png new file mode 100644 index 0000000000000000000000000000000000000000..342180bc0fe82a8acfaff67afc6fb4b351a884bd GIT binary patch literal 6626 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 W`en>^cknq6?A;R?#(y{A)V~4M-*OTF literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png b/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c4ebf958f666be44ed57b4236632a20f4dc725 GIT binary patch literal 3135 zcmcJSe^gWF8OJZBgRZOE9qYC#j?IEjIig3To`8X^qfoSjPKcQ?3AX-VF)I<0cp)Lc z?D07K#W9E}SqP_sW+ddMP9h{BfzwVs{BDTJRg!QS2!Vto$d3fMB-w@9v#z$A>v8WN z@44^2_kG{zKJVxGKF=+GkC3+F<+U#Z0I(wcos@k55K@R;*S-{n^)vF%egy!pgr%qa zCcBX4x^KA{gFByMme5<_v$H4YY)y8jIWS$P?F5Izm!#wG+ zd}V*cRO3V5vDN7#nR`6aE}Kp1Fq*d;P?lPSJ8UynmzLc(-~wfXGDu*Rq))e97`zE((Q`zhl1s&Xf80Q4Yu+FAs`e}9 z?h`pgSM9=_Mr0I0@uUfF40oH!Y2?#W={+^PQr9$HCnws!5FgWUOj^0OiNuo5FlxI1 z!ZiLydHwG=cq!lJG*`ufV4G~4M(MQCJ^d~@-b2&Q&zyz1*8g@`KJZP^!lrXJ($_&r`>s?7&<*depoVCEq(=ASsL1jG34zhK! zllgPdn3pIB$zGmoP%jX4CVk)+JBehT0xrJM&#SQ0*SHYE!0M?&_UHT z&O{d@)u$2H@p%L%ccsEfW=Ko$nr?dXgHVFNa~AW%e6SD!7B3$eyr0tl=io3tbgEKN zeHf!DuqxOZHf0nPEe*a0TF-^g?^xaf*77dN>4nLR3Jvd~g9bA|LJxhcm&~}>#a88&DpX;MoDSw^OS|O5{URua z=-&CBdFqSb#$}mRnWeTHExa$0{EBE`UilDwAKOFT!k}lsRa@W{9}@&cLXOMLyzOGR z44iA7{AqO6;{FcL*Orx9Rdz2mBf6Tv@%K6=0{g9;OomN90}4tFt8Sa71y1Ku^b>Iz zlFu<`*z=H^1eh8*9+PxG7tQ&l`b^Y_)rBf#eKyk;s(YP2Cky7QW^w&irf~Ne>}+~% z`dkid^JyoUR|a_^^haN^>YG56nXUHR;;xyEeHa>bGw;^^T{t#y)#y)=^VidAd2s(o5^ML)3@DG_^R-Q{i&)9xklMfI%UxvuDV zDoJL|#3PA~jM^o2_d%*O40%u!sblJbRTELw;Dls3M;He-?RnzV+64X(L1^&jQ5y=R zs7Y0MBsNxfkByCz=ZZa_LN>pmg|EPCplo$*VX(4WyL+J+!c@M=TfY3E2DQ=7B}BH= zRU64ZnTXX%<>eu!Y=OFkvd_pFy^NOI6B{7p0N#e2)w<~l9*JVzL1wQZQ;L=d9*eqvJWOx_SR~L^z^RIhsiOXf? zPI7uCDF{6$P6LldxGXF(Xg{G!Biacy3zA6qe! z|NctSy4JNwL*M1%yswoFcg_Wpw=VIXnUHj#Ao#T>->WK#v*wN*uN~5OGIih~^0WoZ zs0Ovg*J$LxuNK|jUUVzC#)@wl$o%Udi6m#Mndo8}DP7-(ZJPk15)&0fJb!CD!0{0M zo3dfZv899GWe;!NH+>MJ%usZlxgH&GIpf*N&TIxq6=piAii9&`Vp$2!6-|Kg274oo z)OTg~zhfKXxw2fSP-eS=<3b8+K#oG!8Q0J}Mf}~P8gg?RR#_0LjkFEAa3bExb@evj zdaMU9bgLn=OQ|xKfqV6=WeXQ56@hl^4Wp`mnILXkqRx}(YZDhpbs!nW`#E=q-3J*J zOG?d7<|5o+Oz2|MLtZWxcPwe&oVet~H{g?6>7E)hN87fhS-FgFGaO&X*wg_iuM~T* zLu0#V>3yms|4>Aa*sLL$#90InPYDXTM=vM3qGhP3QG!W3)z@U!$;QM5?xg*?$|Gf@ zy?PL{SKq&ouW&l%e1799gA3np-|-bQ%HI42uWaEB4WsrCwFjLy;P{&?zLeiHP7^*+ z_VB6W9bgZZdO(prz#JP~M+%*?2@oBoG@hM&Khmw+1%(Z1quY2`wVG32I{ZTWVZi}9 zmV4d~kHZSw(p5uLfk%kF{@)AMr?T_2YxVz7I#Vu0EVVXteD;Sxd)f!>q3yzF=oWGc Yq`9yCl)1MN`!N90-zKC$Zyh@IPlJbg&j0`b literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Workunits.png b/esp/src/test-ui/tests/framework/documentation/Workunits.png new file mode 100644 index 0000000000000000000000000000000000000000..0c50d24564b5366198622c12137dd4f283d639f5 GIT binary patch literal 4176 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 S*`c(wP8sN!YFBCAhW-a@CUa2$ literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValue.java b/esp/src/test-ui/tests/framework/model/ApplicationValue.java new file mode 100644 index 00000000000..67f87f1da0a --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ApplicationValue.java @@ -0,0 +1,15 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ApplicationValue { + + @JsonProperty("Application") + private String application; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Value") + private String value; +} diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValues.java b/esp/src/test-ui/tests/framework/model/ApplicationValues.java new file mode 100644 index 00000000000..d7a1425d1e3 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ApplicationValues.java @@ -0,0 +1,11 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class ApplicationValues { + + @JsonProperty("ApplicationValue") + private List applicationValue; +} diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java new file mode 100644 index 00000000000..6a4cc340fe3 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java @@ -0,0 +1,100 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import framework.utility.TimeUtils; + +public class ECLWorkunit { + + @JsonProperty("Wuid") + private String wuid; + @JsonProperty("Owner") + private String owner; + + @JsonProperty("Cluster") + private String cluster; + + @JsonProperty("Jobname") + private String jobname; + + @JsonProperty("StateID") + private int stateID; + + @JsonProperty("State") + private String state; + + @JsonProperty("Protected") + private boolean isProtected; + + @JsonProperty("Action") + private int action; + + @JsonProperty("ActionEx") + private String actionEx; + + @JsonProperty("IsPausing") + private boolean isPausing; + + @JsonProperty("ThorLCR") + private boolean thorLCR; + + @JsonProperty("TotalClusterTime") + private long totalClusterTime; + + @JsonProperty("ApplicationValues") + private ApplicationValues applicationValues; + + @JsonProperty("ExecuteCost") + private double executeCost; + + @JsonProperty("FileAccessCost") + private double fileAccessCost; + + @JsonProperty("CompileCost") + private double compileCost; + + @JsonProperty("NoAccess") + private boolean noAccess; + + public String getWuid() { + return wuid; + } + + public String getOwner() { + return owner; + } + + public String getCluster() { + return cluster; + } + + public String getJobname() { + return jobname; + } + + public String getState() { + return state; + } + + public long getTotalClusterTime() { + return totalClusterTime; + } + + @JsonSetter("TotalClusterTime") + public void setTotalClusterTime(String totalClusterTime) { + this.totalClusterTime = TimeUtils.convertToMilliseconds(totalClusterTime); + } + + public double getExecuteCost() { + return executeCost; + } + + public double getFileAccessCost() { + return fileAccessCost; + } + + public double getCompileCost() { + return compileCost; + } + +} diff --git a/esp/src/test-ui/tests/framework/model/NavigationWebElement.java b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java new file mode 100644 index 00000000000..cf095ad554f --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java @@ -0,0 +1,14 @@ +package framework.model; + +import org.openqa.selenium.WebElement; + +public record NavigationWebElement(String name, String hrefValue, WebElement webElement) { + + @Override + public String toString() { + return "NavigationWebElement{" + + "name='" + name + '\'' + + ", hrefValue='" + hrefValue + '\'' + + '}'; + } +} diff --git a/esp/src/test-ui/tests/framework/model/TestClass.java b/esp/src/test-ui/tests/framework/model/TestClass.java new file mode 100644 index 00000000000..240cdd98a90 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/TestClass.java @@ -0,0 +1,16 @@ +package framework.model; + +public class TestClass { + + String name; + String path; + + public TestClass(String name, String path) { + this.name = name; + this.path = path; + } + + public String getPath() { + return path; + } +} diff --git a/esp/src/test-ui/tests/framework/model/WUQueryResponse.java b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java new file mode 100644 index 00000000000..eb1a9aa3a7d --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java @@ -0,0 +1,55 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class WUQueryResponse { + + @JsonProperty("Type") + private String type; + + @JsonProperty("LogicalFileSearchType") + private String logicalFileSearchType; + + @JsonProperty("Count") + private int count; + + @JsonProperty("PageSize") + private int pageSize; + + @JsonProperty("NextPage") + private int nextPage; + + @JsonProperty("LastPage") + private int lastPage; + + @JsonProperty("NumWUs") + private int numWUs; + + @JsonProperty("First") + private boolean first; + + @JsonProperty("PageStartFrom") + private int pageStartFrom; + + @JsonProperty("PageEndAt") + private int pageEndAt; + + @JsonProperty("Descending") + private boolean descending; + + @JsonProperty("BasicQuery") + private String basicQuery; + + @JsonProperty("Filters") + private String filters; + + @JsonProperty("CacheHint") + private long cacheHint; + + @JsonProperty("Workunits") + private Workunits workunits; + + public Workunits getWorkunits() { + return workunits; + } +} diff --git a/esp/src/test-ui/tests/framework/model/WUQueryRoot.java b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java new file mode 100644 index 00000000000..c5a1c54993d --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java @@ -0,0 +1,12 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class WUQueryRoot { + @JsonProperty("WUQueryResponse") + private WUQueryResponse wuQueryResponse; + + public WUQueryResponse getWUQueryResponse() { + return wuQueryResponse; + } +} diff --git a/esp/src/test-ui/tests/framework/model/Workunits.java b/esp/src/test-ui/tests/framework/model/Workunits.java new file mode 100644 index 00000000000..d52b00c5682 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/Workunits.java @@ -0,0 +1,15 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class Workunits { + + @JsonProperty("ECLWorkunit") + private List eclWorkunit; + + public List getECLWorkunit() { + return eclWorkunit; + } +} diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java new file mode 100644 index 00000000000..50b0ac82213 --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -0,0 +1,117 @@ +package framework.pages; + +import framework.config.Config; +import framework.model.NavigationWebElement; +import framework.setup.LoggerHolder; +import framework.setup.WebDriverHolder; +import framework.utility.Common; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +public class ActivitiesTest { + + static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"}; + static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"}; + static final Map> tabsListMap = Map.of( + "Activities", List.of("Activities", "Event Scheduler"), + "ECL", List.of("Workunits", "Playground"), + "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"), + "Published Queries", List.of("Queries", "Package Maps"), + "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)") + //"DummyNavName", List.of("DummyTab1", "DummyTab2") + ); + + @Test + public void testActivitiesPage() { + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, Common.getUrl(Config.ACTIVITIES_URL)); + + Logger logger = LoggerHolder.getLogger(); + + testForAllText(logger, driver); + + List navWebElements = getNavWebElements(driver); + + testForNavigationLinks(driver, navWebElements, logger); + } + + private void testForNavigationLinks(WebDriver driver, List navWebElements, Logger logger) { + + for (NavigationWebElement element : navWebElements) { + element.webElement().click(); + + if (testTabsForNavigationLinks(driver, element)) { + String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue(); + System.out.println(msg); + } else { + String currentPage = getCurrentPage(driver); + String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue(); + System.err.println(errorMsg); + logger.severe(errorMsg); + } + } + } + + private String getCurrentPage(WebDriver driver) { + + for (var entry : tabsListMap.entrySet()) { + + List tabs = entry.getValue(); + boolean allTabsPresent = true; + for (String tab : tabs) { + if (!driver.getPageSource().contains(tab)) { + allTabsPresent = false; + break; + } + } + + if (allTabsPresent) { + return entry.getKey(); + } + } + + return "Invalid Page"; + } + + private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) { + List tabsList = tabsListMap.get(element.name()); + String pageSource = driver.getPageSource(); + + for (String tab : tabsList) { + if (!pageSource.contains(tab)) { + return false; + } + } + + return true; + } + + private List getNavWebElements(WebDriver driver) { + + List navWebElements = new ArrayList<>(); + + for (String navName : navNamesArray) { + WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a")); + String hrefValue = webElement.getAttribute("href"); + navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement)); + } + + //navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement())); + + return navWebElements; + } + + private void testForAllText(Logger logger, WebDriver driver) { + + for (String text : textArray) { + Common.checkTextPresent(driver, text, "Activities Page", logger); + } + } +} diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java new file mode 100644 index 00000000000..6468196aff5 --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -0,0 +1,310 @@ +package framework.pages; + +import framework.config.Config; +import framework.setup.LoggerHolder; +import framework.setup.WebDriverHolder; +import framework.utility.Common; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Function; +import java.util.logging.Logger; + +public abstract class BaseTableTest { + + protected abstract String getPageName(); + + protected abstract String getPageUrl(); + + protected abstract String getJsonFilePath(); + + protected abstract String[] getColumnNames(); + + protected abstract String[] getColumnKeys(); + + protected abstract String getUniqueKeyName(); + + protected abstract String getUniqueKey(); + + protected abstract String[] getColumnKeysWithLinks(); + + protected abstract Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger); + + protected abstract Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger); + + protected abstract List parseJson(String filePath) throws Exception; + + protected abstract Object getColumnDataFromJson(T object, String columnKey); + + protected abstract void sortJsonUsingSortOrder(String currentSortOrder, List jsonObjects, String columnKey); + + protected abstract String getCurrentPage(WebDriver driver); + + protected void testPage() { + try { + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, getPageUrl()); + Logger logger = LoggerHolder.getLogger(); + + testForAllText(driver, logger); + testContentAndSortingOrder(driver, logger); + testLinksInTable(driver, logger); + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + } + + private void testLinksInTable(WebDriver driver, Logger logger) { + + for (String columnKey : getColumnKeysWithLinks()) { + + List values = getDataFromUIUsingColumnKey(driver, columnKey); + + int i = 1; + + for (Object value : values) { + String name = value.toString().trim(); + //WebElement element = driver.findElement(By.xpath("//div[contains(text(), '"+name+"')]/..")); + WebElement element = waitForElement(driver, By.xpath("//div[contains(text(), '" + name + "')]/..")); + String href = element.findElement(By.tagName("a")).getAttribute("href"); + + String dropdownValueBefore = getSelectedDropdownValue(driver); + + element.click(); + + if (driver.getPageSource().contains(name)) { + String msg = "Success: " + getPageName() + ": Link Test Pass for " + i++ + ". " + name + ". URL : " + href; + System.out.println(msg); + } else { + String currentPage = getCurrentPage(driver); + String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + i++ + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href; + System.err.println(errorMsg); + logger.severe(errorMsg); + } + + driver.navigate().to(getPageUrl()); + driver.navigate().refresh(); + + String dropdownValueAfter = getSelectedDropdownValue(driver); + + // Log error if the dropdown value has changed + if (!dropdownValueBefore.equals(dropdownValueAfter)) { + String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter; + System.err.println(dropdownErrorMsg); + logger.severe(dropdownErrorMsg); + } + } + } + } + + protected WebElement waitForElement(WebDriver driver, By locator) { + return new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + private void testContentAndSortingOrder(WebDriver driver, Logger logger) { + List jsonObjects = getAllObjectsFromJson(logger); + + if (jsonObjects != null) { + int numOfItemsJSON = jsonObjects.size(); + clickDropdown(driver, numOfItemsJSON); + + if (testTableContent(driver, logger, jsonObjects)) { + for (int i = 0; i < getColumnKeys().length; i++) { + testTheSortingOrderForOneColumn(driver, logger, jsonObjects, getColumnKeys()[i], getColumnNames()[i]); + } + } + } + } + + private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List jsonObjects, String columnKey, String columnName) { + for (int i = 0; i < 3; i++) { + + String currentSortOrder = getCurrentSortingOrder(driver, columnKey); + List columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey); + + sortJsonUsingSortOrder(currentSortOrder, jsonObjects, columnKey); + + List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, jsonObjects); + List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + + if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) { + System.out.println("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); + } else { + String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName; + System.err.println(errMsg); + logger.severe(errMsg); + } + } + } + + private String getCurrentSortingOrder(WebDriver driver, String columnKey) { + + WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + columnHeader.click(); + + Common.sleep(); + + columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + + return columnHeader.getAttribute("aria-sort"); + } + + private List getDataFromJSONUsingColumnKey(String columnKey, List jsonObjects) { + List columnDataFromJSON = new ArrayList<>(); + for (T jsonObject : jsonObjects) { + columnDataFromJSON.add(getColumnDataFromJson(jsonObject, columnKey)); + } + return columnDataFromJSON; + } + + private List getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) { + List elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']")); + List columnData = new ArrayList<>(); + for (WebElement element : elements) { + columnData.add(element.getText()); + } + return columnData; + } + + void ascendingSortJson(List jsonObjects, String columnKey) { + jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + } + + void descendingSortJson(List jsonObjects, String columnKey) { + jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + } + + private boolean testTableContent(WebDriver driver, Logger logger, List jsonObjects) { + System.out.println("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + + List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + + if (jsonObjects.size() != columnDataIDFromUI.size()) { + Common.sleep(); + columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + } + + System.out.println("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + + if (jsonObjects.size() != columnDataIDFromUI.size()) { + String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + + "\nNumber of Objects from Json: " + jsonObjects.size() + + "\nNumber of Objects from UI: " + columnDataIDFromUI.size(); + System.out.println(errMsg); + logger.severe(errMsg); + return false; + } + + boolean pass = true; + + for (int i = 0; i < getColumnKeys().length; i++) { + List columnDataFromUI = getDataFromUIUsingColumnKey(driver, getColumnKeys()[i]); + List columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i], jsonObjects); + if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, getColumnNames()[i])) { + pass = false; + } + } + + return pass; + } + + private List getAllObjectsFromJson(Logger logger) { + String filePath = getJsonFilePath(); + try { + return parseJson(filePath); + } catch (Exception e) { + System.err.println("Exception: " + e.getMessage()); + logger.severe("Failure: Exception: " + e.getMessage()); + } + + logger.severe("Failure: Error in JSON Parsing: " + filePath); + return null; + } + + private boolean compareData(List dataUI, List dataJSON, List dataIDUI, Logger logger, String columnName) { + + boolean pass = true; + + for (int i = 0; i < dataUI.size(); i++) { + + Object dataUIValue = dataUI.get(i); + Object dataJSONValue = dataJSON.get(i); + Object dataIDUIValue = dataIDUI.get(i); + + dataUIValue = parseDataUIValue(dataUIValue, columnName, dataIDUIValue, logger); + dataJSONValue = parseDataJSONValue(dataJSONValue, columnName, dataIDUIValue, logger); + + if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) { + pass = false; + } + } + + if (pass) { + System.out.println("Success: " + getPageName() + ": Content test passed for column: " + columnName); + } + + return pass; + } + + private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, Logger logger, String columnName) { + if (!dataUIValue.equals(dataJSONValue)) { + String errMsg = "Failure: " + getPageName() + ": Incorrect " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue + ". Correct " + columnName + " is: " + dataJSONValue; + System.out.println(errMsg); + logger.severe(errMsg); + return false; + } + + return true; + } + + private void clickDropdown(WebDriver driver, int numOfItemsJSON) { + WebElement dropdown = driver.findElement(By.id("pageSize")); + dropdown.click(); + + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); + List options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item"))); + + int selectedValue = Config.dropdownValues[0]; + + // the smallest dropdown value greater than numOfItemsJSON + for (int value : Config.dropdownValues) { + if (numOfItemsJSON < value) { + selectedValue = value; + break; + } + } + + System.out.println("Dropdown selected: " + selectedValue); + + for (WebElement option : options) { + if (option.getText().equals(String.valueOf(selectedValue))) { + option.click(); + break; + } + } + + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item"))); + driver.navigate().refresh(); + Common.sleep(); + } + + private String getSelectedDropdownValue(WebDriver driver) { + WebElement dropdown = waitForElement(driver, By.id("pageSize")); + return dropdown.getText().trim(); + } + + private void testForAllText(WebDriver driver, Logger logger) { + for (String text : getColumnNames()) { + Common.checkTextPresent(driver, text, getPageName(), logger); + } + } +} + diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java new file mode 100644 index 00000000000..b5837fb4d6b --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -0,0 +1,155 @@ +package framework.pages; + +import com.fasterxml.jackson.databind.ObjectMapper; +import framework.config.Config; +import framework.model.ECLWorkunit; +import framework.model.WUQueryResponse; +import framework.model.WUQueryRoot; +import framework.utility.Common; +import framework.utility.TimeUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; + +public class ECLWorkUnitsTest extends BaseTableTest { + + @Test + public void testingECLWorkUnitsPage() { + testPage(); + } + + @Override + protected String getPageName() { + return "ECL Workunits"; + } + + @Override + protected String getPageUrl() { + return Common.getUrl(Config.ECL_WORK_UNITS_URL); + } + + @Override + protected String getJsonFilePath() { + return Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON; + } + + @Override + protected String[] getColumnNames() { + return new String[]{"WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost"}; + } + + @Override + protected String[] getColumnKeys() { + return new String[]{"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"}; + } + + @Override + protected String[] getColumnKeysWithLinks() { + return new String[]{"Wuid"}; + } + + @Override + protected String getUniqueKeyName() { + return "WUID"; + } + + @Override + protected String getUniqueKey() { + return "Wuid"; + } + + private List getCostColumns() { + return Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost"); + } + + @Override + protected List parseJson(String filePath) throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class); + WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse(); + return wuQueryResponse.getWorkunits().getECLWorkunit(); + } + + @Override + protected Object getColumnDataFromJson(ECLWorkunit workunit, String columnKey) { + return switch (columnKey) { + case "Wuid" -> workunit.getWuid(); + case "Owner" -> workunit.getOwner(); + case "Jobname" -> workunit.getJobname(); + case "Cluster" -> workunit.getCluster(); + case "State" -> workunit.getState(); + case "TotalClusterTime" -> workunit.getTotalClusterTime(); + case "Compile Cost" -> workunit.getCompileCost(); + case "Execution Cost" -> workunit.getExecuteCost(); + case "File Access Cost" -> workunit.getFileAccessCost(); + default -> null; + }; + } + + @Override + protected Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger) { + if (getCostColumns().contains(columnName)) { + dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]); + } else if (columnName.equals("Total Cluster Time")) { + long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue); + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue; + System.out.println(errMsg); + logger.severe(errMsg); + return dataUIValue; + } + + return timeInMilliSecs; + } else if (dataUIValue instanceof String) { + dataUIValue = ((String) dataUIValue).trim(); + } + + return dataUIValue; + } + + @Override + protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger) { + if (columnName.equals("Total Cluster Time")) { + long timeInMilliSecs = (long) dataJSONValue; + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " in JSON for " + getUniqueKeyName() + " : " + dataIDUIValue; + System.out.println(errMsg); + logger.severe(errMsg); + return dataJSONValue; + } + + return timeInMilliSecs; + } + + return dataJSONValue; + } + + @Override + protected void sortJsonUsingSortOrder(String currentSortOrder, List workunitsJson, String columnKey) { + switch (currentSortOrder) { + case "ascending" -> ascendingSortJson(workunitsJson, columnKey); + case "descending" -> descendingSortJson(workunitsJson, columnKey); + case "none" -> descendingSortJson(workunitsJson, getUniqueKey()); + } + } + + @Override + protected String getCurrentPage(WebDriver driver) { + try { + WebElement element = waitForElement(driver, By.id("wuid")); + if (element != null) { + return element.getAttribute("title"); + } + } catch (NoSuchElementException e) { + return "Invalid Page"; + } + return "Invalid Page"; + } +} \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/setup/LoggerHolder.java b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java new file mode 100644 index 00000000000..b80c46f471f --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java @@ -0,0 +1,16 @@ +package framework.setup; + +import java.util.logging.Logger; + +public class LoggerHolder { + private static Logger logger; + + public static Logger getLogger() { + return logger; + } + + public static void setLogger(Logger logger) { + LoggerHolder.logger = logger; + } +} + diff --git a/esp/src/test-ui/tests/framework/setup/TestInjector.java b/esp/src/test-ui/tests/framework/setup/TestInjector.java new file mode 100644 index 00000000000..48742c85d51 --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/TestInjector.java @@ -0,0 +1,31 @@ +package framework.setup; + +import org.openqa.selenium.WebDriver; +import org.testng.IInvokedMethod; +import org.testng.IInvokedMethodListener; +import org.testng.ITestResult; + +import java.util.logging.Logger; + +public class TestInjector implements IInvokedMethodListener { + private final Logger logger; + private final WebDriver driver; + + public TestInjector(Logger logger, WebDriver driver) { + this.logger = logger; + this.driver = driver; + } + + @Override + public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { + if (method.isTestMethod()) { + LoggerHolder.setLogger(logger); + WebDriverHolder.setDriver(driver); + } + } + + @Override + public void afterInvocation(IInvokedMethod method, ITestResult testResult) { + // Optionally, clean up if necessary + } +} diff --git a/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java new file mode 100644 index 00000000000..0daf2f245aa --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java @@ -0,0 +1,15 @@ +package framework.setup; + +import org.openqa.selenium.WebDriver; + +public class WebDriverHolder { + private static WebDriver driver; + + public static WebDriver getDriver() { + return driver; + } + + public static void setDriver(WebDriver driver) { + WebDriverHolder.driver = driver; + } +} diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java new file mode 100644 index 00000000000..2fb12970a09 --- /dev/null +++ b/esp/src/test-ui/tests/framework/utility/Common.java @@ -0,0 +1,45 @@ +package framework.utility; + +import framework.config.Config; +import org.openqa.selenium.WebDriver; + +import java.time.Duration; +import java.util.logging.Logger; + +public class Common { + + public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) { + if (driver.getPageSource().contains(text)) { + String msg = "Success: " + page + ": Text present: " + text; + System.out.println(msg); + } else { + String errorMsg = "Failure: " + page + ": Text not present: " + text; + System.err.println(errorMsg); + logger.severe(errorMsg); + } + } + + public static void openWebPage(WebDriver driver, String url) { + + driver.get(url); + driver.manage().window().maximize(); + sleep(); + } + + public static void sleep() { + try { + Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS)); + } catch (InterruptedException e) { + System.err.println(e.getMessage()); + } + } + + public static boolean isRunningOnLocal() { + return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE); + } + + public static String getUrl(String url) { + + return isRunningOnLocal() ? Config.LOCAL_IP + url : Config.GITHUB_ACTION_IP + url; + } +} diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java new file mode 100644 index 00000000000..d15f72b2a13 --- /dev/null +++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java @@ -0,0 +1,63 @@ +package framework.utility; + +import framework.config.Config; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TimeUtils { + private static final Pattern TIME_PATTERN = Pattern.compile( + "\\s*(\\d+)\\s+days\\s+(\\d+):(\\d+):(\\d+).(\\d+)|" + + "(\\d+):(\\d+):(\\d+).(\\d+)|" + + "(\\d+):(\\d+).(\\d+)|" + + "(\\d+).(\\d+)\\s*"); + + private static final long MILLISECONDS_IN_A_SECOND = 1000; + private static final long MILLISECONDS_IN_A_MINUTE = 60 * MILLISECONDS_IN_A_SECOND; + private static final long MILLISECONDS_IN_AN_HOUR = 60 * MILLISECONDS_IN_A_MINUTE; + private static final long MILLISECONDS_IN_A_DAY = 24 * MILLISECONDS_IN_AN_HOUR; + + public static long convertToMilliseconds(String time) { + Matcher matcher = TIME_PATTERN.matcher(time); + if (matcher.matches()) { + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + int milliSeconds = 0; + + try { + if (matcher.group(1) != null) { // Matches d days h:m:s.s + days = Integer.parseInt(matcher.group(1)); + hours = Integer.parseInt(matcher.group(2)); + minutes = Integer.parseInt(matcher.group(3)); + seconds = Integer.parseInt(matcher.group(4)); + milliSeconds = Integer.parseInt(matcher.group(5)); + } else if (matcher.group(6) != null) { // Matches h:m:s.s + hours = Integer.parseInt(matcher.group(6)); + minutes = Integer.parseInt(matcher.group(7)); + seconds = Integer.parseInt(matcher.group(8)); + milliSeconds = Integer.parseInt(matcher.group(9)); + } else if (matcher.group(10) != null) { // Matches m:s.s + minutes = Integer.parseInt(matcher.group(10)); + seconds = Integer.parseInt(matcher.group(11)); + milliSeconds = Integer.parseInt(matcher.group(12)); + } else if (matcher.group(13) != null) { // Matches s.s + seconds = Integer.parseInt(matcher.group(13)); + milliSeconds = Integer.parseInt(matcher.group(14)); + } + } catch (NumberFormatException e) { + return Config.MALFORMED_TIME_STRING; + } + + return days * MILLISECONDS_IN_A_DAY + + hours * MILLISECONDS_IN_AN_HOUR + + minutes * MILLISECONDS_IN_A_MINUTE + + seconds * MILLISECONDS_IN_A_SECOND + + milliSeconds; + + } else { + return Config.MALFORMED_TIME_STRING; + } + } +} From 807836112a1236330845ba0a4c69aa0d9e3720fa Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Wed, 19 Jun 2024 15:52:44 -0400 Subject: [PATCH 03/36] HPCC-31857 : Develop an automated ECL Watch Test Suite Code to add more loggers for debug and detail. --- .../test-ui/tests/framework/TestRunner.java | 54 ++++++-- .../tests/framework/config/Config.java | 4 +- .../tests/framework/config/TestClasses.java | 2 +- .../tests/framework/pages/ActivitiesTest.java | 27 ++-- .../tests/framework/pages/BaseTableTest.java | 122 ++++++++++++------ .../framework/pages/ECLWorkUnitsTest.java | 10 +- .../tests/framework/setup/LoggerHolder.java | 19 ++- .../tests/framework/setup/TestInjector.java | 11 +- .../tests/framework/utility/Common.java | 38 +++++- 9 files changed, 198 insertions(+), 89 deletions(-) diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java index 3be28b05a87..2f368720bf7 100644 --- a/esp/src/test-ui/tests/framework/TestRunner.java +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -24,16 +24,30 @@ public class TestRunner { public static void main(String[] args) { - Logger logger = setupLogger(); + Logger errorLogger = setupLogger("error"); + Logger specificLogger = setupLogger(args[0]); + WebDriver driver = setupWebDriver(); TestNG testng = new TestNG(); testng.setTestClasses(loadClasses()); - testng.addListener(new TestInjector(logger, driver)); + testng.addListener(new TestInjector(errorLogger, specificLogger, driver)); testng.run(); driver.quit(); } + private static Logger getSpecificLogger(String[] args) { + + String logLevel = args.length > 0 ? args[0] : "error"; + Logger specificLogger = null; + + if (!logLevel.equalsIgnoreCase("error")) { + specificLogger = setupLogger(logLevel); + } + + return specificLogger; + } + private static WebDriver setupWebDriver() { ChromeOptions chromeOptions = new ChromeOptions(); @@ -79,20 +93,38 @@ private static Class[] loadClasses() { return classes.toArray(new Class[0]); } - private static Logger setupLogger() { - Logger logger = Logger.getLogger(TestRunner.class.getName()); + private static Logger setupLogger(String logLevel) { + + if (logLevel == null) { + return null; + } + + Logger logger = Logger.getLogger(logLevel); + logger.setUseParentHandlers(false); // Disable console logging + try { - FileHandler fileHandler = new FileHandler(Config.LOG_FILE); - SimpleFormatter formatter = new SimpleFormatter(); - fileHandler.setFormatter(formatter); - logger.addHandler(fileHandler); - logger.setUseParentHandlers(false); - logger.setLevel(Level.ALL); + if (logLevel.equalsIgnoreCase("error")) { + FileHandler errorFileHandler = new FileHandler(Config.LOG_FILE_ERROR); + errorFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(errorFileHandler); + logger.setLevel(Level.SEVERE); + } else if (logLevel.equalsIgnoreCase("debug")) { + FileHandler debugFileHandler = new FileHandler(Config.LOG_FILE_DEBUG); + debugFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(debugFileHandler); + logger.setLevel(Level.INFO); + } else if (logLevel.equalsIgnoreCase("detail")) { + FileHandler detailFileHandler = new FileHandler(Config.LOG_FILE_DETAIL); + detailFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(detailFileHandler); + logger.setLevel(Level.FINE); + } + } catch (IOException e) { System.err.println("Failed to setup logger: " + e.getMessage()); } - Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver. + Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // Turn off all logging from the Selenium WebDriver. return logger; } } diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java index 98b8311ac28..28f5b793989 100644 --- a/esp/src/test-ui/tests/framework/config/Config.java +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -2,7 +2,9 @@ public class Config { - public static final String LOG_FILE = "errorLog.log"; + public static final String LOG_FILE_ERROR = "error_ecl_test.log"; + public static final String LOG_FILE_DEBUG = "debug_ecl_test.log"; + public static final String LOG_FILE_DETAIL = "detail_ecl_test.log"; public static final String LOCAL_OS = "Windows"; public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha"; public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"; diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java index 2a1a3fb1faf..2f850a49bb9 100644 --- a/esp/src/test-ui/tests/framework/config/TestClasses.java +++ b/esp/src/test-ui/tests/framework/config/TestClasses.java @@ -7,7 +7,7 @@ public class TestClasses { public static final List testClassesList = List.of( - //new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), + new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest") ); } diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java index 50b0ac82213..e36548fad90 100644 --- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; public class ActivitiesTest { @@ -28,33 +29,37 @@ public class ActivitiesTest { //"DummyNavName", List.of("DummyTab1", "DummyTab2") ); + Logger errorLogger, specificLogger; + @Test public void testActivitiesPage() { WebDriver driver = WebDriverHolder.getDriver(); Common.openWebPage(driver, Common.getUrl(Config.ACTIVITIES_URL)); - Logger logger = LoggerHolder.getLogger(); + errorLogger = LoggerHolder.getErrorLogger(); + specificLogger = LoggerHolder.getSpecificLogger(); + + Common.logDebug(specificLogger, "Tests started for Activities Page"); - testForAllText(logger, driver); + testForAllText(driver); List navWebElements = getNavWebElements(driver); - testForNavigationLinks(driver, navWebElements, logger); + testForNavigationLinks(driver, navWebElements); + + Common.logDebug(specificLogger, "Tests finished for Activities Page"); } - private void testForNavigationLinks(WebDriver driver, List navWebElements, Logger logger) { + private void testForNavigationLinks(WebDriver driver, List navWebElements) { for (NavigationWebElement element : navWebElements) { element.webElement().click(); if (testTabsForNavigationLinks(driver, element)) { - String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue(); - System.out.println(msg); + Common.logDetail(specificLogger, "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue()); } else { String currentPage = getCurrentPage(driver); - String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue(); - System.err.println(errorMsg); - logger.severe(errorMsg); + Common.logError(errorLogger, "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue()); } } } @@ -108,10 +113,10 @@ private List getNavWebElements(WebDriver driver) { return navWebElements; } - private void testForAllText(Logger logger, WebDriver driver) { + private void testForAllText(WebDriver driver) { for (String text : textArray) { - Common.checkTextPresent(driver, text, "Activities Page", logger); + Common.checkTextPresent(driver, text, "Activities Page", errorLogger, specificLogger); } } } diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 6468196aff5..1d712d28a17 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -5,6 +5,7 @@ import framework.setup.WebDriverHolder; import framework.utility.Common; import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -47,22 +48,63 @@ public abstract class BaseTableTest { protected abstract String getCurrentPage(WebDriver driver); + Logger errorLogger, specificLogger; + protected void testPage() { + + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, getPageUrl()); + errorLogger = LoggerHolder.getErrorLogger(); + specificLogger = LoggerHolder.getSpecificLogger(); + try { - WebDriver driver = WebDriverHolder.getDriver(); - Common.openWebPage(driver, getPageUrl()); - Logger logger = LoggerHolder.getLogger(); + //testingAttributes(driver); - testForAllText(driver, logger); - testContentAndSortingOrder(driver, logger); - testLinksInTable(driver, logger); + Common.logDebug(specificLogger, "Tests started for :" + getPageName() +" page."); + + testForAllText(driver); + testContentAndSortingOrder(driver); + testLinksInTable(driver); + + Common.logDebug(specificLogger, "Tests started for :" + getPageName() +" page."); } catch (Exception ex) { - System.out.println(ex.getMessage()); + Common.logError(errorLogger, ex.getMessage()); + } + } + + private void testingAttributes(WebDriver driver) { + + //WebElement webElement = driver.findElement(By.xpath("//*[text()='WUID']/../../..")); + + WebElement webElement = driver.findElement(By.xpath("//*[@*[.='Wuid']]")); + + JavascriptExecutor executor = (JavascriptExecutor) driver; + Object aa=executor.executeScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", webElement); + System.out.println(webElement.getText()); + String [] attrs = aa.toString().replaceAll("[{}]", "").split(", "); + for (String attr:attrs){ + System.out.println(attr); } + System.out.println(); + +// List elements = driver.findElements(By.xpath("//*[@*[.='Wuid']]")); +// +// System.out.println(elements.size()); +// +// for (WebElement element:elements) { +// Object aaa=executor.executeScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", element); +// System.out.println(); +// System.out.println(element.getText()); +// String [] attrs2 = aaa.toString().replaceAll("[{}]", "").split(", "); +// for (String attr:attrs2){ +// System.out.println(attr); +// } +// } + } - private void testLinksInTable(WebDriver driver, Logger logger) { + private void testLinksInTable(WebDriver driver) { for (String columnKey : getColumnKeysWithLinks()) { @@ -82,12 +124,11 @@ private void testLinksInTable(WebDriver driver, Logger logger) { if (driver.getPageSource().contains(name)) { String msg = "Success: " + getPageName() + ": Link Test Pass for " + i++ + ". " + name + ". URL : " + href; - System.out.println(msg); + Common.logDetail(specificLogger, msg); } else { String currentPage = getCurrentPage(driver); String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + i++ + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href; - System.err.println(errorMsg); - logger.severe(errorMsg); + Common.logError(errorLogger, errorMsg); } driver.navigate().to(getPageUrl()); @@ -98,8 +139,7 @@ private void testLinksInTable(WebDriver driver, Logger logger) { // Log error if the dropdown value has changed if (!dropdownValueBefore.equals(dropdownValueAfter)) { String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter; - System.err.println(dropdownErrorMsg); - logger.severe(dropdownErrorMsg); + Common.logError(errorLogger, dropdownErrorMsg); } } } @@ -109,22 +149,22 @@ protected WebElement waitForElement(WebDriver driver, By locator) { return new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.presenceOfElementLocated(locator)); } - private void testContentAndSortingOrder(WebDriver driver, Logger logger) { - List jsonObjects = getAllObjectsFromJson(logger); + private void testContentAndSortingOrder(WebDriver driver) { + List jsonObjects = getAllObjectsFromJson(); if (jsonObjects != null) { int numOfItemsJSON = jsonObjects.size(); clickDropdown(driver, numOfItemsJSON); - if (testTableContent(driver, logger, jsonObjects)) { + if (testTableContent(driver, jsonObjects)) { for (int i = 0; i < getColumnKeys().length; i++) { - testTheSortingOrderForOneColumn(driver, logger, jsonObjects, getColumnKeys()[i], getColumnNames()[i]); + testTheSortingOrderForOneColumn(driver, jsonObjects, getColumnKeys()[i], getColumnNames()[i]); } } } } - private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List jsonObjects, String columnKey, String columnName) { + private void testTheSortingOrderForOneColumn(WebDriver driver, List jsonObjects, String columnKey, String columnName) { for (int i = 0; i < 3; i++) { String currentSortOrder = getCurrentSortingOrder(driver, columnKey); @@ -135,12 +175,11 @@ private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, Li List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, jsonObjects); List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); - if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) { - System.out.println("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); + if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, columnName)) { + Common.logDebug(specificLogger, "Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); } else { String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName; - System.err.println(errMsg); - logger.severe(errMsg); + Common.logError(errorLogger, errMsg); } } } @@ -182,8 +221,8 @@ void descendingSortJson(List jsonObjects, String columnKey) { jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); } - private boolean testTableContent(WebDriver driver, Logger logger, List jsonObjects) { - System.out.println("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + private boolean testTableContent(WebDriver driver, List jsonObjects) { + Common.logDebug(specificLogger, "Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); @@ -192,14 +231,13 @@ private boolean testTableContent(WebDriver driver, Logger logger, List jsonOb columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); } - System.out.println("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + Common.logDebug(specificLogger, "Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); if (jsonObjects.size() != columnDataIDFromUI.size()) { String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + "\nNumber of Objects from Json: " + jsonObjects.size() + "\nNumber of Objects from UI: " + columnDataIDFromUI.size(); - System.out.println(errMsg); - logger.severe(errMsg); + Common.logError(errorLogger, errMsg); return false; } @@ -208,7 +246,7 @@ private boolean testTableContent(WebDriver driver, Logger logger, List jsonOb for (int i = 0; i < getColumnKeys().length; i++) { List columnDataFromUI = getDataFromUIUsingColumnKey(driver, getColumnKeys()[i]); List columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i], jsonObjects); - if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, getColumnNames()[i])) { + if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, getColumnNames()[i])) { pass = false; } } @@ -216,20 +254,19 @@ private boolean testTableContent(WebDriver driver, Logger logger, List jsonOb return pass; } - private List getAllObjectsFromJson(Logger logger) { + private List getAllObjectsFromJson() { String filePath = getJsonFilePath(); try { return parseJson(filePath); } catch (Exception e) { - System.err.println("Exception: " + e.getMessage()); - logger.severe("Failure: Exception: " + e.getMessage()); + Common.logError(errorLogger, "Failure: Exception: " + e.getMessage()); } - logger.severe("Failure: Error in JSON Parsing: " + filePath); + Common.logError(errorLogger, "Failure: Error in JSON Parsing: " + filePath); return null; } - private boolean compareData(List dataUI, List dataJSON, List dataIDUI, Logger logger, String columnName) { + private boolean compareData(List dataUI, List dataJSON, List dataIDUI, String columnName) { boolean pass = true; @@ -239,26 +276,25 @@ private boolean compareData(List dataUI, List dataJSON, List Date: Wed, 19 Jun 2024 17:12:32 -0400 Subject: [PATCH 04/36] HPCC-31857 : Develop an automated ECL Watch Test Suite Developed a testing framework using Java, Selenium, and TestNG. The framework is initiated by `TestRunner.java`, which loads all test classes listed in `config/TestClasses.java` and executes them sequentially. Each test class contains at least one method annotated with `@Test`, which serves as the entry point for the tests. Test cases cover the Activities and ECL Workunit pages, including tests for text presence, link functionality, sorting order, workunits content, description, and checkbox functionality. Added loggers in separate files for error, debug, and detail. Updated YML files to reflect jars and commands for the current testing framework. Additionally, provided comprehensive documentation with UML diagrams and detailed explanations of each method within the classes. Signed-off-by: Nisha Bagdwal --- .github/workflows/build-docker.yml | 6 +- .github/workflows/test-ui-gh_runner.yml | 55 +- esp/src/test-ui/tests/Activities.java | 2 +- esp/src/test-ui/tests/framework/README.md | 42 +- .../test-ui/tests/framework/TestRunner.java | 106 +- .../tests/framework/config/Config.java | 29 +- .../tests/framework/config/TestClasses.java | 4 +- .../tests/framework/config/URLConfig.java | 54 + .../documentation/ActivitiesTest.png | Bin 15534 -> 14585 bytes .../framework/documentation/BaseTableTest.png | Bin 128722 -> 0 bytes .../documentation/BaseTableTest1.png | Bin 0 -> 40540 bytes .../documentation/BaseTableTest2.png | Bin 0 -> 17203 bytes .../tests/framework/documentation/Common.png | Bin 6174 -> 30026 bytes .../tests/framework/documentation/Config.png | Bin 13193 -> 37103 bytes .../framework/documentation/DesignDocument.md | 999 ++++++++++++++---- .../documentation/ECLWorkUnitsTest.png | Bin 21757 -> 42407 bytes .../framework/documentation/TestRunner.png | Bin 3979 -> 6411 bytes .../framework/documentation/URLConfig1.png | Bin 0 -> 42371 bytes .../framework/documentation/URLConfig2.png | Bin 0 -> 9282 bytes .../framework/documentation/URLMapping.png | Bin 0 -> 9850 bytes .../tests/framework/model/ECLWorkunit.java | 8 + .../tests/framework/model/URLMapping.java | 33 + .../tests/framework/pages/ActivitiesTest.java | 102 +- .../tests/framework/pages/BaseTableTest.java | 532 +++++++--- .../framework/pages/ECLWorkUnitsTest.java | 352 +++++- .../tests/framework/setup/LoggerHolder.java | 16 - .../tests/framework/setup/TestInjector.java | 31 - .../framework/setup/WebDriverHolder.java | 15 - .../tests/framework/utility/Common.java | 182 +++- 29 files changed, 1950 insertions(+), 618 deletions(-) create mode 100644 esp/src/test-ui/tests/framework/config/URLConfig.java delete mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest1.png create mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest2.png create mode 100644 esp/src/test-ui/tests/framework/documentation/URLConfig1.png create mode 100644 esp/src/test-ui/tests/framework/documentation/URLConfig2.png create mode 100644 esp/src/test-ui/tests/framework/documentation/URLMapping.png create mode 100644 esp/src/test-ui/tests/framework/model/URLMapping.java delete mode 100644 esp/src/test-ui/tests/framework/setup/LoggerHolder.java delete mode 100644 esp/src/test-ui/tests/framework/setup/TestInjector.java delete mode 100644 esp/src/test-ui/tests/framework/setup/WebDriverHolder.java diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 7c5090750b6..f4c97ebc7a2 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -176,13 +176,13 @@ jobs: ${{ github.workspace }}/HPCC-Platform/.github/workflows/timeoutcmd if-no-files-found: error - - name: Upload UI Test Files + - name: Upload ECL Watch UI Test Files if: ${{ inputs.upload-package == true }} uses: actions/upload-artifact@v3 with: - name: ${{ inputs.asset-name }}-ui_test-files + name: ${{ inputs.asset-name }}-ecl_watch_ui_tests path: | - ${{ github.workspace }}/HPCC-Platform/esp/src/test-ui/**/* + ${{ github.workspace }}/HPCC-Platform/esp/src/test-ui/tests/**/* if-no-files-found: error - name: Upload Error Logs diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 902b02f678b..76bd7c2f540 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -33,17 +33,17 @@ jobs: - name: Download UI Test Files uses: actions/download-artifact@v3 with: - name: ${{ inputs.asset-name }}-ui_test-files - path: ${{ inputs.asset-name }}-ui_test-files + name: ${{ inputs.asset-name }}-ecl_watch_ui_tests + path: ${{ inputs.asset-name }}-ecl_watch_ui_tests - name: Check ECLWatch UI Test Directory id: check run: | - if [[ ! -d ${{ inputs.asset-name }}-ui_test-files ]] + if [[ ! -d ${{ inputs.asset-name }}-ecl_watch_ui_tests ]] then - echo "ECLWatch UI ${{ inputs.asset-name }}-ui_test-files directory missing." + echo "ECLWatch UI ${{ inputs.asset-name }}-ecl_watch_ui_tests directory missing." else - javaFilesCount=$(find ${{ inputs.asset-name }}-ui_test-files/ -iname '*.java' -type f -print | wc -l ) + javaFilesCount=$(find ${{ inputs.asset-name }}-ecl_watch_ui_tests/ -iname '*.java' -type f -print | wc -l ) echo "Number of test java files is $javaFilesCount" if [[ ${javaFilesCount} -eq 0 ]] then @@ -95,7 +95,7 @@ jobs: chmod +x ./${{ inputs.asset-name }}-support-files/* sudo cp ./${{ inputs.asset-name }}-support-files/* /opt/HPCCSystems/bin - chmod +x ./${{ inputs.asset-name }}-ui_test-files/* + chmod +x ./${{ inputs.asset-name }}-ecl_watch_ui_tests/* - name: Start HPCC-Platform shell: "bash" @@ -136,34 +136,41 @@ jobs: run: | wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb - wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip - unzip chromedriver_linux64.zip - sudo mv chromedriver /usr/bin/chromedriver + wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chromedriver-linux64.zip + unzip chromedriver-linux64.zip -d chromedriver + sudo mv chromedriver/chromedriver-linux64/chromedriver /usr/bin/chromedriver sudo chown root:root /usr/bin/chromedriver sudo chmod +x /usr/bin/chromedriver - wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar - wget http://www.java2s.com/Code/JarDownload/testng/testng-6.8.7.jar.zip - unzip testng-6.8.7.jar.zip - - - name: Run Tests - timeout-minutes: 10 # generous, current runtime is ~1min, this should be increased if new tests are added + wget https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar + wget https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.17.0/jackson-annotations-2.17.0.jar + wget https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.17.0/jackson-core-2.17.0.jar + wget https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.17.0/jackson-databind-2.17.0.jar + wget https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar + wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.22.0/selenium-java-4.22.0.zip + wget https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar + wget https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/1.7.30/slf4j-simple-1.7.30.jar + unzip selenium-java-4.22.0.zip -d selenium-libs + + - name: Run ECL Watch UI Tests + timeout-minutes: 80 # generous, current runtime is ~38 minutes, this should be increased if new tests are added if: steps.check.outputs.runtests shell: "bash" run: | - export CLASSPATH=".:${{ github.workspace }}/selenium-server-standalone-3.141.59.jar:${{ github.workspace }}/testng-6.8.7.jar" - pushd ${{ inputs.asset-name }}-ui_test-files - ./run.sh tests http://localhost:8010 > eclWatchUiTest.log 2>&1 - retCode=$? - echo "UI test done" - [[ $retCode -ne 0 ]] && exit 1 + export CLASSPATH=".:${{ inputs.asset-name }}-ecl_watch_ui_tests:${{ github.workspace }}/selenium-libs/*:${{ github.workspace }}/testng-7.7.1.jar:${{ github.workspace }}/jackson-annotations-2.17.0.jar:${{ github.workspace }}/jackson-core-2.17.0.jar:${{ github.workspace }}/jackson-databind-2.17.0.jar:${{ github.workspace }}/jcommander-1.82.jar:${{ github.workspace }}/slf4j-api-1.7.30.jar:${{ github.workspace }}/slf4j-simple-1.7.30.jar" + pushd ${{ inputs.asset-name }}-ecl_watch_ui_tests + find . -iname '*.java' -type f -print -exec javac {} \; + java framework.TestRunner detail + echo "ECL Watch UI test done" + lines=$(wc -l < error_ecl_test.log) + [[ $lines -ne 0 ]] && exit 1 popd - - name: eclwatch-ui-test-logs-artifact + - name: Upload ECL Watch UI Test Logs To Artifact if: ${{ failure() || cancelled() }} uses: actions/upload-artifact@v3 with: - name: ${{ inputs.asset-name }}-ui_test-logs + name: ${{ inputs.asset-name }}-ecl_watch_ui_test_logs path: | - ${{ inputs.asset-name }}-ui_test-files/eclWatchUiTest.log + ${{ inputs.asset-name }}-ecl_watch_ui_tests/*.log /home/runner/HPCCSystems-regression/log/*.json if-no-files-found: error diff --git a/esp/src/test-ui/tests/Activities.java b/esp/src/test-ui/tests/Activities.java index d160ae8f60c..35686098d3e 100644 --- a/esp/src/test-ui/tests/Activities.java +++ b/esp/src/test-ui/tests/Activities.java @@ -24,7 +24,7 @@ public static void main(String[] args) throws IOException, InterruptedException Capabilities caps = ((RemoteWebDriver) driver).getCapabilities(); String browserName = caps.getBrowserName(); - String browserVersion = caps.getVersion(); + //String browserVersion = caps.getVersion(); // System.out.println(browserName+" "+browserVersion); driver.get(args[0]); diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md index 0f56ebe39b8..78ab59a1b9b 100644 --- a/esp/src/test-ui/tests/framework/README.md +++ b/esp/src/test-ui/tests/framework/README.md @@ -1,4 +1,4 @@ -Project: An Automated ECL Watch Test Suite +### Project: An Automated ECL Watch Test Suite This project's code begins with the TestRunner.java file. The main method in this class loads all the Java classes created for writing test cases for specific web pages of the ECL Watch UI and then runs the tests in those classes @@ -8,4 +8,42 @@ The names of the Java classes that the TestRunner class needs to load should be file. Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The -code for each class starts to run from this method. \ No newline at end of file +code for each class starts to run from this method. + +#### Important Note: ChromeDriver Version Compatibility + +If the Chrome browser version updates in the future, it's crucial to ensure that the corresponding ChromeDriver version is also updated. Failure to do so may cause tests to fail due to compatibility issues between the browser and driver. Always verify and update ChromeDriver to the latest version whenever running tests to maintain compatibility and ensure smooth test execution. + +#### CLI Arguments for TestRunner.java + +While running the test suite, you can pass arguments in this way -> "-l log_level -p path". +- "log_level" is of two types "debug" and "detail" +- "debug" means generate error log file with a debug log file. +- "detail" means generate error log file with a detailed debug file. +- If no -l and log_level is passed in the argument, only error log will be generated +- "path" is the path of the folder where the json files are +- The code will log an error if the '-p' and 'path' arguments are not provided, as the JSON folder path is required for the test suite. + +path could be something like: + +for GitHub Actions -> /home/runner/HPCCSystems-regression/log/ + +for local machine -> C:/Users/nisha/Documents/Internship/Work/files/ + +So an example of complete CLI arguments would look like this: + +-l debug -p C:/Users/nisha/Documents/Internship/Work/files/ + +Below are the dependencies used in the project: + +- https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar +- https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.17.0/jackson-annotations-2.17.0.jar +- https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.17.0/jackson-core-2.17.0.jar +- https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.17.0/jackson-databind-2.17.0.jar +- https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar +- https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.17.0/selenium-server-4.17.0.jar + +Notes: +1. Users need to run these tests with regression test suite only. +2. Code should be updated accordingly if selenium server jar updates. +3. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java index 3be28b05a87..1b8c3399593 100644 --- a/esp/src/test-ui/tests/framework/TestRunner.java +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -3,66 +3,63 @@ import framework.config.Config; import framework.config.TestClasses; import framework.model.TestClass; -import framework.setup.TestInjector; import framework.utility.Common; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.chrome.ChromeOptions; -import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.TestNG; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URI; import java.util.ArrayList; import java.util.List; -import java.util.logging.FileHandler; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; + public class TestRunner { public static void main(String[] args) { - Logger logger = setupLogger(); - WebDriver driver = setupWebDriver(); + try { + getLogLevelAndJSONFolderPath(args); + Common.initializeLoggerAndDriver(); + + if (Common.driver != null) { + TestNG testng = new TestNG(); + testng.setTestClasses(loadClasses()); + testng.run(); + Common.driver.quit(); + } - TestNG testng = new TestNG(); - testng.setTestClasses(loadClasses()); - testng.addListener(new TestInjector(logger, driver)); - testng.run(); - driver.quit(); + } catch (Exception e) { + Common.logError("Exception occurred in TestRunner.java: " + e.getMessage()); + } } - private static WebDriver setupWebDriver() { - - ChromeOptions chromeOptions = new ChromeOptions(); - chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window. - chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome. - chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only. - - System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver - - WebDriver driver; - - if (Common.isRunningOnLocal()) { - System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable. - try { - driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions); - } catch (MalformedURLException e) { - throw new RuntimeException(e); + // Parses the command-line arguments to set the log level and JSON folder path. + // The method checks for the presence of '-l' (log_level) and '-p' (path) arguments. + // Logs an error if the '-p' argument is not provided, as the JSON path is required. + // path is the path of the folder where the json files are + // log level is of two types "debug" and "detail" + // "debug" means generate error log file with a debug log file. + // "detail" means generate error log file with a detailed debug file. + // if no -l and log level is passed in the argument, only error log will be generated + + public static void getLogLevelAndJSONFolderPath(String[] args) { // -l -p + + String log_level = null; + String path = null; + + for (int i = 0; i < args.length; i++) { + if ("-l".equals(args[i]) && i + 1 < args.length) { + log_level = args[++i]; + } else if ("-p".equals(args[i]) && i + 1 < args.length) { + path = args[++i]; } - } else { - System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); - driver = new ChromeDriver(chromeOptions); } - //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities(); - //String browserName = caps.getBrowserName(); - //String browserVersion = caps.getBrowserVersion(); - //System.out.println(browserName+" "+browserVersion); + if (log_level != null) { + Config.LOG_LEVEL = log_level; + } - return driver; + if (path != null) { + Config.PATH_FOLDER_JSON = path; + } else { + Common.logError("Error: JSON folder path is required. Use -p to specify the path."); + } } private static Class[] loadClasses() { @@ -71,28 +68,11 @@ private static Class[] loadClasses() { for (TestClass testClass : TestClasses.testClassesList) { try { classes.add(Class.forName(testClass.getPath())); - } catch (ClassNotFoundException e) { - System.err.println(e.getMessage()); + } catch (Exception e) { + Common.logError("Failure: Error in loading classes: " + e.getMessage()); } } return classes.toArray(new Class[0]); } - - private static Logger setupLogger() { - Logger logger = Logger.getLogger(TestRunner.class.getName()); - try { - FileHandler fileHandler = new FileHandler(Config.LOG_FILE); - SimpleFormatter formatter = new SimpleFormatter(); - fileHandler.setFormatter(formatter); - logger.addHandler(fileHandler); - logger.setUseParentHandlers(false); - logger.setLevel(Level.ALL); - } catch (IOException e) { - System.err.println("Failed to setup logger: " + e.getMessage()); - } - - Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver. - return logger; - } } diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java index 98b8311ac28..90ede35a86e 100644 --- a/esp/src/test-ui/tests/framework/config/Config.java +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -2,19 +2,28 @@ public class Config { - public static final String LOG_FILE = "errorLog.log"; + public static final String LOG_FILE_ERROR = "error_ecl_test.log"; + public static final String LOG_FILE_DEBUG = "debug_ecl_test.log"; + public static final String LOG_FILE_DETAIL = "detail_ecl_test.log"; public static final String LOCAL_OS = "Windows"; public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha"; - public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"; + public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver/chromedriver.exe"; public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver"; - public static final String PATH_LOCAL_WORKUNITS_JSON = "C:/Users/nisha/Documents/Internship/Work/files/workunits.json"; - public static final String PATH_GH_ACTION_WORKUNITS_JSON = ""; - public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub"; - public static final String LOCAL_IP = "http://192.168.0.221:8010/"; - public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/"; - public static final String ACTIVITIES_URL = "esp/files/index.html#/activities"; - public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits"; public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000}; public static final int MALFORMED_TIME_STRING = -1; - public static final int WAIT_TIME_IN_SECONDS = 4; + public static final int WAIT_TIME_IN_SECONDS = 1; + public static final int WAIT_TIME_THRESHOLD_IN_SECONDS = 20; + public static final String TEST_DESCRIPTION_TEXT = "Testing Description"; + public static final boolean TEST_DETAIL_PAGE_FIELD_NAMES_ALL = true; + public static final boolean TEST_WU_DETAIL_PAGE_DESCRIPTION_ALL = true; + public static final boolean TEST_WU_DETAIL_PAGE_PROTECTED_ALL = true; + public static final boolean TEST_DETAIL_PAGE_TAB_CLICK_ALL = true; + + // these values are set in the beginning in the TestRunner.java file + public static String PATH_FOLDER_JSON = ""; + public static String LOG_LEVEL = ""; + + public static final String WORKUNITS_JSON_FILE_NAME = "workunits.json"; + public static final String DFU_WORKUNITS_JSON_FILE_NAME = "dfu-workunits.json"; + public static final String FILES_JSON_FILE_NAME = "files.json"; } diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java index 2a1a3fb1faf..08d504b5cf2 100644 --- a/esp/src/test-ui/tests/framework/config/TestClasses.java +++ b/esp/src/test-ui/tests/framework/config/TestClasses.java @@ -6,8 +6,10 @@ public class TestClasses { + // ActivitiesTest class should always be the first class to load, as it gets URLs for all other pages. + public static final List testClassesList = List.of( - //new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), + new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest") ); } diff --git a/esp/src/test-ui/tests/framework/config/URLConfig.java b/esp/src/test-ui/tests/framework/config/URLConfig.java new file mode 100644 index 00000000000..5b8bdea4ca5 --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/URLConfig.java @@ -0,0 +1,54 @@ +package framework.config; + +import framework.model.URLMapping; +import framework.utility.Common; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class URLConfig { + + public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub"; + public static final String LOCAL_IP = "http://192.168.0.221:8010/"; + public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/"; + + public static final String NAV_ACTIVITIES = "Activities"; + public static final String NAV_ECL = "ECL"; + public static final String NAV_FILES = "Files"; + public static final String NAV_PUBLISHED_QUERIES = "Published Queries"; + public static final String NAV_OPERATIONS = "Operations"; + public static final String TAB_ACTIVITIES_ACTIVITIES = "Activities"; + public static final String TAB_ACTIVITIES_EVENT_SCHEDULER = "Event Scheduler"; + public static final String TAB_ECL_WORKUNITS = "Workunits"; + public static final String TAB_ECL_PLAYGROUND = "Playground"; + public static final String TAB_FILES_LOGICAL_FILES = "Logical Files"; + public static final String TAB_FILES_LANDING_ZONES = "Landing Zones"; + public static final String TAB_FILES_WORKUNITS = "Workunits"; + public static final String TAB_FILES_XREF = "XRef (L)"; + public static final String TAB_PUBLISHED_QUERIES_QUERIES = "Queries"; + public static final String TAB_PUBLISHED_QUERIES_PACKAGE_MAPS = "Package Maps"; + public static final String TAB_OPERATIONS_TOPOLOGY = "Topology (L)"; + public static final String TAB_OPERATIONS_DISK_USAGE = "Disk Usage (L)"; + public static final String TAB_OPERATIONS_TARGET_CLUSTERS = "Target Clusters (L)"; + public static final String TAB_OPERATIONS_CLUSTER_PROCESSES = "Cluster Processes (L)"; + public static final String TAB_OPERATIONS_SYSTEM_SERVERS = "System Servers (L)"; + public static final String TAB_OPERATIONS_SECURITY = "Security (L)"; + public static final String TAB_OPERATIONS_DYNAMIC_ESDL = "Dynamic ESDL (L)"; + + public static final String[] navNamesArray = {NAV_ACTIVITIES, NAV_ECL, NAV_FILES, NAV_PUBLISHED_QUERIES, NAV_OPERATIONS}; + public static final Map> tabsListMap = Map.of( + NAV_ACTIVITIES, List.of(TAB_ACTIVITIES_ACTIVITIES, TAB_ACTIVITIES_EVENT_SCHEDULER), + NAV_ECL, List.of(TAB_ECL_WORKUNITS, TAB_ECL_PLAYGROUND), + NAV_FILES, List.of(TAB_FILES_LOGICAL_FILES, TAB_FILES_LANDING_ZONES, TAB_FILES_WORKUNITS, TAB_FILES_XREF), + NAV_PUBLISHED_QUERIES, List.of(TAB_PUBLISHED_QUERIES_QUERIES, TAB_PUBLISHED_QUERIES_PACKAGE_MAPS), + NAV_OPERATIONS, List.of(TAB_OPERATIONS_TOPOLOGY, TAB_OPERATIONS_DISK_USAGE, TAB_OPERATIONS_TARGET_CLUSTERS, + TAB_OPERATIONS_CLUSTER_PROCESSES, TAB_OPERATIONS_SYSTEM_SERVERS, TAB_OPERATIONS_SECURITY, TAB_OPERATIONS_DYNAMIC_ESDL) + ); + + public static final HashMap urlMap = new HashMap<>(); + + static { + urlMap.put(NAV_ACTIVITIES, new URLMapping(NAV_ACTIVITIES, Common.getIP())); + } +} diff --git a/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png b/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png index c3b17514907881bf55ec3e7d592f0893847d9c4d..21131f104bc510429f53d1f42c42cb87ab6c6652 100644 GIT binary patch literal 14585 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 alIHpOy6)V!Gf_*S?;iY(;MX7h?*9NK(EAPm literal 15534 zcmd^m3s{p^x^C>vnd!xuX>ChYnATA&D2^aTOiVg^x?wsN7=@pR5YmDWC0uGE34vVf zZl_KWVHA-9hRkeQ(Ig~;5io=#&R9eel8nV9++%?xN+5y65JGNe{n0w@oP9axIkRV< z=bY!^A^-X>Yps7>-tYb1@B2UfbxP9nKX~m22n6E!cYgWy0R-ZyHxP(bAAj!|aAsQY z;c5f|UG~n~KTj{unIAiK*1D%=(_dDC+?MYrua=HfUTb!H?BPCWG2eSa#D3{)nf4^%A(Zyrz!$%zwv)2V`CMV%0>M zv}|LmtF?Tz9d(-^T~CvUUje<+QXT6kQpe{j z1lO{&xM0m2hlD2QYFd0n%6YS=Gj~ zRY7?faR*G~VqM;O5*^%q?Z!aqV5r)WHD6!AQ43>QdoUQDq?+7X&YR^8D~}|v73D@t zHe0~W3%okxXJhqA$)`qjAAMNeZdPw$NyuVf{yA;Ara3C7uL6=+;d$k2t&j&?1yB6Z zI)gM(O(jEo;pvItOYSXP60Yn`gFvsHN+^g&NhX>GIZFzG1HN^7h6ZkZCk-6mO-N}8 zD*}V_G$^!8&out&|APyQr_(#A*521R+ z3YvZw?ZIb_E>Ve%KitNv>8zT#Z0C9}FL9g-bDP$FHAtvn^QPz99g((Krx0DEV;K0> z7`xzU#9daTn+W&Gs4JPF3>L;V#J_1ECToU{;Ok`Go@$(Dgfu49FGQS53fV`wbphA zis#ZD%g0A($B)X@-s~?#?OoB3aFnKt1Y5?J^{6Y`>C?-~l@}$VY_8{A$A#MTGE~O} z_o0#phX%59J{q*&3YR*{ot^~w^$1MpbSkOeuR!e7wVey-4V=~{GzK}TCG{VmGzavKyEd3aay~Zf}e-RBB4S|hZJXB38{QW98Xmq z&gSLXZ?O_e3l>?QN9n8egNK=#p(tbZZ0w{q4q4^Ou=FZ%1ulMed`3JorrptynXGA^ z0En=EJ>rCsMlS6FIQ`%Su^*C*Brj~yt9*r%)l+X;$&>3i`@lpL6vYSM(d}@L={gP< z#YgldUfE?iT3?!27A6w@LR2N&=r#3*^`+@ey;stP4i`UaJD~B#J$mo`zE~BW=Ns_g zJSxFv3qYl#lKtu}FCeZfj*;09TbC$w$t7lfQ(@&xS?cB}`HRi!IK$O)GtQEwrlm7! z)q3BTi?#ZU4w`vmYfrV?8P(8{$w(5a=xKelTs}RGb7RYrhH*H(VUd+%irsYz$@kUV zUI{fF%k6LUL@n7sFSl<)^1}L7A(oLTHZ8nSC%>5Z3C^p@#)@)ff_Y~c`-{za{?VLz zQ7#j0k!Yj1GOFwf^{Tcye_|_F7B#}JJ*}^GNbDR2p}Ps!fia|a)T3L*wJFIrS2|^o zyut4sKH}fP?eD6yTQi(d8K%Sx&x;T@Fr4UBGW3VhByzD?T<|hiO#zcNNCs!treot7wGhr%a)2jYNvBrW?+o@z12MW|GnLC#?9P`F zh}{%&PzEp9bu()|Pem)xH`{Jegu-8Fu(vfkY!7dzujhM&I0Jq%^H~JqLV_eX3Ep5u z7&u9EZM<4b4D8fvEBS$9X{|fan&in$R_5L6fiTnJ?0BO~*`z8=4zIKkEyGERn1(S~ zHbDok?6|acQBAaUrQDq2ES|JPF^fC#m&rOgACmxx7Yl4+H;j$@0zX^6@8XYEyRf+{ zhBI?Ukt!Sls1n>ef8LcU=+JiH}kDc zcEZaUXO{w+Ap3=_)U|PQo_Ki^zzU=aHzvVA9$xD9yo6LS!|d>_lm{yc@6f(D4zR|ST|jrwL{mu|EL|8QH&KM1fHBNy)? zB`$X1+qHqP2vcH5_L#voBfiLOi|QiXp=_!>dMEFkeOl^~m&AijF1(z3w5{OcA!9^V zxVt3zrg*cV07EKR96^KkR)Zad7`M&@Dq;K1KIvwrmT`CoM=v+hY5wl!(7ycE^^e>P zLRq`;;JTydQDsTBr8`mf%ohNMGY;%sh6$3~$ibcq{%c_6TB1VRxf*doOD31f@shEf z?B9od@;>7$u;FYpvIt(@|5d#C>ld@RBfGxZN}H_-w_mfOzd|tyc<`2twmKu?AyF9e zX1Ns3le0*rQ)~U56E~r2yE0VSR$!iR(Jt3)G~U4Z_?-Y6XkcR*!N#gM$(=N&1ZnIq znS8WmcF&CO#rgHqDe6I~)qb|Wqsd-THeup?`-v6d(hX$4;G(kKobXjj?;(Yf$T-h8 zOLHT;6F0r*NtW5paO=3v)FfYGO-6tv0bCIwbpro zXi6Q$y+VyQ9;w0LG$M*7N!pP;uu=a?)?c(uGPCBbmlxqhp!1ooo zwFz(m#BybdE!Z70ihcxtX~J@)AYNMzp-#D+f{6iQGBy<|GF-C!Dtzct{}y9E&B>f7 z%;{UnPU{0*eYaDN?LylonyQJ(LN!A_I3=dnr1v$!J778MQN`p4!@sqKeA^=3L3r^= zPLkxJo(!De^iCD0r?nsX(5fMPdm|OAU~}z|qu5)5|Lk`iJI&$(V}^K;!dh2^v+Ytx z{1*73ez1eUuvGg0&gSdyXbJy!tKwgN>|VeBYGORK`2Q-mYx$=-Vt17vGDtA@8LMDA z>1fV_ooaixVg8V-6g!zwwoz)OS`&e#UA&q_`&R|ko_#}_?iJ-4kGRoP;G-aNj(zK) z(fdJ7?LF8ZA6nu%jj^NlEdku#`B3F$-`rPUHoxkv8eq5?gu2B+B7T#BvxNQBev>zT zspO^70urC0pBqdf#Tm7HMyH$}-<{WK|5e!_|6pfrrtPd}{|2xjH>9vAMY!n-W zO#{Vb_;I%)^_>wJz;V7@H;q^py zoh6Yc`DDHmZ%QiY6pyDib5b=)9sAZAPXpu{H_agXVKOp_w-#W>57cXii&`Yrz!!qy zBU_Rgh*c8N7FaouMR9?j6Wd^+H*p(v8ZydpE#|C3Z%D*9koblq16h-_22&aoQbh*r#3& zk5r8PqkQT=Bc&KCjWvmr*(Qy3lJmxSjoYrtxh`X;(Uw+DWpfqQckF!aVjQQ}@{P4@ zc9pVsC)m#JrLfw#_vj<@(yZ=iV;vNPSTnk^dQJ{1z8+^_@@{(%^(AJMMRK|IG(#}H z)fy^#0_uv|so-d21g@qr^h5)?>w@uqWJM0uYtzrahUZ7^y27)%cZ?F^s)8ggIh#vf z&wT@%W~^Y!UDt+e^f~<^?ZRLCljYJfG{*YiZzm^$ZGP*t|GwX-V|QyyCSI%-_HAjQ z&dNQd_My{43w(S9cE|!E=IpU}ER)gZ7p?f3)gGj$p&vEs{?-lZnrLh#_I~%0vsmu$ zVE{L!V$?%kYJvG36X!jN=@)Fymx~6<%~{E=QGtHRnh{?-xz5Fo)T96JnFNfT!|YS-+UvbM?0Zt>ndU7S4aL7mhnoTW|k zhc6}RC%%~FCiZu~s2V?lGPopycScBu&#jwRaEZOhLq-c3BL`gMKeaVgL$T5q%w8YxM_QEI>i6Yh7i?l1mWM$6A*6|}jKYChrdj*jFM(vrz zMbzmPdw7;Af8rgC7iYav&<}JAewlb$%fPZXasB+V%ptP&plVG}(IOk53jWc|tc!=!TL#|*YuhkCE9^Brj_52b7FOtV| zpc2cZ{y5f;rRj^+rjF{|dS1cWEE6CnZ8`Hh_UOCtuE8DwJ-?;nSCAMeh{Y`(sQjQ# zp3&LL=#+^uBpw}`$QzH+y9eh5#j)r6AyX1Bdu`T0-tG>mkT>?JsW+B?RKnQMD0`)K z_=_rHk!24NW7!C66}9&dqbl>aR(2oMcy}ByWpv1iCB)*o4zw^zVf}n5U01nQ<XKf-R1Aa$2tWF%2@ronzj$-4Y|qIH z!HZq?5mJ29>~I`)PXxfwn#fvItwQJfe2$=|9F~vTEMi09&Jj^n`)qSmgO@X}7}bIkiW*^MH$c>I^b0eX{(pM8_uatK4903kz%gi644@INdsgs$yr@nJ6C-tnF5U1~L)0Z=^Txpm1lBw{adHjO?9d-r7}aqc)UIAJQf(m6oi z?&Oz?K)<{K$F^O~NQe;$#FdfLTC;e3EA{dekj`ocXNB27L;=24{?%Z8SAlEKfqB|4 z?f90AMjh0Ddn#HQk1DIrMoPn5{ex2|(MHHP1f(4PL6H_W#&~P6GD=66&pT@hJDZan|jb zls%;#QIi5#1O(2Zb9agpn9}-j`={C6djgr5+UcDH3BO=-t@X|ke@Vy)KYnrPRqVM! zBQu5+o71kScC?Yin<-*|0G*pnaxqSSl`c|>3VG!<`;)g%XQE!yt*me4s`;!0?dVRW zX{9dEn5BcrcmP8CYXRH~%?T^z`Uku+G0=cYAlyJ16MvJqH|GqKlG7K9t%?s5J-maA z*B@qdZ=Uvp7t#}jO|`SU@_L|3jE|cll)fjeARSNQ;b5AJ)Ga&JU2%EdiQ?VaykS=>H9$8NjmnC(f8uh8;_ zZ}Dsz?M9saj;c0JkI%<$X43~H_E}@?g(nf$2{iJW-Vlt=o8|M!(j_k=Jj;A#vo#IEHr1|Z z9YE87O&xH}BHGmqtjM8TDLALgDPg4pUlRE8#&IFKaCG7+%kzsh0<{Y`hY5ByIa#0X ztabqpwWTAQU?RqHomWQE@N-mW<1V8GtpbwNeIZMcI6At&HcG#)eP3%+Hg>ecS-lEzeImt{0K1!V{wQwp2(GokIl0wvSY6ms z;6d9s(**U9fCj>Bi7r1iJ_>-$dFPq^`0�U*lU5|j0SlRO&n>e7L{fk!?+(NGDbxf3YPI0cRrGI2I*lc?lsn!Yzq>+c>O+=^AjXF6@Y4HC3s z$oDQJeNpAPC5Wk&)&kHMR4*yM(hG8ucz%t!aa~`OxMz0vA%;oV)OdTbJ>5FV0fqu7 z_`sfk4Nwy4z7XP@e<^7hV^M-k*74T8Dm>NMI)8g*FrNk00n7zZVQv~Eg3zQ16Kfot z(!FY;>T71BBtnsD`BJ}9O2RqUGts09T~8*46x+??&-BP+rlHy>YT=#AFWMV77(u9z zGB)5YyAaVzf+p~i-{Xg{) zXREDGBd({SBo?rsfH*{A`|r{ufd!e*{{&)TEX9U`=lmZLIm3*Uak8T)kGY9QbXJ>x zZzG8wVK|#gu@D`a9K}3ggS#|GY#e{(I)Usc4J{9p??IrzKlaM6=NAd%F-z~m13MHc!Mu~*p^j3Fg)oHMF<%mF49Xm84lV7*FkyfK6aV$<+ z7B{ldV((dzkxRH!ga~`8Jtz!FnN(}bd&jpWE?!M@tJ#%``)MMz0uvKtDN3%|_oL_U zljAZsgWG3)U-*hsQZ}NQ_YG;?}%4XAw;C|%; zk-D&0Q34H_W&4A)Tp3tGTx~coVChu7nJNOJnarDA;*RCUGkcXtad~)>nb#v2`7{J7 zv{_CWYOFPHEMch{l6mKOETp{Zbj9HbPJ!2cn%wH5&oLhp^b}c-?JP;Gy*E7hsSCJ^ zOiU%PhG`?2&0|a!u~LsE9awrT%#`T0Tf*$8^=`?yh5)Ay_7bL6&QFg{mea|c-jvKp6T7v4hJ$ljPD4Th(+zcR0 z*O3Dd>&J^%8wQ1(YRBl^50*1*xODlt7D5k&WgZ7Zgip8_P1CN_5_1 zR!+OTk^#JILf=ZBHbl5B1e3AeyZemg%4{5}0runLx+vj~3I3iDO-`6z~Ib|Ii6mv*_6j;h^p*2D;l+wTj=XZlm}T18;%VHUQ+P4md|vb zM`Zvg3(AFu>cHz@jEbelq?-5lAl2u_OFM%Xt1La)k6CoEE0Dcn*sN_=;>Ip3=f5Ny zAr{DJ08zQIrMb@6l9z5L)U=maAEJ`br~I#_r}MT3jLc%89b_dG;6WnV>ITjv7R0p@K5qv8&6<5_JlGPi9)^T}Hb?eY>Ec^;Y;}=s5}Y zeAZe!$lJ*0Lh`->=fx`fmj!^@RcxS}7%)AK((^T67y(y3tiI293AG>Jzd_eCyXQd) zNIn7aq(;Jq()iWO1(Csvu!1Pt=Uv@9O5>`UssT?HGlYOy;yM#buTbknAR>=cxt%!D z0UK}-lbhW<9}ldKS9K3!TRL0!w`=%7U6rzP2Qbe34CEtqC-E$s*jSY&c!rO&xonpN7 ze@$1a$VLFpO@kvLE1@8N~ zONv?N-hWp&LR`1(_SC>p*ou=>@$IE%WCRmayNx1lVok1VpZGMtVMLCXq-DwAh6b%N;+&Sq&%i6d0%`*Lh3fI2%xh=N5yhw8La~>C?pGv+lzua zs!-)(&fC!H3O6joJW?R&bGn2XAF`9F&Eelp?{5i-5G7PJeVp!VFUW5*x6Q~YlY>*O zlv2-`+f6wDtn0kM?V$3=sE%=3y>Y*89)_a5mF>e%(sTxI-T{zK3(S_89DSA4|gNOPDr~BaA)rbJ6&TfY38|?@(thKorgY9`e z%oH0aN!~QALnlROn{tEz#O?aSz1(hKG6o?hFqk3-SosDwGxq%6$27k+9Pm^8LsW&V z1s=h`I8S)ix&jie_VR`=@3%Lig|n~5wZw;64NDoG$xCc=Q(e;?k$S)GJ7PydX-7`H z_IAJcVuSU{=4oksnB7ub*@>a(80ihi5OxvbmZUe8Ro*iW{u_=24{r3)4PaSQuwFM@Yw;9U^?d7AMClK8G zGcAWhyI#ly38QtfM#EvWv;AU4aR$j-1|@Tw>6?uG1%Q;RhL5zg##SL)eLR}^itVQ% z^;$fwD{Ij8j4Tr6T*X;!KnE0N+){f@`+u&%e-TB^y+gYQgdD+W|5n<7@6rp1yGSs1 zp+H)*VB~q-ErI+|AZ_HB{mVpBvu<&hc-&O)ODQU2K!PhgVCD~+MIIC^Bj+rp)Q*T!0KskIFS6N-tS&Z8&jv?hV5(Niz0>BWPiCfzp(J1ewbW(~| z1lW6}YxgRIjrz?D0R?)UXuY^8y{}>$0iYAPWyL3;o|pEX)slu1U+df6T7F0ed7!x( z27t_9u_TBN9H+@&lU*=gp5*{fx_Z{ZsH9ISn1SeGBdj#*I)DHQu&8-MYB(*N&Ci6z z0lsq|^eA$tn13`SfV4N863HN&aVxsMp$kn$U9(|g*g0J<}HQ($41OP)jA?GBCj!@L@> z5COWSSY#j}4(6k4rPWjFXfU`L22@@`Y2xBVr6{*iVYbhJbed?1@kL2VnNQ3J?>{QP zk|j=S;Khf*szk|g2DEklKUO8?Uu!p>{@X6>lb#8s3T&R%t*ExJdv=jx4HjCiWN9as zcRycv2-QUFRmMXx?krbWADB8tla_fHZLn437u#sZpA%=B$9y`5ZR510E3A)pILN|= zsr-*6(xkl^lX&SvMU$^rJ2LCOVVk0g^p3RFNoj$V*w2;lVx}8cBbHxDu_eJf>!0jM z42sVbIM@@jKAb0w_3Gkw&)h0F*RJx9Fq;0wds?e0jNtnS-Ft#i;Le2q?#J4QP?Fv1 zP#zq%-T#XFHk(d(Bu4@jGBSmQ`+qd)`EPTZm!d!Hzs3G_PS_u(#6Yxp*M|5oxG7@G zg%>_sqyym&|C0ryBWddXi8DUI@*v0>WnS7ECCvTjwq@4^hwtLWoTKM_m~yoC~se(kxjaQLn5*a-L;v1H@NtCbO-L_T?d zm6!pvcCO=JNB=J3H{+WkcEWXDi~e}^V&3nhrjI_+!2$Q* zEFf4l`xyJ>nzvYK znDT`mK7lx~!S?dkYZj(!jpx^dGoD$67&ZxiB>yae?TZe73#eyNwAzK=_?D*$&akHt zcOlywU!PiD?2lYfd<=$Y11RoWzTF?WNDp27>DMxJd}a;+PxZ!?XHr2Jw{UI2rsbw362M9eQdC@7hIf6&-( zS!@AAH8%d?m;Z$@HFiYNJ?JliIZ+H)a*XaJ@xo_sExZ!Fn$CwvLX(- z{4=wC+UN`iRfr@TWsS`YxY1Hc0BHD6(7r%=Pa#(f3I0Ck%1iSr8HV!n-bA(uEw8t( zL0pgg09PT#l|CTg-B}pdvg2e$I5CtBuS~IXno1XNn(1|tB~Z~1Xcv)QKGMrA&!NBT zfAUkz(tT>pu{QHMU%hjAmkpbuvP5}Xl@sWZYZv3+|gbkVlQI;@tWsU3@v(f`ikwklD);2H@V~ir3V5DpU&q4N;>07!)u5WsiqWHfqmR(87*w-fY6q(=1^1);*Rtx^XGO3 z9;R~Qw57m@2#wTnVH_B#!HHS*q-WKy+l#R|S;CbaS$$13y&IMQ{EYKi?WvNBwcUpO z>ioY=(tKFQVIh$7xta}DP{)rJG^2_s5#gg*ADnyVc?QfZrr!E2;yUsJLxq^e`d+Vi zNwjP={C3=J@(Rp}+;4p~(M8GQ2gn!b0fCsa& z*_KmkUcCxljbXxQ1j6{`gjMbP$%!582sZ_M-?Y5T_Fkzu3BKW4gZ2BMLGmk=aoFeH z1M8WY4K}H~9yQYJIfeiW-uCq#(4Kl+Jvq4MDR^;W3_nDiD7Dlq6|jDK9c&r5e|VPC|Lnr+p~LTwyPjYm*1Qgo^#?RL zBH}vyX;;giIoq#e&98&Zrqn6hD|aItFw(V+$e)y#oPYk|7ckSDRfsX;GxFWw$&=o9 z5HbIK1r6RXSmsR-ZV#T-8WpCM8#D*)+3WeG`A+*1MPjw{OA-kz8Vou!R2yJ+$@_cy{hu&Y^h z+HHu2`O=Ttn8(J;3dcxsFf!FZ8G5$1XUfww{1!iC#7#917@&57sfJ zc35^mhFuo!=X)k6qt--Yu!!s~#q%lh-J_>}h5c$v@K=IaY#k}lxn8y(q*jAS`Ge7} zr2fD3^B5q)ZXX1ZT?R74WsEJlTIq_?2iw`#KZh zQ^-#ws{!W+Uy}g@=`86CqL)C3r_l~cvKu@=#sfKW0cj$M==UD1w@>qXl)RYQZIw8$ zx}~+8tD4Udie^E6PW{Orao2@r)y_CJCzvPkR-*J^5cMFp01TA;D}8lNbfeU4&lxIc zvrRDD9U#f?N(q&j(TN&ux;^@xNFQf76Ezmx@~!7#Y=aYE=l~h6q`AlJrDAD}Rp`0* z8SdYB-c=w`MXebiK665~)cq$EVZCmY>Kv*a#Emhx_J1lMsFO0v_zVD%vab2{vXNdM z_i`b{m|5rDC+Xsi>^RgQ6PLi52h=wVmPgs^SUO8L8tCah<0+KZns%RY@jbVI+Z8cT z27g8~(s?;oeMJ3BsM)J+Vzo$KRxMWD?wRA1g&h1BC74H_zp&jt9%(qs^aqRhiO`DU zY_G{~c1G=z9#eX@?5cZItEgHd10DbtTobqJ6k(+t>TW`|mdB}Z-s0GnkQANaETC2=|7W!nd}m#y zlg5(YRYAyjNC495^J)IAEqRe#CU1C4i}U4XlNgtuf$I~~I^|XIc7YvEby)Fi?LNdM zCr6ZuTANhgO+k)=@H(uOchG5DQQ1~9(fuhHZ+b`Joc^$YFqUPi6!%26$oMYM7Llpg zl>`lGi6D@4j%5oxy@70Qm|Nz zm$}H$rivu2#}#9j@%EfbyAf0aCJjaMFeZ%(_Va-i&*BKfjJQ_BUbhSq#{o}_T=n-a zWE0ju`fhho1MC}M#{d48zU4mzxta*yYir&BKPL#&-~CKj9eg^jGU4@4e78@5%ZPXW NIpuBPKfU)a{{z3MCF}qI diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png deleted file mode 100644 index 289db16ed4529dafef09e02a9d1daee42a8cd85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128722 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

  • 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 B0^I-r diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest1.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest1.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d9d1f61110345b2f659d69ba1abdbf3e3629f3 GIT binary patch literal 40540 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest2.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb247a555736e9236a0d2427cbae88f4a39567f7 GIT binary patch literal 17203 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 oeP7tZ;$QU5&3L9ay3$-vCd;kCd literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png index 0d2b76cc7bb8b8565471fad4f62958cba598e55b..0ed9dbda328c5b1759d0c08ef3562d6b58ef5e7f 100644 GIT binary patch literal 30026 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 diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png index e33466b0fb8d7c95774a976fa76b5eb491869edb..883eecb0333ecc34b4be7225be11efe944172b53 100644 GIT binary patch literal 37103 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 I^V@&>AEp9l+W-In literal 13193 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 diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md index 268d34458db..30763cceeea 100644 --- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -1,12 +1,31 @@ -**The Class Design and Code Flow for ECL Watch Test Suite** +## The Class Design and Code Flow for ECL Watch Test Suite -**1. TestRunner.java** +### TestRunner.java -![img_2.png](TestRunner.png) +![img.png](TestRunner.png) The TestRunner class is responsible for setting up and executing automated tests using the TestNG framework in a -Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the -tests. +Selenium-based testing environment. It handles the initialization of logging and WebDriver, dynamically loads the +test classes to be executed, and runs the tests. + +Variables: +args: Command line arguments passed to the main method. While running the test suite, you can pass arguments in this way -> "-l log_level -p path". +- "log_level" is of two types "debug" and "detail" +- "debug" means generate error log file with a debug log file. +- "detail" means generate error log file with a detailed debug file. +- If no -l and log_level is passed in the argument, only error log will be generated +- "path" is the path of the folder where the json files are +- The code will log an error if the '-p' and 'path' arguments are not provided, as the JSON folder path is required for the test suite. + +path could be something like: + +for GitHub Actions -> /home/runner/HPCCSystems-regression/log/ + +for local machine -> C:/Users/nisha/Documents/Internship/Work/files/ + +So an example of complete CLI arguments would look like this: + +-l debug -p C:/Users/nisha/Documents/Internship/Work/files/ **Methods:** @@ -14,26 +33,14 @@ tests. The entry point of the application. It performs the following steps: -- Calls setupLogger to configure the logging system. -- Logs test execution details to a specified file. -- Calls setupWebDriver to initialize the WebDriver based on the environment (local or remote). -- Creates an instance of TestNG. +- Calls getLogLevelAndJSONFolderPath to get the log level and the path of JSON files from CLI arguments and configure them in the Config file. +- Calls Common.initializeLoggerAndDriver to configure the logging system and web driver. +- If the drives sets up properly and is not null, it creates an instance of TestNG. - Sets the test classes to be run by calling loadClasses. -- Adds a TestInjector listener to inject dependencies (logger and driver) into the tests. - Runs the tests using TestNG. - Quits the WebDriver session after the tests have completed. -2. setupWebDriver Method - -Initializes and returns a WebDriver instance configured for headless Chrome operation: - -- Configures ChromeDriver to run in headless mode, disables sandbox security, and sets log level to errors only. -- Suppresses logs generated by ChromeDriver. -- Checks if the tests are running locally using Common.isRunningOnLocal. -- If local, sets up the driver to connect to a local Selenium server. -- If not local, initializes a standard ChromeDriver. - -3. loadClasses Method +2. loadClasses Method Loads the test classes specified in TestClasses.testClassesList: @@ -41,18 +48,23 @@ Loads the test classes specified in TestClasses.testClassesList: - Adds the loaded class to the list classes. - Catches and prints any ClassNotFoundException. -4. setupLogger Method +3. getLogLevelAndJSONFolderPath Method -Configures the logger for logging test execution details: +This method is designed to parse command-line arguments to set the log level and the path to a folder containing JSON files. It validates the presence of these arguments and sets configuration values accordingly. -- Creates a logger for TestRunner. -- Sets up a FileHandler to log messages to a file specified by Config.LOG_FILE. -- Uses a SimpleFormatter to format the log messages. -- Adds the handler to the logger and sets the log level to ALL. -- Catches and prints any IOException. -- Turns off all logging from the Selenium WebDriver to reduce noise in the logs. +- It takes a single parameter, args, which is an array of strings representing the command-line arguments passed to the program. +- Two local variables, log_level and path, are initialized to null. These will hold the values extracted from the command-line arguments. +- A for loop iterates through the args array to examine each argument. +- The loop uses i as the index variable to traverse the array. +- Inside the loop, check if the current argument equals "-l". +- If "-l" is found and there is another argument following it (i + 1 < args.length), assign the value of the next argument to log_level and increment the index i to skip the processed argument. +- Similarly, check if the current argument equals "-p". +- If "-p" is found and there is another argument following it (i + 1 < args.length), assign the value of the next argument to path and increment the index i to skip the processed argument. +- After the loop, check if log_level is not null. If it is not null, assign its value to Config.LOG_LEVEL. +- Check if path is not null. If it is not null, assign its value to Config.PATH_FOLDER_JSON. +- If path is still null after the loop, log an error message indicating that the JSON folder path is required. Use Common.logError to log this error. -**2. TestClasses.java** +### TestClasses.java ![img_4.png](TestClasses.png) @@ -64,7 +76,7 @@ the test classes easily throughout the testing framework. By using the TestClass class, the framework can dynamically load and execute tests, enhancing modularity and maintainability. -**3. TestClass.java** +### TestClass.java ![img_3.png](TestClass.png) @@ -75,74 +87,74 @@ provides a structured way to store and retrieve information about each test clas which can be utilized by other components in the framework for dynamically loading and executing tests. -**4. TestInjector.java** - -![img.png](TestInjector.png) - -The TestInjector class in the framework.setup package implements the -IInvokedMethodListener interface from TestNG. This class is designed to inject -dependencies (such as a logger and a WebDriver instance) into test methods before -they are invoked. It ensures that these dependencies are available to the tests when -they are executed. The TestInjector class provides a way to set up the necessary -environment for test execution by using holders to manage the logger and WebDriver -instances. - -**Methods:** - -1. constructor - -An instance of TestInjector is created with a Logger and a WebDriver. +### URLMapping.java -2. Before Invocation +![img.png](URLMapping.png) -- Before a test method is invoked, the beforeInvocation method is called. -- It checks if the method is a test method. -- If it is a test method, it sets the logger and driver instances in their respective holders. +The URLMapping class in the framework.model package is a model that represents a URL +and its associated metadata. It provides a structured way to store URLs and their hierarchical +relationships, facilitating easy navigation and retrieval of URLs in a web application. -3. After Invocation +#### Variables: +- name: A String representing the name of the navigation element or tab. +- url: A String representing the URL associated with the navigation element or tab. +- urlMappings: A HashMap that maps the names of nested navigation elements or tabs to their corresponding URLMapping objects. -- After a test method is invoked, the afterInvocation method is called. -- Currently, this method does not perform any actions but can be extended for cleanup operations. +### Config.java -**5. WebDriverHolder.java** - -![img.png](WebDriverHolder.png) +![img.png](Config.png) -The WebDriverHolder class in the framework.setup package is a utility class designed to -manage a singleton instance of WebDriver. This class allows the framework to store and -access the WebDriver instance globally, ensuring that all test methods can utilize the -same driver instance. This class is used in the TestInjector class in the beforeInvocation() method. +The Config class in the framework.config package serves as a centralized configuration +repository for the application. It contains various constants that are used throughout +the framework, providing a single point of reference for configuration settings such as +file paths, file names, flags, and other constants. This approach enhances the maintainability and +readability of the code by avoiding hard-coded values scattered across different classes. -**6. LoggerHolder.java** +### URLConfig.java -![img.png](LoggerHolder.png) +![img.png](URLConfig1.png) +![img.png](URLConfig2.png) -The LoggerHolder class in the framework.setup package is a utility class designed to manage a -singleton instance of Logger. This class allows the framework to store and access the -Logger instance globally, ensuring that all test methods and other components can utilize -the same logger instance for consistent logging throughout the application. This class is -used in the TestInjector class in the beforeInvocation() method. +The URLConfig class is designed to manage the URL configurations for different navigation +and tab pages within the test cases. It provides a structured way to store and retrieve +URLs associated with various sections of the ECL Watch UI. This class uses constants to define +URLs and page names, and it leverages a HashMap to store URL mappings, facilitating easy access +to the URLs of different pages and tabs. -**7. Config.java** +- NAV_ACTIVITIES, NAV_ECL, NAV_FILES, NAV_PUBLISHED_QUERIES, NAV_OPERATIONS: Constants representing main navigation sections. +- TAB_ACTIVITIES_ACTIVITIES, TAB_ACTIVITIES_EVENT_SCHEDULER: Tab names under the Activities navigation. +- TAB_ECL_WORKUNITS, TAB_ECL_PLAYGROUND: Tab names under the ECL navigation. +- TAB_FILES_LOGICAL_FILES, TAB_FILES_LANDING_ZONES, TAB_FILES_WORKUNITS, TAB_FILES_XREF: Tab names under the Files navigation. +- TAB_PUBLISHED_QUERIES_QUERIES, TAB_PUBLISHED_QUERIES_PACKAGE_MAPS: Tab names under the Published Queries navigation. +- TAB_OPERATIONS_TOPOLOGY, TAB_OPERATIONS_DISK_USAGE, TAB_OPERATIONS_TARGET_CLUSTERS, TAB_OPERATIONS_CLUSTER_PROCESSES, TAB_OPERATIONS_SYSTEM_SERVERS, TAB_OPERATIONS_SECURITY, TAB_OPERATIONS_DYNAMIC_ESDL: Tab names under the Operations navigation. +- navNamesArray: Array containing all the main navigation names. +- tabsListMap: Map containing lists of tab names associated with each main navigation section. +- urlMap: A HashMap (urlMap) is created to store URL mappings. This map will use the page name as the key and a URLMapping object as the value. The URLMapping object contains the page name, its URL, and another HashMap for nested pages and tabs. +- A static block is used to initialize the urlMap with the initial URL mapping for the Activities navigation. The URL is retrieved using a method from the Common utility class, which handles the dynamic retrieval of the IP address based on the environment whether it is local or GitHub Actions. -![img.png](Config.png) +#### Implementation Steps for URL Management -The Config class in the framework.config package serves as a centralized configuration -repository for the application. It contains various constants that are used throughout -the framework, providing a single point of reference for configuration settings such as -file paths, IPs, and other constants. This approach enhances the maintainability and -readability of the code by avoiding hard-coded values scattered across different classes. +- For each main navigation section, a URLMapping object is created. This object includes the page name and its corresponding URL. Additionally, it contains another HashMap to store URLs for nested tabs and pages. +- Each URLMapping object is stored in the urlMap with the main navigation name as the key. This initial setup ensures that each navigation section has its base URL stored and accessible. +- For instance, for any navigation page, each page has multiple tabs, and within those tabs, there are multiple pages and tabs. This structure facilitates easy access to the URL of a particular page. +- Starting from the Activities page, for each main navigation section, the code iterates over its associated tabs (as defined in tabsListMap). For each tab, a new URLMapping object is created and added to the HashMap within the corresponding URLMapping object of the main navigation section. This creates a tree-like structure, allowing easy access to URLs for both navigation sections and their nested tabs. +- By following these implementation steps, the URLConfig class ensures that all URLs within the application are well-organized and easily accessible through a hierarchical structure. This setup simplifies navigation and URL management within the application, making it easier to handle complex page structures and dynamic URL retrievals. -**8. Common.java** +### Common.java ![img.png](Common.png) The Common class in the framework.utility package provides a set of utility methods that are frequently used throughout the testing framework. These -methods handle common tasks such as checking for text presence on a webpage, -opening a webpage, and determining the environment in which the code is -running (local or GitHub Actions). The class leverages constants from the -Config class to maintain consistency and facilitate configuration management. +methods handle common tasks and leverages constants from the Config class to maintain consistency +and facilitate configuration management. + +Variables: + +- driver: This public static variable stores the WebDriver instance used for interacting with the web browser. +- errorLogger: This public static variable stores a logger instance used for logging error messages. +- specificLogger: This public static variable stores a logger instance used for logging specific messages +based on the provided level (debug or detail). **Methods:** @@ -177,15 +189,93 @@ Determines if the code is running on a local environment. - Checks if the user profile path starts with the value of Config.LOCAL_USER_PROFILE. - Returns true if both conditions are met, indicating a local environment; otherwise, returns false. -5. getUrl Method +5. getIP Method -Constructs the full URL based on the environment (local or GitHub Actions). +The getIP method determines the appropriate IP address to use based on whether the application +is running in a local environment or in a GitHub Actions environment. +This helps in dynamically adjusting the base URL of the application depending on the +execution context. - Calls isRunningOnLocal to check the environment. -- If running locally, returns the URL prefixed with Config.LOCAL_IP. -- If running in GitHub Actions, returns the URL prefixed with Config.GITHUB_ACTION_IP. +- If running locally, returns the URLConfig.LOCAL_IP. +- If running in GitHub Actions, returns the URLConfig.GITHUB_ACTION_IP. + +6. waitForElement Method + +- This method waits for a web element to be present in the DOM. +- Uses WebDriverWait to wait up to 10 seconds for the presence of the specified web element. + +7. logError Method + +- This method logs error messages. +- Prints the error message to the standard error stream. +- Logs the message using errorLogger. + +8. logDebug Method + +- This method logs debug or detailed messages. +- Prints the message to the standard output stream. +- Logs the message using specificLogger if the logging level is INFO or FINE. + +9. logDetail method + +- This method logs detailed messages. +- Prints the message to the standard output stream. +- Logs the message using specificLogger if the logging level is FINE. + +10. initializeLoggerAndDriver Method + +- This method initializes the logger and WebDriver instances. +- Sets up the specificLogger based on the provided argument. +- Sets up the WebDriver instance using setupWebDriver() method. + +11. setupWebDriver Method + +- This method sets up the WebDriver instance based on the environment. +- Configures ChromeOptions for headless mode, no sandbox, and suppressed log output. +- Sets up the WebDriver based on the environment (local or GitHub Actions). +- Logs an error message if an exception occurs during setup. + +12. setupLogger Method + +- This method sets up a logger instance based on the provided log level. +- Configures the logger to disable console logging and set up file handlers for different log levels (error, debug, detail). +- Turns off all logging from Selenium WebDriver. +- Logs an error message if an exception occurs during logger setup. + +13. getAttributeList Method + +- This method retrieves all attributes of a web element. +- Uses JavaScriptExecutor to extract all attributes of the web element. +- Logs an error message if an exception occurs during attribute extraction. + +14. sleepWithTime Method + +- The sleepWithTime method pauses the execution of the current thread for a specified number of seconds. +- It is a simple utility method used to introduce a delay in the execution flow. +- Used to wait for a certain condition or state before proceeding with further execution. + +15. waitForElementToBeClickable Method + +- This method waits until the specified web element is clickable. +- A WebDriverWait instance is created with a timeout duration specified by Config.WAIT_TIME_THRESHOLD_IN_SECONDS. +- The method waits until the element is clickable, using Selenium's ExpectedConditions.elementToBeClickable condition. +- It is useful in scenarios where an element needs to be interacted with, but it might not be immediately clickable due to loading times or other conditions. -**9. TimeUtils.java** +16. waitForElementToBeDisabled Method + +The waitForElementToBeDisabled method waits until the specified web element is disabled by checking its aria-disabled attribute. +The attribute "aria-disabled" is part of the Accessible Rich Internet Applications (ARIA) specification, which is used to improve the accessibility of web pages. +aria-disabled is a standard attribute and is widely used in HTML to indicate whether an element is disabled. It is system-defined, meaning it is part of the standard +HTML specifications and not a custom class or attribute that might change frequently. By using aria-disabled, you ensure that the check for the disabled state is +consistent and less likely to break due to UI changes. Custom class names or attributes defined by developers can change frequently during updates or redesigns, +but standard attributes like aria-disabled are much more stable. + +- A WebDriverWait instance is created with a timeout duration specified by Config.WAIT_TIME_THRESHOLD_IN_SECONDS. +- The method waits until the aria-disabled attribute of the element contains the value "true", indicating that the element is disabled. +- Ensures that an element has transitioned to a disabled state before proceeding with further actions. + +### TimeUtils.java ![img.png](TimeUtils.png) @@ -216,7 +306,7 @@ malformed time strings. returns Config.MALFORMED_TIME_STRING. - If the parsing is successful, the method calculates the total duration in milliseconds -**10. NavigationWebElement** +### NavigationWebElement ![img.png](NavigationWebElement.png) @@ -238,7 +328,7 @@ elements. - The NavigationWebElement class offers a structured way to manage data related to navigation elements in a web application framework. -**11. Java Classes for Representing Workunit JSON Data** +### Java Classes for Representing Workunit JSON Data This section details the class structure used to map JSON data file of list of "Workunit" entities into Java objects. These classes provide a clear representation of the data and @@ -254,7 +344,7 @@ workunits JSON file. ![img.png](ApplicationValues.png) ![img.png](ApplicationValue.png) -**12. ActivitiesTest** +### ActivitiesTest ![img.png](ActivitiesTest.png) @@ -269,192 +359,681 @@ Activities page: - textArray: A static final String array containing expected text elements to be present on the Activities page (e.g., " Target/Wuid", "Graph"). -- navNamesArray: A static final String array containing names used to locate the navigation link WebElements on the - Activities page (e.g., "Activities", "ECL", "Files). -- tabsListMap: A static final Map that defines the expected sub-tabs for each navigation link. The key is the navigation - link name, and the value is a List of expected sub-tabs. **Methods:** 1. testActivitiesPage (Test Method) -- Obtains the WebDriver instance (WebDriverHolder.getDriver()). -- Opens the Activities page using the URL from Config.ACTIVITIES_URL and Common.openWebPage. -- Retrieves a Logger instance for logging test results (LoggerHolder.getLogger()). -- Calls testForAllText to verify the presence of expected text elements on the page. -- Calls getNavWebElements to retrieve a list of NavigationWebElement objects representing navigation links. -- Calls testForNavigationLinks to verify the functionality of navigation links. +- This is the main test method annotated with @Test to be run as a test case. +- Initializes the WebDriver instance. +- Use the Common.openWebPage method to navigate to the URL of the Activities page, retrieved from the urlMap. +- Logs the start of the tests for the "Activities" page. +- Calls testForAllText(driver) to check for the presence of predefined texts. +- Retrieves the navigation web elements by calling getNavWebElements(driver). +- Calls testForNavigationLinks(driver, navWebElements) to test the navigation links. +- Logs the completion of the tests for the "Activities" page. 2. testForAllText Method -- Iterates through the textArray. -- For each text element, calls Common.checkTextPresent to check its presence on the Activities page using the provided - WebDriver, text element, page name ("Activities Page"), and Logger instance. +- This method checks if specific texts are present on the "Activities" page. +- Logs the start of text presence tests. +- Iterates over each text in textArray. +- Calls Common.checkTextPresent(driver, text, "Activities Page") to verify the presence of each text on the page. 3. testForNavigationLinks Method -- Takes the WebDriver instance, a list of NavigationWebElement objects, and a Logger instance as arguments. -- Iterates through the list of NavigationWebElement objects: - - Clicks on the WebElement using the webElement().click() method. - - Calls testTabsForNavigationLinks to verify if the expected sub-tabs are present for the clicked link. - - Logs success/failure messages based on the verification result using the Logger instance. +- This method tests each navigation link to ensure they direct to the correct pages with the expected tabs. +- Logs the start of navigation link tests. +- Iterates over each NavigationWebElement in navWebElements. +- Clicks on each navigation element and verifies the presence of corresponding tabs by calling testTabsForNavigationLinks(driver, element). +- Logs success if all tabs are present; otherwise, logs an error with the current page details. +- Catches and logs any exceptions that occur during the process. 4. getCurrentPage Method -- Iterates through the tabsListMap. -- For each entry (navigation link name and its corresponding sub-tabs): - - Checks if all sub-tabs from the list are present in the current page source using driver.getPageSource(). - - If all sub-tabs are found, returns the navigation link name (current page). -- If no matching navigation link is found, returns "Invalid Page". +- This method determines the current page by checking the presence of specific tabs. +- Iterates over each entry in tabsListMap. +- Checks if all tabs for each page are present in the page source. +- Returns the page name if all tabs are present; otherwise, returns "Invalid Page". 5. testTabsForNavigationLinks Method: -- Takes the WebDriver instance and a NavigationWebElement object as arguments. -- Retrieves the expected sub-tabs list for the navigation element from tabsListMap. -- Gets the current page source using driver.getPageSource(). -- Iterates through the expected sub-tabs list: - - Checks if each sub-tab is present in the page source. - - If any sub-tab is missing, returns false. -- If all sub-tabs are found, returns true. +- This method verifies the presence of tabs for a given navigation element and updates the URL map with the tab URLs. +- Get the list of tabs associated with the navigation element from URLConfig.tabsListMap. +- Loop through each tab in the list. +- Use Common.waitForElement to wait for the tab element to be present in the DOM. +- Add the tab's URL to the urlMap under the corresponding navigation element. +- If a timeout exception occurs, return false. Otherwise, return true. 6. getNavWebElements Method: +- This method retrieves the web elements for the main navigation links on the Activities page. - Creates an empty list to store NavigationWebElement objects. -- Iterates through the navNamesArray. +- Iterates through the URLConfig.navNamesArray. - For each navigation link name: - Finds the WebElement using driver.findElement with By.name strategy. - Extracts the href attribute value. - Creates a new NavigationWebElement object with the name, href value, and WebElement reference. - Adds the NavigationWebElement to the list. + - Add the navigation element's URL to the urlMap. + - Log any errors that occur during the process. - Returns the list of NavigationWebElement objects. -**13. BaseTableTest** +### BaseTableTest -![img.png](BaseTableTest.png) +![img.png](BaseTableTest1.png) +![img.png](BaseTableTest2.png) -This abstract class, `BaseTableTest`, in the framework.pages package, provides a framework for -testing web pages that display tabular data. It defines methods for common functionalities like: +The BaseTableTest class is designed as a superclass for testing web pages containing tabular data. It is intended for use in automated tests, +particularly for pages like workunits, files, and queries, and includes functionality for testing their respective details pages. +It defines methods for common functionalities like: - Verifying the presence of expected text elements on the page. - Comparing the content displayed in the table with corresponding data from a JSON file. - Testing the sorting functionality of the table columns. - Verifying links within the table cells and their navigation behavior. +- Testing common details functionality, such as tab clicks. **Abstract Methods:** -1. `getPageName`: Returns the name of the page under test. -2. `getPageUrl`: Returns the URL of the page under test. -3. `getJsonFilePath`: Returns the file path of the JSON file containing reference data. -4. `getColumnNames`: Returns an array of column names displayed in the table header. -5. `getColumnKeys`: Returns an array of unique keys used to identify table headers. -6. `getUniqueKeyName`: Returns the name of the unique key used to identify table rows. -7. `getUniqueKey`: Returns the unique key value for the current row (used for logging). -8. `getColumnKeysWithLinks`: Returns an array of column keys that contain links within the table cells. -9. `parseDataUIValue`: Parses and pre-processes a data value extracted from the UI table. -10. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the JSON file. -11. `parseJson`: Parses the JSON file and returns a list of objects representing the data. -12. `getColumnDataFromJson`: Extracts a specific data value from a JSON object based on the provided column key. -13. `sortJsonUsingSortOrder`: Sorts the list of JSON objects based on a given column key and sort order. -14. `getCurrentPage`: Retrieves the name of the current page displayed in the browser. +These methods must be implemented by subclasses to provide specific information and functionality for the page being tested: + +1. getPageName(): Returns the name of the page. +2. getPageUrl(): Returns the URL of the page. +3. getJsonFilePath(): Returns the file path for the JSON data file. +4. getSaveButtonDetailsPage(): Returns the text for the save button on the details page. +5. getColumnNames(): Returns an array of column names displayed in the table. +6. getDetailNames(): Returns an array of detail names for the details page. +7. getColumnKeys(): Returns an array of column keys for accessing data. +8. getDetailKeys(): Returns an array of detail keys for accessing data on the details page. +9. getCheckboxTypeForDetailsPage(): Returns the attribute type for checkboxes on the details page. +10. getAttributeTypeForDetailsPage(): Returns the attribute type for elements on the details page. +11. getAttributeValueForDetailsPage(): Returns the attribute value for elements on the details page. +12. getDetailKeysForPageLoad(): Returns an array of detail keys to check when the details page loads. +13. getUniqueKeyName(): Returns the unique key name for identifying data. +14. getUniqueKey(): Returns the unique key used for identifying data in the table. +15. getColumnKeysWithLinks(): Returns an array of column keys that contain links. +16. parseDataUIValue(dataUIValue, dataJSONValue, columnName, dataIDUIValue): Parses the UI data value. +17. parseDataJSONValue(dataJSONValue, columnName, dataIDUIValue): Parses the JSON data value. +18. parseJson(filePath): Parses the JSON file and returns a list of objects. +19. getColumnDataFromJson(object, columnKey): Gets column data from a JSON object. +20. sortJsonUsingSortOrder(currentSortOrder, columnKey): Sorts the JSON data using the specified order and column key. +21. getCurrentPage(): Returns the current page. +22. getJsonMap(): Returns a map of JSON data. +23. getColumnNamesForTabsDetailsPage(): Returns a map of column names for tabs on the details page. +24. getTabValuesForDetailsPage(): Returns an array of tab values for the details page. +25. testDetailSpecificFunctionality(name, i): Tests specific functionality on the details page. **Non-Abstract Methods:** -1. `testPage`: The main test method that orchestrates all other functionalities to test the target web page. +#### Method: `testPage()` + +This method initiates and executes a series of tests on a web page. + +1. **Open the Web Page**: The method begins by opening the specified web page using `Common.openWebPage(getPageUrl())`. + +2. **Logging**: It logs the start of tests for the page with `Common.logDebug`. + +3. **Test for All Text**: The method `testForAllText()` is called to verify the presence of expected text elements on the page. + +4. **Retrieve JSON Objects**: It retrieves all JSON objects using `getAllObjectsFromJson()` and stores them in `jsonObjects`. + +5. **Dropdown Selection**: If `jsonObjects` is not null, it determines the number of items in JSON (`numOfItemsJSON`) and uses `clickDropdown(numOfItemsJSON)` to select the appropriate dropdown value for displaying items on the page. + +6. **Content and Sorting Tests**: The method `testContentAndSortingOrder()` is called to verify the content and sorting order of items on the page. + +7. **Link Tests**: It calls `testLinksInTable()` to test all the links in the table present on the page. + +8. **Logging**: Logs the completion of tests with `Common.logDebug`. + +9. **Exception Handling**: Catches any exceptions that occur during the test and logs the error with `Common.logError`. + +#### Method: `testDetailsPage(String name, int i)` + +This method tests various aspects of a details page for a specific item. + +1. **Test Detail Page Field Names**: Depending on the configuration `Config.TEST_DETAIL_PAGE_FIELD_NAMES_ALL`, it calls `testForAllTextInDetailsPage(name)` either for all items or just the first item. + +2. **Details Content Page Test**: It calls `testDetailsContentPage(name)` to verify the content of the details page. + +3. **Detail Specific Functionality Test**: The method `testDetailSpecificFunctionality(name, i)` is called to test specific functionality on the details page. + +4. **Test Tab Clicks**: Depending on the configuration `Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL`, it calls `testTabClickOnDetailsPage()` either for all items or just the first item. + +#### Method: `testTabClickOnDetailsPage()` + +This method tests the functionality of clicking through different tabs on the details page. + +1. **Logging**: Logs the start of the tab click test with `Common.logDebug`. + +2. **Wait for Page Load**: Calls `waitToLoadDetailsPage()` to ensure the details page is fully loaded. + +3. **Iterate Through Tabs**: For each tab value retrieved from `getTabValuesForDetailsPage()`: + - It tries to find the tab button element and clicks it using `javaScriptElementClick`. + - It then calls `testPresenceOfColumnNames(getColumnNamesForTabsDetailsPage().get(tabValue), tabValue)` to verify the presence of expected column names for the selected tab. + - If an error occurs, it logs the error with `Common.logError`. + +#### Method: `javaScriptElementClick(WebElement element)` + +This method clicks a web element using JavaScript. + +1. **Execute Script**: Uses a `JavascriptExecutor` to click the specified web element by executing the script `arguments[0].click();`. + +#### Method: `testPresenceOfColumnNames(List columnNames, String tabValue)` + +This method verifies the presence of specific column names within a tab on the details page. + +1. **Check Column Names**: For each column name in the provided list: + - It waits for the element containing the column name using `Common.waitForElement(By.xpath("//*[text()='" + columnName + "']"))`. + - If a `TimeoutException` occurs, it logs an error and sets a flag `allPresent` to false. + +2. **Logging**: If all column names are present, it logs success with `Common.logDetail`. If any column name is missing, it logs an error. + +#### Method: `clickOnSaveButton()` + +This method handles the action of clicking the save button on a details page. + +1. **Wait for Save Button**: It retrieves the save button element using `getSaveButtonWebElementDetailsPage()` and waits for it to be clickable with `Common.waitForElementToBeClickable`. + +2. **Click Save Button**: Clicks the save button. + +3. **Wait for Save Completion**: Waits for the save button to become disabled using `Common.waitForElementToBeDisabled`. + +#### Method: `testLinksInTable()` + +This method tests the functionality and navigation of links present in a table on the page. + +1. **Logging**: Logs the start of the link tests with `Common.logDebug`. + +2. **Iterate Through Columns with Links**: For each column key with links retrieved from `getColumnKeysWithLinks()`: + - It retrieves the data values from the UI using `getDataFromUIUsingColumnKey(columnKey)`. + - For each value, it tries to find and click the corresponding link element. + - After clicking, it checks if the page source contains the name to confirm successful navigation. + - Logs success or failure based on the result. + - It then navigates back to the original page and refreshes it. + - It verifies if the dropdown value remains unchanged after navigation. + +3. **Exception Handling**: Catches any exceptions during the link tests and logs the errors. + +#### Method: `waitToLoadDetailsPage()` + +This method ensures the details page is fully loaded by waiting for specific elements to be visible. + +1. **Initialize Wait Time**: Starts with an initial wait time specified by `Config.WAIT_TIME_IN_SECONDS`. + +2. **Check Element Visibility**: Repeatedly checks the visibility of detail keys retrieved from `getDetailKeysForPageLoad()`: + - Waits for each element by its ID using `Common.waitForElement`. + - If any element's attribute is empty, it continues waiting and increments the wait time. + +3. **Logging**: Logs the total wait time used to load the details page with `Common.logDebug`. + +#### Method: `testDetailsContentPage(String name)` + +This method tests the content of a details page for a specific item. -- Opens the target webpage using the URL obtained from `getPageUrl`. -- Calls `testForAllText` to verify the presence of expected text elements. -- Calls `testContentAndSortingOrder` to compare table data and test sorting functionality. -- Calls `testLinksInTable` to verify links within table cells and their navigation behavior. +1. **Logging**: Logs the start of the content tests with `Common.logDebug`. -2. `waitForElement`: Waits for an element to be present on the page using explicit wait with a timeout. +2. **Wait for Page Load**: Calls `waitToLoadDetailsPage()` to ensure the page is fully loaded. -3. `testContentAndSortingOrder`: +3. **Compare Content**: For each detail key: + - It retrieves the corresponding web element and its value. + - Compares the value with the expected JSON value. + - Logs errors if there are discrepancies. -- Retrieves all objects from the JSON file using `getAllObjectsFromJson`. -- Clicks on the dropdown menu to select an appropriate number of items to display in the table. -- Calls `testTableContent` to compare the table data with JSON data. -- Iterates through each column: - - Calls `testTheSortingOrderForOneColumn` to test sorting functionality for the current column. +4. **Logging**: Logs success if all values match the expected values. -4. `testTheSortingOrderForOneColumn`: +#### Method: `testForAllTextInDetailsPage(String name)` -- Gets the current sorting order for the specified column using `getCurrentSortingOrder`. -- Extracts data from the UI table and JSON file for the specified column. -- Sorts the JSON objects based on the current sorting order using `sortJsonUsingSortOrder`. -- Compares the sorted JSON data with the extracted UI data using `compareData`. +This method tests the presence of specific text elements on a details page. -5. `getCurrentSortingOrder`: Gets the current sorting order (ascending/descending/none) for a specified column. +1. **Logging**: Logs the start of the text tests with `Common.logDebug`. -6. `getDataFromJSONUsingColumnKey`: Extracts a list of data values for a specified column from all JSON objects. +2. **Check Text Presence**: For each expected text element retrieved from `getDetailNames()`: + - Calls `Common.checkTextPresent` to verify the text presence on the page. -7. `getDataFromUIUsingColumnKey`: Extracts a list of data values for a specified column from all table cells (UI). +#### Method: `testContentAndSortingOrder()` -8. `ascendingSortJson`: Sorts a list of JSON objects in ascending order based on a specified column key. +This method tests the content and sorting order of items on a page. -9. `descendingSortJson`: Sorts a list of JSON objects in descending order based on a specified column key. +1. **Logging**: Logs the start of content tests with `Common.logDebug`. -10. `testTableContent`: +2. **Test Table Content**: Calls `testTableContent()` to verify the content of the table. -- Compares the number of items displayed in the UI table with the number of objects retrieved from the JSON file. -- Iterates through each column: - - Extracts data from the UI table and JSON file for the current column. - - Calls `compareData` to compare the extracted data. +3. **Test Sorting Order**: If the content test passes, it logs the start of sorting order tests and: + - Iterates through each column key and name. + - Calls `testTheSortingOrderForOneColumn(columnKey, columnName)` to verify the sorting order. -11. `getAllObjectsFromJson`: Parses the JSON file and returns a list of objects representing the data. Handles potential - exceptions during parsing. +#### Method: `testTheSortingOrderForOneColumn(String columnKey, String columnName)` -12. `compareData`: Compares a list of data values extracted from the UI table with the corresponding list from the JSON - file. +This method tests the sorting order of a specific column. -- Iterates through each data pair: - - Calls `parseDataUIValue` and `parseDataJSONValue` to pre-process the data (if needed). - - Calls `checkValues` to perform the actual comparison and handle mismatches. +1. **Retrieve Sorting Order**: Calls `getCurrentSortingOrder(columnKey)` to retrieve the current sorting order for the column. -13. `checkValues`: Compares two data values and logs an error message if they don't match. +2. **Compare Data**: If a sorting order is retrieved, it: + - Retrieves data from the UI and JSON. + - Sorts JSON data using the retrieved sorting order. + - Compares the UI and JSON data. + - Logs success if the data is correctly sorted; otherwise, logs an error. -**14. ECLWorkUnitsTest** +#### Method: `getCurrentSortingOrder(String columnKey)` + +This method retrieves the current sorting order of a column. + +1. **Find Column Header**: Locates the column header element for the specified column key. + +2. **Retrieve Sort Order**: Retrieves the current sorting order from the column header's attribute `aria-sort`. + +3. **Click to Change Sort Order**: Clicks the column header to change the sort order and waits for the sorting order to change using `waitToLoadChangedSortOrder`. + +4. **Return New Sort Order**: Returns the new sorting order. + +#### Method: `waitToLoadChangedSortOrder(String oldSortOrder, String columnKey)` + +This method waits for the sorting order to change after clicking a column header. + +1. **Initialize Wait Time**: Starts with an initial wait time specified by `Config.WAIT_TIME_IN_SECONDS`. + +2. **Check Sort Order Change**: Repeatedly checks the sorting order of the column header until it changes from the old sort order. + +3. **Return New Sort Order**: Returns the new sorting order once it has changed. + +#### Method: `getDataFromJSONUsingColumnKey(String columnKey)` + +This method retrieves data from JSON objects for a specified column key. + +1. **Iterate Through JSON Objects**: For each JSON object: + - Retrieves the column data using `getColumnDataFromJson`. + +2. **Return Data**: Returns the list of column data. + +#### Method: `getDataFromUIUsingColumnKey(String columnKey)` + +This method retrieves data from the UI based on a specified column key. + +1. **Initialize List**: Starts by creating an empty list to store the data. +2. **Load UI Elements**: Calls the `waitToLoadListOfAllUIObjects` method to get all web elements corresponding to the column key. +3. **Extract Text**: Iterates through the list of web elements (excluding the header) and adds the text content of each element to the list. +4. **Error Handling**: If any exception occurs, it logs an error message. +5. **Return Data**: Finally, returns the list of extracted data. + +#### Method: `waitToLoadListOfAllUIObjects(String columnKey)` + +This method waits until all UI elements corresponding to a column key are loaded. + +1. **Initialize Wait Time**: Starts with an initial wait time. +2. **Find Elements**: Uses a loop to repeatedly find web elements matching the column key's XPath. +3. **Check Element Count**: Checks if the number of elements (excluding the header) matches the number of JSON objects. +4. **Wait and Retry**: If the elements are not fully loaded, it sleeps for the current wait time, increments the wait time, and retries. +5. **Return Elements**: Once the elements are fully loaded, returns the list of web elements. + +#### Method: `ascendingSortJson(String columnKey)` + +This method sorts the JSON objects in ascending order based on a column key. + +1. **Sort JSON Objects**: Uses a comparator to sort the list of JSON objects by comparing the values of the specified column key. +2. **Error Handling**: If any exception occurs during sorting, logs an error message. + +#### Method: `descendingSortJson(String columnKey)` + +This method sorts the JSON objects in descending order based on a column key. + +1. **Sort JSON Objects**: Similar to `ascendingSortJson`, but uses a reversed comparator to sort the list in descending order. +2. **Error Handling**: If any exception occurs during sorting, logs an error message. + +#### Method: `testTableContent()` + +This method tests the content of a table by comparing the UI data with JSON data. + +1. **Log Number of Objects**: Logs the number of objects retrieved from JSON. +2. **Retrieve UI Data**: Calls `getDataFromUIUsingColumnKey` to get the data from the UI for the unique key. +3. **Compare Counts**: Compares the number of objects from JSON and UI. Logs an error if they are not equal and returns false. +4. **Initialize Pass Flag**: Initializes a flag to track if all comparisons pass. +5. **Iterate Through Columns**: For each column key: + - Retrieves data from UI and JSON. + - Calls `compareData` to compare the data and updates the pass flag based on the result. +6. **Return Result**: Returns the pass flag indicating whether all comparisons passed. + +#### Method: `getAllObjectsFromJson()` + +This method retrieves all objects from a JSON file. + +1. **Get File Path**: Retrieves the path of the JSON file. +2. **Parse JSON**: Calls `parseJson` to parse the JSON file and return a list of objects. +3. **Error Handling**: If any exception occurs during parsing, logs an error message. +4. **Return Data**: Returns the list of parsed objects. + +#### Method: `compareData(List dataUI, List dataJSON, List dataIDUI, String columnName)` + +This method compares the data from UI and JSON for a specific column. + +1. **Initialize Pass Flag**: Initializes a flag to track if all comparisons pass. +2. **Iterate Through Data**: For each item in the data lists: + - Parses the UI and JSON values. + - Calls `checkValues` to compare the values and updates the pass flag based on the result. +3. **Log Success**: If all comparisons pass, logs a success message. +4. **Return Result**: Returns the pass flag indicating whether all comparisons passed. + +#### Method: `checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, String columnName)` + +This method checks if the UI value matches the JSON value for a specific column. + +1. **Compare Values**: Compares the UI value with the JSON value. +2. **Log Error**: If the values do not match, logs an error message. +3. **Return Result**: Returns a boolean indicating whether the values match. + +#### Method: `clickDropdown(int numOfItemsJSON)` + +This method selects a dropdown value based on the number of JSON items. + +1. **Find Dropdown**: Locates and clicks the dropdown element. +2. **Wait for Dropdown List**: Waits for the dropdown list to become visible. +3. **Determine Selected Value**: Determines the smallest dropdown value greater than the number of JSON items. +4. **Select Option**: Iterates through the options and clicks the one matching the selected value. +5. **Wait for Invisibility**: Waits for the dropdown list to become invisible. +6. **Log and Refresh**: Logs the selected value and refreshes the page. +7. **Error Handling**: If any exception occurs, logs an error message. + +#### Method: `getSelectedDropdownValue()` + +This method retrieves the currently selected value of a dropdown. + +1. **Find Dropdown**: Locates the dropdown element. +2. **Retrieve Text**: Gets and trims the text of the dropdown element. +3. **Error Handling**: If any exception occurs, logs an error message. +4. **Return Value**: Returns the retrieved text. + +#### Method: `getSaveButtonWebElementDetailsPage()` + +This method retrieves the web element for the save button on the details page. + +1. **Locate Save Button**: Uses an XPath to find the save button element. +2. **Return Element**: Returns the located web element. + +#### Method: `testForAllText()` + +This method tests the presence of specific text elements on a page. + +1. **Log Start**: Logs the start of the text tests. +2. **Check Text**: For each expected text element: + - Calls `Common.checkTextPresent` to verify the text presence on the page. + + + +### ECLWorkUnitsTest ![img.png](ECLWorkUnitsTest.png) This class, `ECLWorkUnitsTest`, in the framework.pages package, extends the `BaseTableTest` class and specifically implements test cases for the ECL Workunits page within the ECL Watch UI. It inherits functionalities for common table testing procedures and specializes them for the -ECL Workunits data and behavior. - -**Override Methods:** - -1. `getPageName`: Returns the display name of the page under test ("ECL Workunits"). -2. `getPageUrl`: Returns the URL for the ECL Workunits page constructed using `Config.ECL_WORK_UNITS_URL`. -3. `getJsonFilePath`: Determines the file path of the JSON file containing ECL Workunit data based on the test execution - environment (local vs. GitHub Actions). -4. `getColumnNames`: Returns an array of column names displayed in the ECL Workunits table header. -5. `getColumnKeys`: Returns an array of unique keys used to identify ECL Workunit table headers. -6. `getColumnKeysWithLinks`: Returns an array specifying the column key that contains links within table cells ( - currently, only "Wuid" has links). -7. `getUniqueKeyName`: Returns the name of the unique key used to identify ECL Workunit table rows ("WUID"). -8. `getUniqueKey`: Returns the actual value of the unique key for the current row (used for logging). -9. `parseJson`: Parses the JSON file specific to ECL Workunits and returns a list of `ECLWorkunit` objects representing - the data. -10. `getColumnDataFromJson`: Extracts a specific data value from an `ECLWorkunit` object based on the provided column - key. -11. `parseDataUIValue`: Parses and pre-processes a data value extracted from the ECL Workunits UI table. -12. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the ECL Workunits JSON file (if - necessary). -13. `sortJsonUsingSortOrder`: Sorts the list of `ECLWorkunit` objects based on a given column key and sort order, - considering the specific sorting behavior for the ECL Workunits table (default sort is descending by WUID). -14. `getCurrentPage`: Retrieves the title attribute of the "wuid" element to determine the current page displayed. - -**Additional Methods:** - -1. `getCostColumns`: Returns a list of column names that represent cost-related data (Compile Cost, Execution Cost, File - Access Cost). - -**Test Method:** - -1. `testingECLWorkUnitsPage`: Calls the inherited `testPage` method to execute the core test logic for the ECL Workunits - page. - -**Class Relationship Structure:** +ECL Workunits data and behavior. It includes test cases for both the main page and the details page of the workunits. + +Here is the detailed explanation and implementation steps of the given methods without code snippets: + +#### Method: `testingECLWorkUnitsPage` +This method is a test method annotated with `@Test`, which indicates that it is a test case to be run using a testing framework like JUnit or TestNG. The method calls `testPage()` to execute the test logic for the ECL Work Units page. + +1. Annotate the method with `@Test` to indicate that it is a test case. +2. Within the method, call the `testPage()` method to perform the necessary testing actions on the ECL Work Units page. + +#### Method: `getPageName` +This method returns the name of the page being tested, which in this case is "ECL Workunits". + +1. Override the method to return the string "ECL Workunits". + +#### Method: `getPageUrl` +The getPageUrl method is designed to retrieve the URL of a specific page within the application. It overrides a method from a superclass, BaseTableTest, and provides the URL for the "Workunits" tab under the "ECL" navigation section. This URL is fetched from a pre-configured map of URLs. + +1. The method accesses the urlMap from the URLConfig class, which stores URL mappings for different navigation sections and their tabs. +2. The method fetches the URLMapping object for the "ECL" navigation section from the urlMap using URLConfig.NAV_ECL as the key. +3. From the URLMapping object of the "ECL" navigation section, the method retrieves the nested URL mapping for the "Workunits" tab using URLConfig.TAB_ECL_WORKUNITS as the key. +4. Finally, the method returns the URL associated with the "Workunits" tab. + +#### Method: `getJsonFilePath` +This method returns the file path of the JSON file containing Workunits test data. +Combine the directory path (Config.PATH_FOLDER_JSON) with the filename (Config.WORKUNITS_JSON_FILE_NAME) to form the complete file path. + +1. Override the method to return the local path `Config.PATH_LOCAL_WORKUNITS_JSON` if the test is running locally. +2. Return the CI/CD path `Config.PATH_GH_ACTION_WORKUNITS_JSON` otherwise. + +#### Method: `getColumnNames` +This method returns an array of column names to be displayed on the ECL Work Units page. + +1. Override the method to return an array of column names: "WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost". + +#### Method: `getColumnKeys` +This method returns an array of column keys corresponding to the column names used in the JSON data. + +1. Override the method to return an array of column keys: "Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost". + +#### Method: `getSaveButtonDetailsPage` +This method returns the label of the save button on the details page. + +1. Override the method to return the string "Save". + +#### Method: `getDetailNames` +This method returns an array of detail names to be displayed on the work unit details page. + +1. Override the method to return an array of detail names: "WUID", "Action", "State", "Owner", "Job Name", "Description", "Potential Savings", "Compile Cost", "Execution Cost", "File Access Cost", "Protected", "Cluster", "Total Cluster Time", "Aborted by", "Aborted time", "Services". + +#### Method: `getDetailKeys` +This method returns an array of detail keys corresponding to the detail names used in the JSON data. + +1. Override the method to wait for the element with ID "state" to load. +2. Check if the state value is in the list of bad states (`compiled`, `failed`). +3. If the state is in the bad states list, return a subset of detail keys: "wuid", "action", "state", "owner", "jobname", "cluster". +4. Otherwise, return the full array of detail keys: "wuid", "action", "state", "owner", "jobname", "compileCost", "executeCost", "fileAccessCost", "protected", "cluster", "totalClusterTime". + +#### Method: `getDetailKeysForPageLoad` +This method returns an array of keys to be used for loading the details page. + +1. Override the method to return an array of keys: "wuid", "state", "jobname", "cluster". + +#### Method: `getCheckboxTypeForDetailsPage` +This method returns the type of the checkbox used on the details page. + +1. Override the method to return the string "checkbox". + +#### Method: `getAttributeTypeForDetailsPage` +This method returns the attribute type used to identify elements on the details page. + +1. Override the method to return the string "type". + +#### Method: `getAttributeValueForDetailsPage` +This method returns the attribute value used to identify elements on the details page. + +1. Override the method to return the string "value". + +#### Method: `getColumnKeysWithLinks` +This method returns an array of column keys that contain links. + +1. Override the method to return an array with a single key: "Wuid". + +#### Method: `getUniqueKeyName` +This method returns the name of the unique key used to identify work units. + +1. Override the method to return the string "WUID". + +#### Method: `getUniqueKey` +This method returns the key used to uniquely identify work units. + +1. Override the method to return the string "Wuid". + +#### Method: `getTabValuesForDetailsPage` +This method returns an array of tab values for the details page. + +1. Define a method to return an array of tab values: "variables", "outputs", "inputs", "metrics", "workflows", "queries", "resources", "helpers", "xml". + +#### Method: `getColumnNamesForTabsDetailsPage` +This method returns a map where each key is the value attribute of an HTML element of a tab, and the value is a list of column names for that tab. + +1. Override the method to return a map of tab values and their corresponding column names: + - "variables": ["Type", "Name", "Value"] + - "outputs": ["Name", "File Name", "Value", "Views"] + - "inputs": ["Name", "File Cluster", "Usage"] + - "metrics": ["Refresh", "Hot spots", "Timeline", "Options"] - there is no column in this tab, so checking the presence of these buttons + - "workflows": ["Name", "Subtype", "Count", "Remaining"] + - "queries": ["ID", "Priority", "Name", "Target", "WUID", "Dll", "Published By", "Status"] + - "resources": ["Name", "Refresh", "Open", "Preview"] - Preview is not a column, it is a button, keeping it for additional check for Resources tab + - "helpers": ["Type", "Description", "File Size"] + - "xml": ["EJ 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 SN60^He>Usi(0~2+-~Mk!*GaPg literal 21757 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 I-}?Rk0S&~DegFUf diff --git a/esp/src/test-ui/tests/framework/documentation/TestRunner.png b/esp/src/test-ui/tests/framework/documentation/TestRunner.png index 066710df8b2d8ca50707d304a717d78337b1a0d6..91721619b6f018bcedd2491a8d406a88a7d6154f 100644 GIT binary patch literal 6411 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 literal 3979 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 diff --git a/esp/src/test-ui/tests/framework/documentation/URLConfig1.png b/esp/src/test-ui/tests/framework/documentation/URLConfig1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9986ae2ee9ed7d11a777f625174bc2680ebb79 GIT binary patch literal 42371 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 VQ{f#6-UHgZ8~Kj#5AXlwe*rvW%)F`F=m| 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 RHUx6e|L_O2|NiuE{|CeIHQxXL literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java index 6a4cc340fe3..3ae1b7ce729 100644 --- a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java +++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java @@ -80,6 +80,14 @@ public long getTotalClusterTime() { return totalClusterTime; } + public String getActionEx() { + return actionEx; + } + + public boolean isProtected() { + return isProtected; + } + @JsonSetter("TotalClusterTime") public void setTotalClusterTime(String totalClusterTime) { this.totalClusterTime = TimeUtils.convertToMilliseconds(totalClusterTime); diff --git a/esp/src/test-ui/tests/framework/model/URLMapping.java b/esp/src/test-ui/tests/framework/model/URLMapping.java new file mode 100644 index 00000000000..bd68f686444 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/URLMapping.java @@ -0,0 +1,33 @@ +package framework.model; + +import java.util.HashMap; + +public class URLMapping { + + String name; + String url; + HashMap urlMappings; + + public URLMapping(String name, String url) { + this.name = name; + this.url = url; + urlMappings = new HashMap<>(); + } + + public String getUrl() { + return url; + } + + public HashMap getUrlMappings() { + return urlMappings; + } + + @Override + public String toString() { + return "URLMapping{" + + "name='" + name + '\'' + + ", url='" + url + '\'' + + ", urlMappings=" + urlMappings + + '}'; + } +} diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java index 50b0ac82213..41dc5dc6ff4 100644 --- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -1,72 +1,70 @@ package framework.pages; -import framework.config.Config; +import framework.config.URLConfig; import framework.model.NavigationWebElement; -import framework.setup.LoggerHolder; -import framework.setup.WebDriverHolder; +import framework.model.URLMapping; import framework.utility.Common; import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.logging.Logger; + +import static framework.config.URLConfig.urlMap; public class ActivitiesTest { static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"}; - static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"}; - static final Map> tabsListMap = Map.of( - "Activities", List.of("Activities", "Event Scheduler"), - "ECL", List.of("Workunits", "Playground"), - "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"), - "Published Queries", List.of("Queries", "Package Maps"), - "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)") - //"DummyNavName", List.of("DummyTab1", "DummyTab2") - ); @Test public void testActivitiesPage() { - WebDriver driver = WebDriverHolder.getDriver(); - Common.openWebPage(driver, Common.getUrl(Config.ACTIVITIES_URL)); + Common.openWebPage(urlMap.get(URLConfig.NAV_ACTIVITIES).getUrl()); + + Common.logDebug("Tests started for: Activities page."); - Logger logger = LoggerHolder.getLogger(); + testForAllText(); - testForAllText(logger, driver); + List navWebElements = getNavWebElements(); - List navWebElements = getNavWebElements(driver); + testForNavigationLinks(navWebElements); - testForNavigationLinks(driver, navWebElements, logger); + Common.logDebug("Tests finished for: Activities page."); + Common.logDebug("URL Map Generated: " + urlMap); } - private void testForNavigationLinks(WebDriver driver, List navWebElements, Logger logger) { + private void testForNavigationLinks(List navWebElements) { + + Common.logDebug("Tests started for: Activities page: Testing Navigation Links"); for (NavigationWebElement element : navWebElements) { - element.webElement().click(); - - if (testTabsForNavigationLinks(driver, element)) { - String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue(); - System.out.println(msg); - } else { - String currentPage = getCurrentPage(driver); - String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue(); - System.err.println(errorMsg); - logger.severe(errorMsg); + + try { + element.webElement().click(); + + if (testTabsForNavigationLinks(element)) { + String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue(); + Common.logDetail(msg); + } else { + String currentPage = getCurrentPage(); + String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue(); + Common.logError(errorMsg); + } + } catch (Exception ex) { + Common.logError("Failure: Exception in Navigation Link for " + element.name() + ". URL : " + element.hrefValue() + " Error: " + ex.getMessage()); } } } - private String getCurrentPage(WebDriver driver) { + private String getCurrentPage() { - for (var entry : tabsListMap.entrySet()) { + for (var entry : URLConfig.tabsListMap.entrySet()) { List tabs = entry.getValue(); boolean allTabsPresent = true; for (String tab : tabs) { - if (!driver.getPageSource().contains(tab)) { + if (!Common.driver.getPageSource().contains(tab)) { allTabsPresent = false; break; } @@ -80,12 +78,14 @@ private String getCurrentPage(WebDriver driver) { return "Invalid Page"; } - private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) { - List tabsList = tabsListMap.get(element.name()); - String pageSource = driver.getPageSource(); + private boolean testTabsForNavigationLinks(NavigationWebElement element) { + List tabsList = URLConfig.tabsListMap.get(element.name()); for (String tab : tabsList) { - if (!pageSource.contains(tab)) { + try { + WebElement webElement = Common.waitForElement(By.xpath("//a[text()='" + tab + "']")); + urlMap.get(element.name()).getUrlMappings().put(tab, new URLMapping(tab, webElement.getAttribute("href"))); + } catch (TimeoutException ex) { return false; } } @@ -93,25 +93,29 @@ private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElemen return true; } - private List getNavWebElements(WebDriver driver) { + private List getNavWebElements() { List navWebElements = new ArrayList<>(); - for (String navName : navNamesArray) { - WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a")); - String hrefValue = webElement.getAttribute("href"); - navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement)); - } + for (String navName : URLConfig.navNamesArray) { + try { + WebElement webElement = Common.driver.findElement(By.name(navName)).findElement(By.tagName("a")); + String hrefValue = webElement.getAttribute("href"); + navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement)); - //navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement())); + urlMap.put(navName, new URLMapping(navName, hrefValue)); + } catch (Exception ex) { + Common.logError("Failure: Activities Page for Navigation Element: " + navName + ": Error: " + ex.getMessage()); + } + } return navWebElements; } - private void testForAllText(Logger logger, WebDriver driver) { - + private void testForAllText() { + Common.logDebug("Tests started for: Activities page: Testing Text"); for (String text : textArray) { - Common.checkTextPresent(driver, text, "Activities Page", logger); + Common.checkTextPresent(text, "Activities Page"); } } } diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 6468196aff5..20121314bb7 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -1,21 +1,20 @@ package framework.pages; import framework.config.Config; -import framework.setup.LoggerHolder; -import framework.setup.WebDriverHolder; import framework.utility.Common; import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.function.Function; -import java.util.logging.Logger; + + +// This class is the super class for all the those web pages that contains a tabular data for e.g. workunits, files, queries etc. It also contains the tests for their respective details page including testing text, content and tabs. public abstract class BaseTableTest { @@ -25,139 +24,360 @@ public abstract class BaseTableTest { protected abstract String getJsonFilePath(); + protected abstract String getSaveButtonDetailsPage(); + protected abstract String[] getColumnNames(); + protected abstract String[] getDetailNames(); + protected abstract String[] getColumnKeys(); + protected abstract String[] getDetailKeys(); + + protected abstract String getCheckboxTypeForDetailsPage(); + + protected abstract String getAttributeTypeForDetailsPage(); + + protected abstract String getAttributeValueForDetailsPage(); + + protected abstract String[] getDetailKeysForPageLoad(); + protected abstract String getUniqueKeyName(); protected abstract String getUniqueKey(); protected abstract String[] getColumnKeysWithLinks(); - protected abstract Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger); + protected abstract Object parseDataUIValue(Object dataUIValue, Object dataJSONValue, String columnName, Object dataIDUIValue); - protected abstract Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger); + protected abstract Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue); protected abstract List parseJson(String filePath) throws Exception; protected abstract Object getColumnDataFromJson(T object, String columnKey); - protected abstract void sortJsonUsingSortOrder(String currentSortOrder, List jsonObjects, String columnKey); + protected abstract void sortJsonUsingSortOrder(String currentSortOrder, String columnKey); + + protected abstract String getCurrentPage(); + + protected abstract Map getJsonMap(); - protected abstract String getCurrentPage(WebDriver driver); + protected abstract Map> getColumnNamesForTabsDetailsPage(); + + protected abstract String[] getTabValuesForDetailsPage(); + + protected abstract void testDetailSpecificFunctionality(String name, int i); + + protected List jsonObjects; protected void testPage() { + Common.openWebPage(getPageUrl()); + try { - WebDriver driver = WebDriverHolder.getDriver(); - Common.openWebPage(driver, getPageUrl()); - Logger logger = LoggerHolder.getLogger(); + Common.logDebug("Tests started for: " + getPageName() + " page."); + + testForAllText(); + + jsonObjects = getAllObjectsFromJson(); + if (jsonObjects != null) { + + int numOfItemsJSON = jsonObjects.size(); + clickDropdown(numOfItemsJSON); + + testContentAndSortingOrder(); + } + + testLinksInTable(); - testForAllText(driver, logger); - testContentAndSortingOrder(driver, logger); - testLinksInTable(driver, logger); + Common.logDebug("Tests finished for: " + getPageName() + " page."); } catch (Exception ex) { - System.out.println(ex.getMessage()); + Common.logError(ex.getMessage()); + } + } + + private void testDetailsPage(String name, int i) { + + if (!Config.TEST_DETAIL_PAGE_FIELD_NAMES_ALL && i == 0) { // TEST_DETAIL_PAGE_FIELD_NAMES_ALL = true means the test will run for all items and false means it will only run for the first item + testForAllTextInDetailsPage(name); + } else if (Config.TEST_DETAIL_PAGE_FIELD_NAMES_ALL) { + testForAllTextInDetailsPage(name); + } + + testDetailsContentPage(name); + testDetailSpecificFunctionality(name, i); + + if (!Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL && i == 0) { // TEST_DETAIL_PAGE_TAB_CLICK_ALL = true means the test will run for all items and false means it will only run for the first item + testTabClickOnDetailsPage(); + } else if (Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL) { + testTabClickOnDetailsPage(); + } + } + + private void testTabClickOnDetailsPage() { + + Common.logDebug("Test started for: Tab Click on " + getPageName() + " Details Page."); + + waitToLoadDetailsPage(); + + for (var tabValue : getTabValuesForDetailsPage()) { + + try { + WebElement element = Common.driver.findElement(By.xpath("//button[@value='" + tabValue + "']")); + javaScriptElementClick(element); + testPresenceOfColumnNames(getColumnNamesForTabsDetailsPage().get(tabValue), tabValue); + } catch (Exception ex) { + Common.logError("Error: " + getPageName() + " Details Page. Testing tab click on: " + tabValue + " Error: " + ex.getMessage()); + } + } + + } + + protected void javaScriptElementClick(WebElement element) { + + JavascriptExecutor js = (JavascriptExecutor) Common.driver; + js.executeScript("arguments[0].click();", element); + } + + private void testPresenceOfColumnNames(List columnNames, String tabValue) { + + boolean allPresent = true; + String currentURL = Common.driver.getCurrentUrl(); + for (String columnName : columnNames) { + + try { + Common.waitForElement(By.xpath("//*[text()='" + columnName + "']")); + } catch (TimeoutException ex) { + Common.logError("Failure: " + getPageName() + " Details Page. Text : " + columnName + " not present for tab: " + tabValue + ". Current URL: " + currentURL); + allPresent = false; + } } + + if (allPresent) { + Common.logDetail("Success: " + getPageName() + " Details Page. Tab click on: " + tabValue); + } + } + + protected void clickOnSaveButton() { + + WebElement saveButton = getSaveButtonWebElementDetailsPage(); + Common.waitForElementToBeClickable(saveButton); + saveButton.click(); + + saveButton = getSaveButtonWebElementDetailsPage(); + Common.waitForElementToBeDisabled(saveButton); } - private void testLinksInTable(WebDriver driver, Logger logger) { + private void testLinksInTable() { + + Common.logDebug("Tests started for: " + getPageName() + " page: Testing Links"); for (String columnKey : getColumnKeysWithLinks()) { - List values = getDataFromUIUsingColumnKey(driver, columnKey); + List values = getDataFromUIUsingColumnKey(columnKey); + + for (int i = 0; i < values.size(); i++) { + + try { + String name = values.get(i).toString().trim(); + + WebElement element = Common.waitForElement(By.xpath("//div[text()='" + name + "']/..")); + String href = Common.driver.getCurrentUrl(); + + String dropdownValueBefore = getSelectedDropdownValue(); - int i = 1; + element.click(); - for (Object value : values) { - String name = value.toString().trim(); - //WebElement element = driver.findElement(By.xpath("//div[contains(text(), '"+name+"')]/..")); - WebElement element = waitForElement(driver, By.xpath("//div[contains(text(), '" + name + "')]/..")); - String href = element.findElement(By.tagName("a")).getAttribute("href"); + if (Common.driver.getPageSource().contains(name)) { + String msg = "Success: " + getPageName() + ": Link Test Pass for " + (i + 1) + ". " + name + ". URL : " + href; + Common.logDetail(msg); + // after the link test has passed, the code tests the details page(including, the text, content and tabs) it has landed on + testDetailsPage(name, i); - String dropdownValueBefore = getSelectedDropdownValue(driver); + } else { + String currentPage = getCurrentPage(); + String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + (i + 1) + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href; + Common.logError(errorMsg); + } - element.click(); + Common.driver.navigate().to(getPageUrl()); + Common.driver.navigate().refresh(); - if (driver.getPageSource().contains(name)) { - String msg = "Success: " + getPageName() + ": Link Test Pass for " + i++ + ". " + name + ". URL : " + href; - System.out.println(msg); + String dropdownValueAfter = getSelectedDropdownValue(); + + // Log error if the dropdown value has changed + if (!dropdownValueBefore.equals(dropdownValueAfter)) { + String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter; + Common.logError(dropdownErrorMsg); + } + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + ": Exception in testing links for column: " + columnKey + " value: " + values.get(i) + " Error: " + ex.getMessage()); + } + } + } + } + + protected void waitToLoadDetailsPage() { + + int waitTimeInSecs = Config.WAIT_TIME_IN_SECONDS; + + boolean allVisible; + + do { + Common.sleepWithTime(waitTimeInSecs); + allVisible = true; + + for (String detailKey : getDetailKeysForPageLoad()) { + WebElement element = Common.waitForElement(By.id(detailKey)); + if ("".equals(element.getAttribute(getAttributeValueForDetailsPage()))) { + allVisible = false; + break; + } + } + + if (allVisible) { + break; + } + + waitTimeInSecs++; + + } while (waitTimeInSecs < Config.WAIT_TIME_THRESHOLD_IN_SECONDS); + + Common.logDebug("Sleep Time In Seconds To Load Details Page: " + waitTimeInSecs); + } + + private void testDetailsContentPage(String name) { + Common.logDebug("Tests started for : " + getPageName() + " Details page content: " + getUniqueKeyName() + " : " + name); + try { + waitToLoadDetailsPage(); // sleep until the specific detail fields have loaded + } catch (Exception ex) { + Common.logError("Error: " + getPageName() + ": Exception in waitToLoadDetailsPage: " + getUniqueKeyName() + " : " + name + " Exception: " + ex.getMessage()); + } + + boolean pass = true; + + T object = getJsonMap().get(name); + + for (String detailKey : getDetailKeys()) { + try { + WebElement element = Common.waitForElement(By.id(detailKey)); + + Object dataUIValue, dataJSONValue; + + if (element.getAttribute(getAttributeTypeForDetailsPage()).equals(getCheckboxTypeForDetailsPage())) { + dataUIValue = element.isSelected(); } else { - String currentPage = getCurrentPage(driver); - String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + i++ + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href; - System.err.println(errorMsg); - logger.severe(errorMsg); + dataUIValue = element.getAttribute(getAttributeValueForDetailsPage()); } - driver.navigate().to(getPageUrl()); - driver.navigate().refresh(); + dataJSONValue = getColumnDataFromJson(object, detailKey); - String dropdownValueAfter = getSelectedDropdownValue(driver); + dataUIValue = parseDataUIValue(dataUIValue, dataJSONValue, detailKey, name); + dataJSONValue = parseDataJSONValue(dataJSONValue, detailKey, name); - // Log error if the dropdown value has changed - if (!dropdownValueBefore.equals(dropdownValueAfter)) { - String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter; - System.err.println(dropdownErrorMsg); - logger.severe(dropdownErrorMsg); + if (!dataUIValue.equals(dataJSONValue)) { + Common.logError("Failure: " + getPageName() + " Details page, Incorrect " + detailKey + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + name + ". Correct " + detailKey + " is: " + dataJSONValue); + pass = false; } + + } catch (Exception ex) { + Common.logError("Error: Details " + getPageName() + "Page, for: " + getUniqueKeyName() + " : " + name + " Error: " + ex.getMessage()); } } + + if (pass) { + Common.logDetail("Success: " + getPageName() + " Details page: All values test passed for: " + getUniqueKeyName() + " : " + name); + } } - protected WebElement waitForElement(WebDriver driver, By locator) { - return new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.presenceOfElementLocated(locator)); + private void testForAllTextInDetailsPage(String name) { + Common.logDebug("Tests started for: " + getPageName() + " Details page: " + getUniqueKeyName() + ": " + name + " Testing Text"); + for (String text : getDetailNames()) { + Common.checkTextPresent(text, getPageName() + " Details page: " + getUniqueKeyName() + ": " + name); + } } - private void testContentAndSortingOrder(WebDriver driver, Logger logger) { - List jsonObjects = getAllObjectsFromJson(logger); + private void testContentAndSortingOrder() { - if (jsonObjects != null) { - int numOfItemsJSON = jsonObjects.size(); - clickDropdown(driver, numOfItemsJSON); + Common.logDebug("Tests started for: " + getPageName() + " page: Testing Content"); - if (testTableContent(driver, logger, jsonObjects)) { - for (int i = 0; i < getColumnKeys().length; i++) { - testTheSortingOrderForOneColumn(driver, logger, jsonObjects, getColumnKeys()[i], getColumnNames()[i]); - } + if (testTableContent()) { + + Common.logDebug("Tests started for: " + getPageName() + " page: Testing Sorting Order"); + + for (int i = 0; i < getColumnKeys().length; i++) { + testTheSortingOrderForOneColumn(getColumnKeys()[i], getColumnNames()[i]); } } } - private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List jsonObjects, String columnKey, String columnName) { + private void testTheSortingOrderForOneColumn(String columnKey, String columnName) { for (int i = 0; i < 3; i++) { - String currentSortOrder = getCurrentSortingOrder(driver, columnKey); - List columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey); + String currentSortOrder = getCurrentSortingOrder(columnKey); + if (currentSortOrder != null) { + List columnDataFromUI = getDataFromUIUsingColumnKey(columnKey); - sortJsonUsingSortOrder(currentSortOrder, jsonObjects, columnKey); + sortJsonUsingSortOrder(currentSortOrder, columnKey); - List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, jsonObjects); - List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey); + List columnDataIDFromUI = getDataFromUIUsingColumnKey(getUniqueKey()); - if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) { - System.out.println("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); + if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, columnName)) { + Common.logDebug("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); + } else { + String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName; + Common.logError(errMsg); + } } else { - String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName; - System.err.println(errMsg); - logger.severe(errMsg); + Common.logError("Failure: " + getPageName() + " Unable to get sort order for column: " + columnKey); } } } - private String getCurrentSortingOrder(WebDriver driver, String columnKey) { + private String getCurrentSortingOrder(String columnKey) { + + try { + + WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); - WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); - columnHeader.click(); + String oldSortOrder = columnHeader.getAttribute("aria-sort"); - Common.sleep(); + columnHeader.click(); - columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + return waitToLoadChangedSortOrder(oldSortOrder, columnKey); - return columnHeader.getAttribute("aria-sort"); + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + " Exception in getting sort order for column: " + columnKey + " Error: " + ex.getMessage()); + } + + return null; } - private List getDataFromJSONUsingColumnKey(String columnKey, List jsonObjects) { + private String waitToLoadChangedSortOrder(String oldSortOrder, String columnKey) { + + int waitTimeInSecs = Config.WAIT_TIME_IN_SECONDS; + String newSortOrder; + + do { + Common.sleepWithTime(waitTimeInSecs); + + WebElement columnHeaderNew = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); + + newSortOrder = columnHeaderNew.getAttribute("aria-sort"); + + if (!Objects.equals(newSortOrder, oldSortOrder)) { + break; + } + + waitTimeInSecs++; + + } while (waitTimeInSecs < Config.WAIT_TIME_THRESHOLD_IN_SECONDS); + + return newSortOrder; + } + + private List getDataFromJSONUsingColumnKey(String columnKey) { List columnDataFromJSON = new ArrayList<>(); for (T jsonObject : jsonObjects) { columnDataFromJSON.add(getColumnDataFromJson(jsonObject, columnKey)); @@ -165,50 +385,80 @@ private List getDataFromJSONUsingColumnKey(String columnKey, List jso return columnDataFromJSON; } - private List getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) { - List elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']")); + protected List getDataFromUIUsingColumnKey(String columnKey) { + List columnData = new ArrayList<>(); - for (WebElement element : elements) { - columnData.add(element.getText()); + + try { + + List elements = waitToLoadListOfAllUIObjects(columnKey); + for (int i = 1; i < elements.size(); i++) { // first element fetched is of column header, so we fetch values from 2nd element. + columnData.add(elements.get(i).getText().trim()); + } + + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + ": Error in getting data from UI using column key: " + columnKey + "Error: " + ex.getMessage()); } + return columnData; } - void ascendingSortJson(List jsonObjects, String columnKey) { - jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + private List waitToLoadListOfAllUIObjects(String columnKey) { + + int waitTimeInSecs = Config.WAIT_TIME_IN_SECONDS; + List elements; + + do { + elements = Common.driver.findElements(By.xpath("//*[@*[.='" + columnKey + "']]")); + + if (elements.size() - 1 >= jsonObjects.size()) { // first element fetched is of column header, so we do -1 from total elements + break; + } + + Common.sleepWithTime(waitTimeInSecs++); + + } while (waitTimeInSecs < Config.WAIT_TIME_THRESHOLD_IN_SECONDS); + + return elements; } - void descendingSortJson(List jsonObjects, String columnKey) { - jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + void ascendingSortJson(String columnKey) { + try { + jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in ascending order using column key: " + columnKey + " Error: " + ex.getMessage()); + } } - private boolean testTableContent(WebDriver driver, Logger logger, List jsonObjects) { - System.out.println("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + void descendingSortJson(String columnKey) { + try { + jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in descending order using column key: " + columnKey + " Error: " + ex.getMessage()); + } + } - List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + private boolean testTableContent() { + Common.logDebug("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); - if (jsonObjects.size() != columnDataIDFromUI.size()) { - Common.sleep(); - columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); - } + List columnDataIDFromUI = getDataFromUIUsingColumnKey(getUniqueKey()); - System.out.println("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + Common.logDebug("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); if (jsonObjects.size() != columnDataIDFromUI.size()) { String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + "\nNumber of Objects from Json: " + jsonObjects.size() + "\nNumber of Objects from UI: " + columnDataIDFromUI.size(); - System.out.println(errMsg); - logger.severe(errMsg); + Common.logError(errMsg); return false; } boolean pass = true; for (int i = 0; i < getColumnKeys().length; i++) { - List columnDataFromUI = getDataFromUIUsingColumnKey(driver, getColumnKeys()[i]); - List columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i], jsonObjects); - if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, getColumnNames()[i])) { + List columnDataFromUI = getDataFromUIUsingColumnKey(getColumnKeys()[i]); + List columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i]); + if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, getColumnNames()[i])) { pass = false; } } @@ -216,20 +466,18 @@ private boolean testTableContent(WebDriver driver, Logger logger, List jsonOb return pass; } - private List getAllObjectsFromJson(Logger logger) { + private List getAllObjectsFromJson() { String filePath = getJsonFilePath(); try { return parseJson(filePath); - } catch (Exception e) { - System.err.println("Exception: " + e.getMessage()); - logger.severe("Failure: Exception: " + e.getMessage()); + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + " Unable to parse JSON File: Exception: " + ex.getMessage()); } - logger.severe("Failure: Error in JSON Parsing: " + filePath); return null; } - private boolean compareData(List dataUI, List dataJSON, List dataIDUI, Logger logger, String columnName) { + private boolean compareData(List dataUI, List dataJSON, List dataIDUI, String columnName) { boolean pass = true; @@ -239,71 +487,91 @@ private boolean compareData(List dataUI, List dataJSON, List options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item"))); + WebElement dropdown = Common.waitForElement(By.id("pageSize")); + dropdown.click(); - int selectedValue = Config.dropdownValues[0]; + WebDriverWait wait = new WebDriverWait(Common.driver, Duration.ofSeconds(Config.WAIT_TIME_THRESHOLD_IN_SECONDS)); - // the smallest dropdown value greater than numOfItemsJSON - for (int value : Config.dropdownValues) { - if (numOfItemsJSON < value) { - selectedValue = value; - break; - } - } + WebElement dropdownList = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("pageSize-list"))); - System.out.println("Dropdown selected: " + selectedValue); + List options = dropdownList.findElements(By.tagName("button")); - for (WebElement option : options) { - if (option.getText().equals(String.valueOf(selectedValue))) { - option.click(); - break; + int selectedValue = Config.dropdownValues[0]; + + // the smallest dropdown value greater than numOfItemsJSON + for (int value : Config.dropdownValues) { + if (numOfItemsJSON < value) { + selectedValue = value; + break; + } + } + + for (WebElement option : options) { + if (option.getText().equals(String.valueOf(selectedValue))) { + option.click(); + break; + } } + + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("pageSize-list"))); + + Common.logDebug("Page: " + getPageName() + ": Dropdown selected: " + selectedValue); + + Common.driver.navigate().refresh(); + Common.sleep(); + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + ": Error in clicking dropdown: " + ex.getMessage()); + } + } + + private String getSelectedDropdownValue() { + try { + WebElement dropdown = Common.waitForElement(By.id("pageSize")); + return dropdown.getText().trim(); + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + ": Error in getting dropdown value: " + ex.getMessage()); } - wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item"))); - driver.navigate().refresh(); - Common.sleep(); + return ""; } - private String getSelectedDropdownValue(WebDriver driver) { - WebElement dropdown = waitForElement(driver, By.id("pageSize")); - return dropdown.getText().trim(); + protected WebElement getSaveButtonWebElementDetailsPage() { + return Common.waitForElement(By.xpath("//button//*[text()='" + getSaveButtonDetailsPage() + "']/../../..")); } - private void testForAllText(WebDriver driver, Logger logger) { + private void testForAllText() { + Common.logDebug("Tests started for: " + getPageName() + " page: Testing Text"); for (String text : getColumnNames()) { - Common.checkTextPresent(driver, text, getPageName(), logger); + Common.checkTextPresent(text, getPageName()); } } } diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java index b5837fb4d6b..7f29811f6a1 100644 --- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -2,21 +2,21 @@ import com.fasterxml.jackson.databind.ObjectMapper; import framework.config.Config; +import framework.config.URLConfig; import framework.model.ECLWorkunit; import framework.model.WUQueryResponse; import framework.model.WUQueryRoot; import framework.utility.Common; import framework.utility.TimeUtils; import org.openqa.selenium.By; -import org.openqa.selenium.NoSuchElementException; -import org.openqa.selenium.WebDriver; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; import org.testng.annotations.Test; import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Logger; +import java.util.*; + +// This class is a subclass of BaseTableTest, and it includes test cases for ECL Workunits page and along with the tests of workunits details page. public class ECLWorkUnitsTest extends BaseTableTest { @@ -32,12 +32,12 @@ protected String getPageName() { @Override protected String getPageUrl() { - return Common.getUrl(Config.ECL_WORK_UNITS_URL); + return URLConfig.urlMap.get(URLConfig.NAV_ECL).getUrlMappings().get(URLConfig.TAB_ECL_WORKUNITS).getUrl(); } @Override protected String getJsonFilePath() { - return Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON; + return Config.PATH_FOLDER_JSON + Config.WORKUNITS_JSON_FILE_NAME; } @Override @@ -50,6 +50,49 @@ protected String[] getColumnKeys() { return new String[]{"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"}; } + private final List badStates = Arrays.asList("compiled", "failed"); + + @Override + protected String getSaveButtonDetailsPage() { + return "Save"; + } + + @Override + protected String[] getDetailNames() { + return new String[]{"WUID", "Action", "State", "Owner", "Job Name", "Description", "Potential Savings", "Compile Cost", "Execution Cost", "File Access Cost", "Protected", "Cluster", "Total Cluster Time", "Aborted by", "Aborted time", "Services"}; + } + + @Override + protected String[] getDetailKeys() { + WebElement element = Common.waitForElement(By.id("state")); + + if (badStates.contains(element.getAttribute(getAttributeValueForDetailsPage()))) { // compiled means it's published but not executed - no wu exists for this, check only these columns + return new String[]{"wuid", "action", "state", "owner", "jobname", "cluster"}; + } else { + return new String[]{"wuid", "action", "state", "owner", "jobname", "compileCost", "executeCost", "fileAccessCost", "protected", "cluster", "totalClusterTime"}; + } + } + + @Override + protected String[] getDetailKeysForPageLoad() { + return new String[]{"wuid", "state", "jobname", "cluster"}; + } + + @Override + protected String getCheckboxTypeForDetailsPage() { + return "checkbox"; + } + + @Override + protected String getAttributeTypeForDetailsPage() { + return "type"; + } + + @Override + protected String getAttributeValueForDetailsPage() { + return "value"; + } + @Override protected String[] getColumnKeysWithLinks() { return new String[]{"Wuid"}; @@ -65,63 +108,282 @@ protected String getUniqueKey() { return "Wuid"; } - private List getCostColumns() { - return Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost"); + protected String[] getTabValuesForDetailsPage() { + return new String[]{"variables", "outputs", "inputs", "metrics", "workflows", + "queries", "resources", "helpers", "xml"}; + } + + @Override + protected Map> getColumnNamesForTabsDetailsPage() { // key in this map is the value attribute of the html element of a tab. + return Map.ofEntries( + Map.entry("variables", List.of("Type", "Name", "Value")), + Map.entry("outputs", List.of("Name", "File Name", "Value", "Views")), + Map.entry("inputs", List.of("Name", "File Cluster", "Usage")), + Map.entry("metrics", List.of("Refresh", "Hot spots", "Timeline", "Options")), // there is no column in this tab, so checking the presence of these buttons + Map.entry("workflows", List.of("Name", "Subtype", "Count", "Remaining")), + Map.entry("queries", List.of("ID", "Priority", "Name", "Target", "WUID", "Dll", "Published By", "Status")), + Map.entry("resources", List.of("Name", "Refresh", "Open", "Preview")), // Preview is not a column, it is a button, keeping it for additional check for Resources tab + Map.entry("helpers", List.of("Type", "Description", "File Size")), + Map.entry("xml", List.of(" costColumns = Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost", "compileCost", "executeCost", "fileAccessCost"); + + @Override + protected Map getJsonMap() { + return jsonMap; } + @Override + protected void testDetailSpecificFunctionality(String wuName, int i) { + + if (!Config.TEST_WU_DETAIL_PAGE_PROTECTED_ALL && i == 0) { // TEST_WU_DETAIL_PAGE_PROTECTED_ALL = true means the test will run for all workunits and false means it will only run for the first workunit + testProtectedButtonFunctionality(wuName); + } else if (Config.TEST_WU_DETAIL_PAGE_PROTECTED_ALL) { + testProtectedButtonFunctionality(wuName); + } + + if (!Config.TEST_WU_DETAIL_PAGE_DESCRIPTION_ALL && i == 0) { // TEST_WU_DETAIL_PAGE_DESCRIPTION_ALL = true means the test will run for all workunits and false means it will only run for the first workunit + testDescriptionUpdateFunctionality(wuName); + } else if (Config.TEST_WU_DETAIL_PAGE_DESCRIPTION_ALL) { + testDescriptionUpdateFunctionality(wuName); + } + } + + private void testDescriptionUpdateFunctionality(String wuName) { + + Common.logDebug("Test started for: Description checkbox " + getPageName() + " Details Page."); + + try { + String newDescription = Config.TEST_DESCRIPTION_TEXT; + + String oldDescription = updateDescriptionAndSave(newDescription); + + testIfTheDescriptionUpdated(wuName, newDescription); + + Common.logDetail("Reverting Description Update To Old Value: " + getPageName() + " Details page, for WUID: " + wuName); + + updateDescriptionAndSave(oldDescription); + + } catch (Exception ex) { + Common.logError("Error: " + getPageName() + " Details page for WUID: " + wuName + ", Exception occurred while testing for description. Exception: " + ex.getMessage()); + } + } + + private void testIfTheDescriptionUpdated(String wuName, String newDescription) { + + Common.driver.navigate().refresh(); + + waitToLoadDetailsPage(); + + WebElement element = Common.waitForElement(By.id("description")); + + String updatedDescription = element.getAttribute(getAttributeValueForDetailsPage()).trim(); + + if (newDescription.equals(updatedDescription)) { + Common.logDetail("Success: " + getPageName() + " Details page. Description Updated Successfully on click of save button: Description After refresh showing on UI: " + updatedDescription + ", Updated description was: " + newDescription + " for WUID: " + wuName); + } else { + Common.logError("Failure: " + getPageName() + " Details page. Description Did Not Update on click of save button : Description After refresh showing on UI: " + updatedDescription + ", Updated description should be: " + newDescription + " for WUID: " + wuName); + } + } + + private String updateDescriptionAndSave(String newDescription) { + + waitToLoadDetailsPage(); + + WebElement element = Common.waitForElement(By.id("description")); + + String oldDescription = element.getAttribute(getAttributeValueForDetailsPage()); + + element.sendKeys(Keys.CONTROL + "a"); // Select all text + element.sendKeys(Keys.DELETE); // Delete all selected text + + element.sendKeys(newDescription); + + clickOnSaveButton(); + + element = Common.waitForElement(By.id("description")); + Common.logDetail("Old Description: " + oldDescription + ", Updated Description After Save: " + element.getAttribute(getAttributeValueForDetailsPage())); + + return oldDescription; + } + + private void testProtectedButtonFunctionality(String wuName) { + + Common.logDebug("Test started for: Protected checkbox " + getPageName() + " Details Page."); + + try { + + boolean newCheckboxValue = clickProtectedCheckboxAndSave(wuName); + + checkProtectedStatusOnECLWorkunitsPage(wuName, newCheckboxValue); + + WebElement element = Common.waitForElement(By.xpath("//div[text()='" + wuName + "']/..")); + element.click(); + + if (checkIfNewCheckBoxValuePresentInDetailsPage(newCheckboxValue)) { + Common.logDetail(getPageName() + " Details Page: Reverting the checkbox value for WUID: " + wuName); + clickProtectedCheckboxAndSave(wuName); + } + + } catch (Exception ex) { + Common.logError("Error: ECL WorkUnits: Exception in testing the protected functionality for WUID: " + wuName + ": Error: " + ex.getMessage()); + } + } + + private boolean checkIfNewCheckBoxValuePresentInDetailsPage(boolean newCheckboxValue) { + + waitToLoadDetailsPage(); + + WebElement protectedCheckbox = Common.waitForElement(By.id("protected")); + boolean currentCheckboxValue = protectedCheckbox.isSelected(); + + if (currentCheckboxValue != newCheckboxValue) { + Common.logError("Failure: " + getPageName() + " Details Page: Testing Protected checkbox value after coming back from ECL Workunits page: Updated value: " + newCheckboxValue + ": Showing: " + currentCheckboxValue + " on Workunits Details page"); + return false; + } else { + Common.logDetail("Success: " + getPageName() + " Details Page: Testing Protected checkbox value after coming back from ECL Workunits page: Updated value: " + newCheckboxValue + ": Showing: " + currentCheckboxValue + " on Workunits Details page"); + return true; + } + } + + private boolean clickProtectedCheckboxAndSave(String wuName) { + + waitToLoadDetailsPage(); + + WebElement protectedCheckbox = Common.waitForElement(By.id("protected")); + boolean oldCheckboxValue = protectedCheckbox.isSelected(); + + javaScriptElementClick(protectedCheckbox); + + waitToLoadUpdatedProtectedCheckbox(oldCheckboxValue); + + clickOnSaveButton(); + + boolean newCheckboxValue = protectedCheckbox.isSelected(); + + Common.logDetail("Protected checkbox old Value: " + oldCheckboxValue + ", current value after save: " + newCheckboxValue + " for WUID: " + wuName); + + return newCheckboxValue; + } + + private void waitToLoadUpdatedProtectedCheckbox(boolean oldCheckboxValue) { + + int waitTimeInSecs = Config.WAIT_TIME_IN_SECONDS; + boolean newCheckboxValue; + + do { + Common.sleepWithTime(waitTimeInSecs); + + WebElement protectedCheckbox = Common.waitForElement(By.id("protected")); + newCheckboxValue = protectedCheckbox.isSelected(); + + if (!Objects.equals(newCheckboxValue, oldCheckboxValue)) { + break; + } + + waitTimeInSecs++; + + } while (waitTimeInSecs < Config.WAIT_TIME_THRESHOLD_IN_SECONDS); + } + + private void checkProtectedStatusOnECLWorkunitsPage(String wuName, boolean newCheckboxValue) { + + Common.driver.navigate().to(getPageUrl()); + Common.driver.navigate().refresh(); + + List columnDataWUID = getDataFromUIUsingColumnKey(getUniqueKey()); + List columnDataProtected = getDataFromUIUsingColumnKey("Protected"); + + for (int i = 1; i < columnDataProtected.size(); i++) { // two web elements are getting fetched for Protected column header + + if (wuName.equals(columnDataWUID.get(i - 1))) { + + String lockStatus = !columnDataProtected.get(i).toString().isEmpty() ? "Locked" : "Unlocked"; + + if (newCheckboxValue && lockStatus.equals("Locked")) { + Common.logDetail("Success: " + getPageName() + " Details Page: Testing Protected checkbox for value: true : Showing Locked on ECL Workunits page"); + } else if (!newCheckboxValue && lockStatus.equals("Unlocked")) { + Common.logDetail("Success: " + getPageName() + " Details Page: Testing Protected checkbox for value: false : Showing Unlocked on ECL Workunits page"); + } else { + Common.logError("Failure: " + getPageName() + " Details Page: Testing Protected checkbox for value: " + newCheckboxValue + ": Showing: " + lockStatus + " on ECL Workunits page"); + } + } + } + } + + + Map jsonMap = new HashMap<>(); + @Override protected List parseJson(String filePath) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class); WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse(); - return wuQueryResponse.getWorkunits().getECLWorkunit(); + List eclWorkunits = wuQueryResponse.getWorkunits().getECLWorkunit(); + + for (ECLWorkunit workunit : eclWorkunits) { + jsonMap.put(workunit.getWuid(), workunit); + } + + return eclWorkunits; } @Override protected Object getColumnDataFromJson(ECLWorkunit workunit, String columnKey) { return switch (columnKey) { - case "Wuid" -> workunit.getWuid(); - case "Owner" -> workunit.getOwner(); - case "Jobname" -> workunit.getJobname(); - case "Cluster" -> workunit.getCluster(); - case "State" -> workunit.getState(); - case "TotalClusterTime" -> workunit.getTotalClusterTime(); - case "Compile Cost" -> workunit.getCompileCost(); - case "Execution Cost" -> workunit.getExecuteCost(); - case "File Access Cost" -> workunit.getFileAccessCost(); + case "Wuid", "wuid" -> workunit.getWuid(); + case "Owner", "owner" -> workunit.getOwner(); + case "Jobname", "jobname" -> workunit.getJobname(); + case "Cluster", "cluster" -> workunit.getCluster(); + case "State", "state" -> workunit.getState(); + case "TotalClusterTime", "totalClusterTime" -> workunit.getTotalClusterTime(); + case "Compile Cost", "compileCost" -> workunit.getCompileCost(); + case "Execution Cost", "executeCost" -> workunit.getExecuteCost(); + case "File Access Cost", "fileAccessCost" -> workunit.getFileAccessCost(); + case "action" -> workunit.getActionEx(); + case "protected" -> workunit.isProtected(); default -> null; }; } @Override - protected Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger) { - if (getCostColumns().contains(columnName)) { - dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]); - } else if (columnName.equals("Total Cluster Time")) { - long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue); - if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { - String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue; - System.out.println(errMsg); - logger.severe(errMsg); - return dataUIValue; - } + protected Object parseDataUIValue(Object dataUIValue, Object dataJSONValue, String columnName, Object dataIDUIValue) { + try { + if (costColumns.contains(columnName)) { + dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]); + } else if (columnName.equals("Total Cluster Time") || columnName.equals("totalClusterTime")) { - return timeInMilliSecs; - } else if (dataUIValue instanceof String) { - dataUIValue = ((String) dataUIValue).trim(); + if ((long) dataJSONValue == 0 && "".equals(dataUIValue)) { + return 0L; // test ok, if Total Cluster Time is 0 in json and blank in UI - Jira raised - HPCC-32147 + } + + long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue); + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue; + Common.logError(errMsg); + return dataUIValue; + } + + return timeInMilliSecs; + } else if (dataUIValue instanceof String) { + dataUIValue = ((String) dataUIValue).trim(); + } + } catch (Exception ex) { + Common.logError("Failure: " + getPageName() + " Error in parsing UI value: " + dataUIValue + " for column: " + columnName + " ID: " + dataIDUIValue + " Error: " + ex.getMessage()); } return dataUIValue; } @Override - protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger) { - if (columnName.equals("Total Cluster Time")) { + protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue) { + if (columnName.equals("Total Cluster Time") || columnName.equals("totalClusterTime")) { long timeInMilliSecs = (long) dataJSONValue; if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " in JSON for " + getUniqueKeyName() + " : " + dataIDUIValue; - System.out.println(errMsg); - logger.severe(errMsg); + Common.logError(errMsg); return dataJSONValue; } @@ -132,23 +394,23 @@ protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Obj } @Override - protected void sortJsonUsingSortOrder(String currentSortOrder, List workunitsJson, String columnKey) { + protected void sortJsonUsingSortOrder(String currentSortOrder, String columnKey) { switch (currentSortOrder) { - case "ascending" -> ascendingSortJson(workunitsJson, columnKey); - case "descending" -> descendingSortJson(workunitsJson, columnKey); - case "none" -> descendingSortJson(workunitsJson, getUniqueKey()); + case "ascending" -> ascendingSortJson(columnKey); + case "descending" -> descendingSortJson(columnKey); + case "none" -> descendingSortJson(getUniqueKey()); } } @Override - protected String getCurrentPage(WebDriver driver) { + protected String getCurrentPage() { try { - WebElement element = waitForElement(driver, By.id("wuid")); + WebElement element = Common.waitForElement(By.id("wuid")); if (element != null) { return element.getAttribute("title"); } - } catch (NoSuchElementException e) { - return "Invalid Page"; + } catch (Exception ex) { + Common.logError("Error: " + getPageName() + ex.getMessage()); } return "Invalid Page"; } diff --git a/esp/src/test-ui/tests/framework/setup/LoggerHolder.java b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java deleted file mode 100644 index b80c46f471f..00000000000 --- a/esp/src/test-ui/tests/framework/setup/LoggerHolder.java +++ /dev/null @@ -1,16 +0,0 @@ -package framework.setup; - -import java.util.logging.Logger; - -public class LoggerHolder { - private static Logger logger; - - public static Logger getLogger() { - return logger; - } - - public static void setLogger(Logger logger) { - LoggerHolder.logger = logger; - } -} - diff --git a/esp/src/test-ui/tests/framework/setup/TestInjector.java b/esp/src/test-ui/tests/framework/setup/TestInjector.java deleted file mode 100644 index 48742c85d51..00000000000 --- a/esp/src/test-ui/tests/framework/setup/TestInjector.java +++ /dev/null @@ -1,31 +0,0 @@ -package framework.setup; - -import org.openqa.selenium.WebDriver; -import org.testng.IInvokedMethod; -import org.testng.IInvokedMethodListener; -import org.testng.ITestResult; - -import java.util.logging.Logger; - -public class TestInjector implements IInvokedMethodListener { - private final Logger logger; - private final WebDriver driver; - - public TestInjector(Logger logger, WebDriver driver) { - this.logger = logger; - this.driver = driver; - } - - @Override - public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { - if (method.isTestMethod()) { - LoggerHolder.setLogger(logger); - WebDriverHolder.setDriver(driver); - } - } - - @Override - public void afterInvocation(IInvokedMethod method, ITestResult testResult) { - // Optionally, clean up if necessary - } -} diff --git a/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java deleted file mode 100644 index 0daf2f245aa..00000000000 --- a/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java +++ /dev/null @@ -1,15 +0,0 @@ -package framework.setup; - -import org.openqa.selenium.WebDriver; - -public class WebDriverHolder { - private static WebDriver driver; - - public static WebDriver getDriver() { - return driver; - } - - public static void setDriver(WebDriver driver) { - WebDriverHolder.driver = driver; - } -} diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java index 2fb12970a09..ca084f72242 100644 --- a/esp/src/test-ui/tests/framework/utility/Common.java +++ b/esp/src/test-ui/tests/framework/utility/Common.java @@ -1,36 +1,63 @@ package framework.utility; import framework.config.Config; -import org.openqa.selenium.WebDriver; +import framework.config.URLConfig; +import org.openqa.selenium.*; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import java.io.IOException; import java.time.Duration; +import java.util.logging.FileHandler; +import java.util.logging.Level; import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; public class Common { - public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) { - if (driver.getPageSource().contains(text)) { - String msg = "Success: " + page + ": Text present: " + text; - System.out.println(msg); - } else { + public static WebDriver driver; + public static Logger errorLogger = setupLogger("error"); + public static Logger specificLogger; + + public static void checkTextPresent(String text, String page) { + try { + WebElement element = Common.waitForElement(By.xpath("//*[text()='" + text + "']")); + if (element != null) { + String msg = "Success: " + page + ": Text present: " + text; + logDetail(msg); + } + } catch (TimeoutException ex) { String errorMsg = "Failure: " + page + ": Text not present: " + text; - System.err.println(errorMsg); - logger.severe(errorMsg); + logError(errorMsg); } } - public static void openWebPage(WebDriver driver, String url) { - - driver.get(url); - driver.manage().window().maximize(); - sleep(); + public static void openWebPage(String url) { + try { + driver.get(url); + driver.manage().window().maximize(); + sleep(); + } catch (Exception ex) { + Common.logError("Error in opening web page: " + url); + } } public static void sleep() { try { Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS)); } catch (InterruptedException e) { - System.err.println(e.getMessage()); + Common.logError("Error in sleep: " + e.getMessage()); + } + } + + public static void sleepWithTime(int seconds) { + try { + Thread.sleep(Duration.ofSeconds(seconds)); + } catch (InterruptedException e) { + Common.logError("Error in sleep: " + e.getMessage()); } } @@ -38,8 +65,131 @@ public static boolean isRunningOnLocal() { return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE); } - public static String getUrl(String url) { + public static String getIP() { + + return isRunningOnLocal() ? URLConfig.LOCAL_IP : URLConfig.GITHUB_ACTION_IP; + } + + public static WebElement waitForElement(By locator) { + return new WebDriverWait(driver, Duration.ofSeconds(Config.WAIT_TIME_THRESHOLD_IN_SECONDS)).until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + public static void waitForElementToBeClickable(WebElement element) { + new WebDriverWait(driver, Duration.ofSeconds(Config.WAIT_TIME_THRESHOLD_IN_SECONDS)).until(ExpectedConditions.elementToBeClickable(element)); + } + + // aria-disabled is a standard attribute and is widely used in HTML to indicate whether an element is disabled. It is system-defined, meaning it is part of the standard HTML specifications and not a custom class or attribute that might change frequently. + // By using aria-disabled, you ensure that the check for the disabled state is consistent and less likely to break due to UI changes. Custom class names or attributes defined by developers can change frequently during updates or redesigns, but standard attributes like aria-disabled are much more stable. + + public static void waitForElementToBeDisabled(WebElement element) { + new WebDriverWait(driver, Duration.ofSeconds(Config.WAIT_TIME_THRESHOLD_IN_SECONDS)) + .until(ExpectedConditions.attributeContains(element, "aria-disabled", "true")); + } + + public static void logError(String message) { + System.err.println(message); + errorLogger.severe(message); + } + + public static void logDebug(String message) { + System.out.println(message); + + if (specificLogger != null && specificLogger.getLevel() == Level.INFO) { + specificLogger.info(message); + } + + if (specificLogger != null && specificLogger.getLevel() == Level.FINE) { + specificLogger.fine(message); + } + } + + public static void logDetail(String message) { + System.out.println(message); + + if (specificLogger != null && specificLogger.getLevel() == Level.FINE) { + specificLogger.fine(message); + } + } + + public static void initializeLoggerAndDriver() { + specificLogger = setupLogger(Config.LOG_LEVEL); + driver = setupWebDriver(); + } + + private static WebDriver setupWebDriver() { + + try { + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window. + chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome. + chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only. + + System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver + + if (Common.isRunningOnLocal()) { + System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable. + } else { + System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); + } + + RemoteWebDriver driver = new ChromeDriver(chromeOptions); + + Capabilities caps = driver.getCapabilities(); + String browserName = caps.getBrowserName(); + String browserVersion = caps.getBrowserVersion(); + System.out.println(browserName + " " + browserVersion); + + return driver; + } catch (Exception ex) { + errorLogger.severe("Failure: Error in setting up web driver: " + ex.getMessage()); + } + + return null; + } + + private static Logger setupLogger(String logLevel) { + + if (logLevel.isEmpty()) { + return null; + } + + Logger logger = Logger.getLogger(logLevel); + logger.setUseParentHandlers(false); // Disable console logging + + try { + if (logLevel.equalsIgnoreCase("error")) { + FileHandler errorFileHandler = new FileHandler(Config.LOG_FILE_ERROR); + errorFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(errorFileHandler); + logger.setLevel(Level.SEVERE); + } else if (logLevel.equalsIgnoreCase("debug")) { + FileHandler debugFileHandler = new FileHandler(Config.LOG_FILE_DEBUG); + debugFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(debugFileHandler); + logger.setLevel(Level.INFO); + } else if (logLevel.equalsIgnoreCase("detail")) { + FileHandler detailFileHandler = new FileHandler(Config.LOG_FILE_DETAIL); + detailFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(detailFileHandler); + logger.setLevel(Level.FINE); + } + } catch (IOException e) { + System.err.println("Failure: Failed to setup logger: " + e.getMessage()); + } + + Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // Turn off all logging from the Selenium WebDriver. + return logger; + } + + public static String[] getAttributeList(WebElement webElement, String pageName) { + try { + JavascriptExecutor executor = (JavascriptExecutor) driver; + Object attributes = executor.executeScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", webElement); + return attributes.toString().replaceAll("[{}]", "").split(", "); + } catch (Exception ex) { + Common.logError("Failure: " + pageName + ": Error in getting arguments list for web element: " + webElement.getText() + "Error: " + ex.getMessage()); + } - return isRunningOnLocal() ? Config.LOCAL_IP + url : Config.GITHUB_ACTION_IP + url; + return new String[0]; } } From f602e295e1662fcfb5f874d0d30d821e916ae26d Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 12:39:28 -0400 Subject: [PATCH 05/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 76bd7c2f540..e7e5c884c66 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -134,6 +134,10 @@ jobs: if: steps.check.outputs.runtests shell: "bash" run: | + sudo apt remove openjdk-11-jdk + sudo apt autoremove + sudo apt update + sudo apt install openjdk-21-jdk wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chromedriver-linux64.zip From fb27eff9b676834c5cabc95a608c6f5790e7c8e9 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 14:06:01 -0400 Subject: [PATCH 06/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index e7e5c884c66..3b260198944 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -138,6 +138,7 @@ jobs: sudo apt autoremove sudo apt update sudo apt install openjdk-21-jdk + java -version wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chromedriver-linux64.zip From 7bc8208dfb1a8777d1747e9956d2d1b31e1bf9b3 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 15:17:25 -0400 Subject: [PATCH 07/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 3b260198944..72bf6257959 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -134,10 +134,13 @@ jobs: if: steps.check.outputs.runtests shell: "bash" run: | - sudo apt remove openjdk-11-jdk - sudo apt autoremove + sudo apt remove -y openjdk-11-jdk + sudo apt autoremove -y sudo apt update - sudo apt install openjdk-21-jdk + export DEBIAN_FRONTEND=noninteractive + sudo apt install -y openjdk-21-jdk + sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 + sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java java -version wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb From cf45ebfb73dfcf8a6f9e54b62ac539226d345518 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 15:42:09 -0400 Subject: [PATCH 08/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 72bf6257959..a86688bbcd0 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -137,11 +137,17 @@ jobs: sudo apt remove -y openjdk-11-jdk sudo apt autoremove -y sudo apt update - export DEBIAN_FRONTEND=noninteractive sudo apt install -y openjdk-21-jdk sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java + vi ~/.bashrc + export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) + export PATH=$PATH:$JAVA_HOME/bin + source ~/.bashrc + echo $JAVA_HOME + echo $PATH java -version + javac -version wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chromedriver-linux64.zip From ade028d31b8ff819fc617d1c8b8555e9d5d79655 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 16:03:37 -0400 Subject: [PATCH 09/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index a86688bbcd0..ae0884307fa 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -140,10 +140,8 @@ jobs: sudo apt install -y openjdk-21-jdk sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java - vi ~/.bashrc export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) export PATH=$PATH:$JAVA_HOME/bin - source ~/.bashrc echo $JAVA_HOME echo $PATH java -version From 493a73c6c876fa0075acef8d892c8c6afdbed22e Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 16:10:05 -0400 Subject: [PATCH 10/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index ae0884307fa..784b12bc330 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -140,7 +140,7 @@ jobs: sudo apt install -y openjdk-21-jdk sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java - export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) + export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/bin/java export PATH=$PATH:$JAVA_HOME/bin echo $JAVA_HOME echo $PATH From 405edc9bd5e242b9ff04e01db9c09ca6d1f43a70 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 16:43:45 -0400 Subject: [PATCH 11/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 784b12bc330..fbc42aa6fb4 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -17,7 +17,7 @@ on: type: string description: 'Dependencies' required: false - default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline pkg-config libtool autotools-dev automake git cmake xmlstarlet' + default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline pkg-config libtool autotools-dev automake git cmake xmlstarlet' jobs: @@ -66,7 +66,6 @@ jobs: unzip \ xvfb \ libxi6 \ - default-jdk \ gdb \ ${{ inputs.dependencies }} @@ -134,16 +133,18 @@ jobs: if: steps.check.outputs.runtests shell: "bash" run: | - sudo apt remove -y openjdk-11-jdk + #sudo apt remove -y openjdk-11-jdk sudo apt autoremove -y sudo apt update sudo apt install -y openjdk-21-jdk - sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 - sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java + #sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 + #sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/bin/java export PATH=$PATH:$JAVA_HOME/bin echo $JAVA_HOME echo $PATH + which "java" + which "javac" java -version javac -version wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb From 9ad287fd5cd332a4bc4c65bfb2ed81c516dd9d84 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 17:07:55 -0400 Subject: [PATCH 12/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index b21e3b0056e..a6514e39988 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -133,12 +133,14 @@ jobs: if: steps.check.outputs.runtests shell: "bash" run: | - #sudo apt remove -y openjdk-11-jdk + sudo apt remove -y openjdk-11-jdk sudo apt autoremove -y sudo apt update sudo apt install -y openjdk-21-jdk - #sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 - #sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java + sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 + sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-21-openjdk-amd64/bin/javac 1 + sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java + sudo update-alternatives --set javac /usr/lib/jvm/java-21-openjdk-amd64/bin/javac export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/bin/java export PATH=$PATH:$JAVA_HOME/bin echo $JAVA_HOME From f8b44c474012799a61fdb65af590b53dff0c29a9 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 17:26:28 -0400 Subject: [PATCH 13/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index a6514e39988..66f14d0dc33 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -174,7 +174,7 @@ jobs: export CLASSPATH=".:${{ inputs.asset-name }}-ecl_watch_ui_tests:${{ github.workspace }}/selenium-libs/*:${{ github.workspace }}/testng-7.7.1.jar:${{ github.workspace }}/jackson-annotations-2.17.0.jar:${{ github.workspace }}/jackson-core-2.17.0.jar:${{ github.workspace }}/jackson-databind-2.17.0.jar:${{ github.workspace }}/jcommander-1.82.jar:${{ github.workspace }}/slf4j-api-1.7.30.jar:${{ github.workspace }}/slf4j-simple-1.7.30.jar" pushd ${{ inputs.asset-name }}-ecl_watch_ui_tests find . -iname '*.java' -type f -print -exec javac {} \; - java framework.TestRunner detail + java framework.TestRunner -l detail -p /home/runner/HPCCSystems-regression/log/ echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) [[ $lines -ne 0 ]] && exit 1 From 6424073b6c045b17a63909b7d36ca89df23e6d23 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 16 Jul 2024 09:24:47 -0400 Subject: [PATCH 14/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 2 +- esp/src/test-ui/tests/framework/model/ECLWorkunit.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 66f14d0dc33..373d3f8974f 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -173,7 +173,7 @@ jobs: run: | export CLASSPATH=".:${{ inputs.asset-name }}-ecl_watch_ui_tests:${{ github.workspace }}/selenium-libs/*:${{ github.workspace }}/testng-7.7.1.jar:${{ github.workspace }}/jackson-annotations-2.17.0.jar:${{ github.workspace }}/jackson-core-2.17.0.jar:${{ github.workspace }}/jackson-databind-2.17.0.jar:${{ github.workspace }}/jcommander-1.82.jar:${{ github.workspace }}/slf4j-api-1.7.30.jar:${{ github.workspace }}/slf4j-simple-1.7.30.jar" pushd ${{ inputs.asset-name }}-ecl_watch_ui_tests - find . -iname '*.java' -type f -print -exec javac {} \; + find . -iname '*.java' -type f -print -exec javac -Xlint:unchecked {} \; java framework.TestRunner -l detail -p /home/runner/HPCCSystems-regression/log/ echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java index 3ae1b7ce729..6449065f14d 100644 --- a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java +++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java @@ -32,6 +32,9 @@ public class ECLWorkunit { @JsonProperty("ActionEx") private String actionEx; + @JsonProperty("DateTimeScheduled") + private String dateTimeScheduled; + @JsonProperty("IsPausing") private boolean isPausing; From 40971baeb25cfd945a5bde10cad095d7e1a8e9a3 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 16 Jul 2024 10:32:57 -0400 Subject: [PATCH 15/36] HPCC-31857 - Added more error handling and fixed warnings --- .../tests/framework/pages/BaseTableTest.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 20121314bb7..02a0aa841d0 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -92,7 +92,7 @@ protected void testPage() { Common.logDebug("Tests finished for: " + getPageName() + " page."); } catch (Exception ex) { - Common.logError(ex.getMessage()); + Common.logError("Error: " + getPageName() + ": Exception: " + ex.getMessage()); } } @@ -306,7 +306,11 @@ private void testContentAndSortingOrder() { Common.logDebug("Tests started for: " + getPageName() + " page: Testing Sorting Order"); for (int i = 0; i < getColumnKeys().length; i++) { - testTheSortingOrderForOneColumn(getColumnKeys()[i], getColumnNames()[i]); + try { + testTheSortingOrderForOneColumn(getColumnKeys()[i], getColumnNames()[i]); + } catch (Exception ex) { + Common.logError("Error: " + getPageName() + ": Exception while testing sort order for column: "+getColumnNames()[i]+": Exception:" + ex.getMessage()); + } } } } @@ -422,17 +426,19 @@ private List waitToLoadListOfAllUIObjects(String columnKey) { return elements; } + @SuppressWarnings("unchecked") void ascendingSortJson(String columnKey) { try { - jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); } catch (Exception ex) { Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in ascending order using column key: " + columnKey + " Error: " + ex.getMessage()); } } + @SuppressWarnings("unchecked") void descendingSortJson(String columnKey) { try { - jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + jsonObjects.sort(Comparator.comparing((Function>) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); } catch (Exception ex) { Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in descending order using column key: " + columnKey + " Error: " + ex.getMessage()); } From 7944f7b471d860d52d543b2fe7740a870c23f42b Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 16 Jul 2024 12:47:23 -0400 Subject: [PATCH 16/36] HPCC-31857 - Seperated logging for test failures as error logs and exception as exception logs. --- .../test-ui/tests/framework/TestRunner.java | 6 +- .../tests/framework/config/Config.java | 1 + .../tests/framework/pages/ActivitiesTest.java | 8 ++- .../tests/framework/pages/BaseTableTest.java | 32 +++++----- .../framework/pages/ECLWorkUnitsTest.java | 15 +++-- .../tests/framework/utility/Common.java | 63 +++++++++++-------- 6 files changed, 73 insertions(+), 52 deletions(-) diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java index 1b8c3399593..4158f129e6e 100644 --- a/esp/src/test-ui/tests/framework/TestRunner.java +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -24,8 +24,10 @@ public static void main(String[] args) { Common.driver.quit(); } + Common.printNumOfErrorsAndExceptions(); + } catch (Exception e) { - Common.logError("Exception occurred in TestRunner.java: " + e.getMessage()); + Common.logException("Exception occurred in TestRunner class: " + e.getMessage(), e); } } @@ -69,7 +71,7 @@ private static Class[] loadClasses() { try { classes.add(Class.forName(testClass.getPath())); } catch (Exception e) { - Common.logError("Failure: Error in loading classes: " + e.getMessage()); + Common.logException("Failure: Error in loading classes: " + e.getMessage(), e); } } diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java index 90ede35a86e..8cb4a08647f 100644 --- a/esp/src/test-ui/tests/framework/config/Config.java +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -3,6 +3,7 @@ public class Config { public static final String LOG_FILE_ERROR = "error_ecl_test.log"; + public static final String LOG_FILE_EXCEPTION = "exception_ecl_test.log"; public static final String LOG_FILE_DEBUG = "debug_ecl_test.log"; public static final String LOG_FILE_DETAIL = "detail_ecl_test.log"; public static final String LOCAL_OS = "Windows"; diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java index 41dc5dc6ff4..9229481f79a 100644 --- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -20,7 +20,9 @@ public class ActivitiesTest { @Test public void testActivitiesPage() { - Common.openWebPage(urlMap.get(URLConfig.NAV_ACTIVITIES).getUrl()); + if(!Common.openWebPage(urlMap.get(URLConfig.NAV_ACTIVITIES).getUrl())){ + return; + } Common.logDebug("Tests started for: Activities page."); @@ -52,7 +54,7 @@ private void testForNavigationLinks(List navWebElements) { Common.logError(errorMsg); } } catch (Exception ex) { - Common.logError("Failure: Exception in Navigation Link for " + element.name() + ". URL : " + element.hrefValue() + " Error: " + ex.getMessage()); + Common.logException("Failure: Exception in Navigation Link for " + element.name() + ". URL : " + element.hrefValue() + " Error: " + ex.getMessage(), ex); } } } @@ -105,7 +107,7 @@ private List getNavWebElements() { urlMap.put(navName, new URLMapping(navName, hrefValue)); } catch (Exception ex) { - Common.logError("Failure: Activities Page for Navigation Element: " + navName + ": Error: " + ex.getMessage()); + Common.logException("Failure: Activities Page for Navigation Element: " + navName + ": Error: " + ex.getMessage(), ex); } } diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 02a0aa841d0..8b76bd7789c 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -71,7 +71,9 @@ public abstract class BaseTableTest { protected List jsonObjects; protected void testPage() { - Common.openWebPage(getPageUrl()); + if(!Common.openWebPage(getPageUrl())){ + return; + } try { Common.logDebug("Tests started for: " + getPageName() + " page."); @@ -92,7 +94,7 @@ protected void testPage() { Common.logDebug("Tests finished for: " + getPageName() + " page."); } catch (Exception ex) { - Common.logError("Error: " + getPageName() + ": Exception: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + ": Exception: " + ex.getMessage(), ex); } } @@ -127,7 +129,7 @@ private void testTabClickOnDetailsPage() { javaScriptElementClick(element); testPresenceOfColumnNames(getColumnNamesForTabsDetailsPage().get(tabValue), tabValue); } catch (Exception ex) { - Common.logError("Error: " + getPageName() + " Details Page. Testing tab click on: " + tabValue + " Error: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + " Details Page. Testing tab click on: " + tabValue + " Error: " + ex.getMessage(), ex); } } @@ -211,7 +213,7 @@ private void testLinksInTable() { Common.logError(dropdownErrorMsg); } } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Exception in testing links for column: " + columnKey + " value: " + values.get(i) + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Exception in testing links for column: " + columnKey + " value: " + values.get(i) + " Error: " + ex.getMessage(), ex); } } } @@ -251,7 +253,7 @@ private void testDetailsContentPage(String name) { try { waitToLoadDetailsPage(); // sleep until the specific detail fields have loaded } catch (Exception ex) { - Common.logError("Error: " + getPageName() + ": Exception in waitToLoadDetailsPage: " + getUniqueKeyName() + " : " + name + " Exception: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + ": Exception in waitToLoadDetailsPage: " + getUniqueKeyName() + " : " + name + " Exception: " + ex.getMessage(), ex); } boolean pass = true; @@ -281,7 +283,7 @@ private void testDetailsContentPage(String name) { } } catch (Exception ex) { - Common.logError("Error: Details " + getPageName() + "Page, for: " + getUniqueKeyName() + " : " + name + " Error: " + ex.getMessage()); + Common.logException("Error: Details " + getPageName() + "Page, for: " + getUniqueKeyName() + " : " + name + " Error: " + ex.getMessage(), ex); } } @@ -309,7 +311,7 @@ private void testContentAndSortingOrder() { try { testTheSortingOrderForOneColumn(getColumnKeys()[i], getColumnNames()[i]); } catch (Exception ex) { - Common.logError("Error: " + getPageName() + ": Exception while testing sort order for column: "+getColumnNames()[i]+": Exception:" + ex.getMessage()); + Common.logException("Error: " + getPageName() + ": Exception while testing sort order for column: " + getColumnNames()[i] + ": Exception:" + ex.getMessage(), ex); } } } @@ -347,12 +349,12 @@ private String getCurrentSortingOrder(String columnKey) { String oldSortOrder = columnHeader.getAttribute("aria-sort"); - columnHeader.click(); + javaScriptElementClick(columnHeader); return waitToLoadChangedSortOrder(oldSortOrder, columnKey); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + " Exception in getting sort order for column: " + columnKey + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + " Exception in getting sort order for column: " + columnKey + " Error: " + ex.getMessage(), ex); } return null; @@ -401,7 +403,7 @@ protected List getDataFromUIUsingColumnKey(String columnKey) { } } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Error in getting data from UI using column key: " + columnKey + "Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Error in getting data from UI using column key: " + columnKey + "Error: " + ex.getMessage(), ex); } return columnData; @@ -431,7 +433,7 @@ void ascendingSortJson(String columnKey) { try { jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in ascending order using column key: " + columnKey + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Exception in sorting JSON in ascending order using column key: " + columnKey + " Error: " + ex.getMessage(), ex); } } @@ -440,7 +442,7 @@ void descendingSortJson(String columnKey) { try { jsonObjects.sort(Comparator.comparing((Function>) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in descending order using column key: " + columnKey + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Exception in sorting JSON in descending order using column key: " + columnKey + " Error: " + ex.getMessage(), ex); } } @@ -477,7 +479,7 @@ private List getAllObjectsFromJson() { try { return parseJson(filePath); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + " Unable to parse JSON File: Exception: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + " Unable to parse JSON File: Exception: " + ex.getMessage(), ex); } return null; @@ -555,7 +557,7 @@ private void clickDropdown(int numOfItemsJSON) { Common.driver.navigate().refresh(); Common.sleep(); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Error in clicking dropdown: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Error in clicking dropdown: " + ex.getMessage(), ex); } } @@ -564,7 +566,7 @@ private String getSelectedDropdownValue() { WebElement dropdown = Common.waitForElement(By.id("pageSize")); return dropdown.getText().trim(); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Error in getting dropdown value: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Error in getting dropdown value: " + ex.getMessage(), ex); } return ""; diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java index 7f29811f6a1..cfe1e470428 100644 --- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -32,7 +32,12 @@ protected String getPageName() { @Override protected String getPageUrl() { - return URLConfig.urlMap.get(URLConfig.NAV_ECL).getUrlMappings().get(URLConfig.TAB_ECL_WORKUNITS).getUrl(); + try { + return URLConfig.urlMap.get(URLConfig.NAV_ECL).getUrlMappings().get(URLConfig.TAB_ECL_WORKUNITS).getUrl(); + } catch (Exception ex){ + Common.logException("Error in getting page URL "+ getPageName() +": Exception: "+ ex.getMessage(), ex); + } + return ""; } @Override @@ -167,7 +172,7 @@ private void testDescriptionUpdateFunctionality(String wuName) { updateDescriptionAndSave(oldDescription); } catch (Exception ex) { - Common.logError("Error: " + getPageName() + " Details page for WUID: " + wuName + ", Exception occurred while testing for description. Exception: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + " Details page for WUID: " + wuName + ", Exception occurred while testing for description. Exception: " + ex.getMessage(), ex); } } @@ -228,7 +233,7 @@ private void testProtectedButtonFunctionality(String wuName) { } } catch (Exception ex) { - Common.logError("Error: ECL WorkUnits: Exception in testing the protected functionality for WUID: " + wuName + ": Error: " + ex.getMessage()); + Common.logException("Error: ECL WorkUnits: Exception in testing the protected functionality for WUID: " + wuName + ": Error: " + ex.getMessage(), ex); } } @@ -371,7 +376,7 @@ protected Object parseDataUIValue(Object dataUIValue, Object dataJSONValue, Stri dataUIValue = ((String) dataUIValue).trim(); } } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + " Error in parsing UI value: " + dataUIValue + " for column: " + columnName + " ID: " + dataIDUIValue + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + " Error in parsing UI value: " + dataUIValue + " for column: " + columnName + " ID: " + dataIDUIValue + " Error: " + ex.getMessage(), ex); } return dataUIValue; @@ -410,7 +415,7 @@ protected String getCurrentPage() { return element.getAttribute("title"); } } catch (Exception ex) { - Common.logError("Error: " + getPageName() + ex.getMessage()); + Common.logException("Error: " + getPageName() + ex.getMessage(), ex); } return "Invalid Page"; } diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java index ca084f72242..34f6d227646 100644 --- a/esp/src/test-ui/tests/framework/utility/Common.java +++ b/esp/src/test-ui/tests/framework/utility/Common.java @@ -2,15 +2,18 @@ import framework.config.Config; import framework.config.URLConfig; -import org.openqa.selenium.*; +import org.openqa.selenium.By; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; -import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.io.IOException; import java.time.Duration; +import java.util.Arrays; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,7 +23,10 @@ public class Common { public static WebDriver driver; public static Logger errorLogger = setupLogger("error"); + public static Logger exceptionLogger = setupLogger("exception"); public static Logger specificLogger; + public static int num_exceptions = 0; + public static int num_errors = 0; public static void checkTextPresent(String text, String page) { try { @@ -35,13 +41,15 @@ public static void checkTextPresent(String text, String page) { } } - public static void openWebPage(String url) { + public static boolean openWebPage(String url) { try { driver.get(url); driver.manage().window().maximize(); sleep(); + return true; } catch (Exception ex) { - Common.logError("Error in opening web page: " + url); + Common.logException("Error in opening web page: " + url, ex); + return false; } } @@ -49,7 +57,7 @@ public static void sleep() { try { Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS)); } catch (InterruptedException e) { - Common.logError("Error in sleep: " + e.getMessage()); + Common.logException("Error in sleep: " + e.getMessage(), e); } } @@ -57,7 +65,7 @@ public static void sleepWithTime(int seconds) { try { Thread.sleep(Duration.ofSeconds(seconds)); } catch (InterruptedException e) { - Common.logError("Error in sleep: " + e.getMessage()); + Common.logException("Error in sleep: " + e.getMessage(), e); } } @@ -89,6 +97,16 @@ public static void waitForElementToBeDisabled(WebElement element) { public static void logError(String message) { System.err.println(message); errorLogger.severe(message); + num_errors++; + } + + public static void logException(String message, Exception ex) { + + message += Arrays.toString(ex.getStackTrace()); + + System.err.println(message); + exceptionLogger.severe(message); + num_exceptions++; } public static void logDebug(String message) { @@ -116,6 +134,11 @@ public static void initializeLoggerAndDriver() { driver = setupWebDriver(); } + public static void printNumOfErrorsAndExceptions() { + System.out.println("Total number of exceptions recorded: " + num_exceptions); + System.out.println("Total number of errors recorded: " + num_errors); + } + private static WebDriver setupWebDriver() { try { @@ -132,16 +155,9 @@ private static WebDriver setupWebDriver() { System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); } - RemoteWebDriver driver = new ChromeDriver(chromeOptions); - - Capabilities caps = driver.getCapabilities(); - String browserName = caps.getBrowserName(); - String browserVersion = caps.getBrowserVersion(); - System.out.println(browserName + " " + browserVersion); - - return driver; + return new ChromeDriver(chromeOptions); } catch (Exception ex) { - errorLogger.severe("Failure: Error in setting up web driver: " + ex.getMessage()); + logException("Failure: Error in setting up web driver: " + ex.getMessage(), ex); } return null; @@ -162,6 +178,11 @@ private static Logger setupLogger(String logLevel) { errorFileHandler.setFormatter(new SimpleFormatter()); logger.addHandler(errorFileHandler); logger.setLevel(Level.SEVERE); + } else if (logLevel.equalsIgnoreCase("exception")) { + FileHandler errorFileHandler = new FileHandler(Config.LOG_FILE_EXCEPTION); + errorFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(errorFileHandler); + logger.setLevel(Level.SEVERE); } else if (logLevel.equalsIgnoreCase("debug")) { FileHandler debugFileHandler = new FileHandler(Config.LOG_FILE_DEBUG); debugFileHandler.setFormatter(new SimpleFormatter()); @@ -180,16 +201,4 @@ private static Logger setupLogger(String logLevel) { Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // Turn off all logging from the Selenium WebDriver. return logger; } - - public static String[] getAttributeList(WebElement webElement, String pageName) { - try { - JavascriptExecutor executor = (JavascriptExecutor) driver; - Object attributes = executor.executeScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", webElement); - return attributes.toString().replaceAll("[{}]", "").split(", "); - } catch (Exception ex) { - Common.logError("Failure: " + pageName + ": Error in getting arguments list for web element: " + webElement.getText() + "Error: " + ex.getMessage()); - } - - return new String[0]; - } } From 4a2f0cb51238f516cf0ea541f7570b79d4c755d8 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 16 Jul 2024 12:57:31 -0400 Subject: [PATCH 17/36] HPCC-31857 - click changed --- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 8b76bd7789c..f1aa6baf168 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -349,7 +349,7 @@ private String getCurrentSortingOrder(String columnKey) { String oldSortOrder = columnHeader.getAttribute("aria-sort"); - javaScriptElementClick(columnHeader); + columnHeader.click(); return waitToLoadChangedSortOrder(oldSortOrder, columnKey); From c801747b44987d1308e153177fb4aa513544a073 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 16 Jul 2024 15:41:31 -0400 Subject: [PATCH 18/36] HPCC-31857 - added wait before click for sort order --- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index f1aa6baf168..6d7c7fb0ab0 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -349,6 +349,7 @@ private String getCurrentSortingOrder(String columnKey) { String oldSortOrder = columnHeader.getAttribute("aria-sort"); + Common.waitForElementToBeClickable(columnHeader); columnHeader.click(); return waitToLoadChangedSortOrder(oldSortOrder, columnKey); From 1e10797ca0e46e24a9f00221cf1515c0d787c7b4 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Wed, 17 Jul 2024 15:02:39 -0400 Subject: [PATCH 19/36] HPCC-31857 - added wait after click for sort order and updated documentation --- esp/src/test-ui/tests/framework/README.md | 4 +- .../test-ui/tests/framework/SetupForDev.md | 125 ++++++++++++++++++ .../tests/framework/pages/BaseTableTest.java | 4 +- 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 esp/src/test-ui/tests/framework/SetupForDev.md diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md index 78ab59a1b9b..048948c01de 100644 --- a/esp/src/test-ui/tests/framework/README.md +++ b/esp/src/test-ui/tests/framework/README.md @@ -41,7 +41,9 @@ Below are the dependencies used in the project: - https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.17.0/jackson-core-2.17.0.jar - https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.17.0/jackson-databind-2.17.0.jar - https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar -- https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.17.0/selenium-server-4.17.0.jar +- https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.22.0/selenium-java-4.22.0.zip +- https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar +- https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/1.7.30/slf4j-simple-1.7.30.jar Notes: 1. Users need to run these tests with regression test suite only. diff --git a/esp/src/test-ui/tests/framework/SetupForDev.md b/esp/src/test-ui/tests/framework/SetupForDev.md new file mode 100644 index 00000000000..1532a8042ac --- /dev/null +++ b/esp/src/test-ui/tests/framework/SetupForDev.md @@ -0,0 +1,125 @@ +This documentation provides a comprehensive guide to setting up an Ubuntu VM on Oracle VirtualBox, installing the HPCC-Platform, and preparing the environment for testing and development. + +#### Setting Up an Ubuntu VM on Oracle VirtualBox + +**Overview of the installation process on a Windows machine:** + +1. **Download and install Oracle VirtualBox:** + - Visit the Oracle VirtualBox [website](https://www.virtualbox.org/) and download the latest version for Windows. + - Follow the installation instructions to install VirtualBox on your system. + +2. **Download the Ubuntu 22.04 Desktop ISO file:** + - Go to the Ubuntu [downloads page](https://ubuntu.com/download/desktop) and download the Ubuntu 22.04 LTS ISO file. + +3. **Set up a new VM in VirtualBox:** + - Open VirtualBox and click on `New` to create a new virtual machine. + - Name the VM and select the type and version (Linux, Ubuntu 64-bit). + - Configure system settings such as memory size and hard disk (create a virtual hard disk now). + - Link the ISO file by going to the `Settings` of the VM, navigating to `Storage`, and attaching the ISO file to the optical drive. + - Boot the VM and follow the installation wizard to complete the Ubuntu setup. + +#### Installing HPCC-Platform on the VM + +**After successfully installing the VM, proceed with installing the HPCC-Platform:** + +1. **Download the HPCC-Platform package:** + ```sh + wget https://cdn.hpccsystems.com/releases/CE-Candidate-9.8.2/bin/platform/hpccsystems-platform-community_9.8.2-1jammy_amd64_withsymbols.deb + ``` + +2. **Install the package:** + ```sh + sudo dpkg -i hpccsystems-platform-community_9.8.2-1jammy_amd64_withsymbols.deb + ``` + +3. **Fix missing dependencies:** + ```sh + sudo apt-get install -f + ``` + +4. **Check if the installation is successful:** + ```sh + sudo /etc/init.d/hpcc-init status + ``` +5. **Start HPCC-Platform:** + ```sh + sudo /etc/init.d/hpcc-init start + ``` + +6. **Verify access to ECL Watch:** + - Open a browser on your local machine and go to `http://192.168.0.221:8010/` to check if you can access ECL Watch. + +#### Cloning and Checking Out the HPCC-Platform Repository on VM + +1. **Clone the HPCC-Platform GitHub repository:** + ```sh + git clone https://github.com/hpcc-systems/HPCC-Platform.git + ``` + +2. **Navigate to the repository directory:** + ```sh + cd HPCC-Platform + ``` + +3. **Check out the specific version of HPCC-Platform:** + ```sh + git checkout candidate-9.8.x + ``` + +#### Running Regression Test Setup + +**Navigate to the testing directory and set up regression tests:** + ```sh + cd testing/regress + ./ecl-test setup --preAbort '/opt/HPCCSystems/bin/smoketest-preabort.sh' + ``` + +#### Running Spray Tests + +**Execute the spray tests:** + ```sh + ./ecl-test query --preAbort /opt/HPCCSystems/bin/smoketest-preabort.sh --excludeclass python2,embedded-r,embedded-js,3rdpartyservice,mongodb *spray* + ``` + +#### Generating JSON Files + +**Generate JSON files for workunits, files, and DFU workunits:** + ```sh + curl localhost:8010/WsWorkunits/WUQuery.json | python3 -m json.tool > workunits.json + curl localhost:8010/WsDfu/DFUQuery.json?PageSize=250 | python3 -m json.tool > files.json + curl localhost:8010/FileSpray/GetDFUWorkunits.json | python3 -m json.tool > dfu-workunits.json + ``` + +#### Transferring Files Using WinSCP + +Find your json files in the VM and use the WinSCP tool to transfer files from the VM to your local machine. + +#### Downloading Dependencies + +1. **Download the following dependencies:** + - [TestNG 7.7.1](https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar) + - [Jackson Annotations 2.17.0](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.17.0/jackson-annotations-2.17.0.jar) + - [Jackson Core 2.17.0](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.17.0/jackson-core-2.17.0.jar) + - [Jackson Databind 2.17.0](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.17.0/jackson-databind-2.17.0.jar) + - [JCommander 1.82](https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar) + - [Selenium Java 4.22.0](https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.22.0/selenium-java-4.22.0.zip) + - [SLF4J API 1.7.30](https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar) + - [SLF4J Simple 1.7.30](https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/1.7.30/slf4j-simple-1.7.30.jar) + +#### Adding Dependencies to Your Java Code + +1. Include the downloaded dependencies in your Java project. +2. Specify the path to your ChromeDriver when creating a `ChromeDriver` object in your code. + +#### Writing Test Cases for ECL Watch + +You are now ready to start writing your test cases for ECL Watch running at `http://192.168.0.221:8010/`. + +#### Uninstall HPCC-Platform on VM + +Use below commands + +```sh + cd /opt/HPCCSystems/sbin + sudo ./complete-uninstall.sh -p + ``` diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 6d7c7fb0ab0..0e947ccc8d9 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -326,6 +326,8 @@ private void testTheSortingOrderForOneColumn(String columnKey, String columnName sortJsonUsingSortOrder(currentSortOrder, columnKey); + Common.sleep(); + List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey); List columnDataIDFromUI = getDataFromUIUsingColumnKey(getUniqueKey()); @@ -349,7 +351,7 @@ private String getCurrentSortingOrder(String columnKey) { String oldSortOrder = columnHeader.getAttribute("aria-sort"); - Common.waitForElementToBeClickable(columnHeader); + //Common.waitForElementToBeClickable(columnHeader); columnHeader.click(); return waitToLoadChangedSortOrder(oldSortOrder, columnKey); From ec20e256fe194a34ce5e2f0c0423c876ef2d3f04 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Wed, 17 Jul 2024 16:51:46 -0400 Subject: [PATCH 20/36] HPCC-31857 - Modified code to test an exception --- esp/src/test-ui/tests/framework/SetupForDev.md | 2 +- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/esp/src/test-ui/tests/framework/SetupForDev.md b/esp/src/test-ui/tests/framework/SetupForDev.md index 1532a8042ac..5e303399c43 100644 --- a/esp/src/test-ui/tests/framework/SetupForDev.md +++ b/esp/src/test-ui/tests/framework/SetupForDev.md @@ -39,7 +39,7 @@ This documentation provides a comprehensive guide to setting up an Ubuntu VM on 4. **Check if the installation is successful:** ```sh - sudo /etc/init.d/hpcc-init status + sudo dpkg -l | grep 'hpccsystems-pl' ``` 5. **Start HPCC-Platform:** ```sh diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 0e947ccc8d9..059ef9490d7 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -326,8 +326,6 @@ private void testTheSortingOrderForOneColumn(String columnKey, String columnName sortJsonUsingSortOrder(currentSortOrder, columnKey); - Common.sleep(); - List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey); List columnDataIDFromUI = getDataFromUIUsingColumnKey(getUniqueKey()); @@ -351,9 +349,12 @@ private String getCurrentSortingOrder(String columnKey) { String oldSortOrder = columnHeader.getAttribute("aria-sort"); - //Common.waitForElementToBeClickable(columnHeader); columnHeader.click(); + if(columnKey.equals("Execution Cost")) { + columnHeader.click(); + } + return waitToLoadChangedSortOrder(oldSortOrder, columnKey); } catch (Exception ex) { From 8f7d39e08d862ce53c6d926f5899ad7b17fa5cee Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 09:38:45 -0400 Subject: [PATCH 21/36] HPCC-31857 - Reverted change for double-click on Execution cost and updated documentation. --- esp/src/test-ui/tests/framework/README.md | 6 +-- .../tests/framework/documentation/Common.png | Bin 30026 -> 0 bytes .../tests/framework/documentation/Common1.png | Bin 0 -> 29898 bytes .../tests/framework/documentation/Common2.png | Bin 0 -> 3083 bytes .../tests/framework/documentation/Config.png | Bin 37103 -> 38947 bytes .../framework/documentation/DesignDocument.md | 38 ++++++++++-------- .../tests/framework/pages/BaseTableTest.java | 4 -- 7 files changed, 25 insertions(+), 23 deletions(-) delete mode 100644 esp/src/test-ui/tests/framework/documentation/Common.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common1.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common2.png diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md index 048948c01de..abb24b93090 100644 --- a/esp/src/test-ui/tests/framework/README.md +++ b/esp/src/test-ui/tests/framework/README.md @@ -18,9 +18,9 @@ If the Chrome browser version updates in the future, it's crucial to ensure that While running the test suite, you can pass arguments in this way -> "-l log_level -p path". - "log_level" is of two types "debug" and "detail" -- "debug" means generate error log file with a debug log file. -- "detail" means generate error log file with a detailed debug file. -- If no -l and log_level is passed in the argument, only error log will be generated +- "debug" means generate error and exception log file with a debug log file. +- "detail" means generate error and exception log file with a detailed debug file. +- If no -l and log_level is passed in the argument, only error and exception log will be generated - "path" is the path of the folder where the json files are - The code will log an error if the '-p' and 'path' arguments are not provided, as the JSON folder path is required for the test suite. diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png deleted file mode 100644 index 0ed9dbda328c5b1759d0c08ef3562d6b58ef5e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30026 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

    CLP8w&V-e^FLtlIAbo#>yyWp7v$x? zwyn==JDIW3RV^236lg3C@nEee%g|(+-31COh1Sw`9x_qHr$i80O%VnlAxwEw{4spxf+;PECo70ThFjW0Vli1L9c$p!(+f^nzP4yxsIubyjw)gj;Kz74rp+ zW2xI337C#h`{mJwO4a?rQK<=5+YdHh`jTg`EB-r)prWS`o9E3Fv6FXnqA zahl12#}zRkLzp_dQzOstP8Bus^tyVA<4Loaw-`LVbT0kgF24P$pRTo WZ}Qx;ZVn;vclMBXOLzYHum1s64%Q|B literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Common2.png b/esp/src/test-ui/tests/framework/documentation/Common2.png new file mode 100644 index 0000000000000000000000000000000000000000..665896f727cfdeb19414e0049394894f53faeaa2 GIT binary patch literal 3083 zcmcJRYgiLk8plU%t<}X|cq+9iQn#%rVy&bE1rpW@qAh|*CMhn07m{=Vr7I91fyCbM zK@_SGG+>enPa#Y~BFQ2PO6b-W3*=J7Ax4Z*X$T~dl!PP@a@mP)FT4At`(eM#nKSdA z^MB8K-t&7;<=*7PfaR|&2LK>o_pbPT0I(z)c_%Jgiah1$x7z_=#m(LE+wmotkJMw; z<8QA_820*j+>h5R`*7>Ypn<<07C06^Rad&}2KDA{la9IA=k?g$M8*OopLJvnIKmH| z3s{8ozTVt1>~BAM72}^DsJ_1Q8UN?M-k$V#x2{A5``a6bnwKEW{jGV0{_d+M&#Xk6 z6XTbE89cXa;kDkWf|-`w1H;|o1~qk zaKv@Br|nF&R+v@4K^A31mGQFfO-p;j9W0+IIV5M&wBIJ5+n@2%h4up#@3e*pq=8x!eRLQGgh1NO# zNG^QY&}ILN@uF;^Mse(bUgJslcO%xqBH$p=fx>>a8#5aZ+g*1<=;>V2d!u5Bbx)us zL)r%(ZOK8iEE!|Z!+Yw8;`39=HXMjf$7Ih(O;fI*rQb{&L~6DwmnpcD1e3$W(`yHt zdMd3(dxUly+?um)s3N@YcpLzjAqMlCH&FWz1%1(;GGkCEL*PC26!tm0APJ7up+m-W z5GJjYJqRk&un?xo%D*?v0m~t>B=37`xWFu*md6g1c^qAk0)MpSIB3JyK#HbVsJM^< z@*s9NN)kH+0Dm8v^9(RPMRaJWqRozjl9vV|-ZT-}P^pZ9yMnA`!b04X0>{G5Inwnt z#$au_&QOE(oxXJ{JDo(KQYLm!n7aICx)q(Vztt$`#W~#QeH+h_0O0Od?sDtXwE?|n z`$Cx44i{mb2;8W?YUdNCk{qN zEKPS;gTN|hr2_!d3556HL-6&S6ga6ap(styhBd=F&VY+59aNf?^5t}Lac?z8&5MH?`8a-f3=-n? zRmPS@yfNx6zsn82=7+?7CzV_w@Lks7F1I5n*KgGbl03<^Z63ykgnM-*kXYwUhH-ToEh+C4< zb0uY~p5dlvJ6YPSdhLTTv3lm)+&d3+3u)6U09m_hWk7A-q?m4%mRdV|zcZpU9{DOl zGe<%%ev~zgt;-tS?KppN_SNK`AYkruYu89n5@uG7o!7+9-??|#zFOp9UJn#c1>R$1 z!FEb%z30tP?8(~crvb);l%s`avPY6M)0?Whzu>kKq)>};yoeU-dxcXF?}1t*+STw8 z6T zOh8rjqA6&`XvjtmcP)+VEoqTV#=h5TIK|5CK5TcVGW`R!Jjf#dL#p_)|V7|49lxPn|vhj!IS5M@XpNh+;dilo?pw$VpNYF$AHuXRo4HO|5Mi{GyFhh@lNF_sS zkPqQQQn`TEoB@N1Y|UQ%j#fiEL>C+q9>{l&W+SikNVpWg9IZTqgr>%}XoXicvBXr}pJ#_U0ZbM5}KehU90N{sMj!28Oy zA$0G>955Q2Uyr0~0+pOpj4`FLAq7-6IeTq8H3Vn7!5u_uh+n$w7KHE^;MeK4$PP*_ zMOmHWHAJD3>C%3r?1kmw`euO z6cU6HSTBv(mTJo9i2l3)6X{ ztq~wvOVLerKb%&5JfO5ZiBwV{6CzWQ;F1@;=E{tCQm&f?_Ct|l<>mfT{l|1s1c+*K zeHn2zh!p_I&`12V%`0AKtTKK&2pKR!vcKH%MWlK=i9I!&FujaVI;?YNFuUm7? zl4`1*jus%Fp#VKinV-H8v)AH0DsU+bnnD zJ;0ZE9SRA;gUoz}BStMl7qqq>NcnM-`dJ|#rv|HK97;EO2~d2f+4kx6@*g17CN6x)j78(0%^($2A~)bb2xHm8*JLZQe3J*BO=n zb^ZL`aF1C3_U`(BAABAY9lq+xQdU*je|)Jj&@WlC;Xm%&-W9_PU}>qho9h3)J0Uq< J^zOk={t0N>FHisg literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png index 883eecb0333ecc34b4be7225be11efe944172b53..57ee0f31690f4fd316fd188e52188a3260d3a0ba 100644 GIT binary patch literal 38947 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

    =5YuEdHyzAz1^uT(rfd0QkUBwba=T4lb#BaD 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 literal 37103 zcmc$`dt8%Oo~< zob8NPkg#RL+YfJh+3)>h?`M8qTp4Y48#B#T*B@9c>-GPZFgs9U%x+Q zLXqcrPR@DG=ks}AKIiy{k>N}J<@J9-p-@YH|GUsXpis|kMxlOX{O9N4H&QA=fkGWd z{XX=Am_wvN{mD}gWvA-z&dmDFcvp{oRL9ty{`q@^_br}>FK&PM8?T0rm-ft<=N7@0 zSK4R7UxZK8@aB7Wkk3QdwEf6u^Qr*2KMF-E@bpAJ#n8U+-I24m#@s7b$Gve^4pKU+`SGyT(*jUjVXVIe?;B){NZ2!FCX?lzMLwxSx2+J zo13doF~8JOlCvg=pD$Pj;}+k)cJ0%?Mq4SCMSgoqSXT0v^sED!-q&q`@MRMnxPZ;B z3h5qmM4v6Is7r?l%r!fWfz-dyYt@U512apEBk#la>#;ayB0VjmE5zJM3?(R1nP1w{ zGcb8o<)5jl5s0Fl{E_zxV7l(t&bspRv4@vy*y_TA8x6dMw+!)rW0IXg99>Z|7Pm$~ z$y8;~OyrfUmT0Y&>0cq0_YEX%=?oOZqz`ZA+c$N8NY5S6Prg;pSkrDBTZ^GY@f*=` z&ZC;~eRl$PHE#3^^3*J5F6DH}s|p`wsIwaTAN>kev(wy^zxg&dF(;F3V38XL`aq_u zV|(VYk!Y-h=o<~B zWb@zv+E@Q(Te!1BHPt}9CdHHot#FpR{^~p;@E#}?Zp3-RcU>}wNt#reRDK~CsV!J~ zS2*aN=fafLdZK6mz(!>(#*eJVb zutP;t(~ZS?6??g6zu2xJM~4WO5!0((r&W#Xs4nMXcZo{%>yB|M4DrcEA7MUfz(g=juWnfsaJ_=(cV7FC(EOd-dNL zpZ@XVJ$%b=cFDz%!-|KF@EN}l@#LqaIqRb0pSyyY)_9ieLSuI9GsbP7B9SZgd&4$S z^n)Gi<)=uy_EkFWY_ca4rbv}L%%M;HO+vKt)@*5~Y>d*hvNp_`KN{Gf4*c91dC0}6 zn(1~#>m6O{*t7Dh1Cyo;R@4NEZ%pm}&?o1k(sTPHdZIdGBl&IEan;3|@*b`vHB>(M z<@_7^XN1olykzUyaR%uC-f4e1VYR>$*-0d03Mu`V1tTFo z89+_LgSOOKtU+C74W)T#j@FFl3$B+qrK?gDv#u<)TBsDvigr;oyL5|&<=5Y?SAVTNtNwQx?};;ysNy>6{RogO- zF%Yez$O`&jN*8I@5;rrZrIF+t4AkrrzH#~Exy-m^^Yxu98vG*5zzkv+N~{#DMwyb< zlj!mbPsyW_-^dNIUm!8-K;mtclQ~xg9U}mC1Y4p+t=DKkIP6q4e601SNh)mVd9anR6@8wwk08vTG?>j@=U zEb->~^kuAOG!sLtVVSCPHvKxYv$?y*Vvl7r*J5I_V2hj~XLvt4NKz(YyINmUT7spY z|I={E)33c!qhGlDHEUKqQDbj2h03eb;5BwXWH;7gzZ{g>mwndBfV;?-ca{#;kENi$ z&tuomQLKMXNz;?T=2c4^Arh==#&&|Ay(1xZbv!(0RRyuY0C9+X)`(qv-{_q5s$Swe zoA{c;kCw1f$=IRYTlBy0<(r5grr#}{H7PT5u}6R^EpP0u}@jOW})o%ypWo)yv4dvb3urivYC){rsg z(Y)f7n>>{E(F|PB%6jVaSJEe^d7Vcdtau)Ee_z$?SSjZubFeuCLqScyisYC?>q8^Y zHix|;#Tz|(!cj*cuU;WMu&Wfu$GxtsNB$(&U@qva8&1DD&K>u@A_`C2KU%zez5v!1 zzIeqxHQkZA_0f*+yhc}KQD$Ce<#3&;qm#5(p;{?nwdnS4ee^Aq4yY>)4}PYo{$C`m z`+Yf&((70sOuo(cOURwfQWo@%?#X)a`r%1oz~(A4xxJjdH+hmhR%g_(qm%3G$E?rHu|G7#`?-padi?AUxHOYERDKDKTTRMAy&-Xk~ z?csgH1HE$-MzBnX6>k>0ybLR0moABB4Z{|G)k&~kvleg&0Yvp+l0e>SiMB`T{mV#W zcQP%}={Fd{XH$+P^}tNz`nDMP@3d3+&OIv9XKz~1k6FcuqtkdR{ry1Z*lpTyy40xb zs~Y-d@yIt3h00Tm`A6ZM7#Vs~6>~W}@-z1)U$T(aq}+)50*DCnx#$pVd54SM9Fm}~ zK|+c2b1zA@Hty5DdM(dJ>7nkD88NX9jr;v=jea+o3YZea;kcLKUP0l0L!FO9@rmA6D=*L8_ zX!6Hs-ktZn>`}!}N8tFZ+WM*~Vg|Q5txhzB$=6?stTr)bCO2fY_d4YqOUGuI(6F-9 zta?m_DN8q&vWgXq%egtNVmAhNu|g?_sP*_(NoOygwsEWWIortOx|FTliGSyv+b7VI z5>sUa!jxCfOSL$6!q^()Z6cjT-2XatG>xlW`sBxouy4R9SJN$riG~X z;1XFiZSDH{x~i$)`9MuSd$ScqVCAera^t_NLb5w$JN(EUr(n4wa2%I=W;(7HR+SvA-w=w;_u~_4Iv{2so zhlX4LSL%>9!*|D1Uvgy!>8wdH^h;ID_3q#)+S1e3cCYAqbf2JQWQ26Uge4imn@b63 zq{!KN=A=bX@|@@*Up&&4`QW*%k1H>bnXK9YQo;~jNgXtj-s=u;zGr@JLv35BwNyWl zTHDP;A`UszIlZo=$oW>!O0lW)o@Mr5xD``v$iViJ#_2cNnx6Pt0<)ZEm^)#~!m-q< zm0j49zGfbw1UG}*(_`r<$}Y-xja_c8cqXN>-)sw`MU8S6(I=<(BkT9CPp@Bs|6MDyKB7qM zO4uB3#yL+w4Fa!JSx<`L(2T(3#QBs5Q3Mf>(_fu<>X<1*>@QYWEj2|B7*Ljfp%Z_I zD$sR95d+CFY^FLmNuC~q?Wy7aDEVU-Qr~v8tl&_fn2Z#_d1M-&*!rucYvw`qts_B? z{8rT1_XgUX$0P2d&fu7AAxU>?5Wuf9cd6m`B!)RaZ|5 zrTF<;CPEu`TKR~SY6y3SHUyn#-f_s8qE>P^t=B2d+Nu?1sL74hW)1()P!m$z>v*=E z&gpWJxztCntO@Fsj&%y=()R}(=t{`c%N|bexEi-g8Ix53Whp)sT`udqzP!)Bx38{h zQpK*Ohi@AQOb^>cNFGwiB6l}lE4p5pWzQRvcHkJ?K@R$HiuVd?FR5~_4cU7w4i_w7 zS|h7WoWVv~hI+5fveI5NW@^zoYl_)cpA3^_&&aC8P=`KH*%2t-d^fO)(%kU{dv8uv zmGD+;H5YwFpf>OJJhANGP^fcUSK22j>up~;W(P|b;oW@GrPArNn=^{VhqM;v*Hg!Q z+`l~gNPge=&D5#%YY3tBJ66lOh!^LcXBo5R9w}Efe%a~${9_8M{nby7swvyy{sw>7 zbN7f7Sl24LR@`aU5f$6`iIhdC!}rYg%FVyY-HlLS*}ngHWO^mUykf3W?>(A0GWq#P zF<&?Req_j5AJL*|fr7DzI^Lo3F^dux<8X# zObQoY*wmG^pEE8Ivi!O#sAZ72->ZNNyY|%CuReKYrq=r0gnRA=#4U_qeR))_O zmb@!xXtH{6a)9z)d(U^H*^b+^!!Q!;7fWal77wPYMh}t>9J3%f6WKNaBxBE=-)Yep zc1pU0al2_(W`1=s_7azI+f&jb*pG+GKabeDlo)KSz3hsOQxu-ui1Yj0*@7EAC)NG& z2BUh$WnF<)Xk1>ADjt^Rb-(zIkuy?d{$|-7W9fxJgAm!85DwiT4DVoUjo}X^30N@@ z9xe#%^~&NW#vSBR6?AP2@bzeYPNQgVUeMd||*7ZCl8Ee@+qU_}+yL zTVUH?Q0<3QANy~zvxKIt6dwHmqyqCUC}{1aY%AIjo^d3AkXp3P6FW=vK__8REowDV zGI(FCBB#_sUMVGbmbrdAE-AgRk))6vA?!kCyUev~0jAncjaTiU475l-Pi$Sv(am^? znzh|sGaXH*2)kl+Gu&(Yv`fw4^>YF{6CS z@v6KUQB{oY7DR?}*)1f=u~q@TLdpVfon>+l0oi%mo*!0TN)L==cc)pb@ zlVS~2q6)%1weJxgZxU@ewU*#4Du#e-e`E=M(AUgqWmFcfEQ^mJ7~VKM_mRS{jnDH4 z`J)ecsUvnOa7Q3Fy|bLa8zxM`xtbv~80Bt&u7AZ4T6=4k66WLUww*VZH~K$dYEvm{lnpIztp&*FG>yD$OC=!hv{^}am0t!)mp7$4+5es4p0l(hU>37 z@z$+luVuz_>kkIEGXPObdQR*=H6CjXE<-{Q0;U_T^6Uoc&dnI$!uU#038@0WcNkVY z`%S8`9>78KSVp?Q?ClIPZ;58z83MkAJZYe!T)_%--T9ue=U&D3RHvB|%Pwud zX2d2%R~HV-W!1|2iQ|)vw~stn{1WPLYUIp&SpOB{cd~LbRj9cjB%>X=(WKcVIp7@88*AqvFsV|{WIhsWImw_9o z6I(9qqYX5wh|0Tcm3}EVL8;kaSJr&O6ApjiA% z|2G|a%k(?2?$rUgU&`Ap&FjQi1G6k5#ygXl?tv|~Q2*+L3vN=3O>OA}pBCiRk7Fk$ z%b`|<0$%8lG(%J|4fK@6s8<822!A`8Z^yY2p&vvsmCQjuXh73r<&`FySTegENWwIm zKz(%jrc=;J%FT)B8371d86?ez()o0MED7qD`;mORCoq>Se=R*1XjK_oY3h6XoE(l$ z-sbX!04{43278Zurn}3PQ&p;dB0_0C248Q0!qvoTq3_*lc=T=3?B^b}7@B$Lp^Rdy zW9(!dz?kKEgpvV&LGyq~6w8Wl8ujmw7Z*kw^gLT5!gFyNM-D;ZBMUZu1zSCP1I(_L zt0;7+vPlsX!$-7JCYt@xM$&;w7BY?iA#aane6VzbL5f6qAi9A1xSW!0oInDF`|7hw zK9iVs38Fmlw9>(d?P5K&IBv84tvy-Z(8}APJ^4SmnxxEN5>-iT4|)17toDZx0mdzQ z-54;t4nlWgL}W*4vZKC=*#|+W#v*PrAq<*Kz79mB<2`~6?LaQyd*%+x((EC)MTZ%~ zhluO923Aip3A`te7k7q+Zn&?P^jsWC-qgHLmA+)*6~AZ|{1qVrH+Q@0$*`QghuXCynQsM7&3;lyqBaf||i@ zT#7<{a?6Z4w)r=S5vaij<8Z_G^I;ENe>4ShO)1p4hs!4nFjU?Z`0;Lb&iM$Cd+)!1 zY|#~7ubytoy%Upb%B~Coca4r9dx29nwD8kAKYC zRG6GkmKP;cy1M`rd(<8?+1i$JG<}^BbuvoityG*&lh;=^{Y92vQ}_5rV}y4Tc6Kl; zN$$aGS%pH)$<*V&f_2ROTU1ABn4?@akp27D>k@~`k+r-*4wGwS7hG#Wt^BCUtdV!W ztFJHXsit6~@C6K@Yk(}8{niY+x@)lM-zQhheN+6O9%zbwy1I&HP}dP2-v!=?&FwCt zy08xbBLWa-(h$bykqg)Xr<<^ut(})SAYv*WHO#sT$%^~mz`}=E_9cv?hj4B>#}|lf z3NiiFzB0z&+7Q~H$0NDSWkAG|a@Z)FD9qZD>Xy_FDeXV}byjsjYuqXToH3M3Kq9~Q z>x6dUBGjxwU{u6O(2YnlKM99X z?q+M0+n(H!qzsj7T&MQqK?>eB^;o1Z*8Ers_=$lE_iMauH)3X%3#Ec=ZQ@XtzlXET z^)gf(prb|mJyzC)OYjA*rfXZ`d}655oTs9nKXn8m$NjskmZN)t@7a^}v8e_#CyLj2 z1AmhECE7R0L$gzhNOi|7S0nupt-C0oUC8c41dC$~q4Q1VOHKPtKUKQ8V-nmMc?skL z1%1SJt%N~_4IrMFp6NRBVA(^*=!@Ga9~HEm;zIp!*bdrxCDan& z-S|JLB~XVI_Z^ET+UHtS1&+Jk)?GP|>L<>QPqeDQaAn7c$`t_qRYXlcX`e>#3QRQ_; zn^^IDrz5V`_}#-n{Vv^CS!48z+2K*m0|14B8oEoKY(L=`AxR351JJuxFcZO)sY}~P zrxSdTxG1d&2z4`g$fMPD2n}EEI+cP4h+d@9uk~=sWrU{BR2uNJfd8VUvxIlOWR>+@ z#q8^cp4O7T%IcL*BbCJCrvqULRC+yrNL)<@bUHxVr$BB$)p22Pxt>v8%SJZ#R;Ui++!ONybNM6mYdfdDBTl(UHgLL-efG-x^MRON-0N! z>&(tTC5z4bb`X|_^WexJ%2n7RPK_Tk4;}t z-HIue+Y#Z=%$`U&tJ868MPtGrOv@Sp9jZ0s2Ne7idn`i?gy&sAX+;i=UchIoN$jrk z4kUEnRw3u$#*nDYaE zyFoo*sqr-nrMQqi6mduYF;h5gmlF$4nbL_;CCCUM1|w`OZsxmF5gGz9r-A-$+dYe% zi)$2!o0~!7EFe593|maYGlS^(mU5q-Q4ciMU#e3|WZRdb*9(|sx|i%DlhdhNxrd}t z9itiI@<4;wQfg1i#7X5X+Kj}3haujwB+wQMlcha^BBCo>UNO1-45;H#{qb8Ng8~S= z!AKxblFZVcPwM%PRE&Dx(HRFm3E_2X#t#G);LtJxg1bTcP{!;4CZr6REY1G2)u$Bn+5i2a`Frp_Nt_(VPFeh*-t{GZlUXH0-IQ* zb~VX;e+l|OGF)R$Que_lb-5?0a6!K~U#Kr~3vM@lI3lpQ)f3(0XevWDv@OH}O=*qd zuBTx3!{oBr6jr#uuhl+U1{5|vp9mTkndwgJh!y2%(?;o9zLU-*)O0*1{iU7b06SiF zJJNuukxttJoB6CG?etM(2Ub=wxd2}VzjcJtG|Hi4WGD<95al5NC$gv|`?YZzF70h_ zDnM%As%R=g4n^fYUBLL`k=2&42PTp zr48~DCKyh40i$lF8HWdRM}3*CCO4D%uJnv(?#>)4k^X1&x$)a zB9GD6^|VbZYBlIrlwm~Wp~f0rw9>mQPh0NaMXIwM{Md9~nZR1gQB38TnwNLRpVf7g z3R8ULpbZW<39C+;q*M-@N;+_f8mT_S{s7%M9T`QaK%(w2H<-Wtz&kw|h+(pK>L&dz z!VlcXxC!-(UrgmL8?Moe|9Sk;_$P=f6ilK`Yuy0iiZ#3Co3^hN*3+JzGgsz)q2T9A z-+ib+Jq4NCb85@XSC(~yow_fjIr+f~m5c1!jd`&-4Rv_jHGSaLkp~4UAeA3Z|MtId zpZ)~Sfa`wQygFN~F8<7K?runkDm}L*YVup%gSehvpOEyZ_}&$)9&gB@em2OVIm6BM z932|1Bx*6`f$0gI?247?xXFZ|aAa}Z?!KHeCHu69*UPk&u_R%YGKpA087$@LBI;~k zplR<8QHTY+R@FXLoG=TEK6$VQ{0^!93Wg~%sENAdze?y1-(b4}VCIUkZ#q6O`SI&(8F`hAHW~mQF&6BCb zuZeYtG4sJ+up6j18#O(l&aVK)vvs=IdSfT|JaA$H#akuIp^&}rgmD0rW0_*cP7DS` zM_G~j{!O=Ga~>OSuF>Wr7Y57=@FpjuX=EVosI!z?g)qs_4rQ3fM{-C)l}S(~a`;}e zI^99$qo|HIGScb;Vs-LvL}#@RlQU9e1YB+yNX4l;$G1;uaw@R~N@TM5hRDNNCxXet zjMmufXOv@59uHgG@B(o#QHbh8D}loX`IU)O(dVTZPo>v$W|htoALXc0ozv8aPMFHk z5T>~|*>>!!ViWMq(_c(-(NtFD)G^htDW&%Fc+R&nBhjG1x9xAYtTdEx8Cpju1@A2!Ihgt0 z&_M95R&d^iWNe)9=8xk%EvHsw&b}OG{j)8ewXRCN#8V6&o%wS` zfgn^$uppR2(1v4`i;0=*t+oBC&g+nh5t?@s6q*RXF5S~d>xp*Hzsb$FKo%CXw2ink z3*J6d16TL;0UOM0{$9I1;!gQT=OpUiPYT@AxsZYTc|#_=k~(Ar9FBM`78brJEf`dB zjS{|r?=@O8piL515VnJ=pN(|A-+Ue26<;(|eGq4a+Co~>P=*Po%En{Z0toTPEtLq; z%q~|sZsysF5c`xMox8XAPOkNII_uj=0piL{<ZKERlXSpE|JXcj<8a%b3JofZYWazB{yWZ>50Asb>mr9Uo{y!ci$1NV?Aauo>e&A3982!zV&MJ6>=&sDEbjd> z4<#hL#?^>6buCF>(~y#kFLDAEGoSM_Yg8vkgiwYa1$XCy9r0%COT_gSWLUM;rlf@e zXP(+awwGJ(5X^o;AmjU_vuXAdMU7RGtwrN-&&@8B!G@eV#)$E)>nTZFZ54l<3U}R z_*xb6&zfbSly`;uRPAe(bXCm>@-|v|fv`<{vr)E%a~ynKq)V1%(QcPlffg6!SCZg7 zy0&~qQz}Bdoh{_%_=Xk9XCTQM`P(^IwFp@a+;Iy0HV@GN4tsY#QSL7vb*lpR|FtDN%r6aEt8jX2xEPhVNiX&isgl|>iQklbmeb{8zuZQyYGwwD>(=w-c~nVKC&;Wq)n}A)8zo*v_DAGS~VBNfALuvBTW|-(U-H zK~W3Up~RPBaz#*kRu&-okhr~kCDz z$2{8QQ0~$N4mnzYOgi-S6YL%;udyMSoSs2}C@HXrkCDTiAJtdYr-*A3`)-48i5Z4C z&+w$r-a%W4pycDjq-Cy)UF{ZP6tTy;gk%tg*={gsZePLD0UEJ)DatWhsqXB)*%!9*S5_c0 zo`v)w?ToE%ED=|vJONcW;v__p45B>(VoV|q)!MN1q~;b)bI;2_r)&W|1e{qWPx(Mr z^T3z95v%x5jZ;(F$OXGH3bGY@1E#HBt%8f(Z#^Ov@tZ)p|ypqeY;pUSf@Qb%{ z+#~{fm)=)m4aGuk4s|ZY3a6T4s0ca~&jT+F0;Sgp<-lgN#jwf)@1`0;oe4ov<2=NU zrQaahWBqfMExT6b+>~p{BPuNd*mH<9`T}>dXV0S)UZAe^=UnXRBUvKgEqTN9v=5jM zz=e)h&Rh5ff(3vo|0}kkf@4Ma*C@p6zZM#ao=h3gw4O>Ob11CdH-q;yBeGdn!cU;r z2ZLi-Br-{WL%I{F?4OPFmA)sWWTgL`v9I|nvlFosyr51`tBdScX|5l1-MjdC!UlDH zE|@rwQV$%ZVzKzk;?@iYz;9t%+HQobGM|zWthdG;Z8Z_Vj$3<2Hm<^Ya8FvidWhmz z8&`X3DBL`O3Z@oFW27ifLtN<{r#|%p5>+Y(E8PN^^>)1 zoyXbCh&g%IB$-J7^$yIGiQjRZDG4r)NEO>^rQt<7rBZ-~3IuHRVVivCYa>T~kb3JA z65x~YHI@QK-CIp^FU_7uH4laRZ|ihxnTDUV|H)g;avd-Mq0f>N9X~FOB6E@iApJ(1 zRWgKl@_@s6*5nIWK&IFMQwl}1aJ1P*I7E@hK8(Q+mDVD&8E8mVTJ5h<14ckDy%tIH*AoAN`M=cR5luB@7~;NAQNOE_vjFQy+5lQKe=w8vFPK9YJDhc3!92CoLGDHau!R4L$YLN{1Dq*GyPZ6{%co<`-l36$HZNHnbN=SCI zX9xi$>Zoa>%ovdRC@T3VXbtk8Xbmv#-%{XK6@F=$Zr*>Z7LBM4H(SrGD{!Mv_P$vdlsRlY&E{%h@1yog1z_{Z#=Wy1eg-p#KD7O?oOW+^ZxOOGjX-c^h~IZ z5v~uIMWlF===xP`bct07%Y^&};Tyvvp%UThSZ-<$FCV%`xPfLE( zq1nTD@7tX<8M^^foouhfcnoDbLWoH7_j*ulOA?@+e344ITEzm|VJ7w(< z5(DVYz`e6JG{*sj50QkXiUhTzwwvrKU1HWcj#{;ktjem_s{*mT;Dir#V6X{ANKBsG z#@GGc(?a0=7K(+jN8I72A*4s3nXRkR>&@(3z3y)HSh$fo9}S z5E-P5x>9M8ZS~)U^b~aShsbrW!Xld*={NP7-j$o;!2U*8WlICFvkT0_4IY2?-s64& z71W7rgybZH$D#ioVt0GlDUs>AV(S%eah7Y2YJdunOLB^KA#GbgQRafi1F!3{F$9PZ4 z-=liyvV&iQM(XC3j>UelJ{e}qofpFO zU)BR9G{tqvPnj|lWz0(@cY!hiA)8fEQs8ddySjbs#HU{AVZh`Sq;%ejzoa;+(!js! zN^PqRr58qU&?^;**eal14;2^R=592(=kJRzY zxE-RDOTgm%Qc;n>)nNI3wn2CM-7vYMUSLOz9SEC%?DQH79rwQ}Dej<2z3!6Y$3xqn z=@t)up^y+tWoGF;?z{nU?4JjQGu#Mbx6SMQg)sI=1 zlKht9N6)qce)q=I{vz?{@qpeR5E^%1fi{F+A~GzN8r$SLI>l{$3g4VMy3n_QR6)(W z@pC(4o~1SPR=OFyOimMX!ShfildZ188cI~w7B@A7G%0s?$uE!^s&#=ts=&hm#kAXb zR|EO#;?1``jd_ztt6Xnd)+PHZvxpUdY1eawNIDAJWKI^&zMNcVLp)On6%L6Wms`ED zJ5f0Rk_nBHszum$DK*k615#ez7%Lw6jNFU^n{q=;=Il}~8*1QA&OX0bIvCl8O`_n% zN+Zi%P^@oHC981tMLk|Yj!~CyLD4H4Hj2z{*B*+WAr&A z@lLsT&wMB0Kam;$Ok_YWAzN*H>A*X))$mNz1pe<)LY_Lt<0mdZygKKR{m4w`G;|XF z>Zwjb6mOi6z8|R%ip!s&F@zaBs07NOQ#F~O>Tt46&FED~_eUbo6$>4O?jAyX|GM;A zlMvm6O_!ezUd&vjcl=!20cuOH1G61=_p-U4b~W4?NOsm#t+P83qWmp-l3WIXr3$f& zyKP=^=cxinhFfnp#frz$U&flMdhEFxu_EUw|H7i-m!>egXOs97--Y~0<9MQNEL7;X z6KesJ-jH<18JM;khgiZa`I`dqtw2N=`KY1_M0>$ZgYaiM4X&WCsYl&v%F(%bO$THL zA-4q-9XIUtHwZN?Hf%H*K@D%Vr=-*D7d8S^RE@=gWKyKMFa~f9X^cipWx{!fkbHLf zTyr0Ut(`Qor=MB#R%d;4H@vXTsZ9TZU_SKQ)VUoW8ks7?9)2VQ`DAG^*4Bk})(C7%MOYs!Y8*v#;YKC%4ej_;AYu z_ZkGNa>1_iKWGrhRy;z_APU}3JbN?7&FvxDBBU_r`2je4@pBx8f}sfV;8&k%%4czg zMqu-6fzxY9?P!3M7XY&SjVBG0=v+rVpF7{5P){6{L0)&Wf(xh_HU0cl0)AnmFMRW{ z2U&>EB{Ni7?z-50m$d}J$C=E^!VSK}dg>+SnzmZ)(Ls5W02A=UWI_FlTvR23Mq+3^ zqBxG!5RlUkqSeBXN8R+=q@##Gyu>mYE>{Ic&EJbn%o%^s^DXnTJ5So+hi~NP&p!BQ;Si{?f4ZL#9HIamdpIO2_p8iTFYXB0 zftdA%-wQTI*PWmEwfk6^IJcGHm-7&$w_g_Ye{lJ5804*5mVN^A)`w5!tt-oOo!3k@ zHrLzsPC0Fe>Bg_=h7Tx^qKt9T+TLVN*U+vqja#8*5rw z-nb647q0_%SVLJ2bPedwqYsEwp!UBNoz|CEoG=u(EmgLb!#B6+2d?KbS{N=yR6CEK z6D%F{ic|+cui0+rBoS#VcyqP{EiH9Q@~R4T5%tCj$Wm1$#}6WXarpky6mK}I$S4GZ zjJAM5G$5{d$U7whF|;;Ad7nAT;M6p%MU-5&KPC~UJns6QW$&=sThbo))X&kP6v0u6_I*7LcQ2LocDxhX z2XVbpw?Am&xyv$?$vRsQPTn6eIJa!0c|jgLL)xl)m#gpT z9ft1rRX^YTK3l0a6QIC2I&py=+vRrSWk@&|#+ouB>&I)z(AK>ZChOUefr+oCEj4lc zG^o?70ax4mJ4(@T$jVSRyMmGdV#H~1zz)Hj7@%<@v+eTPTAvKD2X;MpC2|{ztVF!J zzi0604u+XMqE`QP^KCEh2a}68$I{Q4?*Pz@MXHWVRPuEdEr`;r(+J;XD$KN4^Xo1o z`GfjiNfkDCqM>6pYlp)Ni1Tm&s>V+C1$IhqQHzfzTS=a*Suwza_VXS%oyY0)KX#D7 z<%tpUuu1NL7d4Co5q{p8ceqNgPMUlH`{+$jug)PH__HJ0vr zp?C{~1myUF;|HU$f9Mm=o>E09W2QVLse7Y9dw(*PT~3OxK3&6FN=$2@SAELWq}C#Y zcf<8QAe5g*dyn0C6D7eRYG4|In;&=Hm9R+15Ca~x+PmlHnbCk;y}7H!M#wVDk*rn# z{d;bAxX^_OLd!ei9WI|xo!bcFcMCgDcrODzn^n)5+ibYb@5^LDJ68HH(A&R?a!n)l zz=@anPkP=E{ONX&nuDP8ZjIXl1OA~nx2tXU(0qniLcG~}RJP7P2 z=0a|d0Q(y{pbd_o5ewX-nYYu=Yib_?!|N8 z310D7l3%dl-M@S1`}gNq&WA!q1-L!bU}DAS2B4+YeK4E-gz6sne#_lb_#8E8-Hmb$M`jit;sOn6N|ve}F%Wi)I~FcBXD~_#+&)q^8r|xpz$%=KC>L zNuh`i9n7f{WLE`PlWe!x;sQ$Fmypzd?s%F*Uz?@kCEp%>4TY+CFm-j_a)*k#kDL_q zhUSSjek|R6FyobwWA@Ame>ZxYel9rCm9$9l05RPydVGr7jOkaiXVvBpp`G307+n!I zk0SqKEVqA3!G?+NLfg;%9KNC+GWCZ4E5`Z$j_C(>;?!!#j^Nz)=SCbH@9P8CN51h# z-G9=~KKaWjIgAKYvvez^JDw{B$X|A^Z6#>j4SCuO+@=sUOWIX1H=6Anb@I+)LuRtc zk58OI4Ngp}G>~uGp=-V4ptgM@FOu{)>!qz}!vRx_yz0yjFmf(ewyi==rT~jv>LK|@ zRUlh~Jp()#&evX6WL802d{vk_y*}q?p_Brt9F=*8{-==u&GAHXE|q+yOJ+lJYsi9` z_1s-USl^Y(ZSF(RAZ6N$uFK0f$csHsA0yrBMo3x<8-LEq%VF_adb*xDH3oI%)FX_= z&HAP$-AE11w)a^eDCMDZ-k$~%N+dnETak<-Ok0Y|`MNovm@e=Pkb0tz(rnY| zgk4SGF{_PKmA>B?Y0iU1{~OIno^Q^57MxxXU-L{Ug6JXL6zPVZvP5N&nzt14$E7{f%H8+p$>k&T$I zB40%X4>^&u9eT;|z~7oJ)77gqctnT2-OBdxc`87AaU0i5wefSI{yvb>K48l1{XDn! z>Vh*F>cmW(Gq=fRRUfR9duEF0zHktlj_&Rgk5_3bYXWE+3*jghee18TROK^o=fe4a z*OY_TIzCdlW#C#wQmrmT`$USmph0|IPsIdL%Ol2`s0;gtA-Z&sMTl!`5iZe~U)3zu zQR{IUqrXY%eBsGrHX%pASev@ny5yhKwd&v@y%lXT(|5w zb-^{c4e%bEpHc-YNmNb`1fnMLN#m3Q)#**_FfqYuU2$ft5`r9Jm6F(RrY7k+OXG-{ z6>_~UwvP7&+R!FhE8w4_j&eG)m7%_605$gYASa=HTE91p9Ocln>Dlvnq`{KJgFGUp znCsnn#NV7EETl57J*8iAOBWrE$}&7xfBrIi5h`<7{-}vNogJw{U8x%W<8!FXl~ce- zN;7lUOuw-x`?*yB_a?3nbC=%td+^ossKX&PXR_amsM*g8w%qB@KjS{wS8I$z4HuHe zS08vMZ8yIv@inef*FR;giR!dw0vCz09hxcG;dvtW4D_6$CTb5|L_UX||G>|~eq$@_ zO2^3ozbux1c6cf_@%oT%C@gFYFeJ`RSd_J@%|>&>B=^l@d5nKnz(5EzFePPiSgl>Re?=pxfuMj@{pOC z4oTEyY_97z4RxP3cl(I!(><~c)Eg}?OL{g<;nFOo%5~n(OzUUX#_lt$%{aeb!+-c> z;Opr!_B#aUTf}t2CSS$@PzMWzO|gF~%qKa1%jsJ*fKLruN6#s?HPU>)5u62+%nUmXllJgS;3LuksnI0E-x`b30p zFNbQ7kjiDJ+8a5yQu}2U=)3Zz1nMXY4wG~EP_(Y?h(b8;iPkAB;E7(0ieeZF>&~a$ zJD1k+hPDwxx3ZIG<3^GzvJ7HLPg`I7f&Sa{;DD!}A3&X=V!p%>9GaZ&T4AKf6<=RD z74@2~)Cx^M$4SM2`f|HfPBI{>oS+L7EF85t6TnlW<1wy>r@|h$reUL=taKmiX*eE?Mjg6kT~!P5{K&#H zYjD1jyIq|5XBxWyCQk{0HI0Pht$ZTMnX0{&-BGc+8J`T1zV)T`=9JTs+GH(fjAqZ+ zs349zDGNyw&ed$}e#m(Ck+%SJV2G$g*R4DxWg*}4LnRGjbn=XWCk&Gji>dV=H3TDv zb|E$s+>D108VJ4l4kXYvFF?~0a;AzXD6p8A+O3m!wN8@_I(}ayGhi^@j)z0DM0U5S z=<&p^QNm%Gh5vMzo;Rg*=aBq?YaQn~R+s2fo2v;+Xpfn!o{M22r&J;xVK*4|_t|%! zB$QJrkw84po4i`X*hD%E75WSI^tkJgvzQ^nMXEdwfJ{@1u(r(jA|Y=6ys^hY{qlhx zN_&$k-?Ixch(BQgP+sNi2xw_F`kX*++TDRr{{>)ro~|+h`2}V)WR%jQqhM4%N3^R2MK6dr}K{ z8}DWm+Z%bjPkq}3)xiUkYjZ88!4DD@ak!SQINHXjfexKc>ge9Y=XP~)sP&pwaKmi; zj9fO!<%!%?2kOdk-Ash%2~Q8y{mm_@ISqw;b?Zvh`(J&w1a+SQY=UAfkL&c`UidXggF1`U`TWC%U{YJnz?r|XIpk8 z-%%1`wb?@h#_NE%^2m8W%?O@E&j3C_&53nb64WV6T-Q2I@nyF6j3YUM+?bddy5Zal z_A$zgYPwMBLy63`1ckiK%yo_Pllh-8XGbBZqt4oYjYM0sCmNGuku_v@O${__BTe7b zHcm9tbI$ruqEw|5w`n=spH2m+Su=0Scnk6kwPk~}w@SopZ;EY z#~yYZk4i9CT^@(bFUYlMm#Ke4ZVa1esu>#`tOqXvpVuJ!V`HRV(e z3E|ON+4U{A;1tQr^Kz0??3R;IJg3Yrb*tfWpz&N_XyPWRiLvWU=S)T{>@d$rqk5O~ zU5i>*#WF-8`!a3zHyVvcWA%6p>qd|DLZD-y@wAOrrmKJ&678OuJB_LiXk3Z%an_ha zDVd4FgN<2FH?E)#gEPgm?mX{upg1wKlR@w=mqlt4ae+Fq3C^Bf%Q2_;BE3d@#5ELe z&;-fMyc%LRJ+wV0A6jBA1VEy+3-IMJm>A}Ls-8)Q=HknNAaYI~Sxt<>5p_m6FtnT08hmuFwtSAp>!(p8HGKDq z;J^<1Q|n<~2>!zUapXGp+5MIzJUW-L6!nR5TJ)~HIUr31C6j)|-rFS-o=2Zh26g|- za+76dP`jALaw$~%(r=LFe&ZC5i+hyGx)YYqtXx%4{S;9ygl5o&yVjQfSKQUdC4KLE zw(i#Jb+^6Rj(0WZTzBi7xIL_HkvS!0JC$u^vNH3S3Og%hWod~>LV`P;vsNqHURKTr zWa-KRg-tU91Kd;12Ou+KJ|Hy{R0JwQ6a?<)`$HXV)w$c*?)}S`8T{b)@OgND-kpND#V?8!CFP8&bxYxl@&UDQ`F{)3C}I?vyhlrzvShcuonf@Q*cc} zGMYz|eFgn>+vJ~Q>8x)_D;mPagGNDuL4S05$&5DcA8+S8+GsuHNV9a~Zn<)Aei@~B z&c{*YamA0~JYuao4kA6`J?7~TO~+h7s7HT~pYk5+cz&7pwXt;+?|}1$qfVaRE$$D{ z;!e-b{aga0c+y{z^HXbvKTD{u8D7ioBAp@_d-(fyg{RR{vo7(pRWKk+hsjt?LvCT% zGs;XMT7@E+w=NbRX(Eqj9{XwX$;oyX2du)Yrw z|GZ*^vuVV0m-$LdL69_1nC(oMOZUyXbEy>&CIJ}~gc-257iVX#sx{0=#_H+; zPRIV1RtJ>+BQdCmnOJmCc8&FHy2fOn(xHme1?mdPXiXDpgw+DXZw2M3@-iWyS07N= zBd+D!BCdIy##u6j&KZ!dqCllSTCZf&$GWq9NB7CdEI=|c=LODW%?ny4YI;xEvY_MN zZvrwRk-RO5+mQr%{6GnUYDtLdpG@}v{X^6>)bxsgl-v!~^P-j&y6$RkswPc^go+iO zF^PW$0ij}!+LPGzRw(DCjMk(STSXb53Rfv0g)9{4_k>r3$AeDn3KYQmmqN>d>c;|u zfnti?1e1mvOGW1oIf;yT`m$NMfDm7mTKF4LB^U(r)tfb~F=R&!ERk8CBN(NqS~I0( zw(QA8lKllO5~PbLj5tY9CwFUJ$R#~E%aC*2i$JDk^dA?O(2pyR0@cyImJKtbY60i+ z;NhVp?7RTza;R+b^L5BZ%DY7Eff~sfMJzL94c$Tqh>M{k!P0|Mv>bN9n^KB+(1-k2 zfJVP0RmEr-94?^S4wq@56n(OdcG`6u6mrUH2uuf^_@EA>*Y0Frd7t&etW0;`haCmw zIb=;7zS63#X7W^5v^P3p%M(PF9rzf-CYr$WnMCJ4*dFL4FkAL8(CN9_BjrO!vX;s{ z#*Pos+8gTL2sLGj&RkztPr{Dwv;D%j6-IklnKp-|yM}(JhUmuazP;TCAy#@lx zkhwO;d9SH@bfBXkTrV=-uZxJ0c}~=wOdtPq?QmEo~=JmOx66sD{wFrl$tgXXo=;)9pE!NO62r+4$0AJS<8fSTwY%6Rd6m0GpV2?!b@3@BEzR zj}OP!!@eWxf>!fOpyL7l9)dorQayKH*xf$vn$PX_ot+^S7qGGepbN^}R*RimSj+kv zdUn|RElFgkS4niv|7Im{TY=@?J^BjFdLBDSW;oumhtc;if zyo;ND1_E?DdEZF#R4?Q~s>HDP-u~lfGG#;u4V7?S(gqz^1SbO)7Ykq@!(B_0c6N1} znT*s;f#!z8*irzN96*|gd^JrvhUPY@)HGHMVXeAso3A@+0LI!H!XhJ(Evj2%PH)i! z9=FG=h#)H^PPtTTDr@U$p!LA=SZ=i`p)kP|3ev=BnPQ)+Vn?YE5a7W;KX(B}=HuVn zoe>>iF7O8!-=w>{uXiM^=(}m8!ympyjnS)_HvQu|uLH-ga}jPBKOiH(4Y#vT|Co0! z$1{$Su{^GdIv!I(9pE;ZX3ryy%R97tTy^_? zc)pQpub8nMN;1~8tNriJZHXynpiZ>XoeVjN+PM;KJYSCV`(^-&9d~b@Zpb!3)eD)r1Jt#7F@|8xKJ?o)t{_t4 zsoK6+09o`qRs-mMWz>tpB@1m?8TFo$IB^&#M521Y*vm&y-q}RDrcyL*{7-#Wg92n2 z?t3VyEhdvkNQh!fnc+o{P*D(_NOp96HG+0x1rn$WR&I*tC7tLT9PB-~bb~v1t05_L z6Fr%myFMLN4FUo?6Ckct+RQqT;FhE{6jxZ0cMd76wj&;S=lBGQWu7=ppt#qRfdKs3 z-ybOw?&Ms9@mGA8a0IK67)BnbNxsaYIAZYhp{(qwc2{K@&Kgqfryu=cS2VO*_z?ND5f7e?oH>Nup1e zFyX_%WG-J`2)nzRWFSynT3UnzicP5Uw1$uII-BA<&nP^Rrj7R|6Hr3JFu-0D1r@L} zOqW_Us&OE5|kJR)G-8_6%t*QQQySVS}KDay$6K92qa6$4}gOpQ0GYmGj zp|i8@z#dMLnGr|8@}~DJnn*%G@Ov&{ z#Sl(HO3@j3<}ZH|rhUpM2a2biMvgylN4TMxmrl)_dJtHT1or`o4Y5@kad(xj)l>0- z>4}992PiLG1N7QefD%fi!Y~*zf>0j_K>nU-Gf%FKSP5y<)7TMo(l2c)*3ni&v^|yx zvnGII(RP1XIbFBYoEF8d6^BGr2A-mkm!cTG+64Q`g%yE?^oWSQ&8hfUOau^LR#s_9 z%BAW|4AAk{5iC_B9Z1K&rOF-z62u`A?JP_PAWfy&j0Y>8mM4o38kj68h+l+uTqmXsb#s z*F@Ns@x-ud*AmW}8(xVP?;1e9f9V2clqqPC{fQMa*n=9_NAe)(!}Eu*ag7DZ7f;uk zIP;X8<0Vo_tY#cCUM=O1=>Cg%skk8)Wu~LP674hsLTY<6o|PFkAfeQiW-*u3=IX8{ z-7pNJT!ga`r58;-7nbOJC37-Voe5Md_b@lv&~K;)g|z0$-+3Cs)#r))$*M9M)pax( zGz~H^$T&HoC6OGSBq(Xgx?*7@BN+Fbqr?lc_ZYe^w2T)d8KX~NGoq>dsg?RVwU3oq z5%EFLw!BaXgN+5mF&;8*BW-UjGrhk|Io*8nvA8g5*V>o!^*se@V(}Y%t`WpS+?&D$+g27J@<#?B&>;DajqLuy{i(kSGscR0(o? z*>{M@^2fVC;D|#r^dH+Cn5I}-dC0WJ#*o~<1;pL@OdGKU0qbys#x3WXQvhcUv^yIM zo()4GSs)MK0VyvS%f%{24(hHl!>YmHpg>(Cg2Q|N)X4^(rT<}}yJ9|!<Iwvuk7L|it+@xKXRUnWL(K==Fu3a6Yibhh_ z(1F8!Yi^bK!vFn};Pv1>jt#@|(d_uR5-P#tklUJ}i#rb4FIn>>RuY01AHXw;t<2P8 zP_4nk!!(z|mqc|1afw06Sm|TAHx-=)nR!64*OSIN#p%92^8BI5P~QjNHpM&eA5jT+ z%Ha`w+J{UV5chGLEV!){$wT2`90yX$4Yrznh~JPP-fG-;f)RnJF9(-oh=OW5HvovV zv-czWeE7bLh9pjWq)Rjjld`;M%^UW#u(l4vWYgKYw7Qe>!As{j?``{eQmF-%kFkNn zspWCJ4G9?sD3!&+z(UhVIl!LtN!vTn@)pm)-<@VzW*lM@QnJ{){ulKdp?(Ln09l)ruDo~@7KqU+@W>B?^jKD6}uzoD*W zSEwRD>a{)+ndYEVcrQ#r;n5Rc6=d}U*pT1Z)9(32JQqOM8aC|&H zNH%XmXy(XcIN($yo;!H~wBg-f4OA(j^vDeccfCR8*;V<}w~ijN!D3i$q~UMBlsTn-%M@MP4Jw-Rs}b zuQR&0$$}ztW!;`G*M?44yS{Fr>+jvRO2lN#yJ3$IK(YA5kYBd&^lcjv_CTvNM;e8= z2S&o^k#cR4jQ{gS2$%O)Ph$1>h~)NTFe}(W;~d8(z_}QU0W`l5yb$NspMFr-$Gv}B zhCL|Q>jgybAGKixDIj}PSrDe-Rbv`+Ci@evTRmrgHFAi%bxwhAl2u9q>`o&@mtSOw7tK=UGy{mFHh)%TFCA#Lq{S@? z75kf{;PNUj%4ee%?tx(2-#%8FA>4ZL}1=voPnPR~pof<+Vv93aV;*4oXJ z{1cv8UZqSf1oUg)JrR*IdvDFlm9l)xSbBPw(wp7sYWihyHjgQjccZs`{pW$UEkca0 zrnh^O7+c+$3Tmj=prvM3ES|6(#LIXKaX9PqdLqVOp}qxRW(|}{vI#C& zb&Y4cSXg`m%69<>XJ3@0pE0Dm{Tr4+Jjtc02K6yip0pVa&>tfs4`8GTi%1dEagFz! z;s?gevgKmt){&23@u$Fl@kc|t-N`ij7JtYZ*U_KOk8u0GG7(|NphW&@2ltH!g~s7l zV&oF8$G6TSV_yPS%Pw%WWE9nLR? z;E3gx*lg2r`}QO5SK%CNT93o67_JsFSVoLM!UAbESAka4lJ+amLFMOp==$xYkQU^63w{Y>c3r#QGbu?_QB z5m+s@?QDY=hkIJ^=Bn2>p}GtM?0wo06K`yNPFwV^6vy5}TK7gM+3s`jhaB)kdnev# z2#gRyFb^zOM>`gP?bM1Cn#E$w-l%59WTiUl<`qJ2OR|n;L;JuZR+g~=VZOR4^2w!3MB1h^mYvAe5tU2U zi@gxQd0OP^_@LqbtwNSzSB8d4JZK_RTm?pYkN--vZ$R+R?IYNo+b%tc25aD zW!LBhtfN1feuNmzsvZQ*kf?=;&Da8qKb@G^Mtd9wC(>~MGEqrC!p=Mh5z!HN(U`?2 zo}ZFTPMf@XuC;j5QVpo)#hy^I^mEyZ6BcLsMS1QHnk5~S5j1nPFw+7*rpfWoB+r&= zcgovSqN1q@DC6^bEPR7L?7MDHECdF`m;k#1W>e; zGx?pOi$RVW{{)V!xiHI9k0=G`@$s3eVBwh9%d4YDwn*VR04Ea05=c$R?^x#NYYi|D z{6%vK@C7h1U&~o@apHS1p%W~3?(XWgTdH_q840C%Gphk<-oI*I56p2g@bknV@Z24e z3e`0Dv5-alA8niBz2DIEbp^r5wuuyHB@HoDVc08qtvd{4^&^dnVZ@HMuMbt)TV6@b zPc83RYtzw#!)uAuT40r~F)ibQhDs(TV3g!jR>b~!9;7M2M%=#+8^Ljvi1hXC`T$&{ zsUz1hHAujDo`;Bjy-=E?H~WS3Q7V+1jf=mDaOl5L2jf(zwj~WS=1?ZF5u7pd&f68C zJAF2Xe4z6#-m7y!HM>Nd8ECc7E+SnBrKkU8G1`}NbW=II)8SPcf!6&B>i^0OXpPc-FIR1f5PDdf{Z7k$zDJK%mVCgDFj`c)@8o)X!8oYpa z0Wskc1f^5Ch;AL))Jy&ul-=-9x|Y}O%tw^K3K@bC9u~&Y3jNfPGB(OEkK8G|8p`9! zY(pDcZ$rfP?g3OhM;m6o)eDTG9T{dY-;%a& zQJf^iQw!L+&peF2)i1Ap>f0kTaVnkkKyUGfv{G#U0tZ!d-q8y=GyFsM-Wh;S><)CO zv1)vDAqwxWi%W)Tz+s+GByn-0Rj3+YU*_Ay=zJ8nSIj;I+^}}Xz^quBJH+V;2X`;r zz+QLIMu4=p!4UZOfwXUt$3Aq_ybQ#!JhjmKojT=*}>!-Ltq)(xo$c5 zX~UGI3$v9qH>a+ShzI^X)Ypi84NrhMag{jtS_ObtZ@El-sz1ZFkxK9?H}tN~=y?~T zpNMM^WlEr!^V7GK>3}(!ZHm37e=uhX2k++p#Q1Q9$^pAy*$Db(i1~yKlj%^Qy?@4& zzl4q+7Lh_ew;uRhA)2BHNhxw{mvn)xOivwJ_WSl|SOpAp6Fgq?r}>0Y4KU>%&EKU1qrJX3q*_{sngCcZ&u& z{b0pjIozsq_r!n|`$5&Pd~<)MZA%vj#uW%*S~jo^D9~C^B7$1{NVa?9!3Wghg_H_9 z!fMeKcv^G3g^@=7eyp|kB#Hkk@Qz#FVtr75^4&{ECX%6wmy`QRs%#x?0N`Ie=5HID zC9(v&!&ct^+d7&UO>nt`pD66Peo0CC27(|Sl=MBz(6 z=MR#^xr42$t}y5=)Ub$GzX1Fid~0pw4P2Ph`0mDg5A|Dw?i9@Y3DJFk5e3CK?>SgA zeW@f^gV(AJPa%t`l765G@pLW3 z=;rEW`UvewLW3>D1U>$_7+Yl)<(z=9mJO<+V8W7mRBz4L`?Ca#gKTYz@+pz{9Y|FZJ_ ztt$A3zE8dV?XM@d&%gMKf;G7R@bfRhD_|jV5;HRFS9+&M@4dWc=9T;v=udC1j#(x8 I^V@&>AEp9l+W-In diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md index 30763cceeea..f3ade903475 100644 --- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -11,9 +11,9 @@ test classes to be executed, and runs the tests. Variables: args: Command line arguments passed to the main method. While running the test suite, you can pass arguments in this way -> "-l log_level -p path". - "log_level" is of two types "debug" and "detail" -- "debug" means generate error log file with a debug log file. -- "detail" means generate error log file with a detailed debug file. -- If no -l and log_level is passed in the argument, only error log will be generated +- "debug" means generate error and exception log file with a debug log file. +- "detail" means generate error and exception log file with a detailed debug file. +- If no -l and log_level is passed in the argument, only error and exception log will be generated - "path" is the path of the folder where the json files are - The code will log an error if the '-p' and 'path' arguments are not provided, as the JSON folder path is required for the test suite. @@ -39,6 +39,7 @@ The entry point of the application. It performs the following steps: - Sets the test classes to be run by calling loadClasses. - Runs the tests using TestNG. - Quits the WebDriver session after the tests have completed. +- Calls Common.printNumOfErrorsAndExceptions to print total number of errors and exceptions to the console, so that we get an idea of the count after the tests are finished. 2. loadClasses Method @@ -142,7 +143,8 @@ to the URLs of different pages and tabs. ### Common.java -![img.png](Common.png) +![img.png](Common1.png) +![img.png](Common2.png) The Common class in the framework.utility package provides a set of utility methods that are frequently used throughout the testing framework. These @@ -155,6 +157,8 @@ Variables: - errorLogger: This public static variable stores a logger instance used for logging error messages. - specificLogger: This public static variable stores a logger instance used for logging specific messages based on the provided level (debug or detail). +- num_errors: A counter to keep a count of total numbers of errors generated in the error log file. +- num_exceptions: A counter to keep a count of total numbers of exceptions generated in the exceptions log file. **Methods:** @@ -210,45 +214,47 @@ execution context. - This method logs error messages. - Prints the error message to the standard error stream. - Logs the message using errorLogger. +- Increments the variable num_errors by 1, to maintain the count of number of errors generated. -8. logDebug Method +8. logException Method + +- This method logs exception messages with complete stack trace. +- Prints the exception message with complete stack trace to the standard error stream. +- Logs the message using errorLogger. +- Increments the variable num_exceptions by 1, to maintain the count of number of num_exceptions generated. + +9. logDebug Method - This method logs debug or detailed messages. - Prints the message to the standard output stream. - Logs the message using specificLogger if the logging level is INFO or FINE. -9. logDetail method +10. logDetail method - This method logs detailed messages. - Prints the message to the standard output stream. - Logs the message using specificLogger if the logging level is FINE. -10. initializeLoggerAndDriver Method +11. initializeLoggerAndDriver Method - This method initializes the logger and WebDriver instances. - Sets up the specificLogger based on the provided argument. - Sets up the WebDriver instance using setupWebDriver() method. -11. setupWebDriver Method +12. setupWebDriver Method - This method sets up the WebDriver instance based on the environment. - Configures ChromeOptions for headless mode, no sandbox, and suppressed log output. - Sets up the WebDriver based on the environment (local or GitHub Actions). - Logs an error message if an exception occurs during setup. -12. setupLogger Method +13. setupLogger Method -- This method sets up a logger instance based on the provided log level. +- This method sets up a logger instance based on the provided log level (error, exception, debug and detail). - Configures the logger to disable console logging and set up file handlers for different log levels (error, debug, detail). - Turns off all logging from Selenium WebDriver. - Logs an error message if an exception occurs during logger setup. -13. getAttributeList Method - -- This method retrieves all attributes of a web element. -- Uses JavaScriptExecutor to extract all attributes of the web element. -- Logs an error message if an exception occurs during attribute extraction. - 14. sleepWithTime Method - The sleepWithTime method pauses the execution of the current thread for a specified number of seconds. diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 059ef9490d7..f1aa6baf168 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -351,10 +351,6 @@ private String getCurrentSortingOrder(String columnKey) { columnHeader.click(); - if(columnKey.equals("Execution Cost")) { - columnHeader.click(); - } - return waitToLoadChangedSortOrder(oldSortOrder, columnKey); } catch (Exception ex) { From c2f02e4c6265305b81abb056106f114cec00515f Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 10:38:01 -0400 Subject: [PATCH 22/36] HPCC-31857 - Change the way of accessing web element --- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index f1aa6baf168..158e616a2a9 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -345,7 +345,12 @@ private String getCurrentSortingOrder(String columnKey) { try { - WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); + //WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); + + WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@role='columnheader' and @*[.='" + columnKey + "']]")); + + // Scroll into view + //((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", columnHeader); String oldSortOrder = columnHeader.getAttribute("aria-sort"); From 35310dfb08f7110f6238ad35f3441170104a1cac Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 10:57:21 -0400 Subject: [PATCH 23/36] HPCC-31857 - Scroll web element into view --- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 158e616a2a9..7f6cd71422b 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -350,7 +350,7 @@ private String getCurrentSortingOrder(String columnKey) { WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@role='columnheader' and @*[.='" + columnKey + "']]")); // Scroll into view - //((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", columnHeader); + ((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", columnHeader); String oldSortOrder = columnHeader.getAttribute("aria-sort"); From 402ecbd705a2421c7d263a3899b043445028cd0f Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 11:31:10 -0400 Subject: [PATCH 24/36] HPCC-31857 - Scroll web element into view --- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 7f6cd71422b..ecb47d606c8 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -187,7 +187,7 @@ private void testLinksInTable() { String href = Common.driver.getCurrentUrl(); String dropdownValueBefore = getSelectedDropdownValue(); - + ((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", element); element.click(); if (Common.driver.getPageSource().contains(name)) { From fff45a5ddcfa7bc110eef537554ccb714afc34b2 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 11:50:56 -0400 Subject: [PATCH 25/36] HPCC-31857 - Added page refresh before link test --- esp/src/test-ui/tests/framework/pages/BaseTableTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index ecb47d606c8..f183e93600f 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -174,6 +174,8 @@ private void testLinksInTable() { Common.logDebug("Tests started for: " + getPageName() + " page: Testing Links"); + Common.driver.navigate().refresh(); + for (String columnKey : getColumnKeysWithLinks()) { List values = getDataFromUIUsingColumnKey(columnKey); @@ -187,7 +189,6 @@ private void testLinksInTable() { String href = Common.driver.getCurrentUrl(); String dropdownValueBefore = getSelectedDropdownValue(); - ((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", element); element.click(); if (Common.driver.getPageSource().contains(name)) { From 9699906d5c60bdadb00a45e91f5ab927f776e7a0 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 12:40:17 -0400 Subject: [PATCH 26/36] HPCC-31857 - Added code ge latest chrome driver --- .github/workflows/test-ui-gh_runner.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 373d3f8974f..0e55ff27c51 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -151,7 +151,8 @@ jobs: javac -version wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb - wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chromedriver-linux64.zip + LATEST_VERSION=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE) + wget https://chromedriver.storage.googleapis.com/${LATEST_VERSION}/chromedriver_linux64.zip unzip chromedriver-linux64.zip -d chromedriver sudo mv chromedriver/chromedriver-linux64/chromedriver /usr/bin/chromedriver sudo chown root:root /usr/bin/chromedriver From 7f6e66ab16df5fbf0becaaa62ef6647f39afba8c Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 16:07:46 -0400 Subject: [PATCH 27/36] HPCC-31857 - YML change, Code refactoring and documentation --- .github/workflows/test-ui-gh_runner.yml | 2 +- esp/src/test-ui/tests/framework/README.md | 16 +++++++++++-- .../framework/documentation/DesignDocument.md | 24 ++++++++++++------- .../tests/framework/pages/BaseTableTest.java | 17 +++++++------ .../framework/pages/ECLWorkUnitsTest.java | 6 +++-- 5 files changed, 42 insertions(+), 23 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 0e55ff27c51..30a15d5d2c6 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -152,7 +152,7 @@ jobs: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb LATEST_VERSION=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE) - wget https://chromedriver.storage.googleapis.com/${LATEST_VERSION}/chromedriver_linux64.zip + wget -O chromedriver-linux64.zip https://chromedriver.storage.googleapis.com/${LATEST_VERSION}/chromedriver_linux64.zip unzip chromedriver-linux64.zip -d chromedriver sudo mv chromedriver/chromedriver-linux64/chromedriver /usr/bin/chromedriver sudo chown root:root /usr/bin/chromedriver diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md index abb24b93090..779e81ecdcb 100644 --- a/esp/src/test-ui/tests/framework/README.md +++ b/esp/src/test-ui/tests/framework/README.md @@ -5,7 +5,7 @@ created for writing test cases for specific web pages of the ECL Watch UI and th sequentially. The names of the Java classes that the TestRunner class needs to load should be listed in the config/TestClasses.java -file. +file. ActivitiesTest class should always be the first class to load in TestClasses.java, as it gets URLs for all other web pages. Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The code for each class starts to run from this method. @@ -34,6 +34,17 @@ So an example of complete CLI arguments would look like this: -l debug -p C:/Users/nisha/Documents/Internship/Work/files/ +#### Implementation Steps for URL Management + +- A HashMap (urlMap) is created to store URL mappings in config/URLConfig.java file. This map will use the page name as the key and a URLMapping object as the value. The URLMapping object contains the page name, its URL, and another HashMap for nested pages and tabs. +- A static block is used to initialize the urlMap with the initial URL mapping for the Activities navigation. The URL is retrieved using a method from the Common utility class, which handles the dynamic retrieval of the IP address based on the environment whether it is local or GitHub Actions. +- For each main navigation section, a URLMapping object is created. This object includes the page name and its corresponding URL. Additionally, it contains another HashMap to store URLs for nested tabs and pages. +- Each URLMapping object is stored in the urlMap with the main navigation name as the key. This initial setup in the Activities.java class ensures that each navigation section has its base URL stored and accessible. +- For instance, for any navigation page, each page has multiple tabs, and within those tabs, there are multiple pages and tabs. This structure facilitates easy access to the URL of a particular page. +- Starting from the Activities page, for each main navigation section, the code iterates over its associated tabs. For each tab, a new URLMapping object is created and added to the HashMap within the corresponding URLMapping object of the main navigation section. This creates a tree-like structure, allowing easy access to URLs for both navigation sections and their nested tabs. +- By following these implementation steps, the URLConfig class ensures that all URLs within the application are well-organized and easily accessible through a hierarchical structure. This setup simplifies navigation and URL management within the application, making it easier to handle complex page structures and dynamic URL retrievals. + + Below are the dependencies used in the project: - https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar @@ -48,4 +59,5 @@ Below are the dependencies used in the project: Notes: 1. Users need to run these tests with regression test suite only. 2. Code should be updated accordingly if selenium server jar updates. -3. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. \ No newline at end of file +3. ActivitiesTest class should always be the first class to load in TestClasses.java, as it gets URLs for all other pages. +4. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md index f3ade903475..7e4ad214226 100644 --- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -551,7 +551,9 @@ This method tests the functionality and navigation of links present in a table o 1. **Logging**: Logs the start of the link tests with `Common.logDebug`. -2. **Iterate Through Columns with Links**: For each column key with links retrieved from `getColumnKeysWithLinks()`: +2. **Page refresh**: refreshing page as page has scrolled to right for testing the sorting functionality of column headers, so bringing it back to normal view by refreshing it + +3. **Iterate Through Columns with Links**: For each column key with links retrieved from `getColumnKeysWithLinks()`: - It retrieves the data values from the UI using `getDataFromUIUsingColumnKey(columnKey)`. - For each value, it tries to find and click the corresponding link element. - After clicking, it checks if the page source contains the name to confirm successful navigation. @@ -627,11 +629,13 @@ This method retrieves the current sorting order of a column. 1. **Find Column Header**: Locates the column header element for the specified column key. -2. **Retrieve Sort Order**: Retrieves the current sorting order from the column header's attribute `aria-sort`. +2. **Scrolls To Find Header**: Uses JavascriptExecutor to scroll and bring the column header into view. + +3. **Retrieve Sort Order**: Retrieves the current sorting order from the column header's attribute `aria-sort`. -3. **Click to Change Sort Order**: Clicks the column header to change the sort order and waits for the sorting order to change using `waitToLoadChangedSortOrder`. +4. **Click to Change Sort Order**: Clicks the column header to change the sort order and waits for the sorting order to change using `waitToLoadChangedSortOrder`. -4. **Return New Sort Order**: Returns the new sorting order. +5. **Return New Sort Order**: Returns the new sorting order. #### Method: `waitToLoadChangedSortOrder(String oldSortOrder, String columnKey)` @@ -667,7 +671,7 @@ This method retrieves data from the UI based on a specified column key. This method waits until all UI elements corresponding to a column key are loaded. 1. **Initialize Wait Time**: Starts with an initial wait time. -2. **Find Elements**: Uses a loop to repeatedly find web elements matching the column key's XPath. +2. **Find Elements**: Uses a loop to repeatedly find web elements in a grid cell matching the column key's XPath. 3. **Check Element Count**: Checks if the number of elements (excluding the header) matches the number of JSON objects. 4. **Wait and Retry**: If the elements are not fully loaded, it sleeps for the current wait time, increments the wait time, and retries. 5. **Return Elements**: Once the elements are fully loaded, returns the list of web elements. @@ -986,10 +990,12 @@ This method returns the JSON map containing the work unit data. 2. **Retrieve Column Data**: - Retrieves data for work unit IDs and protected statuses from the UI. 3. **Comparison and Logging**: - - Iterates through the protected status data. - - Compares the retrieved work unit ID with `wuName`. - - Logs success if the protected status matches the expected value. - - Logs an error if the protected status does not match the expected value. + - Iterates through the protected status data and work unit IDs data. + - Compares the work unit ID with the given `wuName`. + - If it matches + - Logs success if the protected status matches the expected value. + - Logs an error if the protected status does not match the expected value. + - Breaks the for loop as the protected testing is done for that workunit. ##### Method: `parseJson` diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index f183e93600f..265f7b3911d 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -174,7 +174,7 @@ private void testLinksInTable() { Common.logDebug("Tests started for: " + getPageName() + " page: Testing Links"); - Common.driver.navigate().refresh(); + Common.driver.navigate().refresh(); // refreshing page as page has scrolled to right for testing the sorting functionality of column headers, so bringing it back to normal view by refreshing it for (String columnKey : getColumnKeysWithLinks()) { @@ -346,11 +346,9 @@ private String getCurrentSortingOrder(String columnKey) { try { - //WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); - WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@role='columnheader' and @*[.='" + columnKey + "']]")); - // Scroll into view + // Scroll to bring the column header into view ((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", columnHeader); String oldSortOrder = columnHeader.getAttribute("aria-sort"); @@ -374,7 +372,7 @@ private String waitToLoadChangedSortOrder(String oldSortOrder, String columnKey) do { Common.sleepWithTime(waitTimeInSecs); - WebElement columnHeaderNew = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); + WebElement columnHeaderNew = Common.driver.findElement(By.xpath("//*[@role='columnheader' and @*[.='" + columnKey + "']]")); newSortOrder = columnHeaderNew.getAttribute("aria-sort"); @@ -404,8 +402,8 @@ protected List getDataFromUIUsingColumnKey(String columnKey) { try { List elements = waitToLoadListOfAllUIObjects(columnKey); - for (int i = 1; i < elements.size(); i++) { // first element fetched is of column header, so we fetch values from 2nd element. - columnData.add(elements.get(i).getText().trim()); + for (WebElement element : elements) { + columnData.add(element.getText().trim()); } } catch (Exception ex) { @@ -421,9 +419,10 @@ private List waitToLoadListOfAllUIObjects(String columnKey) { List elements; do { - elements = Common.driver.findElements(By.xpath("//*[@*[.='" + columnKey + "']]")); - if (elements.size() - 1 >= jsonObjects.size()) { // first element fetched is of column header, so we do -1 from total elements + elements = Common.driver.findElements(By.xpath("//*[@role='gridcell' and @*[.='" + columnKey + "']]")); + + if (elements.size() >= jsonObjects.size()) { break; } diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java index cfe1e470428..2c570c4982b 100644 --- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -301,9 +301,9 @@ private void checkProtectedStatusOnECLWorkunitsPage(String wuName, boolean newCh List columnDataWUID = getDataFromUIUsingColumnKey(getUniqueKey()); List columnDataProtected = getDataFromUIUsingColumnKey("Protected"); - for (int i = 1; i < columnDataProtected.size(); i++) { // two web elements are getting fetched for Protected column header + for (int i = 0; i < columnDataProtected.size(); i++) { - if (wuName.equals(columnDataWUID.get(i - 1))) { + if (wuName.equals(columnDataWUID.get(i))) { String lockStatus = !columnDataProtected.get(i).toString().isEmpty() ? "Locked" : "Unlocked"; @@ -314,6 +314,8 @@ private void checkProtectedStatusOnECLWorkunitsPage(String wuName, boolean newCh } else { Common.logError("Failure: " + getPageName() + " Details Page: Testing Protected checkbox for value: " + newCheckboxValue + ": Showing: " + lockStatus + " on ECL Workunits page"); } + + break; } } } From 338b15a608b5ff66331f5cd91c6b2f10193585f6 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 16:26:10 -0400 Subject: [PATCH 28/36] HPCC-31857 - YML change --- .github/workflows/test-ui-gh_runner.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 30a15d5d2c6..826a47da9b4 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -154,7 +154,7 @@ jobs: LATEST_VERSION=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE) wget -O chromedriver-linux64.zip https://chromedriver.storage.googleapis.com/${LATEST_VERSION}/chromedriver_linux64.zip unzip chromedriver-linux64.zip -d chromedriver - sudo mv chromedriver/chromedriver-linux64/chromedriver /usr/bin/chromedriver + sudo mv chromedriver/chromedriver /usr/bin/chromedriver sudo chown root:root /usr/bin/chromedriver sudo chmod +x /usr/bin/chromedriver wget https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar From 8d16b4f1b332f82d0fe61794a70b06fac3fd71bd Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Thu, 18 Jul 2024 16:46:03 -0400 Subject: [PATCH 29/36] HPCC-31857 - YML change --- .github/workflows/test-ui-gh_runner.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 826a47da9b4..373d3f8974f 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -151,10 +151,9 @@ jobs: javac -version wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt-get install -y ./google-chrome-stable_current_amd64.deb - LATEST_VERSION=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE) - wget -O chromedriver-linux64.zip https://chromedriver.storage.googleapis.com/${LATEST_VERSION}/chromedriver_linux64.zip + wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chromedriver-linux64.zip unzip chromedriver-linux64.zip -d chromedriver - sudo mv chromedriver/chromedriver /usr/bin/chromedriver + sudo mv chromedriver/chromedriver-linux64/chromedriver /usr/bin/chromedriver sudo chown root:root /usr/bin/chromedriver sudo chmod +x /usr/bin/chromedriver wget https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar From 391b1b5d12ed06a20ea87bca66c89fd4cb3fca5c Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Fri, 19 Jul 2024 12:23:19 -0400 Subject: [PATCH 30/36] HPCC-31857 - Log spacing changes --- .github/workflows/test-ui-gh_runner.yml | 2 +- .../tests/framework/pages/ActivitiesTest.java | 8 ++--- .../tests/framework/pages/BaseTableTest.java | 36 ++++++++++--------- .../framework/pages/ECLWorkUnitsTest.java | 4 +-- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 373d3f8974f..129223b8aaa 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -173,7 +173,7 @@ jobs: run: | export CLASSPATH=".:${{ inputs.asset-name }}-ecl_watch_ui_tests:${{ github.workspace }}/selenium-libs/*:${{ github.workspace }}/testng-7.7.1.jar:${{ github.workspace }}/jackson-annotations-2.17.0.jar:${{ github.workspace }}/jackson-core-2.17.0.jar:${{ github.workspace }}/jackson-databind-2.17.0.jar:${{ github.workspace }}/jcommander-1.82.jar:${{ github.workspace }}/slf4j-api-1.7.30.jar:${{ github.workspace }}/slf4j-simple-1.7.30.jar" pushd ${{ inputs.asset-name }}-ecl_watch_ui_tests - find . -iname '*.java' -type f -print -exec javac -Xlint:unchecked {} \; + find . -iname '*.java' -type f -print -exec javac -Xlint:none {} \; java framework.TestRunner -l detail -p /home/runner/HPCCSystems-regression/log/ echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java index 9229481f79a..68b2cd0a52c 100644 --- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -32,13 +32,13 @@ public void testActivitiesPage() { testForNavigationLinks(navWebElements); - Common.logDebug("Tests finished for: Activities page."); - Common.logDebug("URL Map Generated: " + urlMap); + Common.logDebug("\nTests finished for: Activities page."); + Common.logDebug("\nURL Map Generated: " + urlMap); } private void testForNavigationLinks(List navWebElements) { - Common.logDebug("Tests started for: Activities page: Testing Navigation Links"); + Common.logDebug("\nTests started for: Activities page: Testing Navigation Links"); for (NavigationWebElement element : navWebElements) { @@ -115,7 +115,7 @@ private List getNavWebElements() { } private void testForAllText() { - Common.logDebug("Tests started for: Activities page: Testing Text"); + Common.logDebug("\nTests started for: Activities page: Testing Text"); for (String text : textArray) { Common.checkTextPresent(text, "Activities Page"); } diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 265f7b3911d..3bb7dfd1f3a 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -76,7 +76,7 @@ protected void testPage() { } try { - Common.logDebug("Tests started for: " + getPageName() + " page."); + Common.logDebug("\nTests started for: " + getPageName() + " page."); testForAllText(); @@ -91,7 +91,7 @@ protected void testPage() { testLinksInTable(); - Common.logDebug("Tests finished for: " + getPageName() + " page."); + Common.logDebug("\nTests finished for: " + getPageName() + " page."); } catch (Exception ex) { Common.logException("Error: " + getPageName() + ": Exception: " + ex.getMessage(), ex); @@ -110,15 +110,15 @@ private void testDetailsPage(String name, int i) { testDetailSpecificFunctionality(name, i); if (!Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL && i == 0) { // TEST_DETAIL_PAGE_TAB_CLICK_ALL = true means the test will run for all items and false means it will only run for the first item - testTabClickOnDetailsPage(); + testTabClickOnDetailsPage(name); } else if (Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL) { - testTabClickOnDetailsPage(); + testTabClickOnDetailsPage(name); } } - private void testTabClickOnDetailsPage() { + private void testTabClickOnDetailsPage(String name) { - Common.logDebug("Test started for: Tab Click on " + getPageName() + " Details Page."); + Common.logDebug("\nTest started for: Tab Click on " + getPageName() + " Details Page. For: " + name); waitToLoadDetailsPage(); @@ -192,9 +192,9 @@ private void testLinksInTable() { element.click(); if (Common.driver.getPageSource().contains(name)) { - String msg = "Success: " + getPageName() + ": Link Test Pass for " + (i + 1) + ". " + name + ". URL : " + href; + String msg = "\nSuccess: " + getPageName() + ": Link Test Pass for " + (i + 1) + ". " + name + ". URL : " + href; Common.logDetail(msg); - // after the link test has passed, the code tests the details page(including, the text, content and tabs) it has landed on + // after the link test has passed, the code tests the details page(including, the text, content, checkbox, description and tabs) testDetailsPage(name, i); } else { @@ -250,7 +250,7 @@ protected void waitToLoadDetailsPage() { } private void testDetailsContentPage(String name) { - Common.logDebug("Tests started for : " + getPageName() + " Details page content: " + getUniqueKeyName() + " : " + name); + Common.logDebug("\nTests started for : " + getPageName() + " Details page: Testing Content: " + getUniqueKeyName() + " : " + name); try { waitToLoadDetailsPage(); // sleep until the specific detail fields have loaded } catch (Exception ex) { @@ -289,12 +289,12 @@ private void testDetailsContentPage(String name) { } if (pass) { - Common.logDetail("Success: " + getPageName() + " Details page: All values test passed for: " + getUniqueKeyName() + " : " + name); + Common.logDetail("Success: " + getPageName() + " Details page: All content test passed for: " + getUniqueKeyName() + " : " + name); } } private void testForAllTextInDetailsPage(String name) { - Common.logDebug("Tests started for: " + getPageName() + " Details page: " + getUniqueKeyName() + ": " + name + " Testing Text"); + Common.logDebug("\nTests started for: " + getPageName() + " Details page: " + getUniqueKeyName() + ": " + name + ": Testing Text"); for (String text : getDetailNames()) { Common.checkTextPresent(text, getPageName() + " Details page: " + getUniqueKeyName() + ": " + name); } @@ -302,11 +302,11 @@ private void testForAllTextInDetailsPage(String name) { private void testContentAndSortingOrder() { - Common.logDebug("Tests started for: " + getPageName() + " page: Testing Content"); + Common.logDebug("\nTests started for: " + getPageName() + " page: Testing Content"); if (testTableContent()) { - Common.logDebug("Tests started for: " + getPageName() + " page: Testing Sorting Order"); + Common.logDebug("\nTests started for: " + getPageName() + " page: Testing Sorting Order\n"); for (int i = 0; i < getColumnKeys().length; i++) { try { @@ -340,6 +340,8 @@ private void testTheSortingOrderForOneColumn(String columnKey, String columnName Common.logError("Failure: " + getPageName() + " Unable to get sort order for column: " + columnKey); } } + + Common.logDebug(""); } private String getCurrentSortingOrder(String columnKey) { @@ -452,11 +454,11 @@ void descendingSortJson(String columnKey) { } private boolean testTableContent() { - Common.logDebug("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + Common.logDebug("\nPage: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); List columnDataIDFromUI = getDataFromUIUsingColumnKey(getUniqueKey()); - Common.logDebug("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + Common.logDebug("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()+"\n"); if (jsonObjects.size() != columnDataIDFromUI.size()) { String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + @@ -557,7 +559,7 @@ private void clickDropdown(int numOfItemsJSON) { wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("pageSize-list"))); - Common.logDebug("Page: " + getPageName() + ": Dropdown selected: " + selectedValue); + Common.logDebug("\nPage: " + getPageName() + ": Dropdown selected: " + selectedValue); Common.driver.navigate().refresh(); Common.sleep(); @@ -582,7 +584,7 @@ protected WebElement getSaveButtonWebElementDetailsPage() { } private void testForAllText() { - Common.logDebug("Tests started for: " + getPageName() + " page: Testing Text"); + Common.logDebug("\nTests started for: " + getPageName() + " page: Testing Text"); for (String text : getColumnNames()) { Common.checkTextPresent(text, getPageName()); } diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java index 2c570c4982b..c22ff87f215 100644 --- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -158,7 +158,7 @@ protected void testDetailSpecificFunctionality(String wuName, int i) { private void testDescriptionUpdateFunctionality(String wuName) { - Common.logDebug("Test started for: Description checkbox " + getPageName() + " Details Page."); + Common.logDebug("\nTest started for: Description checkbox " + getPageName() + " Details Page. For: " + wuName); try { String newDescription = Config.TEST_DESCRIPTION_TEXT; @@ -216,7 +216,7 @@ private String updateDescriptionAndSave(String newDescription) { private void testProtectedButtonFunctionality(String wuName) { - Common.logDebug("Test started for: Protected checkbox " + getPageName() + " Details Page."); + Common.logDebug("\nTest started for: Protected checkbox " + getPageName() + " Details Page. For: " + wuName); try { From 56bfa0cbda694c9ea1346be339f1183ed5af774b Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Fri, 19 Jul 2024 13:15:36 -0400 Subject: [PATCH 31/36] HPCC-31857 - Updated documentation --- esp/src/test-ui/tests/framework/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md index 779e81ecdcb..f00596b585a 100644 --- a/esp/src/test-ui/tests/framework/README.md +++ b/esp/src/test-ui/tests/framework/README.md @@ -60,4 +60,5 @@ Notes: 1. Users need to run these tests with regression test suite only. 2. Code should be updated accordingly if selenium server jar updates. 3. ActivitiesTest class should always be the first class to load in TestClasses.java, as it gets URLs for all other pages. -4. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. \ No newline at end of file +4. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. +5. Ignore the compiler warnings/errors before the beginning of the test logs. They are because of guava-33.2.1-jre-sources.jar, it seems it is not fully compatible with JRE 21, that is installed on GH Actions. But that does not impact our code in any way, so it is better to just ignore it. \ No newline at end of file From 568c08744bae8cb1b60efc50b50d3c7efc4591e6 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Fri, 19 Jul 2024 14:12:28 -0400 Subject: [PATCH 32/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 129223b8aaa..f0aad7bf300 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -18,6 +18,8 @@ on: description: 'Dependencies' required: false default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline libtool autotools-dev automake git cmake xmlstarlet' +env: + uploadArtifact: false jobs: @@ -178,10 +180,14 @@ jobs: echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) [[ $lines -ne 0 ]] && exit 1 + if [[ -f debug_ecl_test.log || -f detail_ecl_test.log || -f exception_ecl_test.log]] + then + echo "uploadArtifact=true" >> $GITHUB_ENV + fi popd - name: Upload ECL Watch UI Test Logs To Artifact - if: ${{ failure() || cancelled() }} + if: ${{ failure() || cancelled() || env.uploadArtifact == 'true' }} uses: actions/upload-artifact@v3 with: name: ${{ inputs.asset-name }}-ecl_watch_ui_test_logs From 7e500bf70eb733939e50117acc6f4a45d3a8b6e0 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Fri, 19 Jul 2024 14:14:07 -0400 Subject: [PATCH 33/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index f0aad7bf300..a0bb6c61153 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -18,6 +18,7 @@ on: description: 'Dependencies' required: false default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline libtool autotools-dev automake git cmake xmlstarlet' + env: uploadArtifact: false From 1a8dc2f7cd80a0d9aaf902a322bd3e777815c8ed Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Mon, 15 Jul 2024 17:07:55 -0400 Subject: [PATCH 34/36] HPCC-31857 : Develop an automated ECL Watch Test Suite Developed a testing framework using Java, Selenium, and TestNG. The framework is initiated by `TestRunner.java`, which loads all test classes listed in `config/TestClasses.java` and executes them sequentially. Each test class contains at least one method annotated with `@Test`, which serves as the entry point for the tests. Test cases cover the Activities and ECL Workunit pages, including tests for text presence, link functionality, sorting order, workunits content, description, and checkbox functionality. Added loggers in separate files for error, debug, and detail. Updated YML files to reflect jars and commands for the current testing framework. Additionally, provided comprehensive documentation with UML diagrams and detailed explanations of each method within the classes. Signed-off-by: Nisha Bagdwal --- .github/workflows/test-ui-gh_runner.yml | 21 ++- esp/src/test-ui/tests/framework/README.md | 27 +++- .../test-ui/tests/framework/SetupForDev.md | 125 ++++++++++++++++++ .../test-ui/tests/framework/TestRunner.java | 6 +- .../tests/framework/config/Config.java | 1 + .../tests/framework/documentation/Common.png | Bin 30026 -> 0 bytes .../tests/framework/documentation/Common1.png | Bin 0 -> 29898 bytes .../tests/framework/documentation/Common2.png | Bin 0 -> 3083 bytes .../tests/framework/documentation/Config.png | Bin 37103 -> 38947 bytes .../framework/documentation/DesignDocument.md | 62 +++++---- .../tests/framework/model/ECLWorkunit.java | 3 + .../tests/framework/pages/ActivitiesTest.java | 16 ++- .../tests/framework/pages/BaseTableTest.java | 95 +++++++------ .../framework/pages/ECLWorkUnitsTest.java | 25 ++-- .../tests/framework/utility/Common.java | 63 +++++---- 15 files changed, 322 insertions(+), 122 deletions(-) create mode 100644 esp/src/test-ui/tests/framework/SetupForDev.md delete mode 100644 esp/src/test-ui/tests/framework/documentation/Common.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common1.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common2.png diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index b21e3b0056e..a0bb6c61153 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -19,6 +19,9 @@ on: required: false default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline libtool autotools-dev automake git cmake xmlstarlet' +env: + uploadArtifact: false + jobs: main: @@ -133,12 +136,14 @@ jobs: if: steps.check.outputs.runtests shell: "bash" run: | - #sudo apt remove -y openjdk-11-jdk + sudo apt remove -y openjdk-11-jdk sudo apt autoremove -y sudo apt update sudo apt install -y openjdk-21-jdk - #sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 - #sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java + sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1 + sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-21-openjdk-amd64/bin/javac 1 + sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java + sudo update-alternatives --set javac /usr/lib/jvm/java-21-openjdk-amd64/bin/javac export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/bin/java export PATH=$PATH:$JAVA_HOME/bin echo $JAVA_HOME @@ -171,15 +176,19 @@ jobs: run: | export CLASSPATH=".:${{ inputs.asset-name }}-ecl_watch_ui_tests:${{ github.workspace }}/selenium-libs/*:${{ github.workspace }}/testng-7.7.1.jar:${{ github.workspace }}/jackson-annotations-2.17.0.jar:${{ github.workspace }}/jackson-core-2.17.0.jar:${{ github.workspace }}/jackson-databind-2.17.0.jar:${{ github.workspace }}/jcommander-1.82.jar:${{ github.workspace }}/slf4j-api-1.7.30.jar:${{ github.workspace }}/slf4j-simple-1.7.30.jar" pushd ${{ inputs.asset-name }}-ecl_watch_ui_tests - find . -iname '*.java' -type f -print -exec javac {} \; - java framework.TestRunner detail + find . -iname '*.java' -type f -print -exec javac -Xlint:none {} \; + java framework.TestRunner -l detail -p /home/runner/HPCCSystems-regression/log/ echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) [[ $lines -ne 0 ]] && exit 1 + if [[ -f debug_ecl_test.log || -f detail_ecl_test.log || -f exception_ecl_test.log]] + then + echo "uploadArtifact=true" >> $GITHUB_ENV + fi popd - name: Upload ECL Watch UI Test Logs To Artifact - if: ${{ failure() || cancelled() }} + if: ${{ failure() || cancelled() || env.uploadArtifact == 'true' }} uses: actions/upload-artifact@v3 with: name: ${{ inputs.asset-name }}-ecl_watch_ui_test_logs diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md index 78ab59a1b9b..f00596b585a 100644 --- a/esp/src/test-ui/tests/framework/README.md +++ b/esp/src/test-ui/tests/framework/README.md @@ -5,7 +5,7 @@ created for writing test cases for specific web pages of the ECL Watch UI and th sequentially. The names of the Java classes that the TestRunner class needs to load should be listed in the config/TestClasses.java -file. +file. ActivitiesTest class should always be the first class to load in TestClasses.java, as it gets URLs for all other web pages. Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The code for each class starts to run from this method. @@ -18,9 +18,9 @@ If the Chrome browser version updates in the future, it's crucial to ensure that While running the test suite, you can pass arguments in this way -> "-l log_level -p path". - "log_level" is of two types "debug" and "detail" -- "debug" means generate error log file with a debug log file. -- "detail" means generate error log file with a detailed debug file. -- If no -l and log_level is passed in the argument, only error log will be generated +- "debug" means generate error and exception log file with a debug log file. +- "detail" means generate error and exception log file with a detailed debug file. +- If no -l and log_level is passed in the argument, only error and exception log will be generated - "path" is the path of the folder where the json files are - The code will log an error if the '-p' and 'path' arguments are not provided, as the JSON folder path is required for the test suite. @@ -34,6 +34,17 @@ So an example of complete CLI arguments would look like this: -l debug -p C:/Users/nisha/Documents/Internship/Work/files/ +#### Implementation Steps for URL Management + +- A HashMap (urlMap) is created to store URL mappings in config/URLConfig.java file. This map will use the page name as the key and a URLMapping object as the value. The URLMapping object contains the page name, its URL, and another HashMap for nested pages and tabs. +- A static block is used to initialize the urlMap with the initial URL mapping for the Activities navigation. The URL is retrieved using a method from the Common utility class, which handles the dynamic retrieval of the IP address based on the environment whether it is local or GitHub Actions. +- For each main navigation section, a URLMapping object is created. This object includes the page name and its corresponding URL. Additionally, it contains another HashMap to store URLs for nested tabs and pages. +- Each URLMapping object is stored in the urlMap with the main navigation name as the key. This initial setup in the Activities.java class ensures that each navigation section has its base URL stored and accessible. +- For instance, for any navigation page, each page has multiple tabs, and within those tabs, there are multiple pages and tabs. This structure facilitates easy access to the URL of a particular page. +- Starting from the Activities page, for each main navigation section, the code iterates over its associated tabs. For each tab, a new URLMapping object is created and added to the HashMap within the corresponding URLMapping object of the main navigation section. This creates a tree-like structure, allowing easy access to URLs for both navigation sections and their nested tabs. +- By following these implementation steps, the URLConfig class ensures that all URLs within the application are well-organized and easily accessible through a hierarchical structure. This setup simplifies navigation and URL management within the application, making it easier to handle complex page structures and dynamic URL retrievals. + + Below are the dependencies used in the project: - https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar @@ -41,9 +52,13 @@ Below are the dependencies used in the project: - https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.17.0/jackson-core-2.17.0.jar - https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.17.0/jackson-databind-2.17.0.jar - https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar -- https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.17.0/selenium-server-4.17.0.jar +- https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.22.0/selenium-java-4.22.0.zip +- https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar +- https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/1.7.30/slf4j-simple-1.7.30.jar Notes: 1. Users need to run these tests with regression test suite only. 2. Code should be updated accordingly if selenium server jar updates. -3. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. \ No newline at end of file +3. ActivitiesTest class should always be the first class to load in TestClasses.java, as it gets URLs for all other pages. +4. For future testing developers, custom class names or attributes defined by UI developers can change frequently during updates or redesigns. However, standard attributes that are part of the HTML specifications (such as id, type, value, href, aria-sort, aria-disabled, etc.) are much more stable. Therefore, it is advisable to use only standard HTML attributes to access web elements. This approach ensures that test cases remain consistent and are less likely to break due to UI changes. +5. Ignore the compiler warnings/errors before the beginning of the test logs. They are because of guava-33.2.1-jre-sources.jar, it seems it is not fully compatible with JRE 21, that is installed on GH Actions. But that does not impact our code in any way, so it is better to just ignore it. \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/SetupForDev.md b/esp/src/test-ui/tests/framework/SetupForDev.md new file mode 100644 index 00000000000..5e303399c43 --- /dev/null +++ b/esp/src/test-ui/tests/framework/SetupForDev.md @@ -0,0 +1,125 @@ +This documentation provides a comprehensive guide to setting up an Ubuntu VM on Oracle VirtualBox, installing the HPCC-Platform, and preparing the environment for testing and development. + +#### Setting Up an Ubuntu VM on Oracle VirtualBox + +**Overview of the installation process on a Windows machine:** + +1. **Download and install Oracle VirtualBox:** + - Visit the Oracle VirtualBox [website](https://www.virtualbox.org/) and download the latest version for Windows. + - Follow the installation instructions to install VirtualBox on your system. + +2. **Download the Ubuntu 22.04 Desktop ISO file:** + - Go to the Ubuntu [downloads page](https://ubuntu.com/download/desktop) and download the Ubuntu 22.04 LTS ISO file. + +3. **Set up a new VM in VirtualBox:** + - Open VirtualBox and click on `New` to create a new virtual machine. + - Name the VM and select the type and version (Linux, Ubuntu 64-bit). + - Configure system settings such as memory size and hard disk (create a virtual hard disk now). + - Link the ISO file by going to the `Settings` of the VM, navigating to `Storage`, and attaching the ISO file to the optical drive. + - Boot the VM and follow the installation wizard to complete the Ubuntu setup. + +#### Installing HPCC-Platform on the VM + +**After successfully installing the VM, proceed with installing the HPCC-Platform:** + +1. **Download the HPCC-Platform package:** + ```sh + wget https://cdn.hpccsystems.com/releases/CE-Candidate-9.8.2/bin/platform/hpccsystems-platform-community_9.8.2-1jammy_amd64_withsymbols.deb + ``` + +2. **Install the package:** + ```sh + sudo dpkg -i hpccsystems-platform-community_9.8.2-1jammy_amd64_withsymbols.deb + ``` + +3. **Fix missing dependencies:** + ```sh + sudo apt-get install -f + ``` + +4. **Check if the installation is successful:** + ```sh + sudo dpkg -l | grep 'hpccsystems-pl' + ``` +5. **Start HPCC-Platform:** + ```sh + sudo /etc/init.d/hpcc-init start + ``` + +6. **Verify access to ECL Watch:** + - Open a browser on your local machine and go to `http://192.168.0.221:8010/` to check if you can access ECL Watch. + +#### Cloning and Checking Out the HPCC-Platform Repository on VM + +1. **Clone the HPCC-Platform GitHub repository:** + ```sh + git clone https://github.com/hpcc-systems/HPCC-Platform.git + ``` + +2. **Navigate to the repository directory:** + ```sh + cd HPCC-Platform + ``` + +3. **Check out the specific version of HPCC-Platform:** + ```sh + git checkout candidate-9.8.x + ``` + +#### Running Regression Test Setup + +**Navigate to the testing directory and set up regression tests:** + ```sh + cd testing/regress + ./ecl-test setup --preAbort '/opt/HPCCSystems/bin/smoketest-preabort.sh' + ``` + +#### Running Spray Tests + +**Execute the spray tests:** + ```sh + ./ecl-test query --preAbort /opt/HPCCSystems/bin/smoketest-preabort.sh --excludeclass python2,embedded-r,embedded-js,3rdpartyservice,mongodb *spray* + ``` + +#### Generating JSON Files + +**Generate JSON files for workunits, files, and DFU workunits:** + ```sh + curl localhost:8010/WsWorkunits/WUQuery.json | python3 -m json.tool > workunits.json + curl localhost:8010/WsDfu/DFUQuery.json?PageSize=250 | python3 -m json.tool > files.json + curl localhost:8010/FileSpray/GetDFUWorkunits.json | python3 -m json.tool > dfu-workunits.json + ``` + +#### Transferring Files Using WinSCP + +Find your json files in the VM and use the WinSCP tool to transfer files from the VM to your local machine. + +#### Downloading Dependencies + +1. **Download the following dependencies:** + - [TestNG 7.7.1](https://repo1.maven.org/maven2/org/testng/testng/7.7.1/testng-7.7.1.jar) + - [Jackson Annotations 2.17.0](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.17.0/jackson-annotations-2.17.0.jar) + - [Jackson Core 2.17.0](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.17.0/jackson-core-2.17.0.jar) + - [Jackson Databind 2.17.0](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.17.0/jackson-databind-2.17.0.jar) + - [JCommander 1.82](https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar) + - [Selenium Java 4.22.0](https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.22.0/selenium-java-4.22.0.zip) + - [SLF4J API 1.7.30](https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar) + - [SLF4J Simple 1.7.30](https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/1.7.30/slf4j-simple-1.7.30.jar) + +#### Adding Dependencies to Your Java Code + +1. Include the downloaded dependencies in your Java project. +2. Specify the path to your ChromeDriver when creating a `ChromeDriver` object in your code. + +#### Writing Test Cases for ECL Watch + +You are now ready to start writing your test cases for ECL Watch running at `http://192.168.0.221:8010/`. + +#### Uninstall HPCC-Platform on VM + +Use below commands + +```sh + cd /opt/HPCCSystems/sbin + sudo ./complete-uninstall.sh -p + ``` diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java index 1b8c3399593..4158f129e6e 100644 --- a/esp/src/test-ui/tests/framework/TestRunner.java +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -24,8 +24,10 @@ public static void main(String[] args) { Common.driver.quit(); } + Common.printNumOfErrorsAndExceptions(); + } catch (Exception e) { - Common.logError("Exception occurred in TestRunner.java: " + e.getMessage()); + Common.logException("Exception occurred in TestRunner class: " + e.getMessage(), e); } } @@ -69,7 +71,7 @@ private static Class[] loadClasses() { try { classes.add(Class.forName(testClass.getPath())); } catch (Exception e) { - Common.logError("Failure: Error in loading classes: " + e.getMessage()); + Common.logException("Failure: Error in loading classes: " + e.getMessage(), e); } } diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java index 90ede35a86e..8cb4a08647f 100644 --- a/esp/src/test-ui/tests/framework/config/Config.java +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -3,6 +3,7 @@ public class Config { public static final String LOG_FILE_ERROR = "error_ecl_test.log"; + public static final String LOG_FILE_EXCEPTION = "exception_ecl_test.log"; public static final String LOG_FILE_DEBUG = "debug_ecl_test.log"; public static final String LOG_FILE_DETAIL = "detail_ecl_test.log"; public static final String LOCAL_OS = "Windows"; diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png deleted file mode 100644 index 0ed9dbda328c5b1759d0c08ef3562d6b58ef5e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30026 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

    CLP8w&V-e^FLtlIAbo#>yyWp7v$x? zwyn==JDIW3RV^236lg3C@nEee%g|(+-31COh1Sw`9x_qHr$i80O%VnlAxwEw{4spxf+;PECo70ThFjW0Vli1L9c$p!(+f^nzP4yxsIubyjw)gj;Kz74rp+ zW2xI337C#h`{mJwO4a?rQK<=5+YdHh`jTg`EB-r)prWS`o9E3Fv6FXnqA zahl12#}zRkLzp_dQzOstP8Bus^tyVA<4Loaw-`LVbT0kgF24P$pRTo WZ}Qx;ZVn;vclMBXOLzYHum1s64%Q|B literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Common2.png b/esp/src/test-ui/tests/framework/documentation/Common2.png new file mode 100644 index 0000000000000000000000000000000000000000..665896f727cfdeb19414e0049394894f53faeaa2 GIT binary patch literal 3083 zcmcJRYgiLk8plU%t<}X|cq+9iQn#%rVy&bE1rpW@qAh|*CMhn07m{=Vr7I91fyCbM zK@_SGG+>enPa#Y~BFQ2PO6b-W3*=J7Ax4Z*X$T~dl!PP@a@mP)FT4At`(eM#nKSdA z^MB8K-t&7;<=*7PfaR|&2LK>o_pbPT0I(z)c_%Jgiah1$x7z_=#m(LE+wmotkJMw; z<8QA_820*j+>h5R`*7>Ypn<<07C06^Rad&}2KDA{la9IA=k?g$M8*OopLJvnIKmH| z3s{8ozTVt1>~BAM72}^DsJ_1Q8UN?M-k$V#x2{A5``a6bnwKEW{jGV0{_d+M&#Xk6 z6XTbE89cXa;kDkWf|-`w1H;|o1~qk zaKv@Br|nF&R+v@4K^A31mGQFfO-p;j9W0+IIV5M&wBIJ5+n@2%h4up#@3e*pq=8x!eRLQGgh1NO# zNG^QY&}ILN@uF;^Mse(bUgJslcO%xqBH$p=fx>>a8#5aZ+g*1<=;>V2d!u5Bbx)us zL)r%(ZOK8iEE!|Z!+Yw8;`39=HXMjf$7Ih(O;fI*rQb{&L~6DwmnpcD1e3$W(`yHt zdMd3(dxUly+?um)s3N@YcpLzjAqMlCH&FWz1%1(;GGkCEL*PC26!tm0APJ7up+m-W z5GJjYJqRk&un?xo%D*?v0m~t>B=37`xWFu*md6g1c^qAk0)MpSIB3JyK#HbVsJM^< z@*s9NN)kH+0Dm8v^9(RPMRaJWqRozjl9vV|-ZT-}P^pZ9yMnA`!b04X0>{G5Inwnt z#$au_&QOE(oxXJ{JDo(KQYLm!n7aICx)q(Vztt$`#W~#QeH+h_0O0Od?sDtXwE?|n z`$Cx44i{mb2;8W?YUdNCk{qN zEKPS;gTN|hr2_!d3556HL-6&S6ga6ap(styhBd=F&VY+59aNf?^5t}Lac?z8&5MH?`8a-f3=-n? zRmPS@yfNx6zsn82=7+?7CzV_w@Lks7F1I5n*KgGbl03<^Z63ykgnM-*kXYwUhH-ToEh+C4< zb0uY~p5dlvJ6YPSdhLTTv3lm)+&d3+3u)6U09m_hWk7A-q?m4%mRdV|zcZpU9{DOl zGe<%%ev~zgt;-tS?KppN_SNK`AYkruYu89n5@uG7o!7+9-??|#zFOp9UJn#c1>R$1 z!FEb%z30tP?8(~crvb);l%s`avPY6M)0?Whzu>kKq)>};yoeU-dxcXF?}1t*+STw8 z6T zOh8rjqA6&`XvjtmcP)+VEoqTV#=h5TIK|5CK5TcVGW`R!Jjf#dL#p_)|V7|49lxPn|vhj!IS5M@XpNh+;dilo?pw$VpNYF$AHuXRo4HO|5Mi{GyFhh@lNF_sS zkPqQQQn`TEoB@N1Y|UQ%j#fiEL>C+q9>{l&W+SikNVpWg9IZTqgr>%}XoXicvBXr}pJ#_U0ZbM5}KehU90N{sMj!28Oy zA$0G>955Q2Uyr0~0+pOpj4`FLAq7-6IeTq8H3Vn7!5u_uh+n$w7KHE^;MeK4$PP*_ zMOmHWHAJD3>C%3r?1kmw`euO z6cU6HSTBv(mTJo9i2l3)6X{ ztq~wvOVLerKb%&5JfO5ZiBwV{6CzWQ;F1@;=E{tCQm&f?_Ct|l<>mfT{l|1s1c+*K zeHn2zh!p_I&`12V%`0AKtTKK&2pKR!vcKH%MWlK=i9I!&FujaVI;?YNFuUm7? zl4`1*jus%Fp#VKinV-H8v)AH0DsU+bnnD zJ;0ZE9SRA;gUoz}BStMl7qqq>NcnM-`dJ|#rv|HK97;EO2~d2f+4kx6@*g17CN6x)j78(0%^($2A~)bb2xHm8*JLZQe3J*BO=n zb^ZL`aF1C3_U`(BAABAY9lq+xQdU*je|)Jj&@WlC;Xm%&-W9_PU}>qho9h3)J0Uq< J^zOk={t0N>FHisg literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png index 883eecb0333ecc34b4be7225be11efe944172b53..57ee0f31690f4fd316fd188e52188a3260d3a0ba 100644 GIT binary patch literal 38947 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

    =5YuEdHyzAz1^uT(rfd0QkUBwba=T4lb#BaD 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 literal 37103 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 I^V@&>AEp9l+W-In diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md index 30763cceeea..7e4ad214226 100644 --- a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -11,9 +11,9 @@ test classes to be executed, and runs the tests. Variables: args: Command line arguments passed to the main method. While running the test suite, you can pass arguments in this way -> "-l log_level -p path". - "log_level" is of two types "debug" and "detail" -- "debug" means generate error log file with a debug log file. -- "detail" means generate error log file with a detailed debug file. -- If no -l and log_level is passed in the argument, only error log will be generated +- "debug" means generate error and exception log file with a debug log file. +- "detail" means generate error and exception log file with a detailed debug file. +- If no -l and log_level is passed in the argument, only error and exception log will be generated - "path" is the path of the folder where the json files are - The code will log an error if the '-p' and 'path' arguments are not provided, as the JSON folder path is required for the test suite. @@ -39,6 +39,7 @@ The entry point of the application. It performs the following steps: - Sets the test classes to be run by calling loadClasses. - Runs the tests using TestNG. - Quits the WebDriver session after the tests have completed. +- Calls Common.printNumOfErrorsAndExceptions to print total number of errors and exceptions to the console, so that we get an idea of the count after the tests are finished. 2. loadClasses Method @@ -142,7 +143,8 @@ to the URLs of different pages and tabs. ### Common.java -![img.png](Common.png) +![img.png](Common1.png) +![img.png](Common2.png) The Common class in the framework.utility package provides a set of utility methods that are frequently used throughout the testing framework. These @@ -155,6 +157,8 @@ Variables: - errorLogger: This public static variable stores a logger instance used for logging error messages. - specificLogger: This public static variable stores a logger instance used for logging specific messages based on the provided level (debug or detail). +- num_errors: A counter to keep a count of total numbers of errors generated in the error log file. +- num_exceptions: A counter to keep a count of total numbers of exceptions generated in the exceptions log file. **Methods:** @@ -210,45 +214,47 @@ execution context. - This method logs error messages. - Prints the error message to the standard error stream. - Logs the message using errorLogger. +- Increments the variable num_errors by 1, to maintain the count of number of errors generated. -8. logDebug Method +8. logException Method + +- This method logs exception messages with complete stack trace. +- Prints the exception message with complete stack trace to the standard error stream. +- Logs the message using errorLogger. +- Increments the variable num_exceptions by 1, to maintain the count of number of num_exceptions generated. + +9. logDebug Method - This method logs debug or detailed messages. - Prints the message to the standard output stream. - Logs the message using specificLogger if the logging level is INFO or FINE. -9. logDetail method +10. logDetail method - This method logs detailed messages. - Prints the message to the standard output stream. - Logs the message using specificLogger if the logging level is FINE. -10. initializeLoggerAndDriver Method +11. initializeLoggerAndDriver Method - This method initializes the logger and WebDriver instances. - Sets up the specificLogger based on the provided argument. - Sets up the WebDriver instance using setupWebDriver() method. -11. setupWebDriver Method +12. setupWebDriver Method - This method sets up the WebDriver instance based on the environment. - Configures ChromeOptions for headless mode, no sandbox, and suppressed log output. - Sets up the WebDriver based on the environment (local or GitHub Actions). - Logs an error message if an exception occurs during setup. -12. setupLogger Method +13. setupLogger Method -- This method sets up a logger instance based on the provided log level. +- This method sets up a logger instance based on the provided log level (error, exception, debug and detail). - Configures the logger to disable console logging and set up file handlers for different log levels (error, debug, detail). - Turns off all logging from Selenium WebDriver. - Logs an error message if an exception occurs during logger setup. -13. getAttributeList Method - -- This method retrieves all attributes of a web element. -- Uses JavaScriptExecutor to extract all attributes of the web element. -- Logs an error message if an exception occurs during attribute extraction. - 14. sleepWithTime Method - The sleepWithTime method pauses the execution of the current thread for a specified number of seconds. @@ -545,7 +551,9 @@ This method tests the functionality and navigation of links present in a table o 1. **Logging**: Logs the start of the link tests with `Common.logDebug`. -2. **Iterate Through Columns with Links**: For each column key with links retrieved from `getColumnKeysWithLinks()`: +2. **Page refresh**: refreshing page as page has scrolled to right for testing the sorting functionality of column headers, so bringing it back to normal view by refreshing it + +3. **Iterate Through Columns with Links**: For each column key with links retrieved from `getColumnKeysWithLinks()`: - It retrieves the data values from the UI using `getDataFromUIUsingColumnKey(columnKey)`. - For each value, it tries to find and click the corresponding link element. - After clicking, it checks if the page source contains the name to confirm successful navigation. @@ -621,11 +629,13 @@ This method retrieves the current sorting order of a column. 1. **Find Column Header**: Locates the column header element for the specified column key. -2. **Retrieve Sort Order**: Retrieves the current sorting order from the column header's attribute `aria-sort`. +2. **Scrolls To Find Header**: Uses JavascriptExecutor to scroll and bring the column header into view. + +3. **Retrieve Sort Order**: Retrieves the current sorting order from the column header's attribute `aria-sort`. -3. **Click to Change Sort Order**: Clicks the column header to change the sort order and waits for the sorting order to change using `waitToLoadChangedSortOrder`. +4. **Click to Change Sort Order**: Clicks the column header to change the sort order and waits for the sorting order to change using `waitToLoadChangedSortOrder`. -4. **Return New Sort Order**: Returns the new sorting order. +5. **Return New Sort Order**: Returns the new sorting order. #### Method: `waitToLoadChangedSortOrder(String oldSortOrder, String columnKey)` @@ -661,7 +671,7 @@ This method retrieves data from the UI based on a specified column key. This method waits until all UI elements corresponding to a column key are loaded. 1. **Initialize Wait Time**: Starts with an initial wait time. -2. **Find Elements**: Uses a loop to repeatedly find web elements matching the column key's XPath. +2. **Find Elements**: Uses a loop to repeatedly find web elements in a grid cell matching the column key's XPath. 3. **Check Element Count**: Checks if the number of elements (excluding the header) matches the number of JSON objects. 4. **Wait and Retry**: If the elements are not fully loaded, it sleeps for the current wait time, increments the wait time, and retries. 5. **Return Elements**: Once the elements are fully loaded, returns the list of web elements. @@ -980,10 +990,12 @@ This method returns the JSON map containing the work unit data. 2. **Retrieve Column Data**: - Retrieves data for work unit IDs and protected statuses from the UI. 3. **Comparison and Logging**: - - Iterates through the protected status data. - - Compares the retrieved work unit ID with `wuName`. - - Logs success if the protected status matches the expected value. - - Logs an error if the protected status does not match the expected value. + - Iterates through the protected status data and work unit IDs data. + - Compares the work unit ID with the given `wuName`. + - If it matches + - Logs success if the protected status matches the expected value. + - Logs an error if the protected status does not match the expected value. + - Breaks the for loop as the protected testing is done for that workunit. ##### Method: `parseJson` diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java index 3ae1b7ce729..6449065f14d 100644 --- a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java +++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java @@ -32,6 +32,9 @@ public class ECLWorkunit { @JsonProperty("ActionEx") private String actionEx; + @JsonProperty("DateTimeScheduled") + private String dateTimeScheduled; + @JsonProperty("IsPausing") private boolean isPausing; diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java index 41dc5dc6ff4..68b2cd0a52c 100644 --- a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -20,7 +20,9 @@ public class ActivitiesTest { @Test public void testActivitiesPage() { - Common.openWebPage(urlMap.get(URLConfig.NAV_ACTIVITIES).getUrl()); + if(!Common.openWebPage(urlMap.get(URLConfig.NAV_ACTIVITIES).getUrl())){ + return; + } Common.logDebug("Tests started for: Activities page."); @@ -30,13 +32,13 @@ public void testActivitiesPage() { testForNavigationLinks(navWebElements); - Common.logDebug("Tests finished for: Activities page."); - Common.logDebug("URL Map Generated: " + urlMap); + Common.logDebug("\nTests finished for: Activities page."); + Common.logDebug("\nURL Map Generated: " + urlMap); } private void testForNavigationLinks(List navWebElements) { - Common.logDebug("Tests started for: Activities page: Testing Navigation Links"); + Common.logDebug("\nTests started for: Activities page: Testing Navigation Links"); for (NavigationWebElement element : navWebElements) { @@ -52,7 +54,7 @@ private void testForNavigationLinks(List navWebElements) { Common.logError(errorMsg); } } catch (Exception ex) { - Common.logError("Failure: Exception in Navigation Link for " + element.name() + ". URL : " + element.hrefValue() + " Error: " + ex.getMessage()); + Common.logException("Failure: Exception in Navigation Link for " + element.name() + ". URL : " + element.hrefValue() + " Error: " + ex.getMessage(), ex); } } } @@ -105,7 +107,7 @@ private List getNavWebElements() { urlMap.put(navName, new URLMapping(navName, hrefValue)); } catch (Exception ex) { - Common.logError("Failure: Activities Page for Navigation Element: " + navName + ": Error: " + ex.getMessage()); + Common.logException("Failure: Activities Page for Navigation Element: " + navName + ": Error: " + ex.getMessage(), ex); } } @@ -113,7 +115,7 @@ private List getNavWebElements() { } private void testForAllText() { - Common.logDebug("Tests started for: Activities page: Testing Text"); + Common.logDebug("\nTests started for: Activities page: Testing Text"); for (String text : textArray) { Common.checkTextPresent(text, "Activities Page"); } diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java index 20121314bb7..3bb7dfd1f3a 100644 --- a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -71,10 +71,12 @@ public abstract class BaseTableTest { protected List jsonObjects; protected void testPage() { - Common.openWebPage(getPageUrl()); + if(!Common.openWebPage(getPageUrl())){ + return; + } try { - Common.logDebug("Tests started for: " + getPageName() + " page."); + Common.logDebug("\nTests started for: " + getPageName() + " page."); testForAllText(); @@ -89,10 +91,10 @@ protected void testPage() { testLinksInTable(); - Common.logDebug("Tests finished for: " + getPageName() + " page."); + Common.logDebug("\nTests finished for: " + getPageName() + " page."); } catch (Exception ex) { - Common.logError(ex.getMessage()); + Common.logException("Error: " + getPageName() + ": Exception: " + ex.getMessage(), ex); } } @@ -108,15 +110,15 @@ private void testDetailsPage(String name, int i) { testDetailSpecificFunctionality(name, i); if (!Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL && i == 0) { // TEST_DETAIL_PAGE_TAB_CLICK_ALL = true means the test will run for all items and false means it will only run for the first item - testTabClickOnDetailsPage(); + testTabClickOnDetailsPage(name); } else if (Config.TEST_DETAIL_PAGE_TAB_CLICK_ALL) { - testTabClickOnDetailsPage(); + testTabClickOnDetailsPage(name); } } - private void testTabClickOnDetailsPage() { + private void testTabClickOnDetailsPage(String name) { - Common.logDebug("Test started for: Tab Click on " + getPageName() + " Details Page."); + Common.logDebug("\nTest started for: Tab Click on " + getPageName() + " Details Page. For: " + name); waitToLoadDetailsPage(); @@ -127,7 +129,7 @@ private void testTabClickOnDetailsPage() { javaScriptElementClick(element); testPresenceOfColumnNames(getColumnNamesForTabsDetailsPage().get(tabValue), tabValue); } catch (Exception ex) { - Common.logError("Error: " + getPageName() + " Details Page. Testing tab click on: " + tabValue + " Error: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + " Details Page. Testing tab click on: " + tabValue + " Error: " + ex.getMessage(), ex); } } @@ -172,6 +174,8 @@ private void testLinksInTable() { Common.logDebug("Tests started for: " + getPageName() + " page: Testing Links"); + Common.driver.navigate().refresh(); // refreshing page as page has scrolled to right for testing the sorting functionality of column headers, so bringing it back to normal view by refreshing it + for (String columnKey : getColumnKeysWithLinks()) { List values = getDataFromUIUsingColumnKey(columnKey); @@ -185,13 +189,12 @@ private void testLinksInTable() { String href = Common.driver.getCurrentUrl(); String dropdownValueBefore = getSelectedDropdownValue(); - element.click(); if (Common.driver.getPageSource().contains(name)) { - String msg = "Success: " + getPageName() + ": Link Test Pass for " + (i + 1) + ". " + name + ". URL : " + href; + String msg = "\nSuccess: " + getPageName() + ": Link Test Pass for " + (i + 1) + ". " + name + ". URL : " + href; Common.logDetail(msg); - // after the link test has passed, the code tests the details page(including, the text, content and tabs) it has landed on + // after the link test has passed, the code tests the details page(including, the text, content, checkbox, description and tabs) testDetailsPage(name, i); } else { @@ -211,7 +214,7 @@ private void testLinksInTable() { Common.logError(dropdownErrorMsg); } } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Exception in testing links for column: " + columnKey + " value: " + values.get(i) + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Exception in testing links for column: " + columnKey + " value: " + values.get(i) + " Error: " + ex.getMessage(), ex); } } } @@ -247,11 +250,11 @@ protected void waitToLoadDetailsPage() { } private void testDetailsContentPage(String name) { - Common.logDebug("Tests started for : " + getPageName() + " Details page content: " + getUniqueKeyName() + " : " + name); + Common.logDebug("\nTests started for : " + getPageName() + " Details page: Testing Content: " + getUniqueKeyName() + " : " + name); try { waitToLoadDetailsPage(); // sleep until the specific detail fields have loaded } catch (Exception ex) { - Common.logError("Error: " + getPageName() + ": Exception in waitToLoadDetailsPage: " + getUniqueKeyName() + " : " + name + " Exception: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + ": Exception in waitToLoadDetailsPage: " + getUniqueKeyName() + " : " + name + " Exception: " + ex.getMessage(), ex); } boolean pass = true; @@ -281,17 +284,17 @@ private void testDetailsContentPage(String name) { } } catch (Exception ex) { - Common.logError("Error: Details " + getPageName() + "Page, for: " + getUniqueKeyName() + " : " + name + " Error: " + ex.getMessage()); + Common.logException("Error: Details " + getPageName() + "Page, for: " + getUniqueKeyName() + " : " + name + " Error: " + ex.getMessage(), ex); } } if (pass) { - Common.logDetail("Success: " + getPageName() + " Details page: All values test passed for: " + getUniqueKeyName() + " : " + name); + Common.logDetail("Success: " + getPageName() + " Details page: All content test passed for: " + getUniqueKeyName() + " : " + name); } } private void testForAllTextInDetailsPage(String name) { - Common.logDebug("Tests started for: " + getPageName() + " Details page: " + getUniqueKeyName() + ": " + name + " Testing Text"); + Common.logDebug("\nTests started for: " + getPageName() + " Details page: " + getUniqueKeyName() + ": " + name + ": Testing Text"); for (String text : getDetailNames()) { Common.checkTextPresent(text, getPageName() + " Details page: " + getUniqueKeyName() + ": " + name); } @@ -299,14 +302,18 @@ private void testForAllTextInDetailsPage(String name) { private void testContentAndSortingOrder() { - Common.logDebug("Tests started for: " + getPageName() + " page: Testing Content"); + Common.logDebug("\nTests started for: " + getPageName() + " page: Testing Content"); if (testTableContent()) { - Common.logDebug("Tests started for: " + getPageName() + " page: Testing Sorting Order"); + Common.logDebug("\nTests started for: " + getPageName() + " page: Testing Sorting Order\n"); for (int i = 0; i < getColumnKeys().length; i++) { - testTheSortingOrderForOneColumn(getColumnKeys()[i], getColumnNames()[i]); + try { + testTheSortingOrderForOneColumn(getColumnKeys()[i], getColumnNames()[i]); + } catch (Exception ex) { + Common.logException("Error: " + getPageName() + ": Exception while testing sort order for column: " + getColumnNames()[i] + ": Exception:" + ex.getMessage(), ex); + } } } } @@ -333,13 +340,18 @@ private void testTheSortingOrderForOneColumn(String columnKey, String columnName Common.logError("Failure: " + getPageName() + " Unable to get sort order for column: " + columnKey); } } + + Common.logDebug(""); } private String getCurrentSortingOrder(String columnKey) { try { - WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); + WebElement columnHeader = Common.driver.findElement(By.xpath("//*[@role='columnheader' and @*[.='" + columnKey + "']]")); + + // Scroll to bring the column header into view + ((JavascriptExecutor) Common.driver).executeScript("arguments[0].scrollIntoView(true);", columnHeader); String oldSortOrder = columnHeader.getAttribute("aria-sort"); @@ -348,7 +360,7 @@ private String getCurrentSortingOrder(String columnKey) { return waitToLoadChangedSortOrder(oldSortOrder, columnKey); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + " Exception in getting sort order for column: " + columnKey + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + " Exception in getting sort order for column: " + columnKey + " Error: " + ex.getMessage(), ex); } return null; @@ -362,7 +374,7 @@ private String waitToLoadChangedSortOrder(String oldSortOrder, String columnKey) do { Common.sleepWithTime(waitTimeInSecs); - WebElement columnHeaderNew = Common.driver.findElement(By.xpath("//*[@*[.='" + columnKey + "']]")); + WebElement columnHeaderNew = Common.driver.findElement(By.xpath("//*[@role='columnheader' and @*[.='" + columnKey + "']]")); newSortOrder = columnHeaderNew.getAttribute("aria-sort"); @@ -392,12 +404,12 @@ protected List getDataFromUIUsingColumnKey(String columnKey) { try { List elements = waitToLoadListOfAllUIObjects(columnKey); - for (int i = 1; i < elements.size(); i++) { // first element fetched is of column header, so we fetch values from 2nd element. - columnData.add(elements.get(i).getText().trim()); + for (WebElement element : elements) { + columnData.add(element.getText().trim()); } } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Error in getting data from UI using column key: " + columnKey + "Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Error in getting data from UI using column key: " + columnKey + "Error: " + ex.getMessage(), ex); } return columnData; @@ -409,9 +421,10 @@ private List waitToLoadListOfAllUIObjects(String columnKey) { List elements; do { - elements = Common.driver.findElements(By.xpath("//*[@*[.='" + columnKey + "']]")); - if (elements.size() - 1 >= jsonObjects.size()) { // first element fetched is of column header, so we do -1 from total elements + elements = Common.driver.findElements(By.xpath("//*[@role='gridcell' and @*[.='" + columnKey + "']]")); + + if (elements.size() >= jsonObjects.size()) { break; } @@ -422,28 +435,30 @@ private List waitToLoadListOfAllUIObjects(String columnKey) { return elements; } + @SuppressWarnings("unchecked") void ascendingSortJson(String columnKey) { try { - jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in ascending order using column key: " + columnKey + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Exception in sorting JSON in ascending order using column key: " + columnKey + " Error: " + ex.getMessage(), ex); } } + @SuppressWarnings("unchecked") void descendingSortJson(String columnKey) { try { - jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + jsonObjects.sort(Comparator.comparing((Function>) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Exception in sorting JSON in descending order using column key: " + columnKey + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Exception in sorting JSON in descending order using column key: " + columnKey + " Error: " + ex.getMessage(), ex); } } private boolean testTableContent() { - Common.logDebug("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + Common.logDebug("\nPage: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); List columnDataIDFromUI = getDataFromUIUsingColumnKey(getUniqueKey()); - Common.logDebug("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + Common.logDebug("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()+"\n"); if (jsonObjects.size() != columnDataIDFromUI.size()) { String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + @@ -471,7 +486,7 @@ private List getAllObjectsFromJson() { try { return parseJson(filePath); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + " Unable to parse JSON File: Exception: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + " Unable to parse JSON File: Exception: " + ex.getMessage(), ex); } return null; @@ -544,12 +559,12 @@ private void clickDropdown(int numOfItemsJSON) { wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("pageSize-list"))); - Common.logDebug("Page: " + getPageName() + ": Dropdown selected: " + selectedValue); + Common.logDebug("\nPage: " + getPageName() + ": Dropdown selected: " + selectedValue); Common.driver.navigate().refresh(); Common.sleep(); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Error in clicking dropdown: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Error in clicking dropdown: " + ex.getMessage(), ex); } } @@ -558,7 +573,7 @@ private String getSelectedDropdownValue() { WebElement dropdown = Common.waitForElement(By.id("pageSize")); return dropdown.getText().trim(); } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + ": Error in getting dropdown value: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + ": Error in getting dropdown value: " + ex.getMessage(), ex); } return ""; @@ -569,7 +584,7 @@ protected WebElement getSaveButtonWebElementDetailsPage() { } private void testForAllText() { - Common.logDebug("Tests started for: " + getPageName() + " page: Testing Text"); + Common.logDebug("\nTests started for: " + getPageName() + " page: Testing Text"); for (String text : getColumnNames()) { Common.checkTextPresent(text, getPageName()); } diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java index 7f29811f6a1..c22ff87f215 100644 --- a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -32,7 +32,12 @@ protected String getPageName() { @Override protected String getPageUrl() { - return URLConfig.urlMap.get(URLConfig.NAV_ECL).getUrlMappings().get(URLConfig.TAB_ECL_WORKUNITS).getUrl(); + try { + return URLConfig.urlMap.get(URLConfig.NAV_ECL).getUrlMappings().get(URLConfig.TAB_ECL_WORKUNITS).getUrl(); + } catch (Exception ex){ + Common.logException("Error in getting page URL "+ getPageName() +": Exception: "+ ex.getMessage(), ex); + } + return ""; } @Override @@ -153,7 +158,7 @@ protected void testDetailSpecificFunctionality(String wuName, int i) { private void testDescriptionUpdateFunctionality(String wuName) { - Common.logDebug("Test started for: Description checkbox " + getPageName() + " Details Page."); + Common.logDebug("\nTest started for: Description checkbox " + getPageName() + " Details Page. For: " + wuName); try { String newDescription = Config.TEST_DESCRIPTION_TEXT; @@ -167,7 +172,7 @@ private void testDescriptionUpdateFunctionality(String wuName) { updateDescriptionAndSave(oldDescription); } catch (Exception ex) { - Common.logError("Error: " + getPageName() + " Details page for WUID: " + wuName + ", Exception occurred while testing for description. Exception: " + ex.getMessage()); + Common.logException("Error: " + getPageName() + " Details page for WUID: " + wuName + ", Exception occurred while testing for description. Exception: " + ex.getMessage(), ex); } } @@ -211,7 +216,7 @@ private String updateDescriptionAndSave(String newDescription) { private void testProtectedButtonFunctionality(String wuName) { - Common.logDebug("Test started for: Protected checkbox " + getPageName() + " Details Page."); + Common.logDebug("\nTest started for: Protected checkbox " + getPageName() + " Details Page. For: " + wuName); try { @@ -228,7 +233,7 @@ private void testProtectedButtonFunctionality(String wuName) { } } catch (Exception ex) { - Common.logError("Error: ECL WorkUnits: Exception in testing the protected functionality for WUID: " + wuName + ": Error: " + ex.getMessage()); + Common.logException("Error: ECL WorkUnits: Exception in testing the protected functionality for WUID: " + wuName + ": Error: " + ex.getMessage(), ex); } } @@ -296,9 +301,9 @@ private void checkProtectedStatusOnECLWorkunitsPage(String wuName, boolean newCh List columnDataWUID = getDataFromUIUsingColumnKey(getUniqueKey()); List columnDataProtected = getDataFromUIUsingColumnKey("Protected"); - for (int i = 1; i < columnDataProtected.size(); i++) { // two web elements are getting fetched for Protected column header + for (int i = 0; i < columnDataProtected.size(); i++) { - if (wuName.equals(columnDataWUID.get(i - 1))) { + if (wuName.equals(columnDataWUID.get(i))) { String lockStatus = !columnDataProtected.get(i).toString().isEmpty() ? "Locked" : "Unlocked"; @@ -309,6 +314,8 @@ private void checkProtectedStatusOnECLWorkunitsPage(String wuName, boolean newCh } else { Common.logError("Failure: " + getPageName() + " Details Page: Testing Protected checkbox for value: " + newCheckboxValue + ": Showing: " + lockStatus + " on ECL Workunits page"); } + + break; } } } @@ -371,7 +378,7 @@ protected Object parseDataUIValue(Object dataUIValue, Object dataJSONValue, Stri dataUIValue = ((String) dataUIValue).trim(); } } catch (Exception ex) { - Common.logError("Failure: " + getPageName() + " Error in parsing UI value: " + dataUIValue + " for column: " + columnName + " ID: " + dataIDUIValue + " Error: " + ex.getMessage()); + Common.logException("Failure: " + getPageName() + " Error in parsing UI value: " + dataUIValue + " for column: " + columnName + " ID: " + dataIDUIValue + " Error: " + ex.getMessage(), ex); } return dataUIValue; @@ -410,7 +417,7 @@ protected String getCurrentPage() { return element.getAttribute("title"); } } catch (Exception ex) { - Common.logError("Error: " + getPageName() + ex.getMessage()); + Common.logException("Error: " + getPageName() + ex.getMessage(), ex); } return "Invalid Page"; } diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java index ca084f72242..34f6d227646 100644 --- a/esp/src/test-ui/tests/framework/utility/Common.java +++ b/esp/src/test-ui/tests/framework/utility/Common.java @@ -2,15 +2,18 @@ import framework.config.Config; import framework.config.URLConfig; -import org.openqa.selenium.*; +import org.openqa.selenium.By; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; -import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.io.IOException; import java.time.Duration; +import java.util.Arrays; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,7 +23,10 @@ public class Common { public static WebDriver driver; public static Logger errorLogger = setupLogger("error"); + public static Logger exceptionLogger = setupLogger("exception"); public static Logger specificLogger; + public static int num_exceptions = 0; + public static int num_errors = 0; public static void checkTextPresent(String text, String page) { try { @@ -35,13 +41,15 @@ public static void checkTextPresent(String text, String page) { } } - public static void openWebPage(String url) { + public static boolean openWebPage(String url) { try { driver.get(url); driver.manage().window().maximize(); sleep(); + return true; } catch (Exception ex) { - Common.logError("Error in opening web page: " + url); + Common.logException("Error in opening web page: " + url, ex); + return false; } } @@ -49,7 +57,7 @@ public static void sleep() { try { Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS)); } catch (InterruptedException e) { - Common.logError("Error in sleep: " + e.getMessage()); + Common.logException("Error in sleep: " + e.getMessage(), e); } } @@ -57,7 +65,7 @@ public static void sleepWithTime(int seconds) { try { Thread.sleep(Duration.ofSeconds(seconds)); } catch (InterruptedException e) { - Common.logError("Error in sleep: " + e.getMessage()); + Common.logException("Error in sleep: " + e.getMessage(), e); } } @@ -89,6 +97,16 @@ public static void waitForElementToBeDisabled(WebElement element) { public static void logError(String message) { System.err.println(message); errorLogger.severe(message); + num_errors++; + } + + public static void logException(String message, Exception ex) { + + message += Arrays.toString(ex.getStackTrace()); + + System.err.println(message); + exceptionLogger.severe(message); + num_exceptions++; } public static void logDebug(String message) { @@ -116,6 +134,11 @@ public static void initializeLoggerAndDriver() { driver = setupWebDriver(); } + public static void printNumOfErrorsAndExceptions() { + System.out.println("Total number of exceptions recorded: " + num_exceptions); + System.out.println("Total number of errors recorded: " + num_errors); + } + private static WebDriver setupWebDriver() { try { @@ -132,16 +155,9 @@ private static WebDriver setupWebDriver() { System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); } - RemoteWebDriver driver = new ChromeDriver(chromeOptions); - - Capabilities caps = driver.getCapabilities(); - String browserName = caps.getBrowserName(); - String browserVersion = caps.getBrowserVersion(); - System.out.println(browserName + " " + browserVersion); - - return driver; + return new ChromeDriver(chromeOptions); } catch (Exception ex) { - errorLogger.severe("Failure: Error in setting up web driver: " + ex.getMessage()); + logException("Failure: Error in setting up web driver: " + ex.getMessage(), ex); } return null; @@ -162,6 +178,11 @@ private static Logger setupLogger(String logLevel) { errorFileHandler.setFormatter(new SimpleFormatter()); logger.addHandler(errorFileHandler); logger.setLevel(Level.SEVERE); + } else if (logLevel.equalsIgnoreCase("exception")) { + FileHandler errorFileHandler = new FileHandler(Config.LOG_FILE_EXCEPTION); + errorFileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(errorFileHandler); + logger.setLevel(Level.SEVERE); } else if (logLevel.equalsIgnoreCase("debug")) { FileHandler debugFileHandler = new FileHandler(Config.LOG_FILE_DEBUG); debugFileHandler.setFormatter(new SimpleFormatter()); @@ -180,16 +201,4 @@ private static Logger setupLogger(String logLevel) { Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // Turn off all logging from the Selenium WebDriver. return logger; } - - public static String[] getAttributeList(WebElement webElement, String pageName) { - try { - JavascriptExecutor executor = (JavascriptExecutor) driver; - Object attributes = executor.executeScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", webElement); - return attributes.toString().replaceAll("[{}]", "").split(", "); - } catch (Exception ex) { - Common.logError("Failure: " + pageName + ": Error in getting arguments list for web element: " + webElement.getText() + "Error: " + ex.getMessage()); - } - - return new String[0]; - } } From 2b4cf51913868e02a339416f273c96239a0aac34 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Fri, 19 Jul 2024 14:53:27 -0400 Subject: [PATCH 35/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index a0bb6c61153..2d5bef2ce3f 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -181,7 +181,7 @@ jobs: echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) [[ $lines -ne 0 ]] && exit 1 - if [[ -f debug_ecl_test.log || -f detail_ecl_test.log || -f exception_ecl_test.log]] + if [[ -f debug_ecl_test.log || -f detail_ecl_test.log || -f exception_ecl_test.log ]] then echo "uploadArtifact=true" >> $GITHUB_ENV fi From d2cd1d7741fc4192d466c778ca3e14a37cd80e89 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Fri, 19 Jul 2024 14:59:29 -0400 Subject: [PATCH 36/36] HPCC-31857 - Updated YML --- .github/workflows/test-ui-gh_runner.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index a0bb6c61153..2d5bef2ce3f 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -181,7 +181,7 @@ jobs: echo "ECL Watch UI test done" lines=$(wc -l < error_ecl_test.log) [[ $lines -ne 0 ]] && exit 1 - if [[ -f debug_ecl_test.log || -f detail_ecl_test.log || -f exception_ecl_test.log]] + if [[ -f debug_ecl_test.log || -f detail_ecl_test.log || -f exception_ecl_test.log ]] then echo "uploadArtifact=true" >> $GITHUB_ENV fi