TestModel PopulateTestTree(Assembly assembly)
    {
      TestModel testModel = new TestModel();

      var testFrameworkManager = RuntimeAccessor.ServiceLocator.Resolve<ITestFrameworkManager>();
      var logger = new MarkupStreamLogger(TestLog.Default);

      var testFrameworkSelector = new TestFrameworkSelector()
      {
        Filter = testFrameworkHandle => testFrameworkHandle.Id == TestFrameworkHandle.Id,
        FallbackMode = TestFrameworkFallbackMode.Strict
      };

      ITestDriver testDriver = testFrameworkManager.GetTestDriver(testFrameworkSelector, logger);

      var testIsolationProvider = (ITestIsolationProvider)RuntimeAccessor.ServiceLocator.ResolveByComponentId("Gallio.LocalTestIsolationProvider");
      var testIsolationOptions = new TestIsolationOptions();
      using (ITestIsolationContext testIsolationContext = testIsolationProvider.CreateContext(testIsolationOptions, logger))
      {
        var testPackage = new TestPackage();
        testPackage.AddFile(new FileInfo(AssemblyUtils.GetFriendlyAssemblyCodeBase(assembly)));
        var testExplorationOptions = new TestExplorationOptions();

        var messageSink = TestModelSerializer.CreateMessageSinkToPopulateTestModel(testModel);

        new LogProgressMonitorProvider(logger).Run(progressMonitor =>
        {
          testDriver.Explore(testIsolationContext, testPackage, testExplorationOptions,
            messageSink, progressMonitor);
        });
      }

      return testModel;
    }
Beispiel #2
0
        /// <summary>
        /// Creates a copy of the options.
        /// </summary>
        /// <returns>The copy.</returns>
        public TestIsolationOptions Copy()
        {
            TestIsolationOptions copy = new TestIsolationOptions();

            copy.properties.AddAll(properties);

            return(copy);
        }
        /// <inheritdoc />
        public ITestIsolationContext CreateContext(TestIsolationOptions testIsolationOptions, ILogger logger)
        {
            if (testIsolationOptions == null)
                throw new ArgumentNullException("testIsolationOptions");
            if (logger == null)
                throw new ArgumentNullException("logger");

            return CreateContextImpl(testIsolationOptions, logger);
        }
        public void CreateProcess_WhenAttachPropertyProvided_ReturnsExistingProcess()
        {
            processFinder.Processes = new[] { MockRepository.GenerateStub<IProcess>() };
            var options = new TestIsolationOptions();
            options.AddProperty("AcadAttachToExisting", "true");

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<ExistingAcadProcess>(process);
        }
        /// <inheritdoc />
        public ITestIsolationContext CreateContext(TestIsolationOptions testIsolationOptions, ILogger logger)
        {
            if (testIsolationOptions == null)
            {
                throw new ArgumentNullException("testIsolationOptions");
            }
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }

            return(CreateContextImpl(testIsolationOptions, logger));
        }
        public void CreateContext_ReturnsAnAcadTestIsolationContext()
        {
            var options = new TestIsolationOptions();
            var process = MockRepository.GenerateStub<IAcadProcess>();
            var processFactory = MockRepository.GenerateStub<IAcadProcessFactory>();
            processFactory.Stub(x => x.CreateProcess(Arg.Is(options))).Return(process);

            var provider = new AcadTestIsolationProvider(processFactory);

            var context = provider.CreateContext(options, logger);

            Assert.IsInstanceOfType<AcadTestIsolationContext>(context);
        }
        private static bool UseRemoting(TestIsolationOptions testIsolationOptions)
        {
            if (testIsolationOptions.Properties.ContainsKey("MessageSink"))
            {
                var messageSinkToUse = testIsolationOptions.Properties["MessageSink"];

                if (messageSinkToUse == "Remoting")
                    return true;

                throw new ArgumentException(string.Format("{0} is not a valid value for MessageSink", messageSinkToUse));
            }
            // HACK: this code gets executed both in and out of proc :(
            // it won't be necessary once all communication is via messaging
            return Process.GetCurrentProcess().ProcessName == "Gallio.Host";
        }
