/src/main/java/com/atlassian/bamboo/plugin/dotnet/tests/nunit/NUnitCapabilityDefaultsHelper.java
Java | 131 lines | 91 code | 18 blank | 22 comment | 9 complexity | 40122b1d48818908e9162d4f86d03f04 MD5 | raw file
Possible License(s): BSD-3-Clause
- package com.atlassian.bamboo.plugin.dotnet.tests.nunit;
-
- import com.atlassian.bamboo.utils.Which;
- import com.atlassian.bamboo.v2.build.agent.capability.Capability;
- import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
- import com.atlassian.bamboo.v2.build.agent.capability.CapabilityImpl;
- import com.atlassian.bamboo.v2.build.agent.capability.CapabilitySet;
- import com.sun.jna.Platform;
- import com.sun.jna.platform.win32.Shell32Util;
- import com.sun.jna.platform.win32.ShlObj;
- import org.apache.commons.lang3.StringUtils;
- import org.apache.commons.lang3.SystemUtils;
- import org.apache.log4j.Logger;
- import org.jetbrains.annotations.NotNull;
-
- import java.io.File;
- import java.io.FilenameFilter;
-
- /**
- * Automatically detects the capability of Bamboo agents to execute NUnit tests.
- */
- public class NUnitCapabilityDefaultsHelper implements CapabilityDefaultsHelper
- {
- private static final Logger log = Logger.getLogger(NUnitCapabilityDefaultsHelper.class);
- // ------------------------------------------------------------------------------------------------------- Constants
-
- private static final String NUNIT_CONSOLE_ANY_CPU = "nunit-console.exe";
- private static final String NUNIT_CONSOLE_X86 = "nunit-console-x86.exe";
-
- // ------------------------------------------------------------------------------------------------- Type Properties
- // ---------------------------------------------------------------------------------------------------- Dependencies
- // ---------------------------------------------------------------------------------------------------- Constructors
- // ----------------------------------------------------------------------------------------------- Interface Methods
-
- @Override
- @NotNull
- public CapabilitySet addDefaultCapabilities(@NotNull CapabilitySet capabilitySet)
- {
- return SystemUtils.IS_OS_WINDOWS ? getWindowsCapabilityDefaults(capabilitySet)
- : getGenericCapabilityDefaults(capabilitySet);
- }
-
- // ------------------------------------------------------------------------------------------------- Private Methods
-
- @NotNull
- private CapabilitySet getGenericCapabilityDefaults(@NotNull CapabilitySet capabilitySet)
- {
- String path = Which.execute(NUNIT_CONSOLE_ANY_CPU);
- if (!StringUtils.isBlank(path))
- {
- Capability capability = new CapabilityImpl(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + ".NUnit", path);
- capabilitySet.addCapability(capability);
- }
-
- String x86Path = Which.execute(NUNIT_CONSOLE_X86);
- if (!StringUtils.isBlank(x86Path))
- {
- Capability capability = new CapabilityImpl(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + ".NUnit (32bit)", x86Path);
- capabilitySet.addCapability(capability);
- }
-
- return capabilitySet;
- }
-
- @NotNull
- private CapabilitySet getWindowsCapabilityDefaults(@NotNull CapabilitySet capabilitySet)
- {
- // By default, NUnit is not installed on the system %PATH%. To target the path of least resistance, let's
- // enumerate the default NUnit install directories looking for runners.
- File[] nunitInstallLocations = getNUnitInstallDirectories();
- for (File installDirectory : nunitInstallLocations)
- {
- if (!installDirectory.exists() || !installDirectory.isDirectory())
- continue;
-
- // Probe this directory for the console executables. Look for both the "Any CPU" and "x86" versions.
- // Look in both the "bin/" and "/bin/net-2.0/" directories.
- probeDirectory(installDirectory, capabilitySet);
- }
- return capabilitySet;
- }
-
- private File[] getNUnitInstallDirectories()
- {
- String programFilesPath = Platform.is64Bit() ? Shell32Util.getFolderPath(ShlObj.CSIDL_PROGRAM_FILESX86) :
- Shell32Util.getFolderPath(ShlObj.CSIDL_PROGRAM_FILES);
-
- File programFiles = new File(programFilesPath);
- if (!programFiles.exists() || !programFiles.isDirectory())
- {
- log.error(String.format("Unable to process %s, it doesn't exist or is not a valid directory", programFilesPath));
- return null;
- }
-
- return programFiles.listFiles(new FilenameFilter()
- {
- @Override
- public boolean accept(File dir, String name)
- {
- // Example matches: "NUnit 2.4.8", "NUnit 2.5.10", "NUnit 2.6"
- return name.matches("NUnit \\d+\\.\\d+(\\.\\d+)?");
- }
- });
- }
-
- private void probeDirectory(@NotNull File installDirectory, @NotNull CapabilitySet capabilitySet)
- {
- // The actual location of NUnit's binaries in the install directory may vary, depending on the version of NUnit
- // installed. The 2.5.x installers like to put things in an ancillary "net-2.0" folder. The 2.4.x and 2.6.x
- // installers put everything directly in the "bin" directory.
- // Examples: "C:\Program Files\NUnit 2.5.9\bin\net-2.0\nunit-console.exe"
- // "C:\Program Files (x86)\NUnit 2.6\bin\nunit-console-x86.exe"
- addAsCapabilityIfExists(new File(installDirectory, "bin/net-2.0/" + NUNIT_CONSOLE_ANY_CPU), capabilitySet, installDirectory.getName());
- addAsCapabilityIfExists(new File(installDirectory, "bin/net-2.0/" + NUNIT_CONSOLE_X86), capabilitySet, installDirectory.getName() + " (32bit)");
- addAsCapabilityIfExists(new File(installDirectory, "bin/" + NUNIT_CONSOLE_ANY_CPU), capabilitySet, installDirectory.getName());
- addAsCapabilityIfExists(new File(installDirectory, "bin/" + NUNIT_CONSOLE_X86), capabilitySet, installDirectory.getName() + " (32bit)");
- }
-
- private void addAsCapabilityIfExists(File executable, @NotNull CapabilitySet capabilitySet, String capabilityKeySuffix)
- {
- if (executable.exists() && executable.isFile())
- {
- Capability capability = new CapabilityImpl(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + "." + capabilityKeySuffix, executable.getAbsolutePath());
- capabilitySet.addCapability(capability);
- }
- }
-
- // -------------------------------------------------------------------------------------------------- Action Methods
- // -------------------------------------------------------------------------------------------------- Public Methods
- // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
- }