+using System.Threading;\r
using NuGet;\r
using NuGet.Commands;\r
\r
[Command("TeamCity.Ping", "Command that dump NuGet and TeamCity extension versions. It is used to check NuGet<->TeamCity communications")]\r
public class NuGetTeamCityPingCommand : Command\r
{\r
+ [Option("Makes command wait for 1000ms before exit. Used for testing")]\r
+ public bool Sleep { get; set; }\r
+\r
public override void ExecuteCommand()\r
{\r
System.Console.Out.WriteLine("TeamCity NuGet Extension is available.");\r
System.Console.Out.WriteLine("NuGet Version = {0}", typeof(Command).Assembly.GetName().Version);\r
System.Console.Out.WriteLine("TeamCity Extension Version = {0}", GetType().Assembly.GetName().Version);\r
+ \r
+ if (Sleep)\r
+ {\r
+ Thread.Sleep(1000);\r
+ }\r
}\r
}\r
}
\ No newline at end of file
{\r
var m = new Mutex(false, "JetBrains.TeamCity.NuGet.RunMutex");\r
runner.BeforeNuGetStarted += (_, __) => m.WaitOne();\r
- runner.BeforeNuGetStarted += (_, __) => m.ReleaseMutex();\r
+ runner.AfterNuGetFinished += (_, __) => m.ReleaseMutex();\r
}\r
}\r
}
\ No newline at end of file
}\r
finally\r
{\r
- CallEvents(myFinishEvents);\r
+ CallEvents(Enumerable.Reverse(myFinishEvents));\r
}\r
}\r
\r
\feffusing System;\r
using System.IO;\r
+using System.Threading;\r
using NUnit.Framework;\r
+using System.Linq;\r
\r
namespace JetBrains.TeamCity.NuGet.Tests\r
{\r
.AssertNoErrorOutput()\r
.AssertOutputContains("TeamCity NuGet Extension is available.");\r
}\r
+\r
+ [Test]\r
+ public void TestCommands_RunConcurrently()\r
+ {\r
+ bool failed = false;\r
+ new[] {1, 2, 3, 4, 5, 6, 7}\r
+ .Select(\r
+ x => new Thread(() =>\r
+ {\r
+ for (int i = 0; i < 3; i++)\r
+ {\r
+ var proc = ProcessExecutor.ExecuteProcess(Files.NuGetRunnerExe, Files.NuGetExe, "TeamCity.Ping", "-Sleep");\r
+ if (proc.ExitCode != 0 || !string.IsNullOrWhiteSpace(proc.Error))\r
+ {\r
+ proc.Dump();\r
+ failed = true;\r
+ }\r
+ proc.AssertNoErrorOutput().AssertExitedSuccessfully();\r
+ }\r
+ })\r
+ {\r
+ Name = "Checker " + x,\r
+ })\r
+ .ToList()\r
+ .Select(\r
+ x =>\r
+ {\r
+ x.Start();\r
+ return x;\r
+ })\r
+ .ToList()\r
+ .Select(x =>\r
+ {\r
+ x.Join();\r
+ return 0;\r
+ })\r
+ .ToList();\r
+\r
+ Assert.IsFalse(failed);\r
+ }\r
+\r
}\r
}\r