diff --git a/.idea/artifacts/agent.xml b/.idea/artifacts/agent.xml
index 0ddc00d..6b90e30 100644
--- a/.idea/artifacts/agent.xml
+++ b/.idea/artifacts/agent.xml
@@ -2,11 +2,15 @@
$PROJECT_DIR$/out/artifacts/agent
-
+
+
+
+
+
@@ -16,10 +20,6 @@
-
-
-
-
diff --git a/.idea/libraries/com_google_dexmaker_dexmaker_mockito_1_0.xml b/.idea/libraries/com_google_dexmaker_dexmaker_mockito_1_0.xml
deleted file mode 100644
index 6d32450..0000000
--- a/.idea/libraries/com_google_dexmaker_dexmaker_mockito_1_0.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/mockito.xml b/.idea/libraries/mockito.xml
new file mode 100644
index 0000000..16e8ccc
--- /dev/null
+++ b/.idea/libraries/mockito.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agent/agent.iml b/agent/agent.iml
index 13c3f71..84a58bc 100644
--- a/agent/agent.iml
+++ b/agent/agent.iml
@@ -41,7 +41,6 @@
-
@@ -51,6 +50,7 @@
+
diff --git a/agent/src/META-INF/MANIFEST.MF b/agent/src/META-INF/MANIFEST.MF
index 4c98dda..612cdd3 100644
--- a/agent/src/META-INF/MANIFEST.MF
+++ b/agent/src/META-INF/MANIFEST.MF
@@ -1,3 +1,3 @@
Manifest-Version: 1.0
-Class-Path: lib/common.jar lib/jtds-1.2.7.jar
+Class-Path: common.jar jtds-1.2.7.jar
diff --git a/agent/src/org/tsqlt/runner/agent/ConnectionBuilder.java b/agent/src/org/tsqlt/runner/agent/ConnectionBuilder.java
index 1b39e8c..2989e69 100644
--- a/agent/src/org/tsqlt/runner/agent/ConnectionBuilder.java
+++ b/agent/src/org/tsqlt/runner/agent/ConnectionBuilder.java
@@ -1,8 +1,11 @@
package org.tsqlt.runner.agent;
+import jetbrains.buildServer.agent.BuildAgentConfiguration;
+import org.jetbrains.annotations.NotNull;
+
import java.sql.Connection;
import java.sql.SQLException;
public interface ConnectionBuilder {
- Connection getConnection() throws SQLException, ClassNotFoundException;
+ Connection getConnection(@NotNull BuildAgentConfiguration configuration) throws SQLException, ClassNotFoundException;
}
diff --git a/agent/src/org/tsqlt/runner/agent/DomainUser.java b/agent/src/org/tsqlt/runner/agent/DomainUser.java
index de5b5f7..4105dc7 100644
--- a/agent/src/org/tsqlt/runner/agent/DomainUser.java
+++ b/agent/src/org/tsqlt/runner/agent/DomainUser.java
@@ -52,9 +52,12 @@ public String toString() {
}
public static DomainUser create(Map properties){
- DomainUser domainUser = new DomainUser(properties.get(PropertyNames.USER_DOMAIN));
+ String domainAndUser = properties.containsKey(PropertyNames.USER_DOMAIN)
+ ? properties.get(PropertyNames.USER_DOMAIN) : "";
+
+ DomainUser domainUser = new DomainUser(domainAndUser);
boolean useWinAuth = properties.containsKey(PropertyNames.WINDOWS_AUTH)
- ? Boolean.getBoolean(PropertyNames.WINDOWS_AUTH) : false;
+ ? Boolean.parseBoolean(properties.get(PropertyNames.WINDOWS_AUTH)) : false;
if (useWinAuth)
domainUser.setUseNtlm(useWinAuth);
diff --git a/agent/src/org/tsqlt/runner/agent/JtdsConnectionStringBuilder.java b/agent/src/org/tsqlt/runner/agent/JtdsConnectionStringBuilder.java
index ef1aa10..950338f 100644
--- a/agent/src/org/tsqlt/runner/agent/JtdsConnectionStringBuilder.java
+++ b/agent/src/org/tsqlt/runner/agent/JtdsConnectionStringBuilder.java
@@ -3,7 +3,6 @@
import org.jetbrains.annotations.NotNull;
import java.util.Map;
-import java.util.Set;
public class JtdsConnectionStringBuilder {
private final String server;
@@ -12,48 +11,45 @@ public class JtdsConnectionStringBuilder {
private final String domain;
private final int port;
private final Map options;
+ private final boolean useWindowsAuth;
- public JtdsConnectionStringBuilder(@NotNull ServerInstance serverInstance, @NotNull String database, String domain, Map options){
+ public JtdsConnectionStringBuilder(@NotNull ServerInstance serverInstance, @NotNull String database, String domain, Map options, boolean useWindowsAuth) {
server = serverInstance.getServer();
port = serverInstance.getPort();
instance = serverInstance.getInstance();
+
this.database = database;
this.domain = domain;
this.options = options;
+ this.useWindowsAuth = useWindowsAuth;
}
public JtdsConnectionStringBuilder(@NotNull ServerInstance serverInstance, @NotNull String database) {
- this(serverInstance, database, null, null);
+ this(serverInstance, database, null, null, false);
}
- public JtdsConnectionStringBuilder(@NotNull ServerInstance serverInstance, @NotNull String database, String domain){
- this(serverInstance, database, domain, null);
+ public JtdsConnectionStringBuilder(@NotNull ServerInstance serverInstance, @NotNull String database, String domain) {
+ this(serverInstance, database, domain, null, false);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("jdbc:jtds:sqlserver://");
- sb.append(String.format("%s:%s", server, port));
- sb.append(String.format("/%s", database));
+ sb.append(server).append(":").append(port);
+ sb.append("/").append(database);
- if (instance != null)
- sb.append(String.format(";instance=%s", instance));
+ if (instance != null && !instance.isEmpty())
+ sb.append(";instance=").append(instance);
if (domain != null && !domain.isEmpty())
- sb.append(String.format(";domain=%s", domain));
+ sb.append(";domain=").append(domain);
if (options != null && !options.isEmpty())
- sb.append(processOptions(options));
-
- return sb.toString();
- }
+ for (String option : OptionHelper.filter(options.keySet()))
+ sb.append(";").append(option).append("=").append(options.get(option));
- private String processOptions(@NotNull Map options){
- StringBuilder sb = new StringBuilder();
- Set keys = options.keySet();
- for (String key : keys){
- sb.append(String.format(";%s=%s", key, options.get(key)));
- }
+ if (useWindowsAuth)
+ sb.append(";useNTLMv2=true");
return sb.toString();
}
diff --git a/agent/src/org/tsqlt/runner/agent/OptionHelper.java b/agent/src/org/tsqlt/runner/agent/OptionHelper.java
new file mode 100644
index 0000000..34acb75
--- /dev/null
+++ b/agent/src/org/tsqlt/runner/agent/OptionHelper.java
@@ -0,0 +1,28 @@
+package org.tsqlt.runner.agent;
+
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+public final class OptionHelper {
+ private static final List invalidOptions = new Vector() {{
+ add("domain");
+ add("useNTMLv2");
+ add("instance");
+ add("user");
+ add("password");
+ }};
+
+ public static List filter(Set options) {
+ List validOptions = new Vector();
+ for (String option : options){
+ if (isValid(option))
+ validOptions.add(option);
+ }
+ return validOptions;
+ }
+
+ public static boolean isValid(String option) {
+ return invalidOptions.contains(option) == false;
+ }
+}
diff --git a/agent/src/org/tsqlt/runner/agent/ServerInstance.java b/agent/src/org/tsqlt/runner/agent/ServerInstance.java
index 098bd78..dbe8f7e 100644
--- a/agent/src/org/tsqlt/runner/agent/ServerInstance.java
+++ b/agent/src/org/tsqlt/runner/agent/ServerInstance.java
@@ -1,68 +1,14 @@
package org.tsqlt.runner.agent;
import org.jetbrains.annotations.NotNull;
-import org.tsqlt.runner.common.PropertyNames;
-
-import java.util.Map;
-
-public class ServerInstance {
- private String server;
- private int port;
- private final String instance;
-
- public ServerInstance(@NotNull String input) {
- if (input.contains("\\")) {
- String[] parsed = input.split("\\\\", 2);
- setServer(parsed[0]);
- instance = parsed[1];
- } else {
- setServer(input);
- instance = null;
- }
- }
+public interface ServerInstance {
@NotNull
- public String getServer(){
- return server;
- }
+ String getServer();
- private void setServer(@NotNull String server) {
- if (server.contains(":")) {
- String[] parsed = server.split(":", 2);
- this.server = transformLocalAddress(parsed[0]);
- this.port = Integer.parseInt(parsed[1]);
- } else {
- this.server = transformLocalAddress(server);
- port = 1433;
- }
- }
-
- @NotNull
- public static String transformLocalAddress(@NotNull String input) {
- if (input.toLowerCase().equals("(local)") || input.trim().equals("."))
- return "127.0.0.1";
- return input;
- }
+ String getInstance();
- public String getInstance(){
- return instance;
- }
-
- public boolean hasInstance(){
- return instance != null && !instance.isEmpty();
- }
-
- @Override
- public String toString() {
- return hasInstance() ? String.format("%s\\%s", server, instance) : server;
- }
-
- @NotNull
- public static ServerInstance create(@NotNull Map options){
- return new ServerInstance(options.get(PropertyNames.SERVER_INSTANCE));
- }
+ boolean hasInstance();
- public int getPort() {
- return port;
- }
+ int getPort();
}
diff --git a/agent/src/org/tsqlt/runner/agent/ServerInstanceImpl.java b/agent/src/org/tsqlt/runner/agent/ServerInstanceImpl.java
new file mode 100644
index 0000000..e1f2283
--- /dev/null
+++ b/agent/src/org/tsqlt/runner/agent/ServerInstanceImpl.java
@@ -0,0 +1,72 @@
+package org.tsqlt.runner.agent;
+
+import org.jetbrains.annotations.NotNull;
+import org.tsqlt.runner.common.PropertyNames;
+
+import java.util.Map;
+
+public class ServerInstanceImpl implements ServerInstance {
+ private String server;
+ private int port;
+ private final String instance;
+
+ public ServerInstanceImpl(@NotNull String input) {
+ if (input.contains("\\")) {
+ String[] parsed = input.split("\\\\", 2);
+ setServer(parsed[0]);
+ instance = parsed[1];
+ } else {
+ setServer(input);
+ instance = null;
+ }
+ }
+
+ @Override
+ @NotNull
+ public String getServer(){
+ return server;
+ }
+
+ private void setServer(@NotNull String server) {
+ if (server.contains(":")) {
+ String[] parsed = server.split(":", 2);
+ this.server = transformLocalAddress(parsed[0]);
+ this.port = Integer.parseInt(parsed[1]);
+ } else {
+ this.server = transformLocalAddress(server);
+ port = 1433;
+ }
+ }
+
+ @NotNull
+ public static String transformLocalAddress(@NotNull String input) {
+ if (input.toLowerCase().equals("(local)") || input.trim().equals("."))
+ return "127.0.0.1";
+ return input;
+ }
+
+ @Override
+ public String getInstance(){
+ return instance;
+ }
+
+ @Override
+ public boolean hasInstance(){
+ return instance != null && !instance.isEmpty();
+ }
+
+ @Override
+ public String toString() {
+ return hasInstance() ? String.format("%s\\%s", server, instance) : server;
+ }
+
+ @NotNull
+ public static ServerInstance create(@NotNull Map options){
+ return new ServerInstanceImpl(options.get(PropertyNames.SERVER_INSTANCE));
+ }
+
+ @Override
+ public int getPort() {
+ return port;
+ }
+}
diff --git a/agent/src/org/tsqlt/runner/agent/SqlServerConnectionBuilder.java b/agent/src/org/tsqlt/runner/agent/SqlServerConnectionBuilder.java
index cba00bb..45d3e4b 100644
--- a/agent/src/org/tsqlt/runner/agent/SqlServerConnectionBuilder.java
+++ b/agent/src/org/tsqlt/runner/agent/SqlServerConnectionBuilder.java
@@ -1,37 +1,78 @@
package org.tsqlt.runner.agent;
+import jetbrains.buildServer.agent.BuildAgentConfiguration;
import jetbrains.buildServer.log.Loggers;
+import jetbrains.buildServer.util.Bitness;
+import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.tsqlt.runner.common.PropertyNames;
+import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
+import java.util.Arrays;
import java.util.Map;
+import java.util.Vector;
public class SqlServerConnectionBuilder implements ConnectionBuilder {
+ private final static Logger log = Logger.getLogger(ConnectionBuilder.class);
private final JtdsConnectionStringBuilder builder;
private final String user;
private final String password;
+ private final boolean useWindowsAuth;
public SqlServerConnectionBuilder(@NotNull Map properties){
- ServerInstance server = ServerInstance.create(properties);
+ ServerInstance server = ServerInstanceImpl.create(properties);
DomainUser domainUser = DomainUser.create(properties);
String database = properties.get(PropertyNames.DATABASE);
OptionParser options = new OptionParser(properties.get(PropertyNames.OPTIONS));
+
+ useWindowsAuth = domainUser.getUseNtlm();
password = properties.get(PropertyNames.USER_PASSWORD);
user = domainUser.getUser();
- builder = new JtdsConnectionStringBuilder(server, database, domainUser.getDomain(), options.getOptions());
+ builder = new JtdsConnectionStringBuilder(server, database, domainUser.getDomain(), options.getOptions(), useWindowsAuth);
}
@NotNull
@Override
- public Connection getConnection() throws SQLException, ClassNotFoundException {
+ public Connection getConnection(@NotNull BuildAgentConfiguration configuration) throws SQLException, ClassNotFoundException {
Loggers.AGENT.debug(String.format("[tSQLt Agent] connection string is %s", builder.toString()));
Class.forName("net.sourceforge.jtds.jdbc.Driver");
- return DriverManager.getConnection(builder.toString(), user, password);
+ if (useWindowsAuth)
+ addNativeToJavaPath(getSSOLibraryPath(configuration));
+
+ return useWindowsAuth
+ ? DriverManager.getConnection(builder.toString())
+ : DriverManager.getConnection(builder.toString(), user, password);
+ }
+
+ private void addNativeToJavaPath(String path){
+ String libraryPath = System.getProperty("java.library.path");
+ Vector paths = new Vector(Arrays.asList(libraryPath.split(";")));
+ if (paths.contains(path))
+ return;
+
+ System.setProperty("java.library.path", libraryPath + ";" + path);
+ try {
+ Field fieldSysPaths = ClassLoader.class.getDeclaredField("sys_paths");
+ fieldSysPaths.setAccessible(true);
+ fieldSysPaths.set(null, null);
+ } catch (NoSuchFieldException e) {
+ Loggers.AGENT.error(e);
+ } catch (IllegalAccessException e) {
+ Loggers.AGENT.error(e);
+ }
+ }
+
+ @NotNull
+ private String getSSOLibraryPath(@NotNull BuildAgentConfiguration configuration){
+ String lib = configuration.getAgentPluginsDirectory().getAbsolutePath();
+
+ String architecture = configuration.getSystemInfo().bitness() == Bitness.BIT32 ? "x86" : "x64";
+ return String.format("%s\\tsqlt-agent\\lib\\native\\%s\\", lib, architecture);
}
}
diff --git a/agent/src/org/tsqlt/runner/agent/TSQLTAgentBuildRunner.java b/agent/src/org/tsqlt/runner/agent/TSQLTAgentBuildRunner.java
index 1a4fc92..3d1b2fa 100644
--- a/agent/src/org/tsqlt/runner/agent/TSQLTAgentBuildRunner.java
+++ b/agent/src/org/tsqlt/runner/agent/TSQLTAgentBuildRunner.java
@@ -13,8 +13,13 @@ public class TSQLTAgentBuildRunner implements AgentBuildRunner {
public BuildProcess createBuildProcess(@NotNull AgentRunningBuild agentRunningBuild,
@NotNull BuildRunnerContext buildRunnerContext) throws RunBuildException {
Loggers.AGENT.debug("Requesting process");
+
ConnectionBuilder connectionBuilder = new SqlServerConnectionBuilder(buildRunnerContext.getRunnerParameters());
- return new TSQLTBuildProcess(Executors.newSingleThreadExecutor(), agentRunningBuild.getBuildLogger(), connectionBuilder);
+ return new TSQLTBuildProcess(
+ Executors.newSingleThreadExecutor(),
+ agentRunningBuild.getBuildLogger(),
+ buildRunnerContext.getBuild().getAgentConfiguration(),
+ connectionBuilder);
}
@NotNull
diff --git a/agent/src/org/tsqlt/runner/agent/TSQLTBuildProcess.java b/agent/src/org/tsqlt/runner/agent/TSQLTBuildProcess.java
index 4b505e8..579dc1d 100644
--- a/agent/src/org/tsqlt/runner/agent/TSQLTBuildProcess.java
+++ b/agent/src/org/tsqlt/runner/agent/TSQLTBuildProcess.java
@@ -1,5 +1,6 @@
package org.tsqlt.runner.agent;
+import jetbrains.buildServer.agent.BuildAgentConfiguration;
import jetbrains.buildServer.agent.BuildFinishedStatus;
import jetbrains.buildServer.agent.BuildProgressLogger;
import org.jetbrains.annotations.NotNull;
@@ -15,12 +16,17 @@
public class TSQLTBuildProcess extends FutureBasedBuildAdapter {
private final BuildProgressLogger logger;
private final ConnectionBuilder connectionBuilder;
+ private final BuildAgentConfiguration configuration;
- protected TSQLTBuildProcess(@NotNull ExecutorService executor, @NotNull BuildProgressLogger logger, @NotNull ConnectionBuilder connectionBuilder) {
+ protected TSQLTBuildProcess(@NotNull ExecutorService executor,
+ @NotNull BuildProgressLogger logger,
+ @NotNull BuildAgentConfiguration configuration,
+ @NotNull ConnectionBuilder connectionBuilder) {
super(executor);
this.logger = logger;
this.connectionBuilder = connectionBuilder;
+ this.configuration = configuration;
}
@Override
@@ -37,7 +43,7 @@ public BuildFinishedStatus call() throws Exception {
}
private void execute() throws SQLException, ClassNotFoundException {
- Connection connection = connectionBuilder.getConnection();
+ Connection connection = connectionBuilder.getConnection(configuration);
runAllTests(connection);
diff --git a/agent/tests/org/tsqlt/runner/agent/DomainUserTests.java b/agent/tests/org/tsqlt/runner/agent/DomainUserTests.java
index 86a9ef0..66e8315 100644
--- a/agent/tests/org/tsqlt/runner/agent/DomainUserTests.java
+++ b/agent/tests/org/tsqlt/runner/agent/DomainUserTests.java
@@ -68,4 +68,14 @@ public void testItCanBeCreatedFromProperties(){
assertNotNull(sut);
}
+
+ @Test
+ public void testItCanBeCreatedFromPropertiesWithUseWindowsAuth() {
+ Map properties = new HashMap() {{
+ put(PropertyNames.WINDOWS_AUTH, "true");
+ }};
+ DomainUser sut = DomainUser.create(properties);
+
+ assertTrue(sut.getUseNtlm());
+ }
}
\ No newline at end of file
diff --git a/agent/tests/org/tsqlt/runner/agent/JtdsConnectionStringBuilderTests.java b/agent/tests/org/tsqlt/runner/agent/JtdsConnectionStringBuilderTests.java
index bc5dacd..2f2ed66 100644
--- a/agent/tests/org/tsqlt/runner/agent/JtdsConnectionStringBuilderTests.java
+++ b/agent/tests/org/tsqlt/runner/agent/JtdsConnectionStringBuilderTests.java
@@ -1,70 +1,105 @@
package org.tsqlt.runner.agent;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
-
public class JtdsConnectionStringBuilderTests {
+
+ private ServerInstance server;
+ private JtdsConnectionStringBuilder sut;
+
@Test
- public void testItCanBuildConnectionStringUsingServer(){
- ServerInstance server = new ServerInstance("server");
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(server, "database");
+ public void testItCanBuildConnectionStringWithDefaults() {
+ server = mock(ServerInstance.class, new ServerAnswer());
+ sut = new JtdsConnectionStringBuilder(server, "database");
- assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server/database");
+ assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server:1433/database");
}
@Test
- public void testItPassInstanceAsServerOption(){
- ServerInstance server = new ServerInstance("server\\instancename");
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(server, "database");
+ public void testItCorrectlyUsesNonDefaultPort() {
+ server = mock(ServerInstance.class, new ServerAnswer());
+ when(server.getPort()).thenReturn(1234);
- assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server/database;instance=instancename");
+ sut = new JtdsConnectionStringBuilder(server, "database");
+
+ assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server:1234/database");
}
@Test
- public void testItCanHandleDomainAsOption(){
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(new ServerInstance("server"), "database", "domainname");
+ public void testItPassInstanceAsServerOption() {
+ server = mock(ServerInstance.class, new ServerAnswer());
+ when(server.hasInstance()).thenReturn(true);
+ when(server.getInstance()).thenReturn("instancename");
+
+ sut = new JtdsConnectionStringBuilder(server, "database");
- assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server/database;domain=domainname");
+ assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server:1433/database;instance=instancename");
}
@Test
- public void testItCanHandleAdditionalOptions(){
- Map options = new HashMap() {{
- put("option1", "value1");
- put("option2", "value2");
- }};
+ public void testItCanHandleDomainAsOption() {
+ server = mock(ServerInstance.class, new ServerAnswer());
+ sut = new JtdsConnectionStringBuilder(server, "database", "domainname");
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(new ServerInstance("server"), "database", null, options);
-
- assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server/database;option1=value1;option2=value2");
+ assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server:1433/database;domain=domainname");
}
@Test
- public void testItCanBuildFullConnectionString(){
+ public void testItCanHandleAdditionalOptions() {
Map options = new HashMap() {{
put("option1", "value1");
put("option2", "value2");
}};
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(new ServerInstance("server\\instance"), "database", "domain", options);
+ server = mock(ServerInstance.class, new ServerAnswer());
+ sut = new JtdsConnectionStringBuilder(server, "database", null, options, false);
- assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server/database;instance=instance;domain=domain;option1=value1;option2=value2");
+ assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server:1433/database;option1=value1;option2=value2");
}
@Test(expectedExceptions = IllegalArgumentException.class)
@SuppressWarnings({"UnusedDeclaration", "ConstantConditions"})
- public void testItShouldThrowBecauseServerCannotBeNull(){
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(null, "database");
+ public void testItShouldThrowBecauseServerCannotBeNull() {
+ sut = new JtdsConnectionStringBuilder(null, "database");
}
@Test(expectedExceptions = IllegalArgumentException.class)
@SuppressWarnings({"UnusedDeclaration", "ConstantConditions"})
- public void testItShouldThrowBecauseDatabaseCannotBeNull(){
- JtdsConnectionStringBuilder sut = new JtdsConnectionStringBuilder(new ServerInstance("server"), null);
+ public void testItShouldThrowBecauseDatabaseCannotBeNull() {
+ server = mock(ServerInstance.class);
+ sut = new JtdsConnectionStringBuilder(server, null);
+ }
+
+ @Test
+ public void testItCanBuildConnectionStringWhenUsingWindowsAuth(){
+ server = mock(ServerInstance.class, new ServerAnswer());
+ sut = new JtdsConnectionStringBuilder(server, "database", null, null, true);
+
+ assertEquals(sut.toString(), "jdbc:jtds:sqlserver://server:1433/database;useNTLMv2=true");
+ }
+
+ class ServerAnswer implements Answer {
+
+ @Override
+ public Object answer(InvocationOnMock invocation) throws Throwable {
+ String method = invocation.getMethod().getName();
+ if (method == "getPort")
+ return 1433;
+ if (method == "getServer")
+ return "server";
+ if (method == "hasInstance")
+ return false;
+
+ return null;
+ }
}
}
diff --git a/agent/tests/org/tsqlt/runner/agent/OptionHelperTest.java b/agent/tests/org/tsqlt/runner/agent/OptionHelperTest.java
new file mode 100644
index 0000000..ebc7ddc
--- /dev/null
+++ b/agent/tests/org/tsqlt/runner/agent/OptionHelperTest.java
@@ -0,0 +1,26 @@
+package org.tsqlt.runner.agent;
+
+import org.testng.annotations.Test;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.testng.AssertJUnit.assertFalse;
+
+public class OptionHelperTest {
+
+ @Test
+ public void testItCanReturnListWithOnlyValidOptions() {
+ Set options = new HashSet() {{
+ add("option1");
+ add("option2");
+ add("domain"); // Invalid option
+ }};
+
+ List result = OptionHelper.filter(options);
+
+ assertFalse(result.contains("domain"));
+ }
+}
+
diff --git a/agent/tests/org/tsqlt/runner/agent/ServerInstanceTests.java b/agent/tests/org/tsqlt/runner/agent/ServerInstanceTests.java
index 921a836..3b5668d 100644
--- a/agent/tests/org/tsqlt/runner/agent/ServerInstanceTests.java
+++ b/agent/tests/org/tsqlt/runner/agent/ServerInstanceTests.java
@@ -12,7 +12,7 @@ public class ServerInstanceTests {
@Test
public void testItCanParseServerAndInstance(){
final String input = "server\\instance";
- ServerInstance sut = new ServerInstance(input);
+ ServerInstance sut = new ServerInstanceImpl(input);
assertEquals(sut.getServer(), "server");
assertEquals(sut.getInstance(), "instance");
@@ -20,7 +20,7 @@ public void testItCanParseServerAndInstance(){
@Test
public void testItCanParseWhenOnlyServerIsDefined(){
- ServerInstance sut = new ServerInstance("server");
+ ServerInstance sut = new ServerInstanceImpl("server");
assertEquals(sut.getServer(), "server");
assertNull(sut.getInstance());
@@ -29,7 +29,7 @@ public void testItCanParseWhenOnlyServerIsDefined(){
@Test
public void testItWillReturnHasInstanceWhenInstanceIsPresent(){
final String input = "server\\instance";
- ServerInstance sut = new ServerInstance(input);
+ ServerInstance sut = new ServerInstanceImpl(input);
assertEquals(sut.getInstance(), "instance");
assertTrue(sut.hasInstance());
@@ -38,12 +38,12 @@ public void testItWillReturnHasInstanceWhenInstanceIsPresent(){
@Test(expectedExceptions = IllegalArgumentException.class)
@SuppressWarnings({"UnusedDeclaration", "ConstantConditions"})
public void testItShouldThrowIfInputIsNull(){
- ServerInstance sut = new ServerInstance(null);
+ ServerInstance sut = new ServerInstanceImpl(null);
}
@Test
public void testItShouldReturnNoInstanceIfOnlyServer(){
- ServerInstance sut = new ServerInstance("server");
+ ServerInstance sut = new ServerInstanceImpl("server");
assertNull(sut.getInstance());
assertFalse(sut.hasInstance());
@@ -51,14 +51,14 @@ public void testItShouldReturnNoInstanceIfOnlyServer(){
@Test
public void testItCanReturnToStringWithOnlyServer(){
- ServerInstance sut = new ServerInstance("server");
+ ServerInstance sut = new ServerInstanceImpl("server");
assertEquals(sut.toString(), "server");
}
@Test
public void testItCanReturnToStringWithServerAndInstance(){
- ServerInstance sut = new ServerInstance("server\\instance");
+ ServerInstance sut = new ServerInstanceImpl("server\\instance");
assertEquals(sut.toString(), "server\\instance");
}
@@ -69,14 +69,14 @@ public void testItCanBeCreatedFromProperties(){
put(PropertyNames.SERVER_INSTANCE, "user");
}};
- ServerInstance sut = ServerInstance.create(properties);
+ ServerInstance sut = ServerInstanceImpl.create(properties);
assertNotNull(sut);
}
@Test
public void testItWillReturnDefaultPortIfNotSpecified(){
final String input = "server";
- ServerInstance sut = new ServerInstance(input);
+ ServerInstance sut = new ServerInstanceImpl(input);
assertEquals(sut.getPort(), 1433);
}
@@ -84,7 +84,7 @@ public void testItWillReturnDefaultPortIfNotSpecified(){
@Test
public void testItWillReturnSpecifiedPort(){
final String input = "server:1211\\blah";
- ServerInstance sut = new ServerInstance(input);
+ ServerInstance sut = new ServerInstanceImpl(input);
assertEquals(sut.getPort(), 1211);
assertEquals(sut.getServer(), "server");
@@ -93,7 +93,7 @@ public void testItWillReturnSpecifiedPort(){
@Test
public void testItCanTransformLocalAddress(){
final String input = "(local)";
- ServerInstance sut = new ServerInstance(input);
+ ServerInstance sut = new ServerInstanceImpl(input);
assertEquals(sut.getServer(), "127.0.0.1");
}
@@ -101,7 +101,7 @@ public void testItCanTransformLocalAddress(){
@Test
public void testItCanTransformDotAddress(){
final String input = ".\\SQLEXPRESS";
- ServerInstance sut = new ServerInstance(input);
+ ServerInstance sut = new ServerInstanceImpl(input);
assertEquals(sut.getServer(), "127.0.0.1");
assertEquals(sut.getInstance(), "SQLEXPRESS");
diff --git a/lib/dexmaker-1.0.jar b/lib/dexmaker-1.0.jar
deleted file mode 100644
index eb5ae56..0000000
Binary files a/lib/dexmaker-1.0.jar and /dev/null differ
diff --git a/lib/dexmaker-mockito-1.0.jar b/lib/dexmaker-mockito-1.0.jar
deleted file mode 100644
index 6d74099..0000000
Binary files a/lib/dexmaker-mockito-1.0.jar and /dev/null differ
diff --git a/lib/mockito-core-1.9.5.jar b/lib/mockito-all-1.9.5.jar
similarity index 89%
rename from lib/mockito-core-1.9.5.jar
rename to lib/mockito-all-1.9.5.jar
index df91508..00416eb 100644
Binary files a/lib/mockito-core-1.9.5.jar and b/lib/mockito-all-1.9.5.jar differ
diff --git a/server/resources/editTSQLTParams.jsp b/server/resources/editTSQLTParams.jsp
index 3fb7f3f..bc2332f 100644
--- a/server/resources/editTSQLTParams.jsp
+++ b/server/resources/editTSQLTParams.jsp
@@ -64,6 +64,11 @@
$('tsqlt.user_domain').disabled = this.checked ? 'disabled' : '';
$('tsqlt.password').disabled = this.checked ? 'disabled' : '';
+
+ if (this.checked) {
+ $('tsqlt.user_domain').value = '';
+ $('tsqlt.password').value = '';
+ }
Windows SSO will work only in Windows Agents running in a machine joined the Windows Domain
diff --git a/server/src/org/tsqlt/runner/server/DomainUserValidator.java b/server/src/org/tsqlt/runner/server/DomainUserValidator.java
index 7747f32..b084ede 100644
--- a/server/src/org/tsqlt/runner/server/DomainUserValidator.java
+++ b/server/src/org/tsqlt/runner/server/DomainUserValidator.java
@@ -9,12 +9,12 @@
public class DomainUserValidator implements Validator {
@Override
public InvalidProperty hasErrors(@NotNull Map properties) {
- String user = properties.get(PropertyNames.USER_DOMAIN);
boolean useWinAuth = properties.containsKey(PropertyNames.WINDOWS_AUTH)
- ? Boolean.getBoolean(properties.get(PropertyNames.WINDOWS_AUTH)) : false;
+ ? Boolean.parseBoolean(properties.get(PropertyNames.WINDOWS_AUTH)) : false;
if (useWinAuth) return null;
+ String user = properties.get(PropertyNames.USER_DOMAIN);
if (user == null || user.trim().isEmpty())
return new InvalidProperty(PropertyNames.USER_DOMAIN,
"You need to specify a user or domain\\user");
diff --git a/server/src/org/tsqlt/runner/server/TSQLTPropertiesProcessor.java b/server/src/org/tsqlt/runner/server/TSQLTPropertiesProcessor.java
index 7151c9f..688d519 100644
--- a/server/src/org/tsqlt/runner/server/TSQLTPropertiesProcessor.java
+++ b/server/src/org/tsqlt/runner/server/TSQLTPropertiesProcessor.java
@@ -1,14 +1,17 @@
package org.tsqlt.runner.server;
-import jetbrains.buildServer.log.Loggers;
import jetbrains.buildServer.serverSide.InvalidProperty;
import jetbrains.buildServer.serverSide.PropertiesProcessor;
+import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
-import org.tsqlt.runner.common.PropertyNames;
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
public class TSQLTPropertiesProcessor implements PropertiesProcessor {
+ private static final Logger logger = Logger.getLogger(TSQLTPropertiesProcessor.class);
private final List validators;
public TSQLTPropertiesProcessor(List validators) {
@@ -18,11 +21,11 @@ public TSQLTPropertiesProcessor(List validators) {
@Override
public Collection process(@NotNull Map properties) {
List invalidProperties = new Vector();
- for (Validator validator : validators){
+ for (Validator validator : validators) {
InvalidProperty error = validator.hasErrors(properties);
if (error == null) continue;
- Loggers.SERVER.warn(String.format("[tSQLt Plugin] invalid property %s : %s",
+ logger.warn(String.format("[tSQLt Plugin] invalid property %s : %s",
error.getPropertyName(), error.getInvalidReason()));
invalidProperties.add(error);
diff --git a/server/src/org/tsqlt/runner/server/TSQLTRunType.java b/server/src/org/tsqlt/runner/server/TSQLTRunType.java
index e00ea50..12ef426 100644
--- a/server/src/org/tsqlt/runner/server/TSQLTRunType.java
+++ b/server/src/org/tsqlt/runner/server/TSQLTRunType.java
@@ -12,6 +12,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Vector;
public class TSQLTRunType extends RunType {
private final PropertiesProcessor propertiesProcessor;
@@ -66,7 +67,7 @@ private boolean needWindowsAuth(@NotNull Map properties) {
@NotNull
@Override
public List getRunnerSpecificRequirements(@NotNull Map runParameters) {
- List requirements = super.getRunnerSpecificRequirements(runParameters);
+ List requirements = new Vector();
if (needWindowsAuth(runParameters))
requirements.add(new Requirement("teamcity.agent.jvm.os.name", "Windows", RequirementType.CONTAINS));