blob: 7acbeeb1998b40c26c01d75101b9c229f005705f [file] [edit]
// Copyright (c) 2026, 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.
import 'package:code_assets/code_assets.dart';
import 'package:hooks/hooks.dart';
import 'package:native_toolchain_c/native_toolchain_c.dart';
import 'package:native_toolchain_c/src/cbuilder/logger.dart';
import 'package:test/test.dart';
import '../helpers.dart';
void main() {
test('createDefaultLogger logs info and warning records', () {
final defaultLogger = createDefaultLogger();
defaultLogger.info('test info message');
defaultLogger.warning(
'test warning message',
Exception('test exception'),
StackTrace.current,
);
});
test('CLibrary build and link with linkingEnabled: true', () async {
final tempUri = await tempDirForTest();
final tempUriShared = await tempDirForTest();
final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c');
final cLibrary = CLibrary(
name: 'add',
assetName: 'add.dart',
sources: [addCUri.toFilePath()],
);
final buildInputBuilder = BuildInputBuilder()
..setupShared(
packageName: 'testpackage',
packageRoot: tempUri,
outputFile: tempUri.resolve('output.json'),
outputDirectoryShared: tempUriShared,
)
..config.setupBuild(linkingEnabled: true)
..addExtension(
CodeAssetExtension(
targetOS: OS.current,
targetArchitecture: Architecture.current,
linkModePreference: LinkModePreference.dynamic,
cCompiler: cCompiler,
macOS: OS.current == OS.macOS
? MacOSCodeConfig(targetVersion: defaultMacOSVersion)
: null,
),
);
final buildInput = buildInputBuilder.build();
final buildOutputBuilder = BuildOutputBuilder();
await cLibrary.build(
input: buildInput,
output: buildOutputBuilder,
logger: logger,
defines: {'EXTRA_DEFINE': '1'},
);
final buildOutput = BuildOutput(buildOutputBuilder.json);
final buildEncodedAssets =
buildOutput.assets.encodedAssetsForLinking['testpackage']!;
expect(buildEncodedAssets, hasLength(1));
expect(
CodeAsset.fromEncoded(buildEncodedAssets.first).linkMode,
StaticLinking(),
);
final linkInputBuilder = LinkInputBuilder()
..setupShared(
packageName: 'testpackage',
packageRoot: tempUri,
outputFile: tempUri.resolve('link_output.json'),
outputDirectoryShared: tempUriShared,
)
..setupLink(
assets: buildEncodedAssets,
recordedUsesFile: null,
assetsFromLinking: [],
)
..addExtension(
CodeAssetExtension(
targetOS: OS.current,
targetArchitecture: Architecture.current,
linkModePreference: LinkModePreference.dynamic,
cCompiler: cCompiler,
macOS: OS.current == OS.macOS
? MacOSCodeConfig(targetVersion: defaultMacOSVersion)
: null,
),
);
final linkInput = linkInputBuilder.build();
final linkOutputBuilder = LinkOutputBuilder();
await cLibrary.link(
input: linkInput,
output: linkOutputBuilder,
logger: logger,
linkerOptions: LinkerOptions.treeshake(symbolsToKeep: ['add']),
);
final linkOutput = LinkOutput(linkOutputBuilder.json);
expect(linkOutput.assets.code, hasLength(1));
expect(linkOutput.assets.code.first.linkMode, DynamicLoadingBundled());
// Also test link without assetName filter
final cLibraryNoAssetName = CLibrary(
name: 'add',
sources: [addCUri.toFilePath()],
);
final linkOutputBuilder2 = LinkOutputBuilder();
await cLibraryNoAssetName.link(
input: linkInput,
output: linkOutputBuilder2,
logger: logger,
);
expect(LinkOutput(linkOutputBuilder2.json).assets.code, isEmpty);
});
test('CLibrary build with linkingEnabled: false', () async {
final tempUri = await tempDirForTest();
final tempUriShared = await tempDirForTest();
final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c');
final cLibrary = CLibrary(
name: 'add',
assetName: 'add.dart',
sources: [addCUri.toFilePath()],
);
final buildInputBuilder = BuildInputBuilder()
..setupShared(
packageName: 'testpackage',
packageRoot: tempUri,
outputFile: tempUri.resolve('output.json'),
outputDirectoryShared: tempUriShared,
)
..config.setupBuild(linkingEnabled: false)
..addExtension(
CodeAssetExtension(
targetOS: OS.current,
targetArchitecture: Architecture.current,
linkModePreference: LinkModePreference.dynamic,
cCompiler: cCompiler,
macOS: OS.current == OS.macOS
? MacOSCodeConfig(targetVersion: defaultMacOSVersion)
: null,
),
);
final buildInput = buildInputBuilder.build();
final buildOutputBuilder = BuildOutputBuilder();
await cLibrary.build(
input: buildInput,
output: buildOutputBuilder,
logger: logger,
);
final buildOutput = BuildOutput(buildOutputBuilder.json);
expect(buildOutput.assets.code, hasLength(1));
expect(buildOutput.assets.code.first.linkMode, DynamicLoadingBundled());
});
}