From 98eb7f814bca10d9a5aec8a97eb2bf144a7e875a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 7 Aug 2011 13:13:06 +0200 Subject: [PATCH] improve RepositoryExtendedITCase --- .../sonia/scm/it/IntegrationTestUtil.java | 54 +++ .../scm/it/RepositoryExtendedITCase.java | 274 ++------------- .../sonia/scm/it/RepositoryITCaseBase.java | 324 ++++++++++++++++++ 3 files changed, 404 insertions(+), 248 deletions(-) create mode 100644 scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java diff --git a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java index 5fa8ead4f7..df2dca59a1 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java @@ -37,7 +37,10 @@ package sonia.scm.it; import sonia.scm.ScmState; import sonia.scm.Type; +import sonia.scm.repository.client.RepositoryClient; +import sonia.scm.repository.client.RepositoryClientException; import sonia.scm.user.User; +import sonia.scm.util.IOUtil; import static org.junit.Assert.*; @@ -51,7 +54,12 @@ import com.sun.jersey.client.apache.config.ApacheHttpClientConfig; import com.sun.jersey.client.apache.config.DefaultApacheHttpClientConfig; import com.sun.jersey.core.util.MultivaluedMapImpl; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + import java.util.Collection; +import java.util.UUID; import javax.ws.rs.core.MultivaluedMap; @@ -161,6 +169,36 @@ public class IntegrationTestUtil return ApacheHttpClient.create(config); } + /** + * Method description + * + * + * + * @param client + * + * @throws IOException + * @throws RepositoryClientException + */ + public static void createRandomFile(RepositoryClient client) + throws IOException, RepositoryClientException + { + String uuid = UUID.randomUUID().toString(); + String name = "file-" + uuid + ".uuid"; + FileOutputStream out = null; + + try + { + out = new FileOutputStream(new File(client.getLocalRepository(), name)); + out.write(uuid.getBytes()); + } + finally + { + IOUtil.close(out); + } + + client.add(name); + } + /** * Method description * @@ -188,6 +226,22 @@ public class IntegrationTestUtil return BASE_URL.concat(url).concat(EXTENSION); } + /** + * Method description + * + * + * @return + */ + public static File createTempDirectory() + { + File directory = new File(System.getProperty("java.io.tmpdir"), + UUID.randomUUID().toString()); + + IOUtil.mkdirs(directory); + + return directory; + } + /** * Method description * diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java index 9ad7d00a8c..974e5b92e5 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java @@ -35,275 +35,51 @@ package sonia.scm.it; //~--- non-JDK imports -------------------------------------------------------- -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import sonia.scm.ScmState; -import sonia.scm.Type; -import sonia.scm.repository.Permission; -import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryTestData; import sonia.scm.repository.client.RepositoryClient; import sonia.scm.repository.client.RepositoryClientException; import sonia.scm.repository.client.RepositoryClientFactory; import sonia.scm.user.User; -import sonia.scm.user.UserTestData; import sonia.scm.util.IOUtil; -import static org.junit.Assert.*; - import static sonia.scm.it.IntegrationTestUtil.*; //~--- JDK imports ------------------------------------------------------------ -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.GenericType; - import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.UUID; - /** * * @author Sebastian Sdorra */ @RunWith(Parameterized.class) -public class RepositoryExtendedITCase +public class RepositoryExtendedITCase extends RepositoryITCaseBase { /** * Constructs ... * * - * * @param repository - * @param username + * @param owner + * @param write + * @param read * @param password - * - * @throws IOException - * @throws RepositoryClientException */ - public RepositoryExtendedITCase(Repository repository, String username, - String password) - throws RepositoryClientException, IOException + public RepositoryExtendedITCase(Repository repository, User owner, + User write, User read, String password) { - this.repository = repository; - this.username = username; - this.password = password; + super(repository, owner, write, read, password); } //~--- methods -------------------------------------------------------------- - /** - * Method description - * - */ - @AfterClass - public static void cleanup() - { - Client client = createAdminClient(); - - createResource(client, "users/trillian").delete(); - - Collection repositories = - createResource(client, "repositories").get( - new GenericType>() {} - ); - - if (repositories != null) - { - for (Repository r : repositories) - { - createResource(client, "repositories/" + r.getId()).delete(); - } - } - - client.destroy(); - } - - /** - * Method description - * - * - * @return - */ - @Parameters - public static Collection createParameters() - { - Client client = createClient(); - ScmState state = authenticateAdmin(client); - - assertNotNull(state); - assertTrue(state.isSuccess()); - - Collection params = new ArrayList(); - - for (Type t : state.getRepositoryTypes()) - { - if (t.getName().equals("git")) - { - Repository gitRepository = createRepository("git", "trillian"); - - params.add(new Object[] { gitRepository, "trillian", "secret" }); - } - else if (t.getName().equals("svn")) - { - Repository svnRepository = createRepository("svn", "trillian"); - - params.add(new Object[] { svnRepository, "trillian", "secret" }); - } - else if (t.getName().equals("hg")) - { - Repository hgRepository = createRepository("hg", "trillian"); - - params.add(new Object[] { hgRepository, "trillian", "secret" }); - } - } - - return params; - } - - /** - * Method description - * - */ - @BeforeClass - public static void setup() - { - Client client = createAdminClient(); - User trillian = UserTestData.createTrillian(); - - trillian.setPassword("secret"); - createResource(client, "users").post(trillian); - client.destroy(); - } - - /** - * Method description - * - * - * - * @param repository - * @param username - * @param password - * - * @throws IOException - * @throws RepositoryClientException - */ - private static void addTestFiles(Repository repository, String username, - String password) - throws RepositoryClientException, IOException - { - File directory = createTempDirectory(); - - try - { - RepositoryClient rc = - RepositoryClientFactory.createClient(repository.getType(), directory, - repository.getUrl(), username, password); - - rc.init(); - - for (int i = 0; i < 5; i++) - { - createRandomFile(rc, directory); - } - - rc.commit("added some test files"); - } - finally - { - IOUtil.delete(directory); - } - } - - /** - * Method description - * - * - * - * @param client - * @param directory - * - * @throws IOException - * @throws RepositoryClientException - */ - private static void createRandomFile(RepositoryClient client, File directory) - throws IOException, RepositoryClientException - { - String uuid = UUID.randomUUID().toString(); - String name = "file-" + uuid + ".uuid"; - FileOutputStream out = null; - - try - { - out = new FileOutputStream(new File(directory, name)); - out.write(uuid.getBytes()); - } - finally - { - IOUtil.close(out); - } - - client.add(name); - } - - /** - * Method description - * - * - * @param type - * @param username - * - * @return - */ - private static Repository createRepository(String type, String username) - { - Client client = createAdminClient(); - Repository repository = RepositoryTestData.createHeartOfGold(type); - - repository.setPermissions(Arrays.asList(new Permission(username, - PermissionType.WRITE))); - - ClientResponse response = createResource(client, - "repositories").post(ClientResponse.class, - repository); - String url = response.getHeaders().get("Location").get(0) + EXTENSION; - - response.close(); - repository = client.resource(url).get(Repository.class); - client.destroy(); - - return repository; - } - - /** - * Method description - * - * - * @return - */ - private static File createTempDirectory() - { - File directory = new File(System.getProperty("java.io.tmpdir"), - UUID.randomUUID().toString()); - - IOUtil.mkdirs(directory); - - return directory; - } - /** * Method description * @@ -312,7 +88,7 @@ public class RepositoryExtendedITCase * @throws RepositoryClientException */ @Test - public void read() throws RepositoryClientException, IOException + public void simpleRead() throws RepositoryClientException, IOException { File directory = createTempDirectory(); @@ -320,9 +96,8 @@ public class RepositoryExtendedITCase { RepositoryClient rc = RepositoryClientFactory.createClient(repository.getType(), directory, - repository.getUrl(), username, password); + repository.getUrl(), readUser.getName(), password); - rc.init(); rc.checkout(); } finally @@ -340,19 +115,22 @@ public class RepositoryExtendedITCase * @throws RepositoryClientException */ @Test - public void write() throws RepositoryClientException, IOException + public void simpleWrite() throws RepositoryClientException, IOException { - addTestFiles(repository, username, password); + File directory = createTempDirectory(); + + try + { + RepositoryClient rc = + RepositoryClientFactory.createClient(repository.getType(), directory, + repository.getUrl(), writeUser.getName(), password); + + rc.checkout(); + addTestFiles(rc); + } + finally + { + IOUtil.delete(directory); + } } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private String password; - - /** Field description */ - private Repository repository; - - /** Field description */ - private String username; } diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java new file mode 100644 index 0000000000..2fd909c59a --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java @@ -0,0 +1,324 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.it; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.junit.AfterClass; +import org.junit.runners.Parameterized.Parameters; + +import sonia.scm.ScmState; +import sonia.scm.Type; +import sonia.scm.repository.Permission; +import sonia.scm.repository.PermissionType; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryTestData; +import sonia.scm.repository.client.RepositoryClient; +import sonia.scm.repository.client.RepositoryClientException; +import sonia.scm.repository.client.RepositoryClientFactory; +import sonia.scm.user.User; +import sonia.scm.user.UserTestData; +import sonia.scm.util.IOUtil; + +import static org.junit.Assert.*; + +import static sonia.scm.it.IntegrationTestUtil.*; +import static sonia.scm.it.RepositoryITUtil.*; + +//~--- JDK imports ------------------------------------------------------------ + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.GenericType; + +import java.io.File; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +/** + * + * @author Sebastian Sdorra + */ +public class RepositoryITCaseBase +{ + + /** + * Constructs ... + * + * + * @param repository + * @param owner + * @param write + * @param read + * @param password + */ + public RepositoryITCaseBase(Repository repository, User owner, User write, + User read, String password) + { + this.repository = repository; + this.ownerUser = owner; + this.writeUser = write; + this.readUser = read; + this.password = password; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param client + * + * @throws IOException + * @throws RepositoryClientException + */ + public static void addTestFiles(RepositoryClient client) + throws RepositoryClientException, IOException + { + for (int i = 0; i < 5; i++) + { + createRandomFile(client); + } + + client.commit("added some test files"); + } + + /** + * Method description + * + * + * + * @param repository + * @param username + * @param password + * + * @throws IOException + * @throws RepositoryClientException + */ + public static void addTestFiles(Repository repository, String username, + String password) + throws RepositoryClientException, IOException + { + File directory = createTempDirectory(); + + System.out.println( repository.getUrl() ); + + try + { + RepositoryClient rc = + RepositoryClientFactory.createClient(repository.getType(), directory, + repository.getUrl(), username, password); + + rc.init(); + addTestFiles(rc); + } + finally + { + IOUtil.delete(directory); + } + } + + /** + * Method description + * + */ + @AfterClass + public static void cleanup() + { + Client client = createAdminClient(); + + deleteUser(client, UserTestData.createTrillian()); + deleteUser(client, UserTestData.createZaphod()); + deleteUser(client, UserTestData.createMarvin()); + + Collection repositories = + createResource(client, "repositories").get( + new GenericType>() {} + ); + + if (repositories != null) + { + for (Repository r : repositories) + { + createResource(client, "repositories/" + r.getId()).delete(); + } + } + + client.destroy(); + } + + /** + * Method description + * + * + * @return + * + * @throws IOException + * @throws RepositoryClientException + */ + @Parameters + public static Collection createParameters() + throws RepositoryClientException, IOException + { + Client client = createClient(); + ScmState state = authenticateAdmin(client); + + assertNotNull(state); + assertTrue(state.isSuccess()); + + Collection params = new ArrayList(); + User owner = UserTestData.createTrillian(); + + createUser(owner); + + User write = UserTestData.createZaphod(); + + createUser(write); + + User read = UserTestData.createMarvin(); + + createUser(read); + + for (Type t : state.getRepositoryTypes()) + { + if (t.getName().equals("git")) + { + Repository gitRepository = createTestRepository("git", owner, write, + read); + + params.add(new Object[] { gitRepository, owner, write, read, + "secret" }); + } + else if (t.getName().equals("svn")) + { + Repository svnRepository = createTestRepository("svn", owner, write, + read); + + params.add(new Object[] { svnRepository, owner, write, read, + "secret" }); + } + else if (t.getName().equals("hg")) + { + Repository hgRepository = createTestRepository("hg", owner, write, + read); + + params.add(new Object[] { hgRepository, owner, write, read, "secret" }); + } + } + + return params; + } + + /** + * Method description + * + * + * @param type + * @param owner + * @param write + * @param read + * + * @return + * + * @throws IOException + * @throws RepositoryClientException + */ + private static Repository createTestRepository(String type, User owner, + User write, User read) + throws RepositoryClientException, IOException + { + Client client = createAdminClient(); + Repository repository = RepositoryTestData.createHeartOfGold(type); + + //J- + repository.setPermissions(Arrays.asList( + new Permission(owner.getName(), PermissionType.OWNER), + new Permission(write.getName(), PermissionType.WRITE), + new Permission(read.getName(), PermissionType.READ)) + ); + //J+ + repository = createRepository(client, repository); + client.destroy(); + addTestFiles(repository, ADMIN_USERNAME, ADMIN_PASSWORD); + + return repository; + } + + /** + * Method description + * + * + * @param user + */ + private static void createUser(User user) + { + Client client = createAdminClient(); + + user.setPassword("secret"); + createResource(client, "users").post(user); + client.destroy(); + } + + /** + * Method description + * + * + * @param client + * @param user + */ + private static void deleteUser(Client client, User user) + { + createResource(client, "users/".concat(user.getName())).delete(); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + protected User ownerUser; + + /** Field description */ + protected String password; + + /** Field description */ + protected User readUser; + + /** Field description */ + protected Repository repository; + + /** Field description */ + protected User writeUser; +}