Skip to content
Permalink
Browse files

Merge pull request #81 from jglick/temp-dir-JENKINS-27152

[JENKINS-27152] Test of standardized temp directory with Git operations
  • Loading branch information
jglick committed Mar 4, 2016
2 parents 500a376 + eb4a0bd commit 6681f400d9a84ded4c39e8a8c4c982c1a2196295
20 pom.xml
@@ -695,6 +695,26 @@
</plugins>
</build>
</profile>
<profile>
<id>RECORDER</id>
<activation>
<property>
<name>RECORDER</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<environmentVariables>
<RECORDER>${RECORDER}</RECORDER>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!-- TODO could be laboriously repeated for $TYPE, $DISPLAY, etc. (seems Maven provides no generic way to do this) -->

<profile>
@@ -15,15 +15,26 @@
private static final String REPO_DIR = "/home/git/gitRepo";
public static final String REPO_NAME = "gitRepo";

public String host() {
return ipBound(22);
}

public int port() {
return port(22);
}

public URL getUrl() throws IOException {
return new URL("http://localhost:" + port(22));
return new URL("http://" + host() + ":" + port());
}

/** URL visible from the host. */
public String getRepoUrl() {
return "ssh://git@localhost:" + port(22) + REPO_DIR;
return "ssh://git@" + host() + ":" + port() + REPO_DIR;
}

/** URL visible from other Docker containers. */
public String getRepoUrlInsideDocker() throws IOException {
return "ssh://git@" + getIpAddress() + REPO_DIR;
}

}
@@ -20,6 +20,7 @@
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import org.jenkinsci.test.acceptance.plugins.credentials.BaseStandardCredentials;

/**
* Indicates that a test requires credentials.
@@ -53,6 +54,9 @@

String[] values();

/** Optional ID to specify. */
String id() default "";

