add an option to clean output directory before packing a package
authorEugene.Petrenko <eugene.petrenko@gmail.com>
Wed, 24 Aug 2011 11:03:23 +0000 (13:03 +0200)
committerEugene.Petrenko <eugene.petrenko@gmail.com>
Wed, 24 Aug 2011 11:03:23 +0000 (13:03 +0200)
nuget-agent/src/jetbrains/buildServer/nuget/agent/parameters/NuGetPackParameters.java
nuget-agent/src/jetbrains/buildServer/nuget/agent/parameters/impl/PackagesParametersFactoryImpl.java
nuget-agent/src/jetbrains/buildServer/nuget/agent/runner/pack/PackRunner.java
nuget-common/src/jetbrains/buildServer/nuget/common/PackagesConstants.java
nuget-server/resources/pack/editPack.jsp
nuget-server/resources/pack/viewPack.jsp
nuget-server/src/jetbrains/buildServer/nuget/server/runner/pack/PackBean.java
nuget-server/src/jetbrains/buildServer/nuget/server/runner/pack/PackRunType.java
nuget-tests/src/jetbrains/buildServer/nuget/tests/agent/PackRunnerTest.java [new file with mode: 0644]
nuget-tests/src/jetbrains/buildServer/nuget/tests/integration/PackIntegrationTest.java
nuget-tests/src/testng-nuget-fast.xml

index e9fe6dfa717c1346bc203dd38768f2ed7b79b4cb..11b8e9766aa4fe1071e0719278c9a05db5f8d1c4 100644 (file)
@@ -43,6 +43,8 @@ public interface NuGetPackParameters extends NuGetParameters {
   @NotNull\r
   File getOutputDirectory() throws RunBuildException;\r
 \r
+  boolean cleanOutputDirectory() throws RunBuildException;\r
+\r
   @NotNull\r
   File getBaseDirectory() throws RunBuildException;\r
 \r
index bfc008f70fe01be336d174d37293296e0d080f52..b32cd69827984cd2712e26abecee52e30b682b07 100644 (file)
@@ -263,6 +263,10 @@ public class PackagesParametersFactoryImpl implements PackagesParametersFactory
         return getDirectory(context, NUGET_PACK_OUTPUT_DIR, "output directory");\r
       }\r
 \r
