Merge pull request #2507 from nordic-institute/XRDDEV-2782_start-7.7 #1520
GitHub Actions / Central Server system test
failed
Jan 3, 2025 in 1s
122 passed, 2 failed and 0 skipped
❌ src/central-server/admin-service/ui-system-test/build/test-results/systemTest/TEST-org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest.xml
124 tests were completed in 571s with 122 passed, 2 failed and 0 skipped.
Test suite | Passed | Failed | Skipped | Time |
---|---|---|---|---|
org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest | 122✅ | 2❌ | 571s |
❌ org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest
✅ Central server repeat PIN field shows check-mark only when it matches with PIN prompt
✅ Submit enabled only when all fields are filled
✅ Example #1.1
✅ Example #1.2
✅ Example #1.3
✅ Central server is successfully initialized
✅ Correct password and username grant access
✅ Invalid password is rejected
✅ Invalid username is rejected
✅ Multiple member classes are created and present in the list
✅ Member Class description can be modified
✅ Member Class can be deleted
✅ Global group is added and listed
✅ Global group is added and listed
✅ System Parameters is present and can be edited
✅ API key creation wizard is working and key is created
✅ API key is created and revoked
✅ API key is created and edited
✅ User can only assign roles they have when creating/editing API key
✅ Member detail info is correctly shown
✅ Is able to change the name of the member
✅ Is able to delete the member and deleting the member requires the user to input the member code
✅ Search for member with long name
✅ The Subsystems table are correctly shown
✅ The subsystem can be added by code and the added subsystem immediately appears in the table
✅ Can be delete an unregistered subsystem
✅ Initial management services configuration is displayed
✅ Registering management service provider
✅ Member or subsystem cannot be added to server owner group
✅ Member and subsystem can be added to non owner group
✅ Added members are filter out from member candidates list
✅ User can filter member candidates
✅ Selection is preserved while filtering
✅ Group members can be deleted
✅ Add certification service
✅ Delete certification service
✅ View certification service details
✅ View and change certification service settings
✅ Add ACME certification service
✅ View and change acme certification service settings
✅ Intermediate CA can be added
✅ Intermediate CA list is correctly shown
✅ Intermediate CA can be delete in list
✅ Intermediate CA details can be viewed
✅ Intermediate CA OCSP responder can be added
✅ Intermediate CA OCSP responders list is correctly shown
✅ Intermediate CA OCSP responder can be edit in list
✅ Intermediate CA OCSP responder can be delete in list
✅ OCSP responder can be added
✅ OCSP responders list is correctly shown
✅ OCSP responder can be edit in list
✅ OCSP responder can be delete in list
✅ Add timestamping service
✅ Timestamping services list is correctly shown
✅ Timestamping service can be edit in list
✅ Timestamping service can be delete in list
✅ Add Key is disabled on logged-out token
✅ User can add only 2 signings keys after token log-in
✅ User can activate signing key
✅ User can't delete or activate signing key on logged out token
✅ User can delete signing key
✅ User logs out token and can not re-add signing key
✅ Add Key is disabled on logged-out token
✅ User can add only 2 signings keys after token log-in
✅ User can activate signing key
✅ User can't delete or activate signing key on logged out token
✅ User can delete signing key
✅ User logs out token and can not re-add signing key
✅ User can recreate anchor
✅ User can download anchor
✅ Anchor is updated if new signing key is added
✅ Anchor is updated if signing key is deleted
✅ User can recreate anchor
✅ User can download anchor
✅ Anchor is updated if new signing key is added
✅ Anchor is updated if signing key is deleted
✅ Example #1.1
✅ Example #1.1
✅ Example #1.1
✅ Example #1.2
✅ Example #1.1
✅ Example #1.2
✅ Example #1.1
✅ Example #1.2
✅ Example #1.3
✅ Example #1.1
✅ Example #1.2
✅ Example #1.3
✅ User can upload trusted anchor
✅ User can download trusted anchor
✅ User can delete trusted anchor
✅ Management Service TLS certificate is visible and all buttons are enabled
✅ Management Service TLS certificate can be viewed
✅ Management Service TLS certificate can be downloaded
✅ Management Service TLS key and certificate can be re-created
✅ Management Service TLS certificate sign request can be generated
✅ Management Service TLS certificate with different key can't be uploaded
✅ User Approves Management Request
✅ User Declines Management Request
✅ User views Details and Approves pending Management Request
✅ User views Details and Decline pending Management Request
✅ Verify sorting functionality in Management Requests table
✅ Search for pending Management Requests based on Free Text in Visible Columns
✅ Search for Management Requests based on Free Text in Visible Columns
✅ User Approves Management Request for additional authentication certificate
✅ User Approves Management Request for adding another security server
✅ User Approves Management Request for adding another client(subsystem) to security server
❌ User Approves Management Request for adding another client(member) to security server
Element not found {By.xpath: //button[@data-test='add-member-button']}
✅ Management service provider can be registered
✅ Example #1.1
✅ User can change security server address
✅ User can delete security server
✅ Security server authentication certificates for "SS-X" are listed
✅ Security server clients can be sorted by subsystem
✅ Example #1.1
✅ Example #1.2
✅ Security server authentication certificates can be sorted
✅ Security server authentication certificate can be deleted
✅ Navigate from member details to Security Server details and back
❌ Member used servers are listed
Element not found {By.xpath: //div[@data-test='members-table']//table/tbody/tr/td//div[contains(text(), 'E2E TC4 Test Member')]}
✅ Configuration can be backed up and deleted
✅ Configuration backup can be downloaded and uploaded
✅ Already existing configuration backup is overwritten on upload
✅ Configuration can be restored from backup
Annotations
github-actions / Central Server system test
org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest ► User Approves Management Request for adding another client(member) to security server
Failed test found in:
src/central-server/admin-service/ui-system-test/build/test-results/systemTest/TEST-org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest.xml
Error:
Element not found {By.xpath: //button[@data-test='add-member-button']}
Raw output
Element not found {By.xpath: //button[@data-test='add-member-button']}
Expected: clickable: interactable and enabled
Screenshot: file:/home/runner/work/X-Road/X-Road/src/central-server/admin-service/ui-system-test/build/reports/test-automation/selenide-failures/1735906845952.0.png
Page source: file:/home/runner/work/X-Road/X-Road/src/central-server/admin-service/ui-system-test/build/reports/test-automation/selenide-failures/1735906845952.0.html
Timeout: 10 s.
Caused by: NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//button[@data-test='add-member-button']"}
at app//com.codeborne.selenide.impl.WebElementSource.createElementNotFoundError(WebElementSource.java:90)
at app//com.codeborne.selenide.impl.ElementFinder.createElementNotFoundError(ElementFinder.java:142)
at app//com.codeborne.selenide.impl.WebElementSource.handleError(WebElementSource.java:142)
at app//com.codeborne.selenide.impl.WebElementSource.checkConditionAndReturnElement(WebElementSource.java:126)
at app//com.codeborne.selenide.impl.WebElementSource.findAndAssertElementIsClickable(WebElementSource.java:178)
at app//com.codeborne.selenide.commands.Click.findElement(Click.java:53)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:34)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:26)
at app//com.codeborne.selenide.commands.Commands.execute(Commands.java:162)
at app//com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:134)
at app//com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:86)
at app/jdk.proxy3/jdk.proxy3.$Proxy159.click(Unknown Source)
at app//org.niis.xroad.cs.test.ui.glue.MemberStepDefs.memberIsAdded(MemberStepDefs.java:48)
at ✽.A new member with name: E2E TC4 Test Member, code: e2e-tc4-test-member & member class: E2E-TC1 is added(classpath:behavior/ui/0900-cs-management-requests.feature:128)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//button[@data-test='add-member-button']"}
(Session info: chrome=131.0.6778.139)
For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Build info: version: '4.23.0', revision: '4df0a231af'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.5.0-1025-azure', java.version: '21.0.5'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [7746796564060c6e218ac7a1c7f624d1, findElement {value=//button[@data-test='add-member-button'], using=xpath}]
Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 131.0.6778.139, chrome: {chromedriverVersion: 131.0.6778.108 (3b014839fbc..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:36677}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(manual, http=127.0.0...., se:cdp: ws://localhost:36677/devtoo..., se:cdpVersion: 131.0.6778.139, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: accept, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 7746796564060c6e218ac7a1c7f624d1
at java.base@21.0.5/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
at java.base@21.0.5/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
at app//org.openqa.selenium.remote.ErrorCodec.decode(ErrorCodec.java:167)
at app//org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:138)
at app//org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:50)
at app//org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:190)
at app//org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:216)
at app//org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:174)
at app//org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:527)
at app//org.openqa.selenium.remote.ElementLocation$ElementFinder$2.findElement(ElementLocation.java:165)
at app//org.openqa.selenium.remote.ElementLocation.findElement(ElementLocation.java:59)
at app//org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:357)
at app//org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:351)
at app//com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:73)
at app//com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:46)
at app//com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:35)
at app//com.codeborne.selenide.impl.ElementFinder.getWebElement(ElementFinder.java:122)
at app//com.codeborne.selenide.impl.WebElementSource.checkConditionAndReturnElement(WebElementSource.java:115)
at app//com.codeborne.selenide.impl.WebElementSource.findAndAssertElementIsClickable(WebElementSource.java:178)
at app//com.codeborne.selenide.commands.Click.findElement(Click.java:53)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:34)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:26)
at app//com.codeborne.selenide.commands.Commands.execute(Commands.java:162)
at app//com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:134)
at app//com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:86)
at app/jdk.proxy3/jdk.proxy3.$Proxy159.click(Unknown Source)
at app//org.niis.xroad.cs.test.ui.glue.MemberStepDefs.memberIsAdded(MemberStepDefs.java:48)
at java.base@21.0.5/java.lang.reflect.Method.invoke(Method.java:580)
at app//io.cucumber.java.Invoker.doInvoke(Invoker.java:66)
at app//io.cucumber.java.Invoker.invoke(Invoker.java:24)
at app//io.cucumber.java.AbstractGlueDefinition.invokeMethod(AbstractGlueDefinition.java:47)
at app//io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:29)
at app//io.cucumber.core.runner.CoreStepDefinition.execute(CoreStepDefinition.java:66)
at app//io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
at app//io.cucumber.core.runner.ExecutionMode$1.execute(ExecutionMode.java:10)
at app//io.cucumber.core.runner.TestStep.executeStep(TestStep.java:81)
at app//io.cucumber.core.runner.TestStep.run(TestStep.java:53)
at app//io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:51)
at app//io.cucumber.core.runner.TestCase.run(TestCase.java:84)
at app//io.cucumber.core.runner.Runner.runPickle(Runner.java:75)
at app//io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.lambda$runTestCase$4(CucumberEngineExecutionContext.java:112)
at app//io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$5(CucumberExecutionContext.java:136)
at app//io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23)
at app//io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:136)
at app//io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.runTestCase(CucumberEngineExecutionContext.java:109)
at app//io.cucumber.junit.platform.engine.NodeDescriptor$PickleDescriptor.execute(NodeDescriptor.java:168)
at app//io.cucumber.junit.platform.engine.NodeDescriptor$PickleDescriptor.execute(NodeDescriptor.java:90)
at java.base@21.0.5/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base@21.0.5/java.util.ArrayList.forEach(ArrayList.java:1596)
github-actions / Central Server system test
org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest ► Member used servers are listed
Failed test found in:
src/central-server/admin-service/ui-system-test/build/test-results/systemTest/TEST-org.niis.xroad.cs.test.ui.CentralServerUiBehavioralTest.xml
Error:
Element not found {By.xpath: //div[@data-test='members-table']//table/tbody/tr/td//div[contains(text(), 'E2E TC4 Test Member')]}
Raw output
Element not found {By.xpath: //div[@data-test='members-table']//table/tbody/tr/td//div[contains(text(), 'E2E TC4 Test Member')]}
Expected: clickable: interactable and enabled
Screenshot: file:/home/runner/work/X-Road/X-Road/src/central-server/admin-service/ui-system-test/build/reports/test-automation/selenide-failures/1735906882164.1.png
Page source: file:/home/runner/work/X-Road/X-Road/src/central-server/admin-service/ui-system-test/build/reports/test-automation/selenide-failures/1735906882164.1.html
Timeout: 10 s.
Caused by: NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@data-test='members-table']//table/tbody/tr/td//div[contains(text(), 'E2E TC4 Test Member')]"}
at app//com.codeborne.selenide.impl.WebElementSource.createElementNotFoundError(WebElementSource.java:90)
at app//com.codeborne.selenide.impl.ElementFinder.createElementNotFoundError(ElementFinder.java:142)
at app//com.codeborne.selenide.impl.WebElementSource.handleError(WebElementSource.java:142)
at app//com.codeborne.selenide.impl.WebElementSource.checkConditionAndReturnElement(WebElementSource.java:126)
at app//com.codeborne.selenide.impl.WebElementSource.findAndAssertElementIsClickable(WebElementSource.java:178)
at app//com.codeborne.selenide.commands.Click.findElement(Click.java:53)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:34)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:26)
at app//com.codeborne.selenide.commands.Commands.execute(Commands.java:162)
at app//com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:134)
at app//com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:86)
at app/jdk.proxy3/jdk.proxy3.$Proxy159.click(Unknown Source)
at app//org.niis.xroad.cs.test.ui.glue.MemberStepDefs.memberIsSelected(MemberStepDefs.java:43)
at ✽.Member E2E TC4 Test Member is selected(classpath:behavior/ui/1040-cs-member-details.feature:19)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@data-test='members-table']//table/tbody/tr/td//div[contains(text(), 'E2E TC4 Test Member')]"}
(Session info: chrome=131.0.6778.139)
For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Build info: version: '4.23.0', revision: '4df0a231af'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.5.0-1025-azure', java.version: '21.0.5'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [7746796564060c6e218ac7a1c7f624d1, findElement {value=//div[@data-test='members-table']//table/tbody/tr/td//div[contains(text(), 'E2E TC4 Test Member')], using=xpath}]
Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 131.0.6778.139, chrome: {chromedriverVersion: 131.0.6778.108 (3b014839fbc..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:36677}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(manual, http=127.0.0...., se:cdp: ws://localhost:36677/devtoo..., se:cdpVersion: 131.0.6778.139, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: accept, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 7746796564060c6e218ac7a1c7f624d1
at java.base@21.0.5/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
at java.base@21.0.5/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
at app//org.openqa.selenium.remote.ErrorCodec.decode(ErrorCodec.java:167)
at app//org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:138)
at app//org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:50)
at app//org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:190)
at app//org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:216)
at app//org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:174)
at app//org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:527)
at app//org.openqa.selenium.remote.ElementLocation$ElementFinder$2.findElement(ElementLocation.java:165)
at app//org.openqa.selenium.remote.ElementLocation.findElement(ElementLocation.java:59)
at app//org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:357)
at app//org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:351)
at app//com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:73)
at app//com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:46)
at app//com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:35)
at app//com.codeborne.selenide.impl.ElementFinder.getWebElement(ElementFinder.java:122)
at app//com.codeborne.selenide.impl.WebElementSource.checkConditionAndReturnElement(WebElementSource.java:115)
at app//com.codeborne.selenide.impl.WebElementSource.findAndAssertElementIsClickable(WebElementSource.java:178)
at app//com.codeborne.selenide.commands.Click.findElement(Click.java:53)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:34)
at app//com.codeborne.selenide.commands.Click.execute(Click.java:26)
at app//com.codeborne.selenide.commands.Commands.execute(Commands.java:162)
at app//com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:134)
at app//com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:86)
at app/jdk.proxy3/jdk.proxy3.$Proxy159.click(Unknown Source)
at app//org.niis.xroad.cs.test.ui.glue.MemberStepDefs.memberIsSelected(MemberStepDefs.java:43)
at java.base@21.0.5/java.lang.reflect.Method.invoke(Method.java:580)
at app//io.cucumber.java.Invoker.doInvoke(Invoker.java:66)
at app//io.cucumber.java.Invoker.invoke(Invoker.java:24)
at app//io.cucumber.java.AbstractGlueDefinition.invokeMethod(AbstractGlueDefinition.java:47)
at app//io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:29)
at app//io.cucumber.core.runner.CoreStepDefinition.execute(CoreStepDefinition.java:66)
at app//io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
at app//io.cucumber.core.runner.ExecutionMode$1.execute(ExecutionMode.java:10)
at app//io.cucumber.core.runner.TestStep.executeStep(TestStep.java:81)
at app//io.cucumber.core.runner.TestStep.run(TestStep.java:53)
at app//io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:51)
at app//io.cucumber.core.runner.TestCase.run(TestCase.java:84)
at app//io.cucumber.core.runner.Runner.runPickle(Runner.java:75)
at app//io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.lambda$runTestCase$4(CucumberEngineExecutionContext.java:112)
at app//io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$5(CucumberExecutionContext.java:136)
at app//io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23)
at app//io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:136)
at app//io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.runTestCase(CucumberEngineExecutionContext.java:109)
at app//io.cucumber.junit.platform.engine.NodeDescriptor$PickleDescriptor.execute(NodeDescriptor.java:168)
at app//io.cucumber.junit.platform.engine.NodeDescriptor$PickleDescriptor.execute(NodeDescriptor.java:90)
at java.base@21.0.5/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base@21.0.5/java.util.ArrayList.forEach(ArrayList.java:1596)
Loading