PageRenderTime 37ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugin/dotnet/tests/nunit/NUnitCapabilityDefaultsHelper.java

https://bitbucket.org/atlassian/bamboo-dotnet-plugin/
Java | 131 lines | 91 code | 18 blank | 22 comment | 9 complexity | 40122b1d48818908e9162d4f86d03f04 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.tests.nunit;
  2. import com.atlassian.bamboo.utils.Which;
  3. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  4. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  5. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityImpl;
  6. import com.atlassian.bamboo.v2.build.agent.capability.CapabilitySet;
  7. import com.sun.jna.Platform;
  8. import com.sun.jna.platform.win32.Shell32Util;
  9. import com.sun.jna.platform.win32.ShlObj;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.apache.commons.lang3.SystemUtils;
  12. import org.apache.log4j.Logger;
  13. import org.jetbrains.annotations.NotNull;
  14. import java.io.File;
  15. import java.io.FilenameFilter;
  16. /**
  17. * Automatically detects the capability of Bamboo agents to execute NUnit tests.
  18. */
  19. public class NUnitCapabilityDefaultsHelper implements CapabilityDefaultsHelper
  20. {
  21. private static final Logger log = Logger.getLogger(NUnitCapabilityDefaultsHelper.class);
  22. // ------------------------------------------------------------------------------------------------------- Constants
  23. private static final String NUNIT_CONSOLE_ANY_CPU = "nunit-console.exe";
  24. private static final String NUNIT_CONSOLE_X86 = "nunit-console-x86.exe";
  25. // ------------------------------------------------------------------------------------------------- Type Properties
  26. // ---------------------------------------------------------------------------------------------------- Dependencies
  27. // ---------------------------------------------------------------------------------------------------- Constructors
  28. // ----------------------------------------------------------------------------------------------- Interface Methods
  29. @Override
  30. @NotNull
  31. public CapabilitySet addDefaultCapabilities(@NotNull CapabilitySet capabilitySet)
  32. {
  33. return SystemUtils.IS_OS_WINDOWS ? getWindowsCapabilityDefaults(capabilitySet)
  34. : getGenericCapabilityDefaults(capabilitySet);
  35. }
  36. // ------------------------------------------------------------------------------------------------- Private Methods
  37. @NotNull
  38. private CapabilitySet getGenericCapabilityDefaults(@NotNull CapabilitySet capabilitySet)
  39. {
  40. String path = Which.execute(NUNIT_CONSOLE_ANY_CPU);
  41. if (!StringUtils.isBlank(path))
  42. {
  43. Capability capability = new CapabilityImpl(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + ".NUnit", path);
  44. capabilitySet.addCapability(capability);
  45. }
  46. String x86Path = Which.execute(NUNIT_CONSOLE_X86);
  47. if (!StringUtils.isBlank(x86Path))
  48. {
  49. Capability capability = new CapabilityImpl(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + ".NUnit (32bit)", x86Path);
  50. capabilitySet.addCapability(capability);
  51. }
  52. return capabilitySet;
  53. }
  54. @NotNull
  55. private CapabilitySet getWindowsCapabilityDefaults(@NotNull CapabilitySet capabilitySet)
  56. {
  57. // By default, NUnit is not installed on the system %PATH%. To target the path of least resistance, let's
  58. // enumerate the default NUnit install directories looking for runners.
  59. File[] nunitInstallLocations = getNUnitInstallDirectories();
  60. for (File installDirectory : nunitInstallLocations)
  61. {
  62. if (!installDirectory.exists() || !installDirectory.isDirectory())
  63. continue;
  64. // Probe this directory for the console executables. Look for both the "Any CPU" and "x86" versions.
  65. // Look in both the "bin/" and "/bin/net-2.0/" directories.
  66. probeDirectory(installDirectory, capabilitySet);
  67. }
  68. return capabilitySet;
  69. }
  70. private File[] getNUnitInstallDirectories()
  71. {
  72. String programFilesPath = Platform.is64Bit() ? Shell32Util.getFolderPath(ShlObj.CSIDL_PROGRAM_FILESX86) :
  73. Shell32Util.getFolderPath(ShlObj.CSIDL_PROGRAM_FILES);
  74. File programFiles = new File(programFilesPath);
  75. if (!programFiles.exists() || !programFiles.isDirectory())
  76. {
  77. log.error(String.format("Unable to process %s, it doesn't exist or is not a valid directory", programFilesPath));
  78. return null;
  79. }
  80. return programFiles.listFiles(new FilenameFilter()
  81. {
  82. @Override
  83. public boolean accept(File dir, String name)
  84. {
  85. // Example matches: "NUnit 2.4.8", "NUnit 2.5.10", "NUnit 2.6"
  86. return name.matches("NUnit \\d+\\.\\d+(\\.\\d+)?");
  87. }
  88. });
  89. }
  90. private void probeDirectory(@NotNull File installDirectory, @NotNull CapabilitySet capabilitySet)
  91. {
  92. // The actual location of NUnit's binaries in the install directory may vary, depending on the version of NUnit
  93. // 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
  94. // installers put everything directly in the "bin" directory.
  95. // Examples: "C:\Program Files\NUnit 2.5.9\bin\net-2.0\nunit-console.exe"
  96. // "C:\Program Files (x86)\NUnit 2.6\bin\nunit-console-x86.exe"
  97. addAsCapabilityIfExists(new File(installDirectory, "bin/net-2.0/" + NUNIT_CONSOLE_ANY_CPU), capabilitySet, installDirectory.getName());
  98. addAsCapabilityIfExists(new File(installDirectory, "bin/net-2.0/" + NUNIT_CONSOLE_X86), capabilitySet, installDirectory.getName() + " (32bit)");
  99. addAsCapabilityIfExists(new File(installDirectory, "bin/" + NUNIT_CONSOLE_ANY_CPU), capabilitySet, installDirectory.getName());
  100. addAsCapabilityIfExists(new File(installDirectory, "bin/" + NUNIT_CONSOLE_X86), capabilitySet, installDirectory.getName() + " (32bit)");
  101. }
  102. private void addAsCapabilityIfExists(File executable, @NotNull CapabilitySet capabilitySet, String capabilityKeySuffix)
  103. {
  104. if (executable.exists() && executable.isFile())
  105. {
  106. Capability capability = new CapabilityImpl(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + "." + capabilityKeySuffix, executable.getAbsolutePath());
  107. capabilitySet.addCapability(capability);
  108. }
  109. }
  110. // -------------------------------------------------------------------------------------------------- Action Methods
  111. // -------------------------------------------------------------------------------------------------- Public Methods
  112. // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
  113. }