DesignerSupportTests.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using System.Runtime.InteropServices;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using Avalonia.Remote.Protocol;
  13. using Avalonia.Remote.Protocol.Designer;
  14. using Xunit;
  15. using Xunit.Extensions;
  16. namespace Avalonia.DesignerSupport.Tests
  17. {
  18. public class DesignerSupportTests
  19. {
  20. private const string DesignerAppPath = "../../../../../src/tools/Avalonia.Designer.HostApp/bin/$BUILD/netcoreapp2.0/Avalonia.Designer.HostApp.dll";
  21. private readonly Xunit.Abstractions.ITestOutputHelper outputHelper;
  22. public DesignerSupportTests(Xunit.Abstractions.ITestOutputHelper outputHelper)
  23. {
  24. this.outputHelper = outputHelper;
  25. }
  26. [SkippableTheory,
  27. InlineData(
  28. @"..\..\..\..\..\tests/Avalonia.DesignerSupport.TestApp/bin/$BUILD/netcoreapp2.0/",
  29. "Avalonia.DesignerSupport.TestApp",
  30. "Avalonia.DesignerSupport.TestApp.dll",
  31. @"..\..\..\..\..\tests\Avalonia.DesignerSupport.TestApp\MainWindow.xaml"),
  32. InlineData(
  33. @"..\..\..\..\..\samples\ControlCatalog.NetCore\bin\$BUILD\netcoreapp2.0\",
  34. "ControlCatalog.NetCore",
  35. "ControlCatalog.dll",
  36. @"..\..\..\..\..\samples\ControlCatalog\MainWindow.xaml")]
  37. public async Task Designer_In_Win32_Mode_Should_Provide_Valid_Hwnd(
  38. string outputDir,
  39. string executableName,
  40. string assemblyName,
  41. string xamlFile)
  42. {
  43. Skip.IfNot(RuntimeInformation.IsOSPlatform(OSPlatform.Windows));
  44. var xaml = File.ReadAllText(xamlFile);
  45. string buildType;
  46. #if DEBUG
  47. buildType = "Debug";
  48. #else
  49. buildType = "Release";
  50. #endif
  51. outputDir = outputDir.Replace("$BUILD", buildType);
  52. var sessionId = Guid.NewGuid();
  53. long handle = 0;
  54. var resultMessageReceivedToken = new CancellationTokenSource();
  55. var tcpListener = new TcpListener(IPAddress.Loopback, 0);
  56. tcpListener.Start();
  57. var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port;
  58. tcpListener.Stop();
  59. var transport = new BsonTcpTransport();
  60. transport.Listen(IPAddress.Loopback, port, conn =>
  61. {
  62. conn.OnMessage += async (_, msg) =>
  63. {
  64. if (msg is StartDesignerSessionMessage start)
  65. {
  66. Assert.Equal(sessionId, Guid.Parse(start.SessionId));
  67. await conn.Send(new UpdateXamlMessage
  68. {
  69. AssemblyPath = Path.Combine(outputDir, assemblyName),
  70. Xaml = xaml
  71. });
  72. }
  73. else if (msg is UpdateXamlResultMessage result)
  74. {
  75. if (result.Error != null)
  76. outputHelper.WriteLine(result.Error);
  77. handle = result.Handle != null ? long.Parse(result.Handle) : 0;
  78. resultMessageReceivedToken.Cancel();
  79. conn.Dispose();
  80. }
  81. };
  82. });
  83. var cmdline =
  84. $"exec --runtimeconfig \"{outputDir}{executableName}.runtimeconfig.json\" --depsfile \"{outputDir}{executableName}.deps.json\" "
  85. + $" \"{DesignerAppPath.Replace("$BUILD", buildType)}\" "
  86. + $"--transport tcp-bson://127.0.0.1:{port}/ --session-id {sessionId} --method win32 \"{outputDir}{executableName}.dll\"";
  87. using (var proc = new Process
  88. {
  89. StartInfo = new ProcessStartInfo("dotnet", cmdline)
  90. {
  91. UseShellExecute = false,
  92. RedirectStandardOutput = true,
  93. RedirectStandardError = true,
  94. CreateNoWindow = true,
  95. },
  96. EnableRaisingEvents = true
  97. })
  98. {
  99. proc.Start();
  100. var cancelled = false;
  101. try
  102. {
  103. await Task.Delay(10000, resultMessageReceivedToken.Token);
  104. }
  105. catch (TaskCanceledException)
  106. {
  107. cancelled = true;
  108. }
  109. Assert.True(cancelled);
  110. Assert.NotEqual(0, handle);
  111. proc.Kill();
  112. proc.WaitForExit();
  113. }
  114. }
  115. }
  116. }