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));