blob: 7d64825626dfb42dc093542c9952be80c16c6af5 [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@OnPlatform({'mac-os': Timeout.factor(2), 'windows': Timeout.factor(10)})
library;
import 'dart:convert';
import 'dart:io';
import 'package:code_assets/code_assets.dart';
import 'package:hooks/hooks.dart';
import 'package:test/test.dart';
import '../build_runner/helpers.dart';
import '../helpers.dart';
void main() async {
const name = 'native_dynamic_linking';
test(
'native_dynamic_linking build',
skip:
(Platform.isMacOS || Platform.isWindows) &&
Platform.environment['GITHUB_ACTIONS'] != null
? 'https://github.com/dart-lang/native/issues/2501'
: false,
() => inTempDir((tempUri) async {
final buildOutputUri = tempUri.resolve('build_output.json');
var outputDirectory = tempUri.resolve('out/');
await Directory.fromUri(outputDirectory).create();
final outputDirectoryShared = tempUri.resolve('out_shared/');
await Directory.fromUri(outputDirectoryShared).create();
final testTempUri = tempUri.resolve('test1/');
await Directory.fromUri(testTempUri).create();
final testPackageUri = testDataUri.resolve('$name/');
final dartUri = Uri.file(Platform.resolvedExecutable);
final targetOS = OS.current;
final inputBuilder = BuildInputBuilder()
..setupShared(
packageName: name,
packageRoot: testPackageUri,
outputFile: buildOutputUri,
outputDirectoryShared: outputDirectoryShared,
)
..config.setupBuild(linkingEnabled: false)
..addExtension(
CodeAssetExtension(
targetArchitecture: Architecture.current,
targetOS: targetOS,
macOS: targetOS == OS.macOS
? MacOSCodeConfig(targetVersion: defaultMacOSVersion)
: null,
linkModePreference: LinkModePreference.dynamic,
cCompiler: cCompiler,
),
);
final buildInputUri = testTempUri.resolve('build_input.json');
File.fromUri(
buildInputUri,
).writeAsStringSync(jsonEncode(inputBuilder.json));
outputDirectory = inputBuilder.build().outputDirectory;
await runPubGet(workingDirectory: testPackageUri, logger: logger);
final processResult = await Process.run(dartUri.toFilePath(), [
'hook/build.dart',
'--config=${buildInputUri.toFilePath()}',
], workingDirectory: testPackageUri.toFilePath());
if (processResult.exitCode != 0) {
print(processResult.stdout);
print(processResult.stderr);
print(processResult.exitCode);
}
expect(processResult.exitCode, 0);
final buildOutput = BuildOutput(
json.decode(await File.fromUri(buildOutputUri).readAsString())
as Map<String, Object?>,
);
final assets = buildOutput.assets.encodedAssets;
final dependencies = buildOutput.dependencies;
expect(assets.length, 3);
expect(await assets.allExist(), true);
expect(dependencies, [
testPackageUri.resolve('src/debug.c'),
testPackageUri.resolve('src/math.c'),
testPackageUri.resolve('src/add.c'),
]);
final addLibraryPath = assets
.where((e) => e.isCodeAsset)
.map(CodeAsset.fromEncoded)
.firstWhere((asset) => asset.id.endsWith('add.dart'))
.file!
.toFilePath();
final addResult = await runProcess(
executable: dartExecutable,
arguments: [
'run',
pkgNativeAssetsBuilderUri
.resolve('test/test_data/native_dynamic_linking_helper.dart')
.toFilePath(),
addLibraryPath,
'1',
'2',
],
environment: {
// Add the directory containing the linked dynamic libraries to
// the PATH so that the dynamic linker can find them.
// TODO(https://github.com/dart-lang/sdk/issues/56551): We could
// skip this if Dart would implicitly add dylib containing
// directories to the PATH.
if (Platform.isWindows)
'PATH':
'${outputDirectory.toFilePath()};'
'${Platform.environment['PATH']}',
},
throwOnUnexpectedExitCode: true,
logger: logger,
);
expect(
addResult.stdout,
allOf(contains('Adding 1 and 2.'), contains('Result: 3')),
);
}),
);
}
int defaultMacOSVersion = 13;