+      public boolean cleanOutputDirectory() throws RunBuildException {\r
+        return getBoolean(context, NUGET_PACK_OUTPUT_CLEAR);\r
+      }\r
+\r
       @NotNull\r
       public File getBaseDirectory() throws RunBuildException {\r
         String path = getParameter(context, NUGET_PACK_BASE_DIR);\r
index e5e6e4df471859091200d30a7d401dfe0c73a70c..eabc74078a61ee14bed6d4dcaa2514f1ee36edd4 100644 (file)
 package jetbrains.buildServer.nuget.agent.runner.pack;\r
 \r
 import jetbrains.buildServer.RunBuildException;\r
-import jetbrains.buildServer.agent.AgentRunningBuild;\r
-import jetbrains.buildServer.agent.BuildProcess;\r
-import jetbrains.buildServer.agent.BuildRunnerContext;\r
+import jetbrains.buildServer.agent.*;\r
 import jetbrains.buildServer.nuget.agent.commands.NuGetActionFactory;\r
 import jetbrains.buildServer.nuget.agent.parameters.NuGetPackParameters;\r
 import jetbrains.buildServer.nuget.agent.parameters.PackagesParametersFactory;\r
 import jetbrains.buildServer.nuget.agent.runner.NuGetRunnerBase;\r
+import jetbrains.buildServer.nuget.agent.util.BuildProcessBase;\r
 import jetbrains.buildServer.nuget.agent.util.CompositeBuildProcess;\r
 import jetbrains.buildServer.nuget.agent.util.impl.CompositeBuildProcessImpl;\r
 import jetbrains.buildServer.nuget.common.PackagesConstants;\r
+import org.apache.log4j.Logger;\r
 import org.jetbrains.annotations.NotNull;\r
 \r
+import java.io.File;\r
+\r
 /**\r
  * @author Eugene Petrenko (eugene.petrenko@gmail.com)\r
  *         Date: 23.08.11 12:11\r
  */\r
 public class PackRunner extends NuGetRunnerBase {\r
+  private final SmartDirectoryCleaner myCleaner;\r
+\r
   public PackRunner(@NotNull final NuGetActionFactory actionFactory,\r
-                    @NotNull final PackagesParametersFactory parametersFactory) {\r
+                    @NotNull final PackagesParametersFactory parametersFactory,\r
+                    @NotNull final SmartDirectoryCleaner cleaner) {\r
     super(actionFactory, parametersFactory);\r
+    myCleaner = cleaner;\r
   }\r
 \r
   @NotNull\r
@@ -45,6 +51,31 @@ public class PackRunner extends NuGetRunnerBase {
     final CompositeBuildProcess process = new CompositeBuildProcessImpl();\r
     final NuGetPackParameters params = myParametersFactory.loadPackParameters(context);\r
 \r
+    process.pushBuildProcess(new BuildProcessBase() {\r
+      @NotNull\r
+      @Override\r
+      protected BuildFinishedStatus waitForImpl() throws RunBuildException {\r
+        final File output = params.getOutputDirectory();\r
+\r
+        if (params.cleanOutputDirectory()) {\r
+          final CleanerCallback callback = new CleanerCallback(runningBuild.getBuildLogger(), Logger.getLogger(getClass()));\r
+          myCleaner.cleanFolder(output, callback);\r
+          if (callback.isHasErrors()) {\r
+            return BuildFinishedStatus.FINISHED_FAILED;\r
+          }\r
+        }\r
+\r
+        //noinspection ResultOfMethodCallIgnored\r
+        output.mkdirs();\r
+        if (!output.isDirectory()) {\r
+         runningBuild.getBuildLogger().error("Failed to create output directory: " + output);\r
+          return BuildFinishedStatus.FINISHED_FAILED;\r
+        }\r
+\r
+        return BuildFinishedStatus.FINISHED_SUCCESS;\r
+      }\r
+    });\r
+\r
     process.pushBuildProcess(myActionFactory.createPack(context, params));\r
     return process;\r
   }\r
@@ -53,4 +84,52 @@ public class PackRunner extends NuGetRunnerBase {
   public String getType() {\r
     return PackagesConstants.PACK_RUN_TYPE;\r
   }\r
+\r
+  private class CleanerCallback implements SmartDirectoryCleanerCallback {\r
+    private final BuildProgressLogger myLogger;\r
+    private final Logger LOG;\r
+    private boolean myHasErrors = false;\r
+    private File myRoot;\r
+\r
+    public CleanerCallback(@NotNull final BuildProgressLogger logger, @NotNull final Logger LOG) {\r
+      myLogger = logger;\r
+      this.LOG = LOG;\r
+    }\r
+\r
+    public void logCleanStarted(final File f) {\r
+      myRoot = f;\r
+      myLogger.message("Cleaning " + f.getAbsolutePath());\r
+      LOG.info("Cleaning " + f.getAbsolutePath());\r
+    }\r
+\r
+    public void logFailedToDeleteEmptyDirectory(final File f) {\r
+      final String message = "Failed to delete empty directory: " + f.getAbsolutePath();\r
+      if (f != myRoot) {\r
+        myLogger.error(message);\r
+      } else {\r
+        myLogger.warning(message);\r
+      }\r
+      LOG.warn(message);\r
+    }\r
+\r
+    public void logFailedToCleanFilesUnderDirectory(final File problem) {\r
+      myLogger.error("Failed to clean all files under directory: " + problem.getAbsolutePath());\r
+      LOG.warn("Failed to clean all files under directory: " + problem.getAbsolutePath());\r
+      myHasErrors = true;\r
+    }\r
+\r
+    public void logFailedToCleanFile(final File problem) {\r
+      myLogger.error("Failed to delete file: " + problem.getAbsolutePath());\r
+      LOG.warn("Failed to delete file: " + problem.getAbsolutePath());\r
+      myHasErrors = true;\r
+    }\r
+\r
+    public void logFailedToCleanEntireFolder(final File file) {\r
+      myHasErrors = true;\r
+    }\r
+\r
+    public boolean isHasErrors() {\r
+      return myHasErrors;\r
+    }\r
+  }\r
 }\r
index b10d7c80a89d4aeb9985214256baaddf9aea9b4b..82e6757793c08439a3fc9c94250fbf8eae816196 100644 (file)
@@ -53,6 +53,7 @@ public interface PackagesConstants {
   public static final String NUGET_TOOL_REL_PATH = "tools/NuGet.exe";\r
 \r
 \r
+  public static final String NUGET_PACK_OUTPUT_CLEAR = "nuget.pack.output.clean";\r
   public static final String NUGET_PACK_OUTPUT_DIR = "nuget.pack.output.directory";\r
   public static final String NUGET_PACK_BASE_DIR = "nuget.pack.base.directory";\r
   public static final String NUGET_PACK_VERSION = "nuget.pack.version";\r
index 54532966d71a551ecdc1d82e262e6441e29adea2..eb2d1826decafa279e38fdb472046667f2566bc8 100644 (file)
 \r
 <l:settingsGroup title="Output">\r
   <tr>\r
-    <th><label for="${ib.packOutputDirectory}">Output Directory</label><l:star/>:</th>\r
+    <th rowspan="2"><label for="${ib.packOutputDirectory}">Output Directory</label><l:star/>:</th>\r
     <td>\r
       <props:textProperty name="${ib.packOutputDirectory}" className="longField"/>\r
       <span class="smallNote">Specify path to put generated NuGet package</span>\r
       <span id="error_${ib.packOutputDirectory}" class="error"></span>\r
     </td>\r
   </tr>\r
-\r
+  <tr>\r
+    <td>\r
+      <props:checkboxProperty name="${ib.packOutputClear}"/> Clean output directory before pack\r
+    </td>\r
+  </tr>\r
 </l:settingsGroup>\r
 \r
 <l:settingsGroup title="Additionals parameters">\r
index 348b3ac10825e0fbbc962f11d678b42b19dd64a6..0a9b6aad14bb67c72970f1e83aaef6f1f513a4c8 100644 (file)
@@ -18,6 +18,7 @@
 <%@ taglib prefix="l" tagdir="/WEB-INF/tags/layout" %>\r
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>\r
 <jsp:useBean id="ib" class="jetbrains.buildServer.nuget.server.runner.pack.PackBean" scope="request"/>\r
+<jsp:useBean id="propertiesBean" scope="request" type="jetbrains.buildServer.controllers.BasePropertiesBean"/>\r
 \r
 \r
 <div class="parameter">\r
@@ -38,6 +39,7 @@
 \r
 <div class="parameter">\r
   Output Directory: <strong><props:displayValue name="${ib.packOutputDirectory}"/></strong>\r
+  <c:if test="${not empty propertiesBean.properties[ib.packOutputClear]}">(cleaned on start)</c:if>\r
 </div>\r
 \r
 <div class="parameter">\r
index 848569b5013e9f0d95fe180ecea53a598dd9b37c..50bbf369b40cc9247b34f0b31a29eed7975146f1 100644 (file)
@@ -25,6 +25,7 @@ import jetbrains.buildServer.nuget.common.PackagesConstants;
 public class PackBean {\r
   public String getNuGetPathKey() { return PackagesConstants.NUGET_PATH; }\r
   public String getPackOutputDirectory() { return PackagesConstants.NUGET_PACK_OUTPUT_DIR; }\r
+  public String getPackOutputClear() { return PackagesConstants.NUGET_PACK_OUTPUT_CLEAR; }\r
   public String getPackBaseDirectory() { return PackagesConstants.NUGET_PACK_BASE_DIR;}\r
   public String getPackVersion() { return PackagesConstants.NUGET_PACK_VERSION; }\r
   public String getPackSpecFile() { return PackagesConstants.NUGET_PACK_SPEC_FILE;}\r
index 312841595a688559d390649db6e19225344cc969..45ee5368f154a1909d2d3cebc003f597b6c64b6e 100644 (file)
@@ -102,6 +102,7 @@ public class PackRunType extends NuGetRunType {
   public Map<String, String> getDefaultRunnerProperties() {\r
     return new HashMap<String, String>(){{\r
       put(PackagesConstants.NUGET_PACK_VERSION, "%" + ServerProvidedProperties.BUILD_NUMBER_PROP + "%");\r
+      put(PackagesConstants.NUGET_PACK_OUTPUT_CLEAR, "checked");\r
     }};\r
   }\r
 }\r
diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/agent/PackRunnerTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/agent/PackRunnerTest.java
new file mode 100644 (file)
index 0000000..978e006
--- /dev/null
@@ -0,0 +1,144 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.tests.agent;\r
+\r
+import jetbrains.buildServer.RunBuildException;\r
+import jetbrains.buildServer.agent.*;\r
+import jetbrains.buildServer.nuget.agent.commands.NuGetActionFactory;\r
+import jetbrains.buildServer.nuget.agent.parameters.NuGetPackParameters;\r
+import jetbrains.buildServer.nuget.agent.parameters.PackagesParametersFactory;\r
+import jetbrains.buildServer.nuget.agent.runner.pack.PackRunner;\r
+import jetbrains.buildServer.nuget.tests.util.BuildProcessTestCase;\r
+import jetbrains.buildServer.util.FileUtil;\r
+import junit.framework.Assert;\r
+import org.hamcrest.BaseMatcher;\r
+import org.hamcrest.Description;\r
+import org.jmock.Expectations;\r
+import org.jmock.Mockery;\r
+import org.testng.annotations.BeforeMethod;\r
+import org.testng.annotations.Test;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+\r
+/**\r
+ * @author Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ *         Date: 24.08.11 12:31\r
+ */\r
+public class PackRunnerTest extends BuildProcessTestCase {\r
+  private Mockery m;\r
+  private NuGetActionFactory myActionFactory;\r
+  private PackagesParametersFactory myParametersFactory;\r
+  private SmartDirectoryCleaner myCleaner;\r
+  private AgentRunningBuild myBuild;\r
+  private BuildRunnerContext myContext;\r
+  private NuGetPackParameters myPackParameters;\r
+  private BuildProcess myProc;\r
+  private BuildProgressLogger myLogger;\r
+\r
+\r
+  @BeforeMethod\r
+  @Override\r
+  protected void setUp() throws Exception {\r
+    super.setUp();\r
+    m = new Mockery();\r
+    myActionFactory = m.mock(NuGetActionFactory.class);\r
+    myParametersFactory = m.mock(PackagesParametersFactory.class);\r
+    myCleaner = m.mock(SmartDirectoryCleaner.class);\r
+    myBuild = m.mock(AgentRunningBuild.class);\r
+    myContext = m.mock(BuildRunnerContext.class);\r
+    myPackParameters = m.mock(NuGetPackParameters.class);\r
+    myProc = m.mock(BuildProcess.class);\r
+    myLogger = m.mock(BuildProgressLogger.class);\r
+\r
+    m.checking(new Expectations(){{\r
+      allowing(myParametersFactory).loadPackParameters(myContext); will(returnValue(myPackParameters));\r
+      allowing(myActionFactory).createPack(myContext, myPackParameters); will(returnValue(myProc));\r
+\r
+      allowing(myBuild).getBuildLogger(); will(returnValue(myLogger));\r
+      allowing(myContext).getBuild(); will(returnValue(myBuild));\r
+\r
+      allowing(myLogger).message(with(any(String.class)));\r
+      allowing(myLogger).activityStarted(with(any(String.class)), with(any(String.class)), with(any(String.class)));\r
+      allowing(myLogger).activityStarted(with(any(String.class)), with(any(String.class)));\r
+      allowing(myLogger).activityFinished(with(any(String.class)), with(any(String.class)));\r
+\r
+\r
+      oneOf(myProc).start();\r
+      oneOf(myProc).waitFor(); will(returnValue(BuildFinishedStatus.FINISHED_SUCCESS));\r
+    }});\r
+  }\r
+\r
+  @Test\r
+  public void test_packRunner_outputDirectory_notCleaned() throws RunBuildException, IOException {\r
+    m.checking(new Expectations(){{\r
+      allowing(myPackParameters).cleanOutputDirectory(); will(returnValue(false));\r
+      allowing(myPackParameters).getOutputDirectory(); will(returnValue(createTempDir()));\r
+    }});\r
+\r
+    final PackRunner runner = new PackRunner(myActionFactory, myParametersFactory, myCleaner);\r
+    final BuildProcess process = runner.createBuildProcess(myBuild, myContext);\r
+    assertRunSuccessfully(process, BuildFinishedStatus.FINISHED_SUCCESS);\r
+  }\r
+\r
+  @Test\r
+  public void test_packRunner_outputDirectoryCleaned() throws RunBuildException, IOException {\r
+    final File temp = createTempDir();\r
+    m.checking(new Expectations(){{\r
+      allowing(myPackParameters).cleanOutputDirectory(); will(returnValue(true));\r
+      allowing(myPackParameters).getOutputDirectory();will(returnValue(temp));\r
+\r
+      oneOf(myCleaner).cleanFolder(with(equal(temp)), with(any(SmartDirectoryCleanerCallback.class)));\r
+    }});\r
+\r
+    FileUtil.delete(temp);\r
+    final PackRunner runner = new PackRunner(myActionFactory, myParametersFactory, myCleaner);\r
+    final BuildProcess process = runner.createBuildProcess(myBuild, myContext);\r
+    assertRunSuccessfully(process, BuildFinishedStatus.FINISHED_SUCCESS);\r
+\r
+    Assert.assertTrue(temp.isDirectory());\r
+  }\r
+\r
+  @Test\r
+  public void test_packRunner_outputDirectoryCleaned_error() throws RunBuildException, IOException {\r
+    final File temp = createTempDir();\r
+    m.checking(new Expectations(){{\r
+      allowing(myPackParameters).cleanOutputDirectory(); will(returnValue(true));\r
+      allowing(myPackParameters).getOutputDirectory();will(returnValue(temp));\r
+\r
+      allowing(myLogger).error(with(any(String.class)));\r
+\r
+      oneOf(myCleaner).cleanFolder(with(equal(temp)), with(new BaseMatcher<SmartDirectoryCleanerCallback>() {\r
+        public boolean matches(Object o) {\r
+          SmartDirectoryCleanerCallback cb = (SmartDirectoryCleanerCallback) o;\r
+          cb.logFailedToCleanFile(temp);\r
+\r
+          return true;\r
+        }\r
+\r
+        public void describeTo(Description description) {\r
+          description.appendText("Callback with failure");\r
+        }\r
+      }));\r
+    }});\r
+\r
+    final PackRunner runner = new PackRunner(myActionFactory, myParametersFactory, myCleaner);\r
+    final BuildProcess process = runner.createBuildProcess(myBuild, myContext);\r
+    assertRunSuccessfully(process, BuildFinishedStatus.FINISHED_FAILED);\r
+  }\r
+\r
+}\r
index 9fe42a99e6a63bd159aa30630d88f72b922602ce..70edb52739837090a103227deb1e84b804ef98fa 100644 (file)
@@ -23,6 +23,7 @@ import jetbrains.buildServer.RunBuildException;
 import jetbrains.buildServer.SimpleCommandLineProcessRunner;\r
 import jetbrains.buildServer.agent.BuildFinishedStatus;\r
 import jetbrains.buildServer.agent.BuildProcess;\r
+import jetbrains.buildServer.agent.SmartDirectoryCleaner;\r
 import jetbrains.buildServer.nuget.agent.runner.pack.PackRunner;\r
 import jetbrains.buildServer.nuget.agent.parameters.NuGetPackParameters;\r
 import jetbrains.buildServer.util.FileUtil;\r
@@ -43,6 +44,7 @@ import java.util.zip.ZipInputStream;
  */\r
 public class PackIntegrationTest extends IntegrationTestBase {\r
   protected NuGetPackParameters myPackParameters;\r
+  private SmartDirectoryCleaner myCleaner;\r
   private File myOutputDir;\r
 \r
   @BeforeMethod\r
@@ -50,6 +52,7 @@ public class PackIntegrationTest extends IntegrationTestBase {
   protected void setUp() throws Exception {\r
     super.setUp();\r
     myPackParameters = m.mock(NuGetPackParameters.class);\r
+    myCleaner = m.mock(SmartDirectoryCleaner.class);\r
 \r
     m.checking(new Expectations(){{\r
       oneOf(myParametersFactory).loadPackParameters(myContext); will(returnValue(myPackParameters));\r
@@ -67,7 +70,7 @@ public class PackIntegrationTest extends IntegrationTestBase {
     final File spec = new File(myRoot, "SamplePackage.nuspec");\r
     FileUtil.copy(getTestDataPath("SamplePackage.nuspec"), spec);\r
 \r
-    callRunner(spec, false, false);\r
+    callRunner(spec, false, false, false);\r
 \r
     Assert.assertTrue(myOutputDir.list(new FilenameFilter() {\r
       public boolean accept(File dir, String name) {\r
@@ -85,7 +88,7 @@ public class PackIntegrationTest extends IntegrationTestBase {
 \r
     msbuild(new File(myRoot, "nuget-proj.sln"));\r
 \r
-    callRunner(spec, false, false);\r
+    callRunner(spec, false, false, false);\r
 \r
     Assert.assertTrue(nupkgs().length == 1, "There should be only one package created");\r
 \r
@@ -107,7 +110,7 @@ public class PackIntegrationTest extends IntegrationTestBase {
 \r
     msbuild(new File(myRoot, "nuget-proj.sln"));\r
 \r
-    callRunner(spec, true, false);\r
+    callRunner(spec, true, false, false);\r
 \r
     Assert.assertTrue(nupkgs().length == 1, "There should be only one package created");\r
     final File nupkg = nupkgs()[0];\r
@@ -128,7 +131,7 @@ public class PackIntegrationTest extends IntegrationTestBase {
 \r
     msbuild(new File(myRoot, "nuget-proj.sln"));\r
 \r
-    callRunner(spec, false, true);\r
+    callRunner(spec, false, true, false);\r
 \r
     Assert.assertTrue(nupkgs().length == 1, "There should be only one package created");\r
     Assert.assertTrue(symbolsNupkgs().length == 1, "There should be only one symbols package created");\r
@@ -173,7 +176,7 @@ public class PackIntegrationTest extends IntegrationTestBase {
     Assert.assertEquals(0, result.getExitCode());\r
   }\r
 \r
-  private void callRunner(@NotNull final File spec, final boolean packAsTool, final boolean symbols) throws RunBuildException {\r
+  private void callRunner(@NotNull final File spec, final boolean packAsTool, final boolean symbols, final boolean cleanOutput) throws RunBuildException {\r
     m.checking(new Expectations(){{\r
       allowing(myPackParameters).getCustomCommandline(); will(returnValue(Collections.<String>emptyList()));\r
       allowing(myPackParameters).getProperties(); will(returnValue(Collections.<String>emptyList()));\r
@@ -183,12 +186,13 @@ public class PackIntegrationTest extends IntegrationTestBase {
       allowing(myPackParameters).getExclude(); will(returnValue(Collections.<String>emptyList()));\r
       allowing(myPackParameters).getVersion(); will(returnValue("45.239.32.12"));\r
       allowing(myPackParameters).getOutputDirectory(); will(returnValue(myOutputDir));\r
+      allowing(myPackParameters).cleanOutputDirectory(); will(returnValue(cleanOutput));\r
 \r
       allowing(myPackParameters).packTool(); will(returnValue(packAsTool));\r
       allowing(myPackParameters).packSymbols(); will(returnValue(symbols));\r
     }});\r
 \r
-    final PackRunner runner = new PackRunner(myActionFactory, myParametersFactory);\r
+    final PackRunner runner = new PackRunner(myActionFactory, myParametersFactory, myCleaner);\r
     final BuildProcess proc = runner.createBuildProcess(myBuild, myContext);\r
     assertRunSuccessfully(proc, BuildFinishedStatus.FINISHED_SUCCESS);\r
   }\r
index 83619a51fe728b6b65997de96d1e0dae1e1f033f..77acbf9b6b56055cad044fd683060fa62dde5699 100644 (file)
@@ -33,6 +33,7 @@
       <class name="jetbrains.buildServer.nuget.tests.server.tools.NuGetToolsInstallerTest"/>\r
 \r
       <class name="jetbrains.buildServer.nuget.tests.agent.NuGetPackActionFactoryTest"/>\r
+      <class name="jetbrains.buildServer.nuget.tests.agent.PackRunnerTest"/>\r
     </classes>\r
   </test>\r
 </suite>\r