public class RuleImpl implements TestRule {

@Inject
@@ -76,14 +80,14 @@ private boolean enterCredentials(WithCredentials wp) {
switch (wp.credentialType()) {
case USERNAME_PASSWORD:
if (wp.values().length == 2) {
addUsernamePasswordCredentials(wp.values()[0], wp.values()[1]);
addUsernamePasswordCredentials(wp.values()[0], wp.values()[1], wp.id());
} else {
throw new RuntimeException("@WithCredentials: Wrong amount of values. Expected username,password. ");
}
break;
case SSH_USERNAME_PRIVATE_KEY:
if (wp.values().length == 2) {
addSshUsernamePrivateKeyCredentials(wp.values()[0], wp.values()[1]);
addSshUsernamePrivateKeyCredentials(wp.values()[0], wp.values()[1], wp.id());
} else {
throw new RuntimeException("@WithCredentials: Wrong amount of values. Expected username,sshKeyPath.");
}
@@ -100,12 +104,13 @@ private boolean enterCredentials(WithCredentials wp) {
* @param username ssh username
* @param sshKeyPath path to the ssh key
*/
private void addSshUsernamePrivateKeyCredentials(String username, String sshKeyPath) {
private void addSshUsernamePrivateKeyCredentials(String username, String sshKeyPath, String id) {
ManagedCredentials c = new ManagedCredentials(jenkins);
c.open();
SshPrivateKeyCredential sc = c.add(SshPrivateKeyCredential.class);
sc.username.set(username);
sc.selectEnterDirectly().privateKey.set(resource(sshKeyPath).asText());
maybeSetId(sc, id);
c.save();
}

@@ -114,15 +119,21 @@ private void addSshUsernamePrivateKeyCredentials(String username, String sshKeyP
* @param username username
* @param password password
*/
private void addUsernamePasswordCredentials(String username, String password) {
private void addUsernamePasswordCredentials(String username, String password, String id) {
final ManagedCredentials c = new ManagedCredentials(jenkins);
c.open();
final UserPwdCredential upc = c.add(UserPwdCredential.class);
upc.username.set(username);
upc.password.set(password);
maybeSetId(upc, id);
c.save();
}

private void maybeSetId(BaseStandardCredentials creds, String id) {
if (!id.isEmpty()) {
creds.setId(id);
}
}

/**
* Obtains a resource in a wrapper.
@@ -0,0 +1,48 @@
/*
* The MIT License
*
* Copyright 2016 CloudBees, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package org.jenkinsci.test.acceptance.plugins.credentials;

import org.jenkinsci.test.acceptance.po.Control;
import org.jenkinsci.test.acceptance.po.PageArea;
import org.jenkinsci.test.acceptance.po.PageObject;

public abstract class BaseStandardCredentials extends Credential {

public final Control description = control("description");

protected BaseStandardCredentials(PageObject context, String path) {
super(context, path);
}

protected BaseStandardCredentials(PageArea area, String relativePath) {
super(area, relativePath);
}

public void setId(String id) {
control("advanced-button").click();
control("id").set(id);
}

}
@@ -20,4 +20,12 @@ protected Credential(PageObject context, String path) {
protected Credential(PageArea area, String relativePath) {
super(area, relativePath);
}

/**
* Adds this credential and close the dialog.
*/
public void add() {
find(by.id("credentials-add-submit-button")).click();
}

}
@@ -1,6 +1,5 @@
package org.jenkinsci.test.acceptance.plugins.credentials;

import org.jenkinsci.test.acceptance.plugins.credentials.Credential;
import org.jenkinsci.test.acceptance.po.Control;
import org.jenkinsci.test.acceptance.po.Describable;
import org.jenkinsci.test.acceptance.po.PageArea;
@@ -10,9 +9,8 @@
* @author Kohsuke Kawaguchi
*/
@Describable("Username with password")
public class UserPwdCredential extends Credential {
public class UserPwdCredential extends BaseStandardCredentials {
public final Control username = control("username");
public final Control description = control("description");
public final Control password = control("password");

public UserPwdCredential(PageObject context, String path) {
@@ -23,10 +21,4 @@ public UserPwdCredential(PageArea area, String relativePath) {
super(area, relativePath);
}

/**
* Adds this credential and close the dialog.
*/
public void add() {
find(by.id("credentials-add-submit-button")).click();
}
}
@@ -1,6 +1,6 @@
package org.jenkinsci.test.acceptance.plugins.ssh_credentials;

import org.jenkinsci.test.acceptance.plugins.credentials.Credential;
import org.jenkinsci.test.acceptance.plugins.credentials.BaseStandardCredentials;
import org.jenkinsci.test.acceptance.po.Control;
import org.jenkinsci.test.acceptance.po.Describable;
import org.jenkinsci.test.acceptance.po.PageAreaImpl;
@@ -11,9 +11,8 @@
* @author Kohsuke Kawaguchi
*/
@Describable("SSH Username with private key")
public class SshPrivateKeyCredential extends Credential {
public class SshPrivateKeyCredential extends BaseStandardCredentials {
public final Control username = control("username");
public final Control description = control("description");

public SshPrivateKeyCredential(PageObject context, String path) {
super(context, path);
@@ -41,10 +40,4 @@ public Direct(PageObject parent, String path) {
}
}

/**
* Adds this credential and close the dialog.
*/
public void add() {
find(by.id("credentials-add-submit-button")).click();
}
}
@@ -51,7 +51,6 @@
public class GitPluginTest extends AbstractJUnitTest {

private static final String USERNAME = "gitplugin";
private static final String HOST = "localhost";

@Inject
DockerContainerHolder<GitContainer> gitServer;
@@ -60,13 +59,15 @@

private GitContainer container;
private String repoUrl;
private String host;
private int port;

@Before
public void init() {
container = gitServer.get();
repoUrl = container.getRepoUrl();
port = container.port(22);
host = container.host();
port = container.port();
job = jenkins.jobs.create();
job.configure();
}
@@ -75,7 +76,7 @@ public void init() {
@Category(SmokeTest.class)
public void simple_checkout() throws InterruptedException, JSchException, SftpException, IOException {
buildGitRepo()
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)
@@ -90,7 +91,7 @@ public void simple_checkout() throws InterruptedException, JSchException, SftpEx
public void checkout_branch() throws InterruptedException, JSchException, SftpException, IOException {
GitRepo repo = buildGitRepo();
repo.git("branch", "svn");
repo.transferToDockerContainer(HOST, port);
repo.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)
@@ -105,7 +106,7 @@ public void checkout_branch() throws InterruptedException, JSchException, SftpEx
@Test
public void name_remote_repo() throws IOException, InterruptedException, SftpException, JSchException {
buildGitRepo()
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)
@@ -121,7 +122,7 @@ public void name_remote_repo() throws IOException, InterruptedException, SftpExc
@Test
public void checkout_local_branch() throws IOException, InterruptedException, SftpException, JSchException {
buildGitRepo()
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)
@@ -136,7 +137,7 @@ public void checkout_local_branch() throws IOException, InterruptedException, Sf
@Test
public void checkout_to_local_dir() throws IOException, InterruptedException, SftpException, JSchException {
buildGitRepo()
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)
@@ -151,7 +152,7 @@ public void checkout_to_local_dir() throws IOException, InterruptedException, Sf
@Test
public void poll_for_changes() throws IOException, InterruptedException, SftpException, JSchException {
buildGitRepo()
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class) //
.url(container.getRepoUrl())
@@ -169,7 +170,7 @@ public void poll_for_changes() throws IOException, InterruptedException, SftpExc
@Test
public void check_revision() throws IOException, InterruptedException, SftpException, JSchException {
buildGitRepo()
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)
@@ -189,7 +190,7 @@ public void update_submodules_recursively() throws IOException, InterruptedExcep
String name = "submodule";
buildGitRepo()
.addSubmodule(name)
.transferToDockerContainer(HOST, port);
.transferToDockerContainer(host, port);

job.useScm(GitScm.class)
.url(repoUrl)

0 comments on commit 6681f40

Please sign in to comment.
You can’t perform that action at this time.