From f8e1fd5a2eecd6a0af5a901b880d5f37b53ac9a2 Mon Sep 17 00:00:00 2001 From: Simon Vacek Date: Wed, 13 May 2026 14:03:43 +0200 Subject: [PATCH] Refactor legacy test suite's ExportImportResource Closes: #48966 Signed-off-by: Simon Vacek --- .../providers/runonserver/FetchOnServer.java | 3 +- .../util/runonserver/ExportImportHelper.java | 81 +++++++++ .../rest/TestingResourceProvider.java | 6 - .../resource/TestingExportImportResource.java | 165 ------------------ .../TestingExportImportResource.java | 104 ----------- .../client/resources/TestingResource.java | 3 - .../ClientPoliciesImportExportTest.java | 19 +- .../exportimport/ExportImportTest.java | 138 +++++++-------- .../exportimport/OrganizationExportTest.java | 35 ++-- 9 files changed, 175 insertions(+), 379 deletions(-) create mode 100644 tests/utils-shared/src/main/java/org/keycloak/testsuite/util/runonserver/ExportImportHelper.java delete mode 100644 testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/resource/TestingExportImportResource.java delete mode 100644 testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingExportImportResource.java diff --git a/test-framework/remote-providers/src/main/java/org/keycloak/testframework/remote/providers/runonserver/FetchOnServer.java b/test-framework/remote-providers/src/main/java/org/keycloak/testframework/remote/providers/runonserver/FetchOnServer.java index cf2d2ed02b07..1b38e6fa9dc0 100644 --- a/test-framework/remote-providers/src/main/java/org/keycloak/testframework/remote/providers/runonserver/FetchOnServer.java +++ b/test-framework/remote-providers/src/main/java/org/keycloak/testframework/remote/providers/runonserver/FetchOnServer.java @@ -17,6 +17,7 @@ package org.keycloak.testframework.remote.providers.runonserver; +import java.io.IOException; import java.io.Serializable; import org.keycloak.models.KeycloakSession; @@ -26,6 +27,6 @@ */ public interface FetchOnServer extends Serializable { - Object run(KeycloakSession session); + Object run(KeycloakSession session) throws IOException; } diff --git a/tests/utils-shared/src/main/java/org/keycloak/testsuite/util/runonserver/ExportImportHelper.java b/tests/utils-shared/src/main/java/org/keycloak/testsuite/util/runonserver/ExportImportHelper.java new file mode 100644 index 000000000000..b683b97b4dad --- /dev/null +++ b/tests/utils-shared/src/main/java/org/keycloak/testsuite/util/runonserver/ExportImportHelper.java @@ -0,0 +1,81 @@ +package org.keycloak.testsuite.util.runonserver; + +import java.nio.file.Files; + +import org.keycloak.exportimport.ExportImportManager; +import org.keycloak.exportimport.Strategy; +import org.keycloak.testframework.remote.providers.runonserver.FetchOnServer; +import org.keycloak.testframework.remote.providers.runonserver.RunOnServer; + +import static org.keycloak.exportimport.ExportImportConfig.ACTION; +import static org.keycloak.exportimport.ExportImportConfig.DIR; +import static org.keycloak.exportimport.ExportImportConfig.FILE; +import static org.keycloak.exportimport.ExportImportConfig.PROVIDER; +import static org.keycloak.exportimport.ExportImportConfig.REALM_NAME; +import static org.keycloak.exportimport.ExportImportConfig.STRATEGY; +import static org.keycloak.exportimport.ExportImportConfig.USERS_PER_FILE; + +public final class ExportImportHelper { + + private static String tempDir; + + public static RunOnServer runImport() { + return session -> new ExportImportManager(session).runImport(); + } + + public static RunOnServer runExport() { + return session -> new ExportImportManager(session).runExport(); + } + + public static RunOnServer setUsersPerFile(int usersPerFile) { + return session -> System.setProperty(USERS_PER_FILE, String.valueOf(usersPerFile)); + } + + public static RunOnServer setDir(String dir) { + return session -> System.setProperty(DIR, dir); + } + + public static RunOnServer setStrategy(Strategy strategy) { + return session -> System.setProperty(STRATEGY, strategy.name()); + } + + public static RunOnServer setProvider(String exportImportProvider) { + return session -> System.setProperty(PROVIDER, exportImportProvider); + } + + public static RunOnServer setFile(String file) { + return session -> System.setProperty(FILE, file); + } + + public static RunOnServer setAction(String exportImportAction) { + return session -> System.setProperty(ACTION, exportImportAction); + } + + public static RunOnServer setRealmName(String realmName) { + return session -> { + if (realmName != null && !realmName.isEmpty()) { + System.setProperty(REALM_NAME, realmName); + } else { + System.getProperties().remove(REALM_NAME); + } + }; + } + + public static FetchOnServer getExportImportTestDirectory() { + return session -> { + if (tempDir == null) { + tempDir = Files.createTempDirectory("kc-tests").toAbsolutePath().toString(); + } + return tempDir; + }; + } + + public static RunOnServer clear() { + return session -> { + System.clearProperty(REALM_NAME); + System.clearProperty(PROVIDER); + System.clearProperty(ACTION); + System.clearProperty(FILE); + }; + } +} diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java index 0ba63f52900e..874cb63b2948 100644 --- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java +++ b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java @@ -82,7 +82,6 @@ import org.keycloak.testsuite.rest.representation.AuthenticatorState; import org.keycloak.testsuite.rest.resource.TestCacheResource; import org.keycloak.testsuite.rest.resource.TestLDAPResource; -import org.keycloak.testsuite.rest.resource.TestingExportImportResource; import org.keycloak.testsuite.util.FeatureDeployerUtil; import org.keycloak.timer.TimerProvider; import org.keycloak.truststore.FileTruststoreProvider; @@ -277,11 +276,6 @@ public UserRepresentation getUserByServiceAccountClient(@QueryParam("realmName") return ModelToRepresentation.toRepresentation(session, realm, user); } - @Path("/export-import") - public TestingExportImportResource getExportImportResource() { - return new TestingExportImportResource(session); - } - @GET @Path("/test-amphibian-component") @Produces(MediaType.APPLICATION_JSON) diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/resource/TestingExportImportResource.java b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/resource/TestingExportImportResource.java deleted file mode 100644 index 2c0adb717dd4..000000000000 --- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/resource/TestingExportImportResource.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2016 Red Hat, Inc. and/or its affiliates - * and other contributors as indicated by the @author tags. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.keycloak.testsuite.rest.resource; - -import java.nio.file.Files; - -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.PUT; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; - -import org.keycloak.exportimport.ExportImportManager; -import org.keycloak.exportimport.Strategy; -import org.keycloak.models.KeycloakSession; - -import static org.keycloak.exportimport.ExportImportConfig.ACTION; -import static org.keycloak.exportimport.ExportImportConfig.DEFAULT_USERS_PER_FILE; -import static org.keycloak.exportimport.ExportImportConfig.DIR; -import static org.keycloak.exportimport.ExportImportConfig.FILE; -import static org.keycloak.exportimport.ExportImportConfig.PROVIDER; -import static org.keycloak.exportimport.ExportImportConfig.REALM_NAME; -import static org.keycloak.exportimport.ExportImportConfig.STRATEGY; -import static org.keycloak.exportimport.ExportImportConfig.USERS_PER_FILE; - -/** - * @author Marek Posolda - */ -public class TestingExportImportResource { - - private final KeycloakSession session; - private static String tempDir; - - public TestingExportImportResource(KeycloakSession session) { - this.session = session; - } - - @GET - @Path("/run-import") - @Produces(MediaType.APPLICATION_JSON) - public Response runImport() { - new ExportImportManager(session).runImport(); - return Response.noContent().build(); - } - - @GET - @Path("/run-export") - @Produces(MediaType.APPLICATION_JSON) - public Response runExport() { - new ExportImportManager(session).runExport(); - return Response.noContent().build(); - } - - @GET - @Path("/get-users-per-file") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Integer getUsersPerFile() { - String usersPerFile = System.getProperty(USERS_PER_FILE, String.valueOf(DEFAULT_USERS_PER_FILE)); - return Integer.parseInt(usersPerFile.trim()); - } - - @PUT - @Path("/set-users-per-file") - @Consumes(MediaType.APPLICATION_JSON) - public void setUsersPerFile(@QueryParam("usersPerFile") Integer usersPerFile) { - System.setProperty(USERS_PER_FILE, String.valueOf(usersPerFile)); - } - - @GET - @Path("/get-dir") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public String getDir() { - return System.getProperty(DIR); - } - - @PUT - @Path("/set-dir") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public String setDir(@QueryParam("dir") String dir) { - return System.setProperty(DIR, dir); - } - - @PUT - @Path("/set-import-strategy") - @Consumes(MediaType.APPLICATION_JSON) - public void setStrategy(@QueryParam("importStrategy") Strategy strategy) { - System.setProperty(STRATEGY, strategy.name()); - } - - @PUT - @Path("/export-import-provider") - @Consumes(MediaType.APPLICATION_JSON) - public void setProvider(@QueryParam("exportImportProvider") String exportImportProvider) { - System.setProperty(PROVIDER, exportImportProvider); - } - - @PUT - @Path("/export-import-file") - @Consumes(MediaType.APPLICATION_JSON) - public void setFile(@QueryParam("file") String file) { - System.setProperty(FILE, file); - } - - @PUT - @Path("/export-import-action") - @Consumes(MediaType.APPLICATION_JSON) - public void setAction(@QueryParam("exportImportAction") String exportImportAction) { - System.setProperty(ACTION, exportImportAction); - } - - @PUT - @Path("/set-realm-name") - @Consumes(MediaType.APPLICATION_JSON) - public void setRealmName(@QueryParam("realmName") String realmName) { - if (realmName != null && !realmName.isEmpty()) { - System.setProperty(REALM_NAME, realmName); - } else { - System.getProperties().remove(REALM_NAME); - } - } - - @GET - @Path("/get-test-dir") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public String getExportImportTestDirectory() throws Exception { - if (tempDir == null) { - tempDir = Files.createTempDirectory("kc-tests").toAbsolutePath().toString(); - } - return tempDir; - } - - @GET - @Path("/clear") - @Produces(MediaType.APPLICATION_JSON) - public Response clear() { - System.clearProperty(REALM_NAME); - System.clearProperty(PROVIDER); - System.clearProperty(ACTION); - System.clearProperty(FILE); - - return Response.noContent().build(); - } -} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingExportImportResource.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingExportImportResource.java deleted file mode 100644 index 9d0a3c6a4444..000000000000 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingExportImportResource.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2016 Red Hat, Inc. and/or its affiliates - * and other contributors as indicated by the @author tags. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.keycloak.testsuite.client.resources; - -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.PUT; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.MediaType; - -import org.keycloak.exportimport.Strategy; - -/** - * @author Marek Posolda - */ -public interface TestingExportImportResource { - - @GET - @Path("/run-import") - @Produces(MediaType.APPLICATION_JSON) - void runImport(); - - @GET - @Path("/run-export") - @Produces(MediaType.APPLICATION_JSON) - void runExport(); - - @GET - @Path("/get-users-per-file") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - Integer getUsersPerFile(); - - @PUT - @Path("/set-users-per-file") - @Consumes(MediaType.APPLICATION_JSON) - void setUsersPerFile(@QueryParam("usersPerFile") Integer usersPerFile); - - @GET - @Path("/get-dir") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - String getDir(); - - @PUT - @Path("/set-dir") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - String setDir(@QueryParam("dir") String dir); - - @PUT - @Path("/set-import-strategy") - @Consumes(MediaType.APPLICATION_JSON) - void setStrategy(@QueryParam("importStrategy") Strategy strategy); - - @PUT - @Path("/export-import-provider") - @Consumes(MediaType.APPLICATION_JSON) - void setProvider(@QueryParam("exportImportProvider") String exportImportProvider); - - @PUT - @Path("/export-import-file") - @Consumes(MediaType.APPLICATION_JSON) - void setFile(@QueryParam("file") String file); - - @PUT - @Path("/export-import-action") - @Consumes(MediaType.APPLICATION_JSON) - void setAction(@QueryParam("exportImportAction") String exportImportAction); - - @PUT - @Path("/set-realm-name") - @Consumes(MediaType.APPLICATION_JSON) - void setRealmName(@QueryParam("realmName") String realmName); - - @GET - @Path("/get-test-dir") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - String getExportImportTestDirectory(); - - @GET - @Path("/clear") - @Produces(MediaType.APPLICATION_JSON) - void clear(); - -} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java index ff1323349ca0..ce382c67676a 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java @@ -130,9 +130,6 @@ public UserRepresentation getUserByUsernameFromFedProviderFactory(@QueryParam("r @Produces(MediaType.APPLICATION_JSON) public UserRepresentation getUserByServiceAccountClient(@QueryParam("realmName") String realmName, @QueryParam("clientId") String clientId); - @Path("export-import") - TestingExportImportResource exportImport(); - @GET @Path("/test-amphibian-component") @Produces(MediaType.APPLICATION_JSON) diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/client/policies/ClientPoliciesImportExportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/client/policies/ClientPoliciesImportExportTest.java index da181cc7adc5..9c27641fc0f0 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/client/policies/ClientPoliciesImportExportTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/client/policies/ClientPoliciesImportExportTest.java @@ -29,6 +29,7 @@ import org.keycloak.representations.idm.ClientProfilesRepresentation; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.testsuite.Assert; +import org.keycloak.testsuite.util.runonserver.ExportImportHelper; import org.junit.After; import org.junit.Test; @@ -60,14 +61,14 @@ public void beforeAbstractKeycloakTestRealmImport() { @After public void afterImportExport() { - testingClient.testing().exportImport().clear(); + runOnServerMaster.run(ExportImportHelper.clear()); } @Test public void testSingleFileRealmExportImport() throws Throwable { - testingClient.testing().exportImport().setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - String targetFilePath = testingClient.testing().exportImport().getExportImportTestDirectory() + File.separator + "client-policies-exported-realm.json"; - testingClient.testing().exportImport().setFile(targetFilePath); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); + String targetFilePath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "client-policies-exported-realm.json"; + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); setupValidProfilesAndPolicies(); @@ -75,10 +76,10 @@ public void testSingleFileRealmExportImport() throws Throwable { } private void testRealmExportImport() throws Exception { - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_EXPORT); - testingClient.testing().exportImport().setRealmName("test"); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); + runOnServerMaster.run(ExportImportHelper.setRealmName("test")); - testingClient.testing().exportImport().runExport(); + runOnServerMaster.run(ExportImportHelper.runExport()); // Delete some realm (and some data in admin realm) adminClient.realm("test").remove(); @@ -86,9 +87,9 @@ private void testRealmExportImport() throws Exception { Assert.assertNames(adminClient.realms().findAll(), "master"); // Configure import - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); - testingClient.testing().exportImport().runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); // Ensure data are imported back, but just for "test" realm Assert.assertNames(adminClient.realms().findAll(), "master", "test"); diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java index 92ab8cde2850..212339aee3db 100755 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java @@ -56,8 +56,8 @@ import org.keycloak.testsuite.Assert; import org.keycloak.testsuite.arquillian.annotation.EnableFeature; import org.keycloak.testsuite.arquillian.annotation.UncaughtServerErrorExpected; -import org.keycloak.testsuite.client.resources.TestingExportImportResource; import org.keycloak.testsuite.util.JsonTestUtils; +import org.keycloak.testsuite.util.runonserver.ExportImportHelper; import org.keycloak.testsuite.util.runonserver.RunHelpers; import org.keycloak.testsuite.util.userprofile.UserProfileUtil; import org.keycloak.userprofile.DeclarativeUserProfileProvider; @@ -177,11 +177,11 @@ public void clearExportImportProps() throws LifecycleException { @Test public void testDirFullExportImport() throws Throwable { - testingClient.testing().exportImport().setProvider(DirExportProviderFactory.PROVIDER_ID); - String targetDirPath = testingClient.testing().exportImport().getExportImportTestDirectory()+ File.separator + "dirExport"; + runOnServerMaster.run(ExportImportHelper.setProvider(DirExportProviderFactory.PROVIDER_ID)); + String targetDirPath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","")+ File.separator + "dirExport"; DirExportProvider.recursiveDeleteDir(new File(targetDirPath)); - testingClient.testing().exportImport().setDir(targetDirPath); - testingClient.testing().exportImport().setUsersPerFile(ExportImportConfig.DEFAULT_USERS_PER_FILE); + runOnServerMaster.run(ExportImportHelper.setDir(targetDirPath)); + runOnServerMaster.run(ExportImportHelper.setUsersPerFile(ExportImportConfig.DEFAULT_USERS_PER_FILE)); testFullExportImport(); @@ -194,13 +194,11 @@ public void testDirFullExportImport() throws Throwable { @Test public void testDirRealmExportImport() throws Throwable { - testingClient.testing() - .exportImport() - .setProvider(DirExportProviderFactory.PROVIDER_ID); - String targetDirPath = testingClient.testing().exportImport().getExportImportTestDirectory() + File.separator + "dirRealmExport"; + runOnServerMaster.run(ExportImportHelper.setProvider(DirExportProviderFactory.PROVIDER_ID)); + String targetDirPath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "dirRealmExport"; DirExportProvider.recursiveDeleteDir(new File(targetDirPath)); - testingClient.testing().exportImport().setDir(targetDirPath); - testingClient.testing().exportImport().setUsersPerFile(5); + runOnServerMaster.run(ExportImportHelper.setDir(targetDirPath)); + runOnServerMaster.run(ExportImportHelper.setUsersPerFile(5)); testRealmExportImport(); @@ -215,9 +213,9 @@ public void testDirRealmExportImport() throws Throwable { @Test public void testSingleFileFullExportImport() throws Throwable { - testingClient.testing().exportImport().setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - String targetFilePath = testingClient.testing().exportImport().getExportImportTestDirectory() + File.separator + "singleFile-full.json"; - testingClient.testing().exportImport().setFile(targetFilePath); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); + String targetFilePath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "singleFile-full.json"; + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); testFullExportImport(); assertExportContainsGoogleClientSecret(targetFilePath); @@ -238,9 +236,9 @@ private static void assertExportContainsGoogleClientSecret(String targetFilePath @Test public void testSingleFileRealmExportImport() throws Throwable { - testingClient.testing().exportImport().setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - String targetFilePath = testingClient.testing().exportImport().getExportImportTestDirectory() + File.separator + "singleFile-realm.json"; - testingClient.testing().exportImport().setFile(targetFilePath); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); + String targetFilePath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "singleFile-realm.json"; + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); testRealmExportImport(); } @@ -251,14 +249,14 @@ public void testSingleFileRealmWithoutBuiltinsImport() throws Throwable { removeRealm(TEST_REALM); // Set the realm, which doesn't have builtin clients/roles inside JSON - testingClient.testing().exportImport().setProvider(SingleFileExportProviderFactory.PROVIDER_ID); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); URL url = ExportImportTest.class.getResource("/model/testrealm.json"); String targetFilePath = new File(url.getFile()).getAbsolutePath(); - testingClient.testing().exportImport().setFile(targetFilePath); + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); - testingClient.testing().exportImport().runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); RealmResource testRealmRealm = adminClient.realm(TEST_REALM); @@ -304,20 +302,19 @@ public void testExportUserProfileConfig() throws IOException { UPConfig persistedConfig = UserProfileUtil.setUserProfileConfiguration(realmRes, UserProfileUtil.CONFIGURATION_FOR_USER_EDIT); //export - TestingExportImportResource exportImport = testingClient.testing().exportImport(); - exportImport.setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - exportImport.setAction(ExportImportConfig.ACTION_EXPORT); - exportImport.setRealmName(TEST_REALM); - String targetFilePath = exportImport.getExportImportTestDirectory() + File.separator + "singleFile-userProfile.json"; - exportImport.setFile(targetFilePath); - exportImport.runExport(); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); + runOnServerMaster.run(ExportImportHelper.setRealmName(TEST_REALM)); + String targetFilePath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "singleFile-userProfile.json"; + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); + runOnServerMaster.run(ExportImportHelper.runExport()); //remove realm removeRealm(TEST_REALM); //import - exportImport.setAction(ExportImportConfig.ACTION_IMPORT); - exportImport.runImport(); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); + runOnServerMaster.run(ExportImportHelper.runImport()); List userProfileComponents = realmRes.components().query(TEST_REALM, "org.keycloak.userprofile.UserProfileProvider"); assertThat(userProfileComponents, notNullValue()); @@ -346,13 +343,12 @@ public void testRealmImportWithOID4VCICredentialOfferCreateRole() throws Throwab assertEquals(OID4VCIConstants.CREDENTIAL_OFFER_CREATE.getName(), credentialOfferCreateRole.getName(), "Role name should match"); // Export the realm - TestingExportImportResource exportImport = testingClient.testing().exportImport(); - exportImport.setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - exportImport.setAction(ExportImportConfig.ACTION_EXPORT); - exportImport.setRealmName(testRealmName); - String targetFilePath = exportImport.getExportImportTestDirectory() + File.separator + "oid4vci-realm-export.json"; - exportImport.setFile(targetFilePath); - exportImport.runExport(); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); + runOnServerMaster.run(ExportImportHelper.setRealmName(testRealmName)); + String targetFilePath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "oid4vci-realm-export.json"; + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); + runOnServerMaster.run(ExportImportHelper.runExport()); // Verify the exported file contains the role Map exportedRealms; @@ -371,8 +367,8 @@ public void testRealmImportWithOID4VCICredentialOfferCreateRole() throws Throwab removeRealm(testRealmName); // Import the realm back - this should succeed without ModelDuplicateException - exportImport.setAction(ExportImportConfig.ACTION_IMPORT); - exportImport.runImport(); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); + runOnServerMaster.run(ExportImportHelper.runImport()); // Verify the realm was imported successfully RealmResource importedRealmResource = adminClient.realm(testRealmName); @@ -389,18 +385,16 @@ public void testRealmImportWithOID4VCICredentialOfferCreateRole() throws Throwab @Test public void testImportIgnoreExistingMissingClientId() { - TestingExportImportResource resource = testingClient.testing().exportImport(); + runOnServerMaster.run(ExportImportHelper.setStrategy(Strategy.IGNORE_EXISTING)); + runOnServerMaster.run(ExportImportHelper.setProvider(DirExportProviderFactory.PROVIDER_ID)); - resource.setStrategy(Strategy.IGNORE_EXISTING); - resource.setProvider(DirExportProviderFactory.PROVIDER_ID); - - String targetDirPath = resource.getExportImportTestDirectory() + File.separator + "dirRealmExport"; + String targetDirPath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "dirRealmExport"; File dest = new File(targetDirPath); try { DirExportProvider.recursiveDeleteDir(dest); - resource.setDir(targetDirPath); + runOnServerMaster.run(ExportImportHelper.setDir(targetDirPath)); - resource.setAction(ExportImportConfig.ACTION_EXPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); URL url = ExportImportTest.class.getResource("/model/testrealm.json"); File testRealm = new File(url.getFile()); @@ -418,12 +412,12 @@ public void testImportIgnoreExistingMissingClientId() { File existingFile = FileUtils.getFile(dest, newFile.getName()); assertThat(existingFile, Matchers.notNullValue()); - resource.runExport(); - resource.setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.runExport()); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); try { - resource.runImport(); - resource.runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); + runOnServerMaster.run(ExportImportHelper.runImport()); } catch (Exception e) { Assertions.fail("Error with realm importing twice. Details: " + e.getMessage()); } @@ -434,18 +428,16 @@ public void testImportIgnoreExistingMissingClientId() { @UncaughtServerErrorExpected public void testImportNameMismatch() { - TestingExportImportResource resource = testingClient.testing().exportImport(); - - resource.setStrategy(Strategy.IGNORE_EXISTING); - resource.setProvider(DirExportProviderFactory.PROVIDER_ID); + runOnServerMaster.run(ExportImportHelper.setStrategy(Strategy.IGNORE_EXISTING)); + runOnServerMaster.run(ExportImportHelper.setProvider(DirExportProviderFactory.PROVIDER_ID)); - String targetDirPath = resource.getExportImportTestDirectory() + File.separator + "dirRealmExport"; + String targetDirPath = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "dirRealmExport"; File dest = new File(targetDirPath); try { DirExportProvider.recursiveDeleteDir(dest); - resource.setDir(targetDirPath); + runOnServerMaster.run(ExportImportHelper.setDir(targetDirPath)); - resource.setAction(ExportImportConfig.ACTION_EXPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); URL url = ExportImportTest.class.getResource("/model/testrealm.json"); File testRealm = new File(url.getFile()); @@ -463,9 +455,9 @@ public void testImportNameMismatch() { File existingFile = FileUtils.getFile(dest, newFile.getName()); assertThat(existingFile, Matchers.notNullValue()); - resource.setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); - resource.runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); } finally { DirExportProvider.recursiveDeleteDir(dest); } @@ -488,10 +480,10 @@ private void addTestRealmToTestRealmReps(String realm) { } private void testFullExportImport() throws LifecycleException { - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_EXPORT); - testingClient.testing().exportImport().setRealmName(""); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); + runOnServerMaster.run(ExportImportHelper.setRealmName("")); - testingClient.testing().exportImport().runExport(); + runOnServerMaster.run(ExportImportHelper.runExport()); removeRealm("test"); removeRealm(TEST_REALM); @@ -512,9 +504,9 @@ private void testFullExportImport() throws LifecycleException { // Configure import - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); - testingClient.testing().exportImport().runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); // Ensure data are imported back Assert.assertNames(adminClient.realms().findAll(), "master", "test", TEST_REALM); @@ -548,12 +540,12 @@ private void testFullExportImport() throws LifecycleException { } private void testRealmExportImport() throws LifecycleException { - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_EXPORT); - testingClient.testing().exportImport().setRealmName("test"); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); + runOnServerMaster.run(ExportImportHelper.setRealmName("test")); String[] authFlowObjectIdsBeforeImport = getSomeAuthenticationFlowsObjectIds(); - testingClient.testing().exportImport().runExport(); + runOnServerMaster.run(ExportImportHelper.runExport()); List components = adminClient.realm("test").components().query(); KeysMetadataRepresentation keyMetadata = adminClient.realm("test").keys().getKeyMetadata(); @@ -576,9 +568,9 @@ private void testRealmExportImport() throws LifecycleException { assertNotAuthenticated("test", "user-requiredWebAuthn", "password"); // Configure import - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); - testingClient.testing().exportImport().runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); // Ensure data are imported back, but just for "test" realm Assert.assertNames(adminClient.realms().findAll(), "master", "test", TEST_REALM); @@ -695,13 +687,13 @@ private void clearExportImportProperties() { } private void importRealmFromFile(String path) { - testingClient.testing().exportImport().setProvider(SingleFileExportProviderFactory.PROVIDER_ID); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); URL url = ExportImportTest.class.getResource(path); String targetFilePath = new File(url.getFile()).getAbsolutePath(); - testingClient.testing().exportImport().setFile(targetFilePath); + runOnServerMaster.run(ExportImportHelper.setFile(targetFilePath)); - testingClient.testing().exportImport().setAction(ExportImportConfig.ACTION_IMPORT); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); - testingClient.testing().exportImport().runImport(); + runOnServerMaster.run(ExportImportHelper.runImport()); } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java index d1a1d818e12a..35188d35b948 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java @@ -47,9 +47,9 @@ import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.testframework.realm.UserBuilder; import org.keycloak.testsuite.admin.ApiUtil; -import org.keycloak.testsuite.client.resources.TestingExportImportResource; import org.keycloak.testsuite.organization.admin.AbstractOrganizationTest; import org.keycloak.testsuite.pages.AppPage; +import org.keycloak.testsuite.util.runonserver.ExportImportHelper; import org.hamcrest.Matchers; import org.junit.Test; @@ -291,35 +291,34 @@ public void testExportImportEmptyOrg() { } private RealmRepresentation exportRemoveImportRealm(boolean file) { - TestingExportImportResource exportImport = testingClient.testing().exportImport(); String fileOrDir; //export if (file) { - exportImport.setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - fileOrDir = exportImport.getExportImportTestDirectory() + File.separator + "org-export.json"; - exportImport.setFile(fileOrDir); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileExportProviderFactory.PROVIDER_ID)); + fileOrDir = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"","") + File.separator + "org-export.json"; + runOnServerMaster.run(ExportImportHelper.setFile(fileOrDir)); } else { - exportImport.setProvider(DirExportProviderFactory.PROVIDER_ID); - fileOrDir = exportImport.getExportImportTestDirectory(); - exportImport.setDir(fileOrDir); + runOnServerMaster.run(ExportImportHelper.setProvider(DirExportProviderFactory.PROVIDER_ID)); + fileOrDir = runOnServerMaster.fetchString(ExportImportHelper.getExportImportTestDirectory()).replace("\"",""); + runOnServerMaster.run(ExportImportHelper.setDir(fileOrDir)); } - exportImport.setAction(ExportImportConfig.ACTION_EXPORT); - exportImport.setRealmName(managedRealm.admin().toRepresentation().getRealm()); - exportImport.runExport(); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_EXPORT)); + runOnServerMaster.run(ExportImportHelper.setRealmName(managedRealm.admin().toRepresentation().getRealm())); + runOnServerMaster.run(ExportImportHelper.runExport()); + // remove the realm and import it back managedRealm.admin().remove(); - exportImport = testingClient.testing().exportImport(); if (file) { - exportImport.setProvider(SingleFileImportProviderFactory.PROVIDER_ID); - exportImport.setFile(fileOrDir); + runOnServerMaster.run(ExportImportHelper.setProvider(SingleFileImportProviderFactory.PROVIDER_ID)); + runOnServerMaster.run(ExportImportHelper.setFile(fileOrDir)); } else { - exportImport.setProvider(DirImportProviderFactory.PROVIDER_ID); - exportImport.setDir(fileOrDir); + runOnServerMaster.run(ExportImportHelper.setProvider(DirImportProviderFactory.PROVIDER_ID)); + runOnServerMaster.run(ExportImportHelper.setDir(fileOrDir)); } - exportImport.setAction(ExportImportConfig.ACTION_IMPORT); - exportImport.runImport(); + runOnServerMaster.run(ExportImportHelper.setAction(ExportImportConfig.ACTION_IMPORT)); + runOnServerMaster.run(ExportImportHelper.runImport()); getCleanup().addCleanup(() -> { managedRealm.admin().remove(); getTestContext().getTestRealmReps().clear();