Beispiel #8
0
        /// <summary>
        /// Creates a hosted test isolation context.
        /// </summary>
        /// <param name="hostFactory">The host factory.</param>
        /// <param name="testIsolationOptions">The test isolation options.</param>
        /// <param name="logger">The logger.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="hostFactory"/>,
        /// <paramref name="testIsolationOptions"/> or <paramref name="logger"/> is null.</exception>
        public HostedTestIsolationContext(IHostFactory hostFactory,
                                          TestIsolationOptions testIsolationOptions, ILogger logger)
        {
            if (hostFactory == null)
            {
                throw new ArgumentNullException("hostFactory");
            }
            if (testIsolationOptions == null)
            {
                throw new ArgumentNullException("testIsolationOptions");
            }
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }

            this.hostFactory     = hostFactory;
            TestIsolationOptions = testIsolationOptions;
            this.logger          = logger;
        }
 /// <summary>
 /// Gets the right message sink for the runner, based on the test isolation options.
 /// </summary>
 /// <param name="testIsolationOptions">The test isolation options.</param>
 /// <param name="messageSink">The message sink to wrap.</param>
 /// <returns>An appropriate message sink for the runner.</returns>
 public static IMessageSink GetRunnerMessageSink(TestIsolationOptions testIsolationOptions, IMessageSink messageSink)
 {
     return UseRemoting(testIsolationOptions)
         ? messageSink
         : new AsyncTcpListenerMessageSink(messageSink, GetMessageFormatter(testIsolationOptions), GetPort(testIsolationOptions));
 }
        public void CreateProcess_WhenWorkingDirectoryPreferenceIsInvalid_ThrowsArgumentException()
        {
            preferenceManager.WorkingDirectory = new string(Path.GetInvalidPathChars());
            var options = new TestIsolationOptions();

            Assert.Throws<ArgumentException>(() => factory.CreateProcess(options));
        }
        public void CreateProcess_WhenUserSpecifiedExecutablePreferenceRefersToMissingFile_ThrowsFileNotFoundException()
        {
            preferenceManager.StartupAction = StartupAction.StartUserSpecified;
            preferenceManager.UserSpecifiedExecutable = @"c:\missing\path\to\acad.exe";
            var options = new TestIsolationOptions();

            Assert.Throws<FileNotFoundException>(() => factory.CreateProcess(options));
        }
        public void CreateProcess_WhenUserSpecifiedExecutablePreferenceIsNull_ThrowsArgumentException()
        {
            preferenceManager.StartupAction = StartupAction.StartUserSpecified;
            preferenceManager.UserSpecifiedExecutable = null;
            var options = new TestIsolationOptions();

            Assert.Throws<ArgumentException>(() => factory.CreateProcess(options));
        }
        public void CreateProcess_WhenStartupActionPreferenceIsStartMru_SetsFileName()
        {
            preferenceManager.StartupAction = StartupAction.StartMostRecentlyUsed;
            var options = new TestIsolationOptions();

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<CreatedAcadProcess>(process);
            Assert.AreEqual(@"c:\most\recently\used\acad.exe", ((CreatedAcadProcess)process).FileName);
        }
        public void CreateProcess_WhenCommandLineArgumentsPreferenceProvided_SetsProcessArguments()
        {
            preferenceManager.CommandLineArguments = "arguments";
            var options = new TestIsolationOptions();

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<CreatedAcadProcess>(process);
            Assert.AreEqual("arguments", ((CreatedAcadProcess)process).Arguments);
        }
 /// <inheritdoc />
 protected override ITestIsolationContext CreateContextImpl(TestIsolationOptions testIsolationOptions, ILogger logger)
 {
     return new PartCoverTestIsolationContext(testIsolationOptions, logger, runtime);
 }
        private List<Test> getTests(string assembly)
        {
            var testIsolationProvider = (ITestIsolationProvider)RuntimeAccessor.ServiceLocator.ResolveByComponentId("Gallio.LocalTestIsolationProvider");
            var testIsolationOptions = new TestIsolationOptions();
            ITestIsolationContext testIsolationContext = testIsolationProvider.CreateContext(testIsolationOptions, _logger);

            // Create a test package.
            // You can set a whole bunch of options here.
            var testPackage = new TestPackage();
            testPackage.AddFile(new FileInfo(assembly));
            testPackage.TestFrameworkFallbackMode = TestFrameworkFallbackMode.Strict;

            var testExplorationOptions = new TestExplorationOptions();

            // This query you can answer by exploring tests and looking at their metadata for "TestsOn".
            // You can explore tests using the Explore method of TestDriver. It sends a bunch of
            // messages to an IMessageSink just like Run.  Just scan these messages for tests that
            // match the pattern you like.

            // Alternately, you can build a TestModel once up front and traverse the resulting test tree
            // to find what you need.  The Explore method of testDriver is just like Run, except that
            // it does not run the tests.
            // TestModelSerializer is a little helper we can use to build up a TestModel from test messages on the fly.
            // The TestModel is just a tree of test metadata.  Pretty straightforward.
            TestModel testModel = new TestModel();
            IMessageSink messageSink = TestModelSerializer.CreateMessageSinkToPopulateTestModel(testModel);

            var logProgressMonitorProvider = new LogProgressMonitorProvider(_logger);

            logProgressMonitorProvider.Run((progressMonitor) =>
            {
                _testDriver.Explore(testIsolationContext, testPackage, testExplorationOptions, messageSink, progressMonitor);
            });

            return testModel.AllTests.Where(x => x.IsTestCase).ToList();
        }
        public IEnumerable<AutoTest.TestRunners.Shared.Results.TestResult> Run(RunSettings settings)
        {
            if (!_isInitialized)
                return new AutoTest.TestRunners.Shared.Results.TestResult[] { getNotInitializedResult(settings) };
            var tests = settings.Assembly.Tests.ToList();
            var members = settings.Assembly.Members.ToList();
            var namespaces = settings.Assembly.Namespaces.ToList();

            var runAll = namespaces.Count == 0 && members.Count == 0 && tests.Count == 0;
            var steps = new List<TestStepData>();
            var testResults = new List<AutoTest.TestRunners.Shared.Results.TestResult>();

            // Get a test isolation context.  Here we want to run tests in the same AppDomain.
            var testIsolationProvider = (ITestIsolationProvider)RuntimeAccessor.ServiceLocator.ResolveByComponentId("Gallio.LocalTestIsolationProvider");
            var testIsolationOptions = new TestIsolationOptions();
            ITestIsolationContext testIsolationContext = testIsolationProvider.CreateContext(testIsolationOptions, _logger);

            var testPackage = new TestPackage();
            testPackage.AddFile(new FileInfo(settings.Assembly.Assembly));
            testPackage.TestFrameworkFallbackMode = TestFrameworkFallbackMode.Strict;

            // Create some test exploration options.  Nothing interesting for you here, probably.
            var testExplorationOptions = new TestExplorationOptions();
            var messageSink = new MessageConsumer()
                .Handle<TestStepStartedMessage>((message) =>
                {
                    steps.Add(message.Step);
                })
                .Handle<TestStepFinishedMessage>(message =>
                {
                    var test = steps.FirstOrDefault(x => x.Id.Equals(message.StepId) && x.IsTestCase);
                    if (test == null)
                        return;
                    var fixture = string.Format("{0}.{1}", test.CodeReference.NamespaceName, steps.First(x => x.Id.Equals(test.ParentId)).Name);
                    testResults.Add(new AutoTest.TestRunners.Shared.Results.TestResult(
                        "MbUnit",
                        settings.Assembly.Assembly,
                        fixture,
                        message.Result.Duration.TotalMilliseconds,
                        string.Format("{0}.{1}", fixture, test.Name),
                        convertState(message.Result.Outcome.Status),
                        message.Result.Outcome.DisplayName));
                });

            // Provide a progress monitor.
            var logProgressMonitorProvider = new LogProgressMonitorProvider(_logger);
            var options = new TestExecutionOptions();
            options.FilterSet = new Gallio.Model.Filters.FilterSet<ITestDescriptor>(new OrFilter<ITestDescriptor>(getTestFilter(namespaces, members, tests)));

            // Run the tests.
            logProgressMonitorProvider.Run((progressMonitor) =>
            {
                _testDriver.Run(testIsolationContext, testPackage, testExplorationOptions, options, messageSink, progressMonitor);
            });

            return testResults;
        }
 private static int? GetPort(TestIsolationOptions testIsolationOptions)
 {
     return null;
 }
 private static IMessageFormatter GetMessageFormatter(TestIsolationOptions testIsolationOptions)
 {
     return new BinaryMessageFormatter();
 }
        public void CreateProcess_WhenExePropertyRefersToMissingFile_ThrowsFileNotFoundException()
        {
            var options = new TestIsolationOptions();
            options.AddProperty("AcadExePath", @"c:\path\to\missing\acad.exe");

            Assert.Throws<FileNotFoundException>(() => factory.CreateProcess(options));
        }
 /// <summary>
 /// Creates a test isolation context.
 /// </summary>
 /// <param name="testIsolationOptions">The test isolation options, not null.</param>
 /// <param name="logger">The logger, not null.</param>
 /// <returns>The test isolation context.</returns>
 protected abstract ITestIsolationContext CreateContextImpl(TestIsolationOptions testIsolationOptions, ILogger logger);
        public void CreateProcess_WhenMoreThanOneExistingProcess_AttachExisting_ThrowsNotSupportedException()
        {
            processFinder.Processes = new[]
                                          {
                                              MockRepository.GenerateStub<IProcess>(),
                                              MockRepository.GenerateStub<IProcess>()
                                          };
            var options = new TestIsolationOptions();
            options.AddProperty("AcadAttachToExisting", @"true");

            Assert.Throws<NotSupportedException>(() => factory.CreateProcess(options));
        }
 /// <summary>
 /// Creates a test isolation context.
 /// </summary>
 /// <param name="testIsolationOptions">The test isolation options, not null.</param>
 /// <param name="logger">The logger, not null.</param>
 /// <returns>The test isolation context.</returns>
 protected abstract ITestIsolationContext CreateContextImpl(TestIsolationOptions testIsolationOptions, ILogger logger);
        public void CreateProcess_WhenStartupActionPreferenceIsAttachToExisting_ReturnsExistingProcess()
        {
            processFinder.Processes = new[] { MockRepository.GenerateStub<IProcess>() };
            preferenceManager.StartupAction = StartupAction.AttachToExisting;
            var options = new TestIsolationOptions();

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<ExistingAcadProcess>(process);
        }
        /// <summary>
        /// Creates a copy of the options.
        /// </summary>
        /// <returns>The copy.</returns>
        public TestIsolationOptions Copy()
        {
            TestIsolationOptions copy = new TestIsolationOptions();
            copy.properties.AddAll(properties);

            return copy;
        }
        public void CreateProcess_WhenStartupActionPreferenceIsStartUserSpecified_SetsFileName()
        {
            preferenceManager.StartupAction = StartupAction.StartUserSpecified;
            preferenceManager.UserSpecifiedExecutable = @"c:\path\to\acad.exe";
            var options = new TestIsolationOptions();

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<CreatedAcadProcess>(process);
            Assert.AreEqual(@"c:\path\to\acad.exe", ((CreatedAcadProcess)process).FileName);
        }
 /// <inheritdoc />
 protected override ITestIsolationContext CreateContextImpl(TestIsolationOptions testIsolationOptions, ILogger logger)
 {
     return(new HostedTestIsolationContext(hostFactory, testIsolationOptions, logger));
 }
        public void CreateProcess_WhenUserSpecifiedExecutablePreferenceIsInvalid_ThrowsArgumentException()
        {
            preferenceManager.StartupAction = StartupAction.StartUserSpecified;
            preferenceManager.UserSpecifiedExecutable = new string(Path.GetInvalidPathChars());
            var options = new TestIsolationOptions();

            Assert.Throws<ArgumentException>(() => factory.CreateProcess(options));
        }
        public void CreateProcess_WhenExePropertyProvided_SetsProcessFileName()
        {
            var options = new TestIsolationOptions();
            options.AddProperty("AcadExePath", @"c:\path\to\acad.exe");

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<CreatedAcadProcess>(process);
            Assert.AreEqual(@"c:\path\to\acad.exe", ((CreatedAcadProcess)process).FileName);
        }
        public void CreateProcess_WhenWorkingDirectoryPreferenceProvided_SetsWorkingDirectory()
        {
            preferenceManager.WorkingDirectory = @"c:\working\dir\";
            var options = new TestIsolationOptions();

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<CreatedAcadProcess>(process);
            Assert.AreEqual(@"c:\working\dir\", ((CreatedAcadProcess)process).WorkingDirectory);
        }
        public void CreateProcess_WhenExePropertyProvided_OverridesPreferenceManager()
        {
            preferenceManager.StartupAction = StartupAction.AttachToExisting;
            var options = new TestIsolationOptions();
            options.AddProperty("AcadExePath", @"c:\path\to\acad.exe");

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<CreatedAcadProcess>(process);
            Assert.AreEqual(@"c:\path\to\acad.exe", ((CreatedAcadProcess)process).FileName);
        }
        public void CreateProcess_WhenWorkingDirectoryPreferenceRefersToMissingDirectory_ThrowsDirectoryNotFoundException()
        {
            preferenceManager.WorkingDirectory = @"c:\missing\dir\";
            var options = new TestIsolationOptions();

            Assert.Throws<DirectoryNotFoundException>(() => factory.CreateProcess(options));
        }
        public void CreateProcess_WhenExePropertyIsInvalid_ThrowsArgumentException()
        {
            var options = new TestIsolationOptions();
            options.AddProperty("AcadExePath", new string(Path.GetInvalidPathChars()));

            Assert.Throws<ArgumentException>(() => factory.CreateProcess(options));
        }
        public void CreateProcess_WhenAttachPropertyProvided_OverridesPreferenceManager()
        {
            processFinder.Processes = new[] { MockRepository.GenerateStub<IProcess>() };
            preferenceManager.StartupAction = StartupAction.StartMostRecentlyUsed;
            var options = new TestIsolationOptions();
            options.AddProperty("AcadAttachToExisting", @"true");

            var process = factory.CreateProcess(options);

            Assert.IsInstanceOfType<ExistingAcadProcess>(process);
        }
        /// <inheritdoc />
        public void Initialize(TestRunnerOptions testRunnerOptions, ILogger logger, IProgressMonitor progressMonitor)
        {
            if (testRunnerOptions == null)
                throw new ArgumentNullException("testRunnerOptions");
            if (logger == null)
                throw new ArgumentNullException("logger");
            if (progressMonitor == null)
                throw new ArgumentNullException("progressMonitor");

            ThrowIfDisposed();
            if (state != State.Created)
                throw new InvalidOperationException("The test runner has already been initialized.");

            testRunnerOptions = testRunnerOptions.Copy();

            this.testRunnerOptions = testRunnerOptions;
            tappedLogger = new TappedLogger(this, logger);

            int extensionCount = extensions.Count;
            using (progressMonitor.BeginTask("Initializing the test runner.", 1 + extensionCount))
            {
                foreach (ITestRunnerExtension extension in extensions)
                {
                    string extensionName = extension.GetType().Name; // TODO: improve me

                    progressMonitor.SetStatus(String.Format("Installing extension '{0}'.", extensionName));
                    try
                    {
                        // Note: We don't pass the tapped logger to the extensions because the
                        //       extensions frequently write to the console a bunch of information we
                        //       already have represented in the report.  We are more interested in what
                        //       the test driver has to tell us.
                        extension.Install(eventDispatcher, logger);
                        progressMonitor.Worked(1);
                    }
                    catch (Exception ex)
                    {
                        throw new RunnerException(String.Format("Failed to install extension '{0}'.", extensionName), ex);
                    }
                    progressMonitor.SetStatus("");
                }

                try
                {
                    UnhandledExceptionPolicy.ReportUnhandledException += OnUnhandledException;

                    eventDispatcher.NotifyInitializeStarted(new InitializeStartedEventArgs(testRunnerOptions));

                    progressMonitor.SetStatus("Initializing the test isolation context.");

                    TestIsolationOptions testIsolationOptions = new TestIsolationOptions();
                    GenericCollectionUtils.ForEach(testRunnerOptions.Properties, x => testIsolationOptions.AddProperty(x.Key, x.Value));
                    testIsolationContext = testIsolationProvider.CreateContext(testIsolationOptions, tappedLogger);

                    progressMonitor.Worked(1);
                }
                catch (Exception ex)
                {
                    eventDispatcher.NotifyInitializeFinished(new InitializeFinishedEventArgs(false));

                    UnhandledExceptionPolicy.ReportUnhandledException -= OnUnhandledException;

                    throw new RunnerException("A fatal exception occurred while initializing the test isolation context.", ex);
                }

                state = State.Initialized;
                eventDispatcher.NotifyInitializeFinished(new InitializeFinishedEventArgs(true));
            }
        }