}
}
+ // If this is a single-file app, add the app's dir to the native search directories.
+ if (bundle::info_t::is_single_file_bundle() && !is_resources)
+ {
+ auto bundle = bundle::runner_t::app();
+ add_unique_path(asset_type, bundle->base_path(), &items, output, &non_serviced, core_servicing);
+
+ // Add the extraction path if it exists.
+ if (pal::directory_exists(bundle->extraction_path()))
+ {
+ add_unique_path(asset_type, bundle->extraction_path(), &items, output, &non_serviced, core_servicing);
+ }
+ }
+
output->append(non_serviced);
return true;
Console.WriteLine("AppContext.BaseDirectory: " + AppContext.BaseDirectory);
break;
+ case "native_search_dirs":
+ var native_search_dirs = AppContext.GetData("NATIVE_DLL_SEARCH_DIRECTORIES");
+ Console.WriteLine("NATIVE_DLL_SEARCH_DIRECTORIES: " + native_search_dirs);
+ break;
+
default:
Console.WriteLine("test failure");
return -1;
<RuntimeFrameworkVersion>$(MNAVersion)</RuntimeFrameworkVersion>
</PropertyGroup>
-</Project>
\ No newline at end of file
+ <ItemGroup>
+ <None Condition="'$(AddFile)' != ''" Include="$(AddFile)">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
+
+</Project>
RepoDirectories = new RepoDirectoriesProvider();
}
- public TestProjectFixture PreparePublishedSelfContainedTestProject(string projectName)
+ public TestProjectFixture PreparePublishedSelfContainedTestProject(string projectName, params string[] extraArgs)
{
var testFixture = new TestProjectFixture(projectName, RepoDirectories);
testFixture
.EnsureRestoredForRid(testFixture.CurrentRid, RepoDirectories.CorehostPackages)
.PublishProject(runtime: testFixture.CurrentRid,
- outputDirectory: BundleHelper.GetPublishPath(testFixture));
+ outputDirectory: BundleHelper.GetPublishPath(testFixture),
+ extraArgs: extraArgs);
return testFixture;
}
.HaveStdOutContaining(appPath);
}
+ [Fact]
+ public void AppContext_Native_Search_Dirs_Contains_Bundle_Dir()
+ {
+ var fixture = sharedTestState.TestFixture.Copy();
+ Bundler bundler = BundleHelper.BundleApp(fixture, out string singleFile);
+ string extractionDir = BundleHelper.GetExtractionDir(fixture, bundler).Name;
+ string bundleDir = BundleHelper.GetBundleDir(fixture).FullName;
+
+ // If we don't extract anything to disk, the extraction dir shouldn't
+ // appear in the native search dirs.
+ Command.Create(singleFile, "native_search_dirs")
+ .CaptureStdErr()
+ .CaptureStdOut()
+ .Execute()
+ .Should().Pass()
+ .And.HaveStdOutContaining(bundleDir)
+ .And.NotHaveStdOutContaining(extractionDir);
+ }
+
+ [Fact]
+ public void AppContext_Native_Search_Dirs_Contains_Bundle_And_Extraction_Dirs()
+ {
+ var fixture = sharedTestState.TestFixture.Copy();
+ Bundler bundler = BundleHelper.BundleApp(fixture, out string singleFile, BundleOptions.BundleNativeBinaries);
+ string extractionDir = BundleHelper.GetExtractionDir(fixture, bundler).Name;
+ string bundleDir = BundleHelper.GetBundleDir(fixture).FullName;
+
+ Command.Create(singleFile, "native_search_dirs")
+ .CaptureStdErr()
+ .CaptureStdOut()
+ .Execute()
+ .Should().Pass()
+ .And.HaveStdOutContaining(extractionDir)
+ .And.HaveStdOutContaining(bundleDir);
+ }
+
public class SharedTestState : SharedTestStateBase, IDisposable
{
public TestProjectFixture TestFixture { get; set; }
public SharedTestState()
{
- TestFixture = PreparePublishedSelfContainedTestProject("SingleFileApiTests");
+ // We include mockcoreclr in our project to test native binaries extraction.
+ string mockCoreClrPath = Path.Combine(RepoDirectories.Artifacts, "corehost_test",
+ RuntimeInformationExtensions.GetSharedLibraryFileNameForCurrentPlatform("mockcoreclr"));
+ TestFixture = PreparePublishedSelfContainedTestProject("SingleFileApiTests", $"/p:AddFile={mockCoreClrPath}");
}
public void Dispose()
bool? selfContained = null,
string outputDirectory = null,
bool singleFile = false,
- bool restore = false)
+ bool restore = false,
+ params string[] extraArgs)
{
dotnet = dotnet ?? SdkDotnet;
outputDirectory = outputDirectory ?? TestProject.OutputDirectory;
publishArgs.Add($"/p:TestTargetRid={RepoDirProvider.TargetRID}");
publishArgs.Add($"/p:MNAVersion={RepoDirProvider.MicrosoftNETCoreAppVersion}");
+ foreach (var arg in extraArgs)
+ {
+ publishArgs.Add(arg);
+ }
+
dotnet.Publish(publishArgs.ToArray())
.WorkingDirectory(TestProject.ProjectDirectory)
.Environment("NUGET_PACKAGES", RepoDirProvider.NugetPackages)