Skip to content

Commit 0479f6e

Browse files
authored
refactor: improved unit tests (#23)
* cmake unit tests use mock * add more cmake unit tests * add cmake install location search path test * add ninja unit tests * unit test: do not pull ANDROID_HOME from env var * update changelog ---------
1 parent 08d9003 commit 0479f6e

File tree

9 files changed

+1271
-51
lines changed

9 files changed

+1271
-51
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## 0.2.1
44

55
- support configuring cmake/ninja versions and android NDK version
6+
- mock cmake/ninja when testing
67

78
## 0.2.0
89

lib/src/builder/user_config.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ class UserConfig {
4040
String? androidHome,
4141
bool? preferAndroidCmake,
4242
bool? preferAndroidNinja,
43+
bool envVarAndroidHomeAsDefault = true,
4344
}) : preferAndroidCmake = preferAndroidCmake ?? targetOS == OS.android,
4445
preferAndroidNinja = preferAndroidNinja ?? targetOS == OS.android,
45-
androidHome = androidHome ?? Platform.environment['ANDROID_HOME'];
46+
androidHome = androidHome ?? (envVarAndroidHomeAsDefault ? Platform.environment['ANDROID_HOME'] : null);
4647

4748
UserConfig copyWith({
4849
OS? targetOS,

lib/src/native_toolchain/cmake.dart

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io';
44

55
import 'package:code_assets/code_assets.dart';
66
import 'package:logging/logging.dart';
7+
import 'package:meta/meta.dart';
78
import 'package:pub_semver/pub_semver.dart';
89

910
import '../builder/user_config.dart';
@@ -14,13 +15,16 @@ import '../tool/tool_resolver.dart';
1415
/// CMake.
1516
final cmake = Tool(name: 'CMake', defaultResolver: _CmakeResolver());
1617

18+
@visibleForTesting
19+
CliVersionResolver? unitTestCmakeAndroidResolver;
20+
@visibleForTesting
21+
CliVersionResolver? unitTestCmakeSystemResolver;
22+
1723
class _CmakeResolver implements ToolResolver {
1824
final executableName = OS.current.executableFileName('cmake');
1925

20-
@override
21-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
22-
// here, we always try to find android cmake first and filter out unsatisfied versions
23-
final androidResolver = CliVersionResolver(
26+
CliVersionResolver _getAndroidResolver({UserConfig? userConfig}) {
27+
return unitTestCmakeAndroidResolver ?? CliVersionResolver(
2428
wrappedResolver: ToolResolvers([
2529
InstallLocationResolver(
2630
toolName: 'CMake',
@@ -33,12 +37,22 @@ class _CmakeResolver implements ToolResolver {
3337
),
3438
]),
3539
);
36-
final androidCmakeInstances = await androidResolver.resolve(logger: logger);
37-
logger?.info('Found Android CMake: ${androidCmakeInstances.map((e) => e.toString()).join(', ')}');
40+
}
3841

39-
final systemResolver = CliVersionResolver(
42+
CliVersionResolver _getSystemResolver() {
43+
return unitTestCmakeSystemResolver ?? CliVersionResolver(
4044
wrappedResolver: PathToolResolver(toolName: 'CMake', executableName: 'cmake'),
4145
);
46+
}
47+
48+
@override
49+
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
50+
// here, we always try to find android cmake first and filter out unsatisfied versions
51+
final androidResolver = _getAndroidResolver(userConfig: userConfig);
52+
final androidCmakeInstances = await androidResolver.resolve(logger: logger);
53+
logger?.info('Found Android CMake: ${androidCmakeInstances.map((e) => e.toString()).join(', ')}');
54+
55+
final systemResolver = _getSystemResolver();
4256
final systemCmakeInstances = await systemResolver.resolve(logger: logger);
4357
logger?.info('Found System CMake: ${systemCmakeInstances.map((e) => e.toString()).join(', ')}');
4458

lib/src/native_toolchain/ninja.dart

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io';
44

55
import 'package:code_assets/code_assets.dart';
66
import 'package:logging/logging.dart';
7+
import 'package:meta/meta.dart';
78
import 'package:native_toolchain_cmake/src/tool/tool_instance.dart';
89
import 'package:pub_semver/pub_semver.dart';
910

@@ -13,12 +14,16 @@ import '../tool/tool_resolver.dart';
1314

1415
final ninja = Tool(name: 'Ninja', defaultResolver: _NinjaResolver());
1516

17+
@visibleForTesting
18+
CliVersionResolver? unitTestNinjaAndroidResolver;
19+
@visibleForTesting
20+
CliVersionResolver? unitTestNinjaSystemResolver;
21+
1622
class _NinjaResolver implements ToolResolver {
1723
final executableName = OS.current.executableFileName('ninja');
1824

19-
@override
20-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
21-
final androidResolver = CliVersionResolver(
25+
CliVersionResolver _getAndroidResolver({UserConfig? userConfig}) {
26+
return unitTestNinjaAndroidResolver ?? CliVersionResolver(
2227
wrappedResolver: ToolResolvers([
2328
InstallLocationResolver(
2429
toolName: 'Ninja',
@@ -31,12 +36,21 @@ class _NinjaResolver implements ToolResolver {
3136
),
3237
]),
3338
);
34-
final androidNinjaInstances = await androidResolver.resolve(logger: logger);
35-
logger?.info('Found Android Ninja: ${androidNinjaInstances.map((e) => e.toString()).join(', ')}');
39+
}
3640

37-
final systemResolver = CliVersionResolver(
41+
CliVersionResolver _getSystemResolver() {
42+
return unitTestNinjaSystemResolver ?? CliVersionResolver(
3843
wrappedResolver: PathToolResolver(toolName: 'Ninja', executableName: 'ninja'),
3944
);
45+
}
46+
47+
@override
48+
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
49+
final androidResolver = _getAndroidResolver(userConfig: userConfig);
50+
final androidNinjaInstances = await androidResolver.resolve(logger: logger);
51+
logger?.info('Found Android Ninja: ${androidNinjaInstances.map((e) => e.toString()).join(', ')}');
52+
53+
final systemResolver = _getSystemResolver();
4054
final systemNinjaInstances = await systemResolver.resolve(logger: logger);
4155
logger?.info('Found System Ninja: ${systemNinjaInstances.map((e) => e.toString()).join(', ')}');
4256

lib/src/tool/tool_resolver.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:code_assets/code_assets.dart';
99
import 'package:glob/glob.dart';
1010
import 'package:glob/list_local_fs.dart';
1111
import 'package:logging/logging.dart';
12+
import 'package:meta/meta.dart';
1213
import 'package:pub_semver/pub_semver.dart';
1314

1415
import '../builder/user_config.dart';
@@ -182,6 +183,9 @@ class InstallLocationResolver implements ToolResolver {
182183

183184
static const home = r'$HOME';
184185

186+
@visibleForTesting
187+
static Future<List<Uri>> Function(String)? unitTestTryResolvePath;
188+
185189
/// [userConfig] is ignored.
186190
@override
187191
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
@@ -203,6 +207,10 @@ class InstallLocationResolver implements ToolResolver {
203207
}
204208

205209
Future<List<Uri>> tryResolvePath(String path) async {
210+
if (unitTestTryResolvePath != null) {
211+
return unitTestTryResolvePath!(path);
212+
}
213+
206214
String pathNew = path;
207215
if (path.startsWith(home)) {
208216
final homeDir_ = homeDir;

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ dependencies:
2626
dev_dependencies:
2727
collection: ^1.19.1
2828
test: ^1.21.0
29+
mocktail: ^1.0.3

test/mock_components.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import 'package:mocktail/mocktail.dart';
2+
import 'package:native_toolchain_cmake/src/tool/tool_resolver.dart';
3+
4+
class MockCliVersionResolver extends Mock implements CliVersionResolver {}

0 commit comments

Comments
 (0)