From 4c5b964dcfc3c76bfa2f7716da59dd26258909ac Mon Sep 17 00:00:00 2001 From: Eugene Petrenko Date: Fri, 15 Jul 2011 01:15:40 +0400 Subject: [PATCH] test trigger updater --- .../META-INF/build-server-plugin-nuget.xml | 2 +- .../server/exec/ListPackagesCommand.java | 44 ++----- .../server/exec/ListPackagesCommandImpl.java | 63 ++++++++++ .../trigger/NamedPackagesUpdateChecker.java | 23 +++- nuget-tests/nuget-tests.iml | 1 + .../tests/server/ListPackagesCommandTest.java | 7 +- .../NamedPackagesUpdateCheckerTest.java | 119 ++++++++++++++++++ nuget-tests/src/testng-nuget-tests..xml | 2 + 8 files changed, 216 insertions(+), 45 deletions(-) create mode 100644 nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommandImpl.java create mode 100644 nuget-tests/src/jetbrains/buildServer/nuget/tests/server/NamedPackagesUpdateCheckerTest.java diff --git a/nuget-server/src/META-INF/build-server-plugin-nuget.xml b/nuget-server/src/META-INF/build-server-plugin-nuget.xml index d726138..a1ba186 100644 --- a/nuget-server/src/META-INF/build-server-plugin-nuget.xml +++ b/nuget-server/src/META-INF/build-server-plugin-nuget.xml @@ -17,7 +17,7 @@ - + diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommand.java b/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommand.java index 9d5d6ca..f1a17a1 100644 --- a/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommand.java +++ b/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommand.java @@ -16,51 +16,21 @@ package jetbrains.buildServer.nuget.server.exec; -import com.intellij.openapi.diagnostic.Logger; -import jetbrains.buildServer.util.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; /** * Created by Eugene Petrenko (eugene.petrenko@gmail.com) - * Date: 14.07.11 13:10 + * Date: 14.07.11 19:04 */ -public class ListPackagesCommand { - private static final Logger LOG = Logger.getInstance(ListPackagesCommand.class.getName()); - - private NuGetExecutor myExec; - - public ListPackagesCommand(NuGetExecutor exec) { - myExec = exec; - } - +public interface ListPackagesCommand { @NotNull - public Collection checkForChanges( - @NotNull final File nugetPath, - @NotNull final String source, - @NotNull final String packageId, - @Nullable final String versionSpec) { - List cmd = new ArrayList(); - - cmd.add("TeamCity.List"); - if (!StringUtil.isEmptyOrSpaces(source)) { - cmd.add("-Source"); - cmd.add(source); - } - cmd.add("-Id"); - cmd.add(packageId); - - if (!StringUtil.isEmptyOrSpaces(versionSpec)) { - cmd.add("-Version"); - cmd.add(versionSpec); - } - - return myExec.executeNuGet(nugetPath, cmd, new ListPackagesCommandProcessor(source)); - } - + Collection checkForChanges( + @NotNull File nugetPath, + @Nullable String source, + @NotNull String packageId, + @Nullable String versionSpec); } diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommandImpl.java b/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommandImpl.java new file mode 100644 index 0000000..4bffd6c --- /dev/null +++ b/nuget-server/src/jetbrains/buildServer/nuget/server/exec/ListPackagesCommandImpl.java @@ -0,0 +1,63 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package jetbrains.buildServer.nuget.server.exec; + +import jetbrains.buildServer.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by Eugene Petrenko (eugene.petrenko@gmail.com) + * Date: 14.07.11 13:10 + */ +public class ListPackagesCommandImpl implements ListPackagesCommand { + private NuGetExecutor myExec; + + public ListPackagesCommandImpl(NuGetExecutor exec) { + myExec = exec; + } + + @NotNull + public Collection checkForChanges( + @NotNull final File nugetPath, + @Nullable final String source, + @NotNull final String packageId, + @Nullable final String versionSpec) { + List cmd = new ArrayList(); + + cmd.add("TeamCity.List"); + if (!StringUtil.isEmptyOrSpaces(source)) { + cmd.add("-Source"); + cmd.add(source); + } + cmd.add("-Id"); + cmd.add(packageId); + + if (!StringUtil.isEmptyOrSpaces(versionSpec)) { + cmd.add("-Version"); + cmd.add(versionSpec); + } + + return myExec.executeNuGet(nugetPath, cmd, new ListPackagesCommandProcessor(source)); + } + +} diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/trigger/NamedPackagesUpdateChecker.java b/nuget-server/src/jetbrains/buildServer/nuget/server/trigger/NamedPackagesUpdateChecker.java index 263c0b5..5ba574f 100644 --- a/nuget-server/src/jetbrains/buildServer/nuget/server/trigger/NamedPackagesUpdateChecker.java +++ b/nuget-server/src/jetbrains/buildServer/nuget/server/trigger/NamedPackagesUpdateChecker.java @@ -5,6 +5,7 @@ import jetbrains.buildServer.buildTriggers.BuildTriggerException; import jetbrains.buildServer.nuget.server.exec.ListPackagesCommand; import jetbrains.buildServer.nuget.server.exec.PackageInfo; import jetbrains.buildServer.serverSide.CustomDataStorage; +import jetbrains.buildServer.util.StringUtil; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -29,11 +30,29 @@ public class NamedPackagesUpdateChecker implements TriggerUpdateChecker { final String version = descriptor.getProperties().get(TriggerConstants.VERSION); final String source = descriptor.getProperties().get(TriggerConstants.SOURCE); - Collection result = myCommand.checkForChanges(new File(path), source, pkgId, version); + if (StringUtil.isEmptyOrSpaces(path)) { + throw new BuildTriggerException("Path to NuGet.exe must be specified"); + } + + if (StringUtil.isEmptyOrSpaces(pkgId)) { + throw new BuildTriggerException("Package Id must be specified"); + } + + File nugetPath = new File(path); + if (!nugetPath.isFile()) { + throw new BuildTriggerException("Failed to find NuGet.exe at: " + nugetPath); + } + + Collection result; + try { + result = myCommand.checkForChanges(nugetPath, source, pkgId, version); + } catch (Throwable t) { + throw new BuildTriggerException("Failed to check for package versions. " + t.getMessage(), t); + } final String hash = serializeHashcode(result); String oldHash = storage.getValue(KEY); - if (!hash.equals(oldHash)) { + if (oldHash != null && !hash.equals(oldHash)) { storage.putValue(KEY, hash); storage.flush(); return new BuildStartReason("NuGet Package " + pkgId + " updated"); diff --git a/nuget-tests/nuget-tests.iml b/nuget-tests/nuget-tests.iml index 6c1b9c2..88001f8 100644 --- a/nuget-tests/nuget-tests.iml +++ b/nuget-tests/nuget-tests.iml @@ -21,6 +21,7 @@ + diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/ListPackagesCommandTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/ListPackagesCommandTest.java index 62af502..1420f7c 100644 --- a/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/ListPackagesCommandTest.java +++ b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/ListPackagesCommandTest.java @@ -17,10 +17,7 @@ package jetbrains.buildServer.nuget.tests.server; import jetbrains.buildServer.BaseTestCase; -import jetbrains.buildServer.nuget.server.exec.ListPackagesCommand; -import jetbrains.buildServer.nuget.server.exec.ListPackagesCommandProcessor; -import jetbrains.buildServer.nuget.server.exec.NuGetExecutor; -import jetbrains.buildServer.nuget.server.exec.PackageInfo; +import jetbrains.buildServer.nuget.server.exec.*; import org.jmock.Expectations; import org.jmock.Mockery; import org.testng.annotations.BeforeMethod; @@ -44,7 +41,7 @@ public class ListPackagesCommandTest extends BaseTestCase { super.setUp(); m = new Mockery(); exec = m.mock(NuGetExecutor.class); - cmd = new ListPackagesCommand(exec); + cmd = new ListPackagesCommandImpl(exec); } private void allowCommandLineCall(final String... cmd) { diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/NamedPackagesUpdateCheckerTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/NamedPackagesUpdateCheckerTest.java new file mode 100644 index 0000000..208e265 --- /dev/null +++ b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/NamedPackagesUpdateCheckerTest.java @@ -0,0 +1,119 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package jetbrains.buildServer.nuget.tests.server; + +import jetbrains.buildServer.BaseTestCase; +import jetbrains.buildServer.buildTriggers.BuildTriggerDescriptor; +import jetbrains.buildServer.buildTriggers.BuildTriggerException; +import jetbrains.buildServer.nuget.server.exec.ListPackagesCommand; +import jetbrains.buildServer.nuget.server.exec.PackageInfo; +import jetbrains.buildServer.nuget.server.trigger.NamedPackagesUpdateChecker; +import jetbrains.buildServer.nuget.server.trigger.TriggerConstants; +import jetbrains.buildServer.nuget.tests.integration.Paths; +import jetbrains.buildServer.serverSide.CustomDataStorage; +import junit.framework.Assert; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.Map; +import java.util.TreeMap; + +/** + * Created by Eugene Petrenko (eugene.petrenko@gmail.com) + * Date: 14.07.11 18:57 + */ +public class NamedPackagesUpdateCheckerTest extends BaseTestCase { + private Mockery m; + private ListPackagesCommand cmd; + private NamedPackagesUpdateChecker checker; + private BuildTriggerDescriptor desr; + private CustomDataStorage store; + private Map params; + private File nugetFakePath; + + @BeforeMethod + @Override + protected void setUp() throws Exception { + super.setUp(); + + m = new Mockery(); + cmd = m.mock(ListPackagesCommand.class); + desr = m.mock(BuildTriggerDescriptor.class); + store = m.mock(CustomDataStorage.class); + params = new TreeMap(); + + checker = new NamedPackagesUpdateChecker(cmd); + + m.checking(new Expectations(){{ + allowing(desr).getProperties(); will(returnValue(params)); + }}); + nugetFakePath = Paths.getNuGetRunnerPath(); + + params.put(TriggerConstants.NUGET_EXE, nugetFakePath.getPath()); + params.put(TriggerConstants.PACKAGE, "NUnit"); + } + + @Test + public void test_check_first_time_should_not_trigger() { + m.checking(new Expectations(){{ + oneOf(cmd).checkForChanges(nugetFakePath, null, "NUnit", null); + will(returnValue(Arrays.asList(new PackageInfo("src", "pkg", "5.6.87")))); + + oneOf(store).getValue("hash"); will(returnValue(null)); + oneOf(store).putValue(with(equal("hash")), with(any(String.class))); + oneOf(store).flush(); + }}); + Assert.assertNull(checker.checkChanges(desr, store)); + } + + @Test + public void test_check_should_not_trigger_twice() { + m.checking(new Expectations(){{ + oneOf(cmd).checkForChanges(nugetFakePath, null, "NUnit", null); + will(returnValue(Arrays.asList(new PackageInfo("src", "pkg", "5.6.87")))); + + oneOf(cmd).checkForChanges(nugetFakePath, null, "NUnit", null); + will(returnValue(Arrays.asList(new PackageInfo("src", "pkg", "5.6.87")))); + + oneOf(store).getValue("hash"); will(returnValue("aaa")); + oneOf(store).putValue("hash", "|s:src|p:pkg|v:5.6.87"); + oneOf(store).getValue("hash"); will(returnValue("|s:src|p:pkg|v:5.6.87")); + oneOf(store).flush(); + }}); + + Assert.assertNotNull(checker.checkChanges(desr, store)); + Assert.assertNull(checker.checkChanges(desr, store)); + } + + @Test + public void test_check_should_fail_on_error() { + m.checking(new Expectations() {{ + oneOf(cmd).checkForChanges(with(equal(nugetFakePath)), with(any(String.class)), with(any(String.class)), with(any(String.class))); + will(throwException(new RuntimeException("Failed to execute command"))); + }}); + try { + checker.checkChanges(desr, store); + } catch (BuildTriggerException e) { + return; + } + Assert.fail("should throw an exception"); + } +} diff --git a/nuget-tests/src/testng-nuget-tests..xml b/nuget-tests/src/testng-nuget-tests..xml index 2e53378..6b53fac 100644 --- a/nuget-tests/src/testng-nuget-tests..xml +++ b/nuget-tests/src/testng-nuget-tests..xml @@ -12,6 +12,8 @@ + + -- 2.23.3