Changes in v2.17

New Features
-----------------------------------------------

Introduced a new NCrunch attribute, 'DistributeByCapabilities'. When implemented on any assembly, fixture
or test, this attribute will split the test(s) into clones, with each clone representing a different
RequiredCapability as passed into the attribute constructor. This allows NCrunch distributed processing
to be easily used for multi-platform testing without needing to manually build new tests for each platform
use case.

Adjusted the status message for grid nodes in the grid management window so that they have a distinct
state when the engine is offline.

Boosted the memory limit for the x86 engine process from 2GB to 3GB.

Introduced the ability to specify a default license server address for the first-time launch of NCrunch
on a workspace. By placing a text file, 'LicenseServerAddress.txt' inside the NCrunch install
directory and placing the host/address of a known license server in this file, it is possible to have
the NCrunch client default to using the specified license server. This should make it easier to push
out installations of NCrunch automatically on large sites.

License Server: Added the ability to blacklist/whitelist users by Unique ID, Login Name, Machine Name
and IP Address. This can be used to control who has access to request tokens from the license server.

License Server: Added a feature to control how the license server identifies a user's Unique ID.
Normally, the Unique ID is a free text field provided by the client to the server. When the new feature
('Override user 'Unique IDs' with user Login Names for licensing') is enabled, the server will disregard
the client's Unique ID and instead will use the user's Login Name. This is a useful feature for
environments where all users are already logged into an active directory, and there are too many users
to efficiently educate on the way NCrunch uses Unique IDs.

License server: When using the new 'Override user 'Unique IDs' with user Login Names for licensing'
feature, the license server will prevent NCrunch v2.15 and v2.16 from requesting licenses, as these
versions do not provide Login Names to the license server. The license server also won't revoke tokens
for concurrent use when this feature is enabled.

License server: Added an option on the Statistics page to export all licenses and lease data to CSV
format.




Fixes and Compatibility Improvements
-----------------------------------------------

Added a new test adapter to support NUnit v3.

Updated Xunit to v2.1.

Fixed an issue that was preventing NCrunch from correctly capturing fixture execution times. This issue
had a serious impact on engine throughput and responsiveness.

Fixed an issue that was preventing NCrunch from correctly interpreting the results from Xunit2 FsCheck
properties.

Improved the handling of OutOfMemoryExceptions thrown in NCrunch's test environment when trying to process
test trace output.

Fixed an Xunit V2 integration issue that was preventing Xunit extensions from being loaded into the test
environment.

Fixed an issue that could cause grid connections to get stuck in a data exchange loop after certain changes
are made to a solution.

Fixed an issue where NCrunch was still queuing tests for projects that had experienced a load error. This
was creating downstream instability, including NullReferenceExceptions being thrown on grid nodes.

Improved NCrunch's handling of file locking issues around the upload of files to remote grid servers.
Previously, the engine would hang indefinitely waiting for the lock to be released. Now, NCrunch will
report this as a meaningful error in the Tests Window and will avoid copying the file to the remote server.

Fixed an issue where NCrunch was not correctly handling files encoded without a BOM.

Fixed an issue that could cause a metadata exception when trying to read/instrument some assemblies.

Added a warning for systems using early versions of .NET 4.6 under x64, where a serious GC performance
issue exists.

Added a warning message for situations where NCrunch detects multiple NUnit tests with the same name
inside the same project. NCrunch needs NUnit test names to be unique in order to interpret the results
of a test run, so this warning should be taken seriously.

Fixed an issue that could cause invalid grid node status values to be shown in the grid management window
after engine shutdown.

Disabled Roslyn's UseSharedCompilation setting for NCrunch builds. This setting causes the
VBCSCompiler.exe process to be spawned during builds, often without effective limits on the lifespan of
this process. To prevent grid node servers from being choked out by this process, it will no longer be
used for NCrunch builds.

Fixed an issue where NCrunch was not writing separators between step output inside XBehave test cases.

Included code analyzer assemblies in NCrunch's auto dependency resolution.

Introduced the automatic detection and resolution of build dependencies in NuGet packages. NCrunch
will now attempt to infer the existence of NuGet-related build dependencies through the presence of
MSBuild Imports pointing into the NuGet packages directory. Where a NuGet package is referenced with
a build import, NCrunch will automatically include ALL files in the NuGet package inside the workspace
for the project. This should alleviate the need for specifying many NuGet packages using the
'Additional files to include' setting, though there is a risk that NCrunch may include a number of
files from NuGet packages that are not actually required in the workspace, thus consuming more disk
space than otherwise necessary. This feature is controlled using the new
'Auto-detect NuGet build dependencies' project-level configuration setting, which defaults to TRUE.

Fixed a PDB custom metadata corruption issue caused by NCrunch's instrumentation.

License server: Fixed a race condition in the license management UI that could cause it to be
inoperable under certain conditions.

License Server: Fixed poor selection handling in the license management page.

License Server: Fixed an issue that could cause the license data file to be corrupted if the server was
shut down unexpectedly at an unlucky time.