rename to NuGetActionFactory, add Update packages getters
[teamcity/dotNetPackagesSupport.git] / nuget-tests / src / jetbrains / buildServer / nuget / tests / integration / InstallPackageIntegtatoinTest.java
1 /*\r
2  * Copyright 2000-2011 JetBrains s.r.o.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package jetbrains.buildServer.nuget.tests.integration;\r
18 \r
19 import com.intellij.execution.configurations.GeneralCommandLine;\r
20 import jetbrains.buildServer.ExecResult;\r
21 import jetbrains.buildServer.RunBuildException;\r
22 import jetbrains.buildServer.SimpleCommandLineProcessRunner;\r
23 import jetbrains.buildServer.agent.*;\r
24 import jetbrains.buildServer.nuget.agent.install.PackageInstallParametersFactory;\r
25 import jetbrains.buildServer.nuget.agent.install.PackagesInstallParameters;\r
26 import jetbrains.buildServer.nuget.agent.install.PackagesInstallerRunner;\r
27 import jetbrains.buildServer.nuget.agent.install.impl.NuGetActionFactoryImpl;\r
28 import jetbrains.buildServer.nuget.agent.util.BuildProcessBase;\r
29 import jetbrains.buildServer.nuget.agent.util.CommandlineBuildProcessFactory;\r
30 import jetbrains.buildServer.nuget.tests.util.BuildProcessTestCase;\r
31 import jetbrains.buildServer.util.ArchiveUtil;\r
32 import jetbrains.buildServer.util.FileUtil;\r
33 import junit.framework.Assert;\r
34 import org.jetbrains.annotations.NotNull;\r
35 import org.jmock.Expectations;\r
36 import org.jmock.Mockery;\r
37 import org.testng.annotations.BeforeMethod;\r
38 import org.testng.annotations.Test;\r
39 \r
40 import java.io.File;\r
41 import java.util.Arrays;\r
42 import java.util.Collection;\r
43 import java.util.Collections;\r
44 import java.util.List;\r
45 \r
46 /**\r
47  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
48  * Date: 08.07.11 2:15\r
49  */\r
50 public class InstallPackageIntegtatoinTest extends BuildProcessTestCase {\r
51   private File myRoot;\r
52   private Mockery m;\r
53   private AgentRunningBuild myBuild;\r
54   private BuildRunnerContext myContext;\r
55   private BuildProgressLogger myLogger;\r
56   private PackageInstallParametersFactory myParametersFactory;\r
57   private PackagesInstallParameters myParameters;\r
58   private BuildProcess myMockProcess;\r
59 \r
60   @BeforeMethod\r
61   @Override\r
62   protected void setUp() throws Exception {\r
63     super.setUp();\r
64     myRoot = createTempDir();\r
65     m = new Mockery();\r
66     myBuild = m.mock(AgentRunningBuild.class);\r
67     myContext = m.mock(BuildRunnerContext.class);\r
68     myLogger = m.mock(BuildProgressLogger.class);\r
69     myParametersFactory = m.mock(PackageInstallParametersFactory.class);\r
70     myParameters = m.mock(PackagesInstallParameters.class);\r
71     myMockProcess = m.mock(BuildProcess.class);\r
72 \r
73     m.checking(new Expectations() {{\r
74       allowing(myContext).getBuild();\r
75       will(returnValue(myBuild));\r
76       allowing(myBuild).getBuildLogger();\r
77       will(returnValue(myLogger));\r
78       allowing(myBuild).getCheckoutDirectory();\r
79       will(returnValue(myRoot));\r
80 \r
81       allowing(myMockProcess).start();\r
82       allowing(myMockProcess).waitFor();\r
83       will(returnValue(BuildFinishedStatus.FINISHED_SUCCESS));\r
84 \r
85       allowing(myLogger).message(with(any(String.class)));\r
86       allowing(myLogger).activityStarted(with(equal("install")), with(any(String.class)), with(any(String.class)));\r
87       allowing(myLogger).activityFinished(with(equal("install")), with(any(String.class)));\r
88     }});\r
89   }\r
90 \r
91   @Test\r
92   public void test_01_online_sources() throws RunBuildException {\r
93     ArchiveUtil.unpackZip(getTestDataPath("test-01.zip"), "", myRoot);\r
94 \r
95     fetchPackages(new File(myRoot, "sln1-lib.sln"), Collections.<String>emptyList(), false);\r
96 \r
97     List<File> packageses = Arrays.asList(new File(myRoot, "packages").listFiles());\r
98     System.out.println("installed packageses = " + packageses);\r
99 \r
100     Assert.assertTrue(new File(myRoot, "packages/NUnit.2.5.7.10213").isDirectory());\r
101     Assert.assertTrue(new File(myRoot, "packages/NInject.2.2.1.4").isDirectory());\r
102     Assert.assertTrue(new File(myRoot, "packages/Machine.Specifications.0.4.13.0").isDirectory());\r
103     Assert.assertEquals(4, packageses.size());\r
104   }\r
105 \r
106   @Test\r
107   public void test_01_online_sources_ecludeVersion() throws RunBuildException {\r
108     ArchiveUtil.unpackZip(getTestDataPath("test-01.zip"), "", myRoot);\r
109 \r
110     fetchPackages(new File(myRoot, "sln1-lib.sln"), Collections.<String>emptyList(), true);\r
111 \r
112     List<File> packageses = Arrays.asList(new File(myRoot, "packages").listFiles());\r
113     System.out.println("installed packageses = " + packageses);\r
114 \r
115     Assert.assertTrue(new File(myRoot, "packages/NUnit").isDirectory());\r
116     Assert.assertTrue(new File(myRoot, "packages/NInject").isDirectory());\r
117     Assert.assertTrue(new File(myRoot, "packages/Machine.Specifications").isDirectory());\r
118     Assert.assertEquals(4, packageses.size());\r
119   }\r
120 \r
121   @Test(enabled = false, dependsOnGroups = "Need to understand how to check NuGet uses only specified sources")\r
122   public void test_01_local_sources() throws RunBuildException {\r
123     ArchiveUtil.unpackZip(getTestDataPath("test-01.zip"), "", myRoot);\r
124     File sourcesDir = new File(myRoot, "js");\r
125     ArchiveUtil.unpackZip(getTestDataPath("test-01-sources.zip"), "", sourcesDir);\r
126 \r
127     fetchPackages(new File(myRoot, "sln1-lib.sln"), Arrays.asList("file:///" + sourcesDir.getPath()), false);\r
128 \r
129     List<File> packageses = Arrays.asList(new File(myRoot, "packages").listFiles());\r
130     System.out.println("installed packageses = " + packageses);\r
131 \r
132     Assert.assertTrue(new File(myRoot, "packages/NUnit.2.5.7.10213").isDirectory());\r
133     Assert.assertTrue(new File(myRoot, "packages/NInject.2.2.1.4").isDirectory());\r
134     Assert.assertTrue(new File(myRoot, "packages/Machine.Specifications.0.4.13.0").isDirectory());\r
135     Assert.assertEquals(4, packageses.size());\r
136   }\r
137 \r
138   private void fetchPackages(final File sln, final List<String> sources, final boolean excludeVersion) throws RunBuildException {\r
139     m.checking(new Expectations() {{\r
140       allowing(myParametersFactory).loadParameters(myContext);\r
141       will(returnValue(myParameters));\r
142 \r
143       allowing(myParameters).getNuGetExeFile();\r
144       will(returnValue(getPathToNuGet()));\r
145       allowing(myParameters).getSolutionFile();\r
146       will(returnValue(sln));\r
147       allowing(myParameters).getNuGetPackageSources();\r
148       will(returnValue(sources));\r
149       allowing(myParameters).getExcludeVersion();\r
150       will(returnValue(excludeVersion));\r
151     }});\r
152 \r
153     BuildProcess proc = new PackagesInstallerRunner(\r
154             new NuGetActionFactoryImpl(executingFactory()),\r
155             myParametersFactory\r
156     ).createBuildProcess(myBuild, myContext);\r
157 \r
158     assertRunSuccessfully(proc, BuildFinishedStatus.FINISHED_SUCCESS);\r
159 \r
160     m.assertIsSatisfied();\r
161   }\r
162 \r
163 \r
164   @NotNull\r
165   private File getTestDataPath() {\r
166     return FileUtil.getCanonicalFile(new File("./nuget-tests/testData/integration"));\r
167   }\r
168 \r
169   @NotNull\r
170   private File getTestDataPath(@NotNull final String p) {\r
171     return FileUtil.getCanonicalFile(new File(getTestDataPath(), p));\r
172   }\r
173 \r
174   @NotNull\r
175   private File getPathToNuGet() {\r
176     return FileUtil.getCanonicalFile(new File("./nuget-tests/testData/nuget/1.4/NuGet.exe"));\r
177   }\r
178 \r
179   private CommandlineBuildProcessFactory executingFactory() {\r
180     return new CommandlineBuildProcessFactory() {\r
181       public BuildProcess executeCommandLine(@NotNull final BuildRunnerContext hostContext,\r
182                                              @NotNull final File program,\r
183                                              @NotNull final Collection<String> argz,\r
184                                              @NotNull final File workingDir) throws RunBuildException {\r
185         return new BuildProcessBase() {\r
186           @NotNull\r
187           @Override\r
188           protected BuildFinishedStatus waitForImpl() throws RunBuildException {\r
189             GeneralCommandLine cmd = new GeneralCommandLine();\r
190             cmd.setExePath(program.getPath());\r
191             for (String arg : argz) {\r
192               cmd.addParameter(arg);\r
193             }\r
194             cmd.setWorkingDirectory(workingDir);\r
195 \r
196             System.out.println("Run: " + cmd.getCommandLineString());\r
197 \r
198             ExecResult result = SimpleCommandLineProcessRunner.runCommand(cmd, new byte[0]);\r
199 \r
200             System.out.println(result.getStdout());\r
201             System.out.println(result.getStderr());\r
202 \r
203             return result.getExitCode() == 0\r
204                     ? BuildFinishedStatus.FINISHED_SUCCESS\r
205                     : BuildFinishedStatus.FINISHED_FAILED;\r
206           }\r
207         };\r
208       }\r
209     };\r
210   }\r
211 }\r