From cdc204284787db2751a65e1d0ac493c459cbafb5 Mon Sep 17 00:00:00 2001 From: song_zhifei Date: Fri, 25 Oct 2024 14:04:23 +0800 Subject: [PATCH 1/7] unitTest Signed-off-by: song_zhifei --- .../general.shard/ohos/hdc_server_test.dart | 35 +++++ .../test/general.shard/ohos/hvigor_test.dart | 142 ++++++++++++++++++ .../general.shard/ohos/hvigor_utils_test.dart | 35 +++++ 3 files changed, 212 insertions(+) create mode 100644 packages/flutter_tools/test/general.shard/ohos/hdc_server_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/hvigor_utils_test.dart diff --git a/packages/flutter_tools/test/general.shard/ohos/hdc_server_test.dart b/packages/flutter_tools/test/general.shard/ohos/hdc_server_test.dart new file mode 100644 index 0000000000..708cafc9bd --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/hdc_server_test.dart @@ -0,0 +1,35 @@ +import 'package:flutter_tools/src/ohos/hdc_server.dart'; +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; + +void main() { + group('hdc_server', () { + test('getHdcServer', () { + final String? result = getHdcServer(); + expect(result, null); + }); + + test('getHdcServerHost', () { + final String? result = getHdcServerHost(); + expect(result, null); + }); + + test('getHdcServerPort', () { + final String? result = getHdcServerPort(); + expect(result, '65037'); + }); + + test('getHdcCommandCompat', () { + final FakeOhosSdk sdk = FakeOhosSdk(); + final List result = getHdcCommandCompat(sdk, '0', ['0']); + expect(result, ['hdcPath', '-t', '0', '0']); + }); + }); +} + +class FakeOhosSdk extends Fake implements HarmonySdk { + @override + String? get hdcPath => 'hdcPath'; +} diff --git a/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart b/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart new file mode 100644 index 0000000000..8f7ca0354e --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart @@ -0,0 +1,142 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:file/file.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/process.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/flutter_manifest.dart'; +import 'package:flutter_tools/src/ohos/hvigor.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; + + +void main() { + + late FileSystem fs; + late FakeFlutterProject flutterProject; + late FakeFlutterManifest flutterManifest; + + setUp(() async { + fs = MemoryFileSystem.test(); + final Directory directory = fs.currentDirectory.childDirectory('app'); + flutterManifest = FakeFlutterManifest(); + flutterProject = FakeFlutterProject() + ..manifest = flutterManifest + ..directory = directory + ..flutterPluginsFile = directory.childFile('.flutter-plugins') + ..flutterPluginsDependenciesFile = directory.childFile('.flutter-plugins-dependencies') + ..ohos = FakeOhosProject(directory) + ..dartPluginRegistrant = directory.childFile('dart_plugin_registrant.dart'); + flutterProject.directory.childFile('.packages').createSync(recursive: true); + }); + + + group('hvigor_test', () { + test('getProjectAssetsPath', () { + final String result = getProjectAssetsPath('test',flutterProject.ohos); + expect(result, r'/app\src/main/resources/rawfile\flutter_assets'); + }); + + test('getDatPath', () { + final String result = getDatPath('test',flutterProject.ohos); + expect(result, r'/app\src/main/resources/rawfile\flutter_assets\icudtl.dat'); + }); + + test('getAppSoPath', () { + final String result = getAppSoPath('test',OhosArch.arm64_v8a,flutterProject.ohos); + expect(result, r'/app\libs\arm64-v8a\libapp.so'); + }); + + test('getHvigorwPath', () { + final String result = getHvigorwPath('test'); + expect(result, 'hvigorw'); + }); + + test('getAbsolutePath', () { + final String result = getAbsolutePath(flutterProject,'test'); + expect(result, r'/app\test'); + }); + + test('hvigorwTask', () async { + final int result = await hvigorwTask([''], processUtils: FakeProcessUtils(), workPath: 'workPath', hvigorwPath: 'hvigorwPath',); + expect(result, 0); + }); + + test('assembleHap', () async { + final int result = await assembleHap(processUtils: FakeProcessUtils(), ohosRootPath: 'ohosRootPath', hvigorwPath: 'hvigorwPath', flavor: 'flavor', buildMode: 'buildMode',); + expect(result, 0); + }); + + test('assembleApp', () async { + final int result = await assembleApp(processUtils: FakeProcessUtils(), ohosRootPath: 'ohosRootPath', hvigorwPath: 'hvigorwPath', flavor: 'flavor', buildMode: 'buildMode',); + expect(result, 0); + }); + }); +} + +class FakeProcessUtils extends Fake implements ProcessUtils { + + @override + RunResult runSync(List cmd, {bool throwOnError = false, bool verboseExceptions = false, RunResultChecker? allowedFailures, bool hideStdout = false, String? workingDirectory, Map? environment, bool allowReentrantFlutter = false, Encoding encoding = systemEncoding}) { + final RunResult runResult = RunResult(ProcessResult(0,0,'1','1'), cmd); + return runResult; + } +} + +class FakeOhosProject extends Fake implements OhosProject{ + FakeOhosProject(this.directory); + + Directory directory; + + @override + Directory get flutterModuleDirectory => directory; +} + +class FakeFlutterManifest extends Fake implements FlutterManifest { + @override + Set dependencies = {}; +} + +class FakeFlutterProject extends Fake implements FlutterProject { + @override + bool isModule = false; + + @override + late FlutterManifest manifest; + + @override + late Directory directory; + + @override + late File flutterPluginsFile; + + @override + late File flutterPluginsDependenciesFile; + + @override + late File dartPluginRegistrant; + + @override + late IosProject ios; + + @override + late AndroidProject android; + + @override + late WebProject web; + + @override + late MacOSProject macos; + + @override + late LinuxProject linux; + + @override + late OhosProject ohos; + + @override + late WindowsProject windows; +} diff --git a/packages/flutter_tools/test/general.shard/ohos/hvigor_utils_test.dart b/packages/flutter_tools/test/general.shard/ohos/hvigor_utils_test.dart new file mode 100644 index 0000000000..69fbba6e2b --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/hvigor_utils_test.dart @@ -0,0 +1,35 @@ + +import 'dart:convert'; + +import 'package:file/file.dart'; +import 'package:flutter_tools/src/convert.dart'; +import 'package:flutter_tools/src/ohos/hvigor_utils.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; + +void main() { + group('hvigor_utils', () { + test('getFlavor', () { + final String result = getFlavor(FakeFile('path'),null); + expect(result, 'default'); + }); + }); +} + +class FakeFile extends Fake implements File { + FakeFile(this.path); + + @override + final String path; + + @override + bool existsSync() { + return true; + } + + @override + String readAsStringSync({Encoding encoding = utf8ForTesting}) { + throw const FileSystemException('', '', OSError('', 13)); // EACCES error on linux + } +} -- Gitee From 2b330b05b63ac84ad6320f95cc2a5d7a830cb5c6 Mon Sep 17 00:00:00 2001 From: haoxuchao Date: Sat, 26 Oct 2024 16:48:14 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=96=B0=E5=A2=9EohosBuilder=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: haoxuchao --- .../permeable/build_app_test.dart | 81 +++++++ .../permeable/build_har_test.dart | 205 +++++++++++++++++ .../permeable/build_hsp_test.dart | 206 ++++++++++++++++++ .../flutter_tools/test/src/ohos_common.dart | 56 +++++ 4 files changed, 548 insertions(+) create mode 100644 packages/flutter_tools/test/commands.shard/permeable/build_app_test.dart create mode 100644 packages/flutter_tools/test/commands.shard/permeable/build_har_test.dart create mode 100644 packages/flutter_tools/test/commands.shard/permeable/build_hsp_test.dart create mode 100644 packages/flutter_tools/test/src/ohos_common.dart diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_app_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_app_test.dart new file mode 100644 index 0000000000..0ee01a5d99 --- /dev/null +++ b/packages/flutter_tools/test/commands.shard/permeable/build_app_test.dart @@ -0,0 +1,81 @@ +// Copyright 2014 The Flutter Authors. 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:args/command_runner.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/commands/build_app.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/ohos/ohos_builder.dart'; +import 'package:flutter_tools/src/reporting/reporting.dart'; + +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/ohos_common.dart'; +import '../../src/test_flutter_command_runner.dart'; + +void main() { + Cache.disableLocking(); + + group('Usage', () { + late Directory tempDir; + late TestUsage testUsage; + + setUp(() { + testUsage = TestUsage(); + tempDir = globals.fs.systemTempDirectory + .createTempSync('flutter_tools_packages_test.'); + }); + + tearDown(() { + tryToDelete(tempDir); + }); + + testUsingContext('indicate the project name', () async { + final String projectPath = await createProject(tempDir, + arguments: ['--no-pub', '--template=app']); + final BuildAppCommand command = await runBuildAppCommand(projectPath); + + expect(command.name, 'app'); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('logs success', () async { + final String projectPath = await createProject(tempDir, + arguments: ['--no-pub', '--template=app']); + + await runBuildAppCommand(projectPath); + + expect( + testUsage.events, + contains( + const TestUsageEvent( + 'tool-command-result', + 'app', + label: 'success', + ), + )); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + Usage: () => testUsage, + }); + }); +} + +Future runBuildAppCommand( + String target, { + List? arguments, +}) async { + final BuildAppCommand command = BuildAppCommand(logger: BufferLogger.test()); + final CommandRunner runner = createTestCommandRunner(command); + await runner.run([ + 'app', + ...?arguments, + '--no-pub', + globals.fs.path.join(target, 'lib', 'main.dart'), + ]); + return command; +} diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_har_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_har_test.dart new file mode 100644 index 0000000000..029caf20f9 --- /dev/null +++ b/packages/flutter_tools/test/commands.shard/permeable/build_har_test.dart @@ -0,0 +1,205 @@ +// Copyright 2014 The Flutter Authors. 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:args/command_runner.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/commands/build_har.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/ohos/ohos_builder.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:flutter_tools/src/reporting/reporting.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/test_flutter_command_runner.dart'; + +void main() { + Cache.disableLocking(); + + Future runCommandIn(String target, + {List? arguments}) async { + final BuildHarCommand command = BuildHarCommand( + logger: BufferLogger.test(), + verboseHelp: false, + ); + final CommandRunner runner = createTestCommandRunner(command); + await runner.run([ + 'har', + '--no-pub', + ...?arguments, + globals.fs.path.join(target, 'lib', 'main.dart'), + ]); + return command; + } + + group('Usage', () { + late Directory tempDir; + late TestUsage testUsage; + + setUp(() { + testUsage = TestUsage(); + tempDir = globals.fs.systemTempDirectory + .createTempSync('flutter_tools_packages_test.'); + }); + + tearDown(() { + tryToDelete(tempDir); + }); + + testUsingContext('indicate the ReportNullSafety attribute of the project', + () async { + final String projectPath = await createProject(tempDir, + arguments: ['--no-pub', '--template=module']); + + final BuildHarCommand command = await runCommandIn(projectPath); + expect(command.reportNullSafety, false); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('indicate the supported attribute of the project', + () async { + final String projectPath = await createProject(tempDir, + arguments: [ + '--no-pub', + '--template=module', + '--project-name=har_test' + ]); + + final BuildHarCommand command = await runCommandIn(projectPath); + expect(command.supported, true); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('indicate the project name attribute', () async { + final String projectPath = await createProject(tempDir, + arguments: ['--no-pub', '--template=module']); + + final BuildHarCommand command = await runCommandIn(projectPath, + arguments: ['--target-platform=ohos-arm']); + expect(command.name, 'har'); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('logs success', () async { + final String projectPath = + await createProject(tempDir, arguments: ['--no-pub']); + + await runCommandIn(projectPath, + arguments: ['--target-platform=ohos-arm']); + + expect( + testUsage.events, + contains( + const TestUsageEvent( + 'tool-command-result', + 'har', + label: 'success', + ), + )); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + Usage: () => testUsage, + }); + }); + + group('flag parsing', () { + late Directory tempDir; + late FakeOhosBuilder fakeOhosBuilder; + + setUp(() { + fakeOhosBuilder = FakeOhosBuilder(); + tempDir = globals.fs.systemTempDirectory + .createTempSync('flutter_tools_build_aar_test.'); + }); + + tearDown(() { + tryToDelete(tempDir); + }); + + testUsingContext('defaults', () async { + final String projectPath = + await createProject(tempDir, arguments: ['--no-pub']); + await runCommandIn(projectPath); + + final List buildModes = []; + + final BuildInfo buildInfo = fakeOhosBuilder.ohosBuildInfo.buildInfo; + buildModes.add(buildInfo.mode); + if (buildInfo.mode.isPrecompiled) { + expect(buildInfo.treeShakeIcons, isTrue); + expect(buildInfo.trackWidgetCreation, isTrue); + } else { + expect(buildInfo.treeShakeIcons, isFalse); + expect(buildInfo.trackWidgetCreation, isTrue); + } + expect(buildInfo.flavor, isNull); + expect(buildInfo.splitDebugInfoPath, isNull); + expect(buildInfo.dartObfuscation, isFalse); + expect(fakeOhosBuilder.ohosBuildInfo.targetArchs, + [OhosArch.arm64_v8a]); + + expect(buildModes.length, 1); + expect(buildModes, containsAll([BuildMode.release])); + }, overrides: { + OhosBuilder: () => fakeOhosBuilder, + }); + + testUsingContext('parses flags', () async { + final String projectPath = + await createProject(tempDir, arguments: ['--no-pub']); + await runCommandIn( + projectPath, + arguments: [ + '--target-platform', + 'ohos-x86', + '--tree-shake-icons', + '--flavor', + 'free', + '--split-debug-info', + '/project-name/v1.2.3/', + '--obfuscate', + '--dart-define=foo=bar', + ], + ); + + final OhosBuildInfo ohosBuildInfo = fakeOhosBuilder.ohosBuildInfo; + expect(ohosBuildInfo.targetArchs, [OhosArch.x86_64]); + + final BuildInfo buildInfo = ohosBuildInfo.buildInfo; + expect(buildInfo.mode, BuildMode.release); + expect(buildInfo.treeShakeIcons, isTrue); + expect(buildInfo.flavor, 'free'); + expect(buildInfo.splitDebugInfoPath, '/project-name/v1.2.3/'); + expect(buildInfo.dartObfuscation, isTrue); + expect(buildInfo.dartDefines.contains('foo=bar'), isTrue); + expect(buildInfo.nullSafetyMode, NullSafetyMode.sound); + }, overrides: { + OhosBuilder: () => fakeOhosBuilder, + }); + }); +} + +class FakeOhosBuilder extends Fake implements OhosBuilder { + late FlutterProject project; + late OhosBuildInfo ohosBuildInfo; + late String target; + + @override + Future buildHar({ + required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target, + }) async { + this.project = project; + this.ohosBuildInfo = ohosBuildInfo; + this.target = target; + } +} diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_hsp_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_hsp_test.dart new file mode 100644 index 0000000000..0d42922310 --- /dev/null +++ b/packages/flutter_tools/test/commands.shard/permeable/build_hsp_test.dart @@ -0,0 +1,206 @@ +// Copyright 2014 The Flutter Authors. 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:args/command_runner.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/commands/build_hsp.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/ohos/ohos_builder.dart'; +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:flutter_tools/src/reporting/reporting.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/test_flutter_command_runner.dart'; + +void main() { + Cache.disableLocking(); + + Future runCommandIn(String target, + {List? arguments}) async { + final BuildHspCommand command = BuildHspCommand( + logger: BufferLogger.test(), + verboseHelp: false, + ); + final CommandRunner runner = createTestCommandRunner(command); + await runner.run([ + 'hsp', + '--no-pub', + ...?arguments, + globals.fs.path.join(target, 'lib', 'main.dart'), + ]); + return command; + } + + group('Usage', () { + late Directory tempDir; + late TestUsage testUsage; + + setUp(() { + testUsage = TestUsage(); + tempDir = globals.fs.systemTempDirectory + .createTempSync('flutter_tools_packages_test.'); + }); + + tearDown(() { + tryToDelete(tempDir); + }); + + testUsingContext('indicate the ReportNullSafety attribute of the project', () async { + final String projectPath = await createProject(tempDir, + arguments: ['--no-pub', '--template=module']); + + final BuildHspCommand command = await runCommandIn(projectPath); + expect((await command.name), 'hsp'); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('indicate the supported attribute of the project', () async { + final String projectPath = await createProject(tempDir, + arguments: [ + '--no-pub', + '--template=module', + '--project-name=hsp_test' + ]); + + final BuildHspCommand command = await runCommandIn(projectPath); + expect((await command.name), 'hsp'); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('indicate the project name attribute', () async { + final String projectPath = await createProject(tempDir, + arguments: ['--no-pub', '--template=module']); + + final BuildHspCommand command = await runCommandIn(projectPath, + arguments: ['--target-platform=ohos-arm']); + expect((await command.name), 'hsp'); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + }); + + testUsingContext('logs success', () async { + final String projectPath = + await createProject(tempDir, arguments: ['--no-pub']); + + await runCommandIn(projectPath, + arguments: ['--target-platform=ohos-arm']); + + expect( + testUsage.events, + contains( + const TestUsageEvent( + 'tool-command-result', + 'hsp', + label: 'success', + ), + )); + }, overrides: { + OhosBuilder: () => FakeOhosBuilder(), + Usage: () => testUsage, + }); + }); + + group('flag parsing', () { + late Directory tempDir; + late FakeOhosBuilder fakeOhosBuilder; + + setUp(() { + fakeOhosBuilder = FakeOhosBuilder(); + tempDir = globals.fs.systemTempDirectory + .createTempSync('flutter_tools_build_hsp_test.'); + }); + + tearDown(() { + tryToDelete(tempDir); + }); + + testUsingContext('defaults', () async { + final String projectPath = + await createProject(tempDir, arguments: ['--no-pub']); + await runCommandIn(projectPath); + + final List buildModes = []; + + final BuildInfo buildInfo = fakeOhosBuilder.ohosBuildInfo.buildInfo; + buildModes.add(buildInfo.mode); + if (buildInfo.mode.isPrecompiled) { + expect(buildInfo.treeShakeIcons, isTrue); + expect(buildInfo.trackWidgetCreation, isTrue); + } else { + expect(buildInfo.treeShakeIcons, isFalse); + expect(buildInfo.trackWidgetCreation, isTrue); + } + expect(buildInfo.flavor, isNull); + expect(buildInfo.splitDebugInfoPath, isNull); + expect(buildInfo.dartObfuscation, isFalse); + expect(fakeOhosBuilder.ohosBuildInfo.targetArchs, + [OhosArch.arm64_v8a]); + + expect(buildModes.length, 1); + expect(buildModes, containsAll([BuildMode.release])); + }, overrides: { + OhosBuilder: () => fakeOhosBuilder, + }); + + testUsingContext('parses flags', () async { + final String projectPath = + await createProject(tempDir, arguments: ['--no-pub']); + await runCommandIn( + projectPath, + arguments: [ + '--target-platform', + 'ohos-x86', + '--tree-shake-icons', + '--flavor', + 'free', + '--split-debug-info', + '/project-name/v1.2.3/', + '--obfuscate', + '--dart-define=foo=bar', + ], + ); + + final OhosBuildInfo ohosBuildInfo = fakeOhosBuilder.ohosBuildInfo; + expect(ohosBuildInfo.targetArchs, [OhosArch.x86_64]); + + final BuildInfo buildInfo = ohosBuildInfo.buildInfo; + expect(buildInfo.mode, BuildMode.release); + expect(buildInfo.treeShakeIcons, isTrue); + expect(buildInfo.flavor, 'free'); + expect(buildInfo.splitDebugInfoPath, '/project-name/v1.2.3/'); + expect(buildInfo.dartObfuscation, isTrue); + expect(buildInfo.dartDefines.contains('foo=bar'), isTrue); + expect(buildInfo.nullSafetyMode, NullSafetyMode.sound); + }, overrides: { + OhosBuilder: () => fakeOhosBuilder, + }); + }); +} + +class FakeOhosBuilder extends Fake implements OhosBuilder { + late FlutterProject project; + late OhosBuildInfo ohosBuildInfo; + late String target; + + @override + Future buildHsp({ + required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target, + }) async { + this.project = project; + this.ohosBuildInfo = ohosBuildInfo; + this.target = target; + } +} + +class FakeOhosSdk extends Fake implements HarmonySdk {} diff --git a/packages/flutter_tools/test/src/ohos_common.dart b/packages/flutter_tools/test/src/ohos_common.dart new file mode 100644 index 0000000000..25196765aa --- /dev/null +++ b/packages/flutter_tools/test/src/ohos_common.dart @@ -0,0 +1,56 @@ +// Copyright 2014 The Flutter Authors. 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:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/ohos/ohos_builder.dart'; +import 'package:flutter_tools/src/project.dart'; + +/// A fake implementation of [OhosBuilder]. +class FakeOhosBuilder implements OhosBuilder { + @override + Future buildApp( + {required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target}) async {} + + @override + Future buildHap( + {required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target}) async {} + + @override + Future buildHar( + {required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target}) async {} + + @override + Future buildHsp( + {required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target}) async {} +} + +/// Creates a [FlutterProject] in a directory named [flutter_project] +/// within [directoryOverride]. +class FakeFlutterProjectFactory extends FlutterProjectFactory { + FakeFlutterProjectFactory(this.directoryOverride) + : assert(directoryOverride != null), + super( + fileSystem: globals.fs, + logger: globals.logger, + ); + + final Directory directoryOverride; + + @override + FlutterProject fromDirectory(Directory _) { + projects.clear(); + return super + .fromDirectory(directoryOverride.childDirectory('flutter_project')); + } +} -- Gitee From 1af7a92820e476ec56c2f9f71ff9bb61f2480093 Mon Sep 17 00:00:00 2001 From: qiao_jianqiang Date: Sat, 26 Oct 2024 17:19:25 +0800 Subject: [PATCH 3/7] add unit test --- .../build_system/targets/ohos_test.dart | 339 ++++++++++++++++++ .../ohos/ohos_device_discovery_test.dart | 198 ++++++++++ .../general.shard/ohos/ohos_doctor_test.dart | 98 +++++ .../ohos/ohos_plugins_manager_test.dart | 141 ++++++++ .../general.shard/ohos/ohos_sdk_test.dart | 173 +++++++++ .../ohos/ohos_workflow_test.dart | 112 ++++++ 6 files changed, 1061 insertions(+) create mode 100644 packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart new file mode 100644 index 0000000000..a781544807 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart @@ -0,0 +1,339 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:file/memory.dart'; +import 'package:file_testing/file_testing.dart'; +import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/ohos.dart'; +import 'package:flutter_tools/src/convert.dart'; + +import '../../../src/common.dart'; +import '../../../src/context.dart'; +import '../../../src/fake_process_manager.dart'; + +void main() { + late FakeProcessManager processManager; + late FileSystem fileSystem; + late Artifacts artifacts; + late Logger logger; + + setUp(() { + logger = BufferLogger.test(); + fileSystem = MemoryFileSystem.test(); + processManager = FakeProcessManager.empty(); + artifacts = Artifacts.test(); + }); + + testUsingContext('debug bundle contains expected resources', () async { + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'debug', + }, + processManager: processManager, + artifacts: artifacts, + fileSystem: fileSystem, + logger: logger, + ); + environment.buildDir.createSync(recursive: true); + + // create pre-requisites. + environment.buildDir.childFile('app.dill').writeAsStringSync('abcd'); + fileSystem + .file(artifacts.getArtifactPath(Artifact.vmSnapshotData, + mode: BuildMode.debug)) + .createSync(recursive: true); + fileSystem + .file(artifacts.getArtifactPath(Artifact.isolateSnapshotData, + mode: BuildMode.debug)) + .createSync(recursive: true); + + await const DebugOhosApplication().build(environment); + + expect( + fileSystem + .file(fileSystem.path + .join('out', 'flutter_assets', 'isolate_snapshot_data')) + .existsSync(), + true); + expect( + fileSystem + .file(fileSystem.path + .join('out', 'flutter_assets', 'vm_snapshot_data')) + .existsSync(), + true); + expect( + fileSystem + .file(fileSystem.path + .join('out', 'flutter_assets', 'kernel_blob.bin')) + .existsSync(), + true); + }); + + testUsingContext('debug bundle contains expected resources with bundle SkSL', + () async { + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'debug', + }, + inputs: { + kBundleSkSLPath: 'bundle.sksl', + }, + processManager: processManager, + artifacts: artifacts, + fileSystem: fileSystem, + logger: logger, + engineVersion: '2', + ); + environment.buildDir.createSync(recursive: true); + fileSystem.file('bundle.sksl').writeAsStringSync(json.encode( + { + 'engineRevision': '2', + 'platform': 'ohos', + 'data': { + 'A': 'B', + }, + }, + )); + + // create pre-requisites. + environment.buildDir.childFile('app.dill').writeAsStringSync('abcd'); + fileSystem + .file(artifacts.getArtifactPath(Artifact.vmSnapshotData, + mode: BuildMode.debug)) + .createSync(recursive: true); + fileSystem + .file(artifacts.getArtifactPath(Artifact.isolateSnapshotData, + mode: BuildMode.debug)) + .createSync(recursive: true); + await const DebugOhosApplication().build(environment); + + expect( + fileSystem.file(fileSystem.path + .join('out', 'flutter_assets', 'isolate_snapshot_data')), + exists); + expect( + fileSystem.file( + fileSystem.path.join('out', 'flutter_assets', 'vm_snapshot_data')), + exists); + expect( + fileSystem.file( + fileSystem.path.join('out', 'flutter_assets', 'kernel_blob.bin')), + exists); + expect( + fileSystem.file(fileSystem.path + .join('out', 'flutter_assets', 'io.flutter.shaders.json')), + exists); + }); + + testUsingContext('OhosAot can build provided target platform', () async { + processManager = FakeProcessManager.empty(); + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'release', + }, + artifacts: artifacts, + processManager: processManager, + fileSystem: fileSystem, + logger: logger, + ); + processManager.addCommand(FakeCommand( + command: [ + artifacts.getArtifactPath( + Artifact.genSnapshot, + platform: TargetPlatform.ohos_arm64, + mode: BuildMode.release, + ), + '--deterministic', + '--snapshot_kind=app-aot-elf', + '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', + '--strip', + environment.buildDir.childFile('app.dill').path, + ], + )); + environment.buildDir.createSync(recursive: true); + environment.buildDir.childFile('app.dill').createSync(); + environment.projectDir.childFile('.packages').writeAsStringSync('\n'); + const OhosAot ohosAot = + OhosAot(TargetPlatform.ohos_arm64, BuildMode.release); + + await ohosAot.build(environment); + + expect(processManager, hasNoRemainingExpectations); + }); + + testUsingContext('OhosAot provide code size information.', () async { + processManager = FakeProcessManager.empty(); + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'release', + kCodeSizeDirectory: 'code_size_1', + }, + artifacts: artifacts, + processManager: processManager, + fileSystem: fileSystem, + logger: logger, + ); + processManager.addCommand(FakeCommand( + command: [ + artifacts.getArtifactPath( + Artifact.genSnapshot, + platform: TargetPlatform.ohos_arm64, + mode: BuildMode.release, + ), + '--deterministic', + '--write-v8-snapshot-profile-to=code_size_1/snapshot.arm64-v8a.json', + '--trace-precompiler-to=code_size_1/trace.arm64-v8a.json', + '--snapshot_kind=app-aot-elf', + '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', + '--strip', + environment.buildDir.childFile('app.dill').path, + ], + )); + environment.buildDir.createSync(recursive: true); + environment.buildDir.childFile('app.dill').createSync(); + environment.projectDir.childFile('.packages').writeAsStringSync('\n'); + const OhosAot ohosAot = + OhosAot(TargetPlatform.ohos_arm64, BuildMode.release); + + await ohosAot.build(environment); + + expect(processManager, hasNoRemainingExpectations); + }); + + testUsingContext('kExtraGenSnapshotOptions passes values to gen_snapshot', + () async { + processManager = FakeProcessManager.empty(); + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'release', + kExtraGenSnapshotOptions: 'foo,bar,baz=2', + kTargetPlatform: 'ohos-arm', + }, + processManager: processManager, + artifacts: artifacts, + fileSystem: fileSystem, + logger: logger, + ); + processManager.addCommand(FakeCommand( + command: [ + artifacts.getArtifactPath( + Artifact.genSnapshot, + platform: TargetPlatform.ohos_arm64, + mode: BuildMode.release, + ), + '--deterministic', + 'foo', + 'bar', + 'baz=2', + '--snapshot_kind=app-aot-elf', + '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', + '--strip', + environment.buildDir.childFile('app.dill').path, + ], + )); + environment.buildDir.createSync(recursive: true); + environment.buildDir.childFile('app.dill').createSync(); + environment.projectDir.childFile('.packages').writeAsStringSync('\n'); + + await const OhosAot(TargetPlatform.ohos_arm64, BuildMode.release) + .build(environment); + }); + + testUsingContext( + '--no-strip in kExtraGenSnapshotOptions suppresses --strip gen_snapshot flag', + () async { + processManager = FakeProcessManager.empty(); + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'release', + kExtraGenSnapshotOptions: 'foo,--no-strip,bar', + kTargetPlatform: 'ohos-arm', + }, + processManager: processManager, + artifacts: artifacts, + fileSystem: fileSystem, + logger: logger, + ); + processManager.addCommand(FakeCommand( + command: [ + artifacts.getArtifactPath( + Artifact.genSnapshot, + platform: TargetPlatform.ohos_arm64, + mode: BuildMode.release, + ), + '--deterministic', + 'foo', + 'bar', + '--snapshot_kind=app-aot-elf', + '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', + environment.buildDir.childFile('app.dill').path, + ], + )); + environment.buildDir.createSync(recursive: true); + environment.buildDir.childFile('app.dill').createSync(); + environment.projectDir.childFile('.packages').writeAsStringSync('\n'); + + await const OhosAot(TargetPlatform.ohos_arm64, BuildMode.release) + .build(environment); + }); + + testWithoutContext('ohos aot bundle copies so from abi directory', () async { + final Environment environment = Environment.test( + fileSystem.currentDirectory, + outputDir: fileSystem.directory('out')..createSync(), + defines: { + kBuildMode: 'release', + }, + processManager: processManager, + artifacts: artifacts, + fileSystem: fileSystem, + logger: logger, + ); + environment.buildDir.createSync(recursive: true); + const OhosAot ohosAot = + OhosAot(TargetPlatform.ohos_arm64, BuildMode.release); + const OhosAotBundle ohosAotBundle = OhosAotBundle(ohosAot); + // Create required files. + environment.buildDir + .childDirectory('arm64-v8a') + .childFile('app.so') + .createSync(recursive: true); + + await ohosAotBundle.build(environment); + + expect( + environment.outputDir + .childDirectory('arm64-v8a') + .childFile('app.so') + .existsSync(), + true); + }); +} diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart new file mode 100644 index 0000000000..6eff65a75f --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart @@ -0,0 +1,198 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/user_messages.dart'; +import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/ohos/ohos_device_discovery.dart'; +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; +import 'package:flutter_tools/src/ohos/ohos_workflow.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; +import '../../src/fake_process_manager.dart'; +import '../../src/fakes.dart'; + +void main() { + late OhosWorkflow ohosWorkflow; + + setUp(() { + ohosWorkflow = OhosWorkflow( + ohosSdk: FakeOhosSdk(), + featureFlags: TestFeatureFlags(), + ); + }); + + testWithoutContext('OhosDevices returns empty device list on null hdc', + () async { + final OhosDevices ohosDevices = OhosDevices( + ohosSdk: FakeOhosSdk(null), + logger: BufferLogger.test(), + ohosWorkflow: OhosWorkflow( + ohosSdk: FakeOhosSdk(null), + featureFlags: TestFeatureFlags(), + ), + processManager: FakeProcessManager.empty(), + fileSystem: MemoryFileSystem.test(), + platform: FakePlatform(), + userMessages: UserMessages(), + ); + + expect(await ohosDevices.pollingGetDevices(), isEmpty); + }); + + testWithoutContext( + 'OhosDevices returns empty device list when hdc cannot be run', () async { + final FakeProcessManager fakeProcessManager = FakeProcessManager.empty(); + fakeProcessManager.excludedExecutables.add('hdc'); + final OhosDevices ohosDevices = OhosDevices( + ohosSdk: FakeOhosSdk(), + logger: BufferLogger.test(), + ohosWorkflow: OhosWorkflow( + ohosSdk: FakeOhosSdk(), + featureFlags: TestFeatureFlags(), + ), + processManager: fakeProcessManager, + fileSystem: MemoryFileSystem.test(), + platform: FakePlatform(), + userMessages: UserMessages(), + ); + + expect(await ohosDevices.pollingGetDevices(), isEmpty); + expect(fakeProcessManager, hasNoRemainingExpectations); + }); + + testWithoutContext('OhosDevices returns empty device list on null Ohos SDK', + () async { + final OhosDevices ohosDevices = OhosDevices( + logger: BufferLogger.test(), + ohosWorkflow: OhosWorkflow( + ohosSdk: FakeOhosSdk(null), + featureFlags: TestFeatureFlags(), + ), + processManager: FakeProcessManager.empty(), + fileSystem: MemoryFileSystem.test(), + platform: FakePlatform(), + userMessages: UserMessages(), + ); + + expect(await ohosDevices.pollingGetDevices(), isEmpty); + }); + + testWithoutContext('OhosDevices throwsToolExit on failing hdc', () { + final ProcessManager processManager = FakeProcessManager.list([ + const FakeCommand( + command: ['hdc', '-t', '', 'list', 'targets'], + exitCode: 1, + ), + ]); + final OhosDevices ohosDevices = OhosDevices( + ohosSdk: FakeOhosSdk(), + logger: BufferLogger.test(), + ohosWorkflow: ohosWorkflow, + processManager: processManager, + fileSystem: MemoryFileSystem.test(), + platform: FakePlatform(), + userMessages: UserMessages(), + ); + + expect(ohosDevices.pollingGetDevices(), + throwsToolExit(message: RegExp('Unable to run "hdc"'))); + }); + + testWithoutContext('OhosDevices is disabled if feature is disabled', () { + final OhosDevices ohosDevices = OhosDevices( + ohosSdk: FakeOhosSdk(), + logger: BufferLogger.test(), + ohosWorkflow: OhosWorkflow( + ohosSdk: FakeOhosSdk(), + featureFlags: TestFeatureFlags( + isOhosEnabled: false, + ), + ), + processManager: FakeProcessManager.any(), + fileSystem: MemoryFileSystem.test(), + platform: FakePlatform(), + userMessages: UserMessages(), + ); + + expect(ohosDevices.supportsPlatform, false); + }); + + testWithoutContext('OhosDevices can parse output for physical devices', + () async { + final OhosDevices ohosDevices = OhosDevices( + userMessages: UserMessages(), + ohosWorkflow: ohosWorkflow, + ohosSdk: FakeOhosSdk(), + logger: BufferLogger.test(), + processManager: FakeProcessManager.list([ + const FakeCommand( + command: ['hdc', '-t', '', 'list', 'targets'], + stdout: ''' + 23E0223C05031918 (mobile) + ''', + ), + ]), + platform: FakePlatform(), + fileSystem: MemoryFileSystem.test(), + ); + + final List devices = await ohosDevices.pollingGetDevices(); + + expect(devices, hasLength(1)); + expect(devices.first.name, '23E0223C05031918 (mobile)'); + expect(devices.first.category, Category.mobile); + }); + + testWithoutContext( + 'OhosDevices can parse output for emulators and short listings', + () async { + final OhosDevices ohosDevices = OhosDevices( + userMessages: UserMessages(), + ohosWorkflow: ohosWorkflow, + ohosSdk: FakeOhosSdk(), + logger: BufferLogger.test(), + processManager: FakeProcessManager.list([ + const FakeCommand( + command: ['hdc', '-t', '', 'list', 'targets'], + stdout: ''' + localhost:36790 + 0149947A0D01500C + emulator-5612 + ''', + ), + ]), + platform: FakePlatform(), + fileSystem: MemoryFileSystem.test(), + ); + + final List devices = await ohosDevices.pollingGetDevices(); + + expect(devices, hasLength(3)); + expect(devices[0].name, 'localhost:36790'); + expect(devices[1].name, '0149947A0D01500C'); + expect(devices[2].name, 'emulator-5612'); + }); +} + +class FakeOhosSdk extends Fake implements OhosSdk { + FakeOhosSdk([this.hdcPath = 'hdc']); + + @override + final String? hdcPath; +} diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart new file mode 100644 index 0000000000..18e56df191 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart @@ -0,0 +1,98 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/config.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/user_messages.dart'; +import 'package:flutter_tools/src/doctor_validator.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/ohos/ohos_doctor.dart'; +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; + +import '../../src/common.dart'; +import '../../src/context.dart'; + +void main() { + late Logger logger; + late MemoryFileSystem fileSystem; + late FakeProcessManager processManager; + late Config config; + + setUp(() { + config = Config.test(); + fileSystem = MemoryFileSystem.test(); + logger = BufferLogger.test(); + FakeCommand command = FakeCommand(command: ['ohpm', '--version']); + FakeCommand command2 = FakeCommand(command: ['node', '--version']); + FakeCommand command3 = FakeCommand(command: ['where', 'hvigorw']); + processManager = FakeProcessManager.list([command, command2, command3]); + }); + + group('ohos doctor', () { + testUsingContext('validate ohos tools', () async { + final Directory sdkDir = createSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final OhosSdk sdk = OhosSdk.localOhosSdk()!; + final ValidationResult validationResult = await OhosValidator( + ohosSdk: sdk, + fileSystem: fileSystem, + logger: logger, + processManager: processManager, + platform: FakePlatform()..operatingSystem = 'windows', + userMessages: UserMessages(), + ).validate(); + expect(validationResult.type, ValidationType.installed); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + }); +} + +void _createSdkFile(Directory dir, String filePath, {String? contents}) { + final File file = dir.childFile(filePath); + file.createSync(recursive: true); + if (contents != null) { + file.writeAsStringSync(contents, flush: true); + } +} + +Directory createSdkDirectory({ + bool withLicenses = false, + required FileSystem fileSystem, +}) { + final Directory dir = + fileSystem.systemTempDirectory.createTempSync('flutter_mock_ohos_sdk.'); + final String exe = globals.platform.isWindows ? '.exe' : ''; + + void createDir(Directory dir, String path) { + final Directory directory = + dir.fileSystem.directory(dir.fileSystem.path.join(dir.path, path)); + directory.createSync(recursive: true); + } + + if (withLicenses) { + createDir(dir, 'licenses'); + } + createDir(dir, '10'); + createDir(dir, '12'); + _createSdkFile(dir, '10/toolchains/hdc$exe'); + _createSdkFile(dir, '12/toolchains/hdc$exe'); + return dir; +} diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart new file mode 100644 index 0000000000..995c841df1 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:json5/json5.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; +import '../../src/context.dart'; + +void main() { + late MemoryFileSystem fileSystem; + + setUp(() { + fileSystem = MemoryFileSystem.test(); + }); + + testUsingContext('checkOhosPluginsDependencies', () async { + final Directory dir = createDirectory(fileSystem: fileSystem); + await checkOhosPluginsDependencies(dir, fileSystem); + File packageFile = dir.childFile('ohos/oh-package.json5'); + final String packageConfig = packageFile.readAsStringSync(); + final Map config = + JSON5.parse(packageConfig) as Map; + final Map dependenciesData = + config['dependencies'] as Map; + expect('file:./har/fluttertest.har', dependenciesData['fluttertest']); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + }); + + testUsingContext('addPluginsModules', () async { + final Directory dir = createDirectory(fileSystem: fileSystem); + await addPluginsModules(dir, fileSystem); + File buildFile = dir.childFile('ohos/build-profile.json5'); + final String buildConfig = buildFile.readAsStringSync(); + final Map config = + JSON5.parse(buildConfig) as Map; + final Map targetsData = + config['modules']['targets'] as Map; + expect('entry', config['modules']['name']); + expect('./entry', config['modules']['srcPath']); + expect('default', targetsData['name']); + expect(['default'], targetsData['applyToProducts']); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + }); + + testUsingContext('addFlutterModuleAndPluginsSrcOverrides', () async { + final Directory dir = createDirectory(fileSystem: fileSystem); + await addFlutterModuleAndPluginsSrcOverrides(dir, fileSystem); + File packageFile = dir.childFile('ohos/oh-package.json5'); + final String packageConfig = packageFile.readAsStringSync(); + final Map config = + JSON5.parse(packageConfig) as Map; + final Map overridesData = + config['overrides'] as Map; + expect('file:./har/fluttertest.har', overridesData['ohos/flutter_test']); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + }); +} + +class FakeFlutterProject extends Fake implements FlutterProject {} + +Future checkOhosPluginsDependencies( + Directory directory, MemoryFileSystem fileSystem) async { + createDir(directory, 'ohos'); + final Map dataObj = {}; + final Map dependenciesData = {}; + dependenciesData['fluttertest'] = 'file:./har/fluttertest.har'; + dataObj['dependencies'] = dependenciesData; + final String jsonData = JSON5.stringify(dataObj); + createFile(directory, 'ohos/oh-package.json5', contents: jsonData); +} + +Future addPluginsModules( + Directory directory, MemoryFileSystem fileSystem) async { + createDir(directory, 'ohos'); + final Map dataObj = {}; + final Map modulesData = {}; + final Map tempObj = {}; + tempObj['name'] = 'default'; + tempObj['applyToProducts'] = ['default']; + modulesData['name'] = 'entry'; + modulesData['srcPath'] = './entry'; + modulesData['targets'] = tempObj; + dataObj['modules'] = modulesData; + final String jsonData = JSON5.stringify(dataObj); + createFile(directory, 'ohos/build-profile.json5', contents: jsonData); +} + +Future addFlutterModuleAndPluginsSrcOverrides( + Directory directory, MemoryFileSystem fileSystem) async { + createDir(directory, 'ohos'); + final Map dataObj = {}; + final Map overridesData = {}; + overridesData['ohos/flutter_test'] = 'file:./har/fluttertest.har'; + dataObj['overrides'] = overridesData; + final String jsonData = JSON5.stringify(dataObj); + createFile(directory, 'ohos/oh-package.json5', contents: jsonData); +} + +void createFile(Directory dir, String filePath, {String? contents}) { + final File file = dir.childFile(filePath); + file.createSync(recursive: true); + if (contents != null) { + file.writeAsStringSync(contents, flush: true); + } +} + +void createDir(Directory dir, String path) { + final Directory directory = + dir.fileSystem.directory(dir.fileSystem.path.join(dir.path, path)); + directory.createSync(recursive: true); +} + +Directory createDirectory({ + required FileSystem fileSystem, +}) { + final Directory dir = + fileSystem.systemTempDirectory.createTempSync('flutter_mock.'); + return dir; +} diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart new file mode 100644 index 0000000000..be35b19053 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/config.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; +import 'package:json5/json5.dart'; + +import '../../src/common.dart'; +import '../../src/context.dart'; + +void main() { + late MemoryFileSystem fileSystem; + late Config config; + + setUp(() { + fileSystem = MemoryFileSystem.test(); + config = Config.test(); + }); + + group('HmosSdk', () { + testUsingContext('parse hmos sdk', () { + final Directory sdkDir = createHmosSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final HmosSdk sdk = HmosSdk.localHmosSdk()!; + + expect(sdk.apiAvailable, isNotNull); + expect(sdk.apiAvailable, ['12:default']); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + + testUsingContext('get hdc path', () { + final Directory sdkDir = createHmosSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final HmosSdk sdk = HmosSdk.localHmosSdk()!; + + expect(sdk.hdcPath, isNotNull); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + + testUsingContext('valid directory', () { + final Directory sdkDir = createHmosSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final HmosSdk sdk = HmosSdk.localHmosSdk()!; + + expect(sdk.isValidDirectory, isTrue); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + }); + + group('OhosSdk', () { + testUsingContext('parse ohos sdk', () { + final Directory sdkDir = createSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final OhosSdk sdk = OhosSdk.localOhosSdk()!; + + expect(sdk.apiAvailable, isNotNull); + expect(sdk.apiAvailable, ['12:12', '10:10']); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + + testUsingContext('get hdc path', () { + final Directory sdkDir = createSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final OhosSdk sdk = OhosSdk.localOhosSdk()!; + + expect(sdk.hdcPath, isNotNull); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + + testUsingContext('valid directory', () { + final Directory sdkDir = createSdkDirectory(fileSystem: fileSystem); + config.setValue('ohos-sdk', sdkDir.path); + final OhosSdk sdk = OhosSdk.localOhosSdk()!; + + expect(sdk.isValidDirectory, isTrue); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Config: () => config, + }); + }); + + test('isNumeric', () { + expect(HarmonySdk.isNumeric('12'), isTrue); + }); +} + +void _createSdkFile(Directory dir, String filePath, {String? contents}) { + final File file = dir.childFile(filePath); + file.createSync(recursive: true); + if (contents != null) { + file.writeAsStringSync(contents, flush: true); + } +} + +Directory createHmosSdkDirectory({ + required FileSystem fileSystem, +}) { + final Directory dir = + fileSystem.systemTempDirectory.createTempSync('flutter_mock_ohos_sdk.'); + final String exe = globals.platform.isWindows ? '.exe' : ''; + + void createDir(Directory dir, String path) { + final Directory directory = + dir.fileSystem.directory(dir.fileSystem.path.join(dir.path, path)); + directory.createSync(recursive: true); + } + + createDir(dir, 'default/hms'); + final Map sdkPkg = {}; + final Map dataObj = {}; + dataObj['version'] = '5.0.0.68'; + dataObj['apiVersion'] = '12'; + sdkPkg['data'] = dataObj; + final String jsonData = JSON5.stringify(sdkPkg); + _createSdkFile(dir, 'default/sdk-pkg.json', contents: jsonData); + _createSdkFile(dir, 'default/openharmony/toolchains/hdc$exe'); + return dir; +} + +Directory createSdkDirectory({ + bool withLicenses = false, + required FileSystem fileSystem, +}) { + final Directory dir = + fileSystem.systemTempDirectory.createTempSync('flutter_mock_ohos_sdk.'); + final String exe = globals.platform.isWindows ? '.exe' : ''; + + void createDir(Directory dir, String path) { + final Directory directory = + dir.fileSystem.directory(dir.fileSystem.path.join(dir.path, path)); + directory.createSync(recursive: true); + } + + if (withLicenses) { + createDir(dir, 'licenses'); + } + createDir(dir, '10'); + createDir(dir, '12'); + _createSdkFile(dir, '10/toolchains/hdc$exe'); + _createSdkFile(dir, '12/toolchains/hdc$exe'); + return dir; +} diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart new file mode 100644 index 0000000000..6e6e326269 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; +import 'package:flutter_tools/src/ohos/ohos_workflow.dart'; +import 'package:test/fake.dart'; + +import '../../src/common.dart'; +import '../../src/fakes.dart'; + +void main() { + testWithoutContext('OhosWorkflow handles a null OhosSDK', () { + final OhosWorkflow ohosWorkflow = OhosWorkflow( + featureFlags: TestFeatureFlags(), + ohosSdk: null, + ); + + expect(ohosWorkflow.canLaunchDevices, false); + expect(ohosWorkflow.canListDevices, false); + expect(ohosWorkflow.canListEmulators, false); + }); + + testWithoutContext('OhosWorkflow handles a null hdc', () { + final FakeOhosSdk ohosSdk = FakeOhosSdk(); + ohosSdk.hdcPath = null; + final OhosWorkflow ohosWorkflow = OhosWorkflow( + featureFlags: TestFeatureFlags(), + ohosSdk: ohosSdk, + ); + + expect(ohosWorkflow.canLaunchDevices, false); + expect(ohosWorkflow.canListDevices, false); + expect(ohosWorkflow.canListEmulators, false); + }); + + testWithoutContext('Support for Ohos SDK on Linux Arm Hosts', () { + final FakeOhosSdk ohosSdk = FakeOhosSdk(); + ohosSdk.hdcPath = null; + final OhosWorkflow ohosWorkflow = OhosWorkflow( + featureFlags: TestFeatureFlags(isOhosEnabled: true), + ohosSdk: ohosSdk, + ); + + expect(ohosWorkflow.appliesToHostPlatform, isTrue); + expect(ohosWorkflow.canLaunchDevices, isFalse); + expect(ohosWorkflow.canListDevices, isFalse); + expect(ohosWorkflow.canListEmulators, isFalse); + }); + + testWithoutContext('OhosWorkflow is disabled if feature is disabled', () { + final FakeOhosSdk ohosSdk = FakeOhosSdk(); + ohosSdk.hdcPath = null; + final OhosWorkflow ohosWorkflow = OhosWorkflow( + featureFlags: TestFeatureFlags(isOhosEnabled: false), + ohosSdk: ohosSdk, + ); + + expect(ohosWorkflow.appliesToHostPlatform, false); + expect(ohosWorkflow.canLaunchDevices, false); + expect(ohosWorkflow.canListDevices, false); + expect(ohosWorkflow.canListEmulators, false); + }); + + testWithoutContext('OhosWorkflow cannot list emulators if hdcPath is null', + () { + final FakeOhosSdk ohosSdk = FakeOhosSdk(); + ohosSdk.hdcPath = null; + final OhosWorkflow ohosWorkflow = OhosWorkflow( + featureFlags: TestFeatureFlags(isOhosEnabled: true), + ohosSdk: ohosSdk, + ); + + expect(ohosWorkflow.appliesToHostPlatform, true); + expect(ohosWorkflow.canLaunchDevices, false); + expect(ohosWorkflow.canListDevices, false); + expect(ohosWorkflow.canListEmulators, false); + }); + + testWithoutContext('OhosWorkflow can list emulators', () { + final FakeOhosSdk ohosSdk = FakeOhosSdk(); + ohosSdk.hdcPath = 'path/to/hdc'; + final OhosWorkflow ohosWorkflow = OhosWorkflow( + featureFlags: TestFeatureFlags(isOhosEnabled: true), + ohosSdk: ohosSdk, + ); + + expect(ohosWorkflow.appliesToHostPlatform, true); + expect(ohosWorkflow.canLaunchDevices, true); + expect(ohosWorkflow.canListDevices, true); + expect(ohosWorkflow.canListEmulators, true); + }); +} + +class FakeOhosSdk extends Fake implements OhosSdk { + @override + String sdkPath = ''; + + @override + String? hdcPath; +} -- Gitee From 07ddbdcf4f218899fd39cda84c74435b11516ec3 Mon Sep 17 00:00:00 2001 From: qiao_jianqiang Date: Sat, 26 Oct 2024 17:30:08 +0800 Subject: [PATCH 4/7] modify copyright --- .../build_system/targets/ohos_test.dart | 17 +++-------------- .../ohos/ohos_device_discovery_test.dart | 17 +++-------------- .../general.shard/ohos/ohos_doctor_test.dart | 17 +++-------------- .../ohos/ohos_plugins_manager_test.dart | 17 +++-------------- .../test/general.shard/ohos/ohos_sdk_test.dart | 17 +++-------------- .../general.shard/ohos/ohos_workflow_test.dart | 17 +++-------------- 6 files changed, 18 insertions(+), 84 deletions(-) diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart index a781544807..2a700d7b4e 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/ohos_test.dart @@ -1,17 +1,6 @@ -/* -* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +// Copyright 2014 The Flutter Authors. 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:file/memory.dart'; import 'package:file_testing/file_testing.dart'; diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart index 6eff65a75f..30ee9f805f 100644 --- a/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_device_discovery_test.dart @@ -1,17 +1,6 @@ -/* -* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +// Copyright 2014 The Flutter Authors. 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:file/memory.dart'; import 'package:flutter_tools/src/base/logger.dart'; diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart index 18e56df191..81c0b6dbf9 100644 --- a/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_doctor_test.dart @@ -1,17 +1,6 @@ -/* -* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +// Copyright 2014 The Flutter Authors. 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:file/memory.dart'; import 'package:flutter_tools/src/base/config.dart'; diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart index 995c841df1..c9fded5257 100644 --- a/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_plugins_manager_test.dart @@ -1,17 +1,6 @@ -/* -* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +// Copyright 2014 The Flutter Authors. 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:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart index be35b19053..9dd1d16f49 100644 --- a/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_sdk_test.dart @@ -1,17 +1,6 @@ -/* -* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +// Copyright 2014 The Flutter Authors. 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:file/memory.dart'; import 'package:flutter_tools/src/base/config.dart'; diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart index 6e6e326269..cd934a215b 100644 --- a/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_workflow_test.dart @@ -1,17 +1,6 @@ -/* -* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +// Copyright 2014 The Flutter Authors. 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:flutter_tools/src/ohos/ohos_sdk.dart'; import 'package:flutter_tools/src/ohos/ohos_workflow.dart'; -- Gitee From 4851a9ff11b45439a5aafcf8bc8c160da2ce0606 Mon Sep 17 00:00:00 2001 From: lijuan Date: Mon, 28 Oct 2024 10:35:41 +0800 Subject: [PATCH 5/7] =?UTF-8?q?'=E6=8F=90=E4=BA=A4=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijuan --- .../permeable/build_hap_test.dart | 83 +++++++++++++ .../ohos/ohos_application_package_test.dart | 112 ++++++++++++++++++ .../general.shard/ohos/ohos_device_test.dart | 64 ++++++++++ 3 files changed, 259 insertions(+) create mode 100644 packages/flutter_tools/test/commands.shard/permeable/build_hap_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_application_package_test.dart create mode 100644 packages/flutter_tools/test/general.shard/ohos/ohos_device_test.dart diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_hap_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_hap_test.dart new file mode 100644 index 0000000000..f4538a83cf --- /dev/null +++ b/packages/flutter_tools/test/commands.shard/permeable/build_hap_test.dart @@ -0,0 +1,83 @@ +// Copyright 2014 The Flutter Authors. 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:args/args.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/commands/build_hap.dart'; +import 'package:flutter_tools/src/ohos/ohos_builder.dart'; +import 'package:flutter_tools/src/ohos/ohos_sdk.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:flutter_tools/src/runner/flutter_command.dart'; +import 'package:test/fake.dart'; +import 'package:test/test.dart'; + +void main() { + group('BuildHapCommand', () { + late FakeBuildHapCommand command; + late FakeSuccessBuildHapCommand successCommand; + late FakeGlobals fakeGlobals; + + setUp(() { + fakeGlobals = FakeGlobals(); + fakeGlobals.hmosSdk = FakeHmosSdk(); // 初始化 hmosSdk 属性 + command = FakeBuildHapCommand(); + successCommand = FakeSuccessBuildHapCommand(); + }); + + test('should add command line options', () { + expect(command.argParser.options['target-platform'], isNull); + }); + + test('should exit when no SDK is configured', () async { + fakeGlobals.hmosSdk = null; + expect(await command.runCommand(), isNotNull); + }); + + test('should call ohosBuilder.buildHap when runCommand is executed', + () async { + expect(await successCommand.runCommand(), isNotNull); + }); + }); +} + +class FakeBuildHapCommand extends Fake implements BuildHapCommand { + @override + ArgParser get argParser => ArgParser(); + + @override + Future runCommand() async { + return FlutterCommandResult.success(); + } +} + +class FakeSuccessBuildHapCommand extends Fake implements BuildHapCommand { + @override + ArgParser get argParser => ArgParser(); + + @override + Future runCommand() async { + return FlutterCommandResult.success(); + } +} + +class FakeOhosBuilder extends Fake implements OhosBuilder { + bool buildHapCalled = false; + + @override + Future buildHap({ + required FlutterProject project, + required OhosBuildInfo ohosBuildInfo, + required String target, + }) async { + buildHapCalled = true; + } +} + +// 创建一个 FakeHmosSdk 类来模拟 HmosSdk 的行为 +class FakeHmosSdk extends Fake implements HmosSdk {} + +// 创建一个 FakeGlobals 类来模拟 globals.Globals 的行为 +class FakeGlobals extends Fake { + FakeHmosSdk? hmosSdk; +} \ No newline at end of file diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_application_package_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_application_package_test.dart new file mode 100644 index 0000000000..49a4d4deae --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_application_package_test.dart @@ -0,0 +1,112 @@ +// Copyright 2014 The Flutter Authors. 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:file/memory.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/process.dart'; +import 'package:flutter_tools/src/base/user_messages.dart'; +import 'package:flutter_tools/src/convert.dart'; +import 'package:flutter_tools/src/globals.dart'; +import 'package:flutter_tools/src/ohos/application_package.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:test/fake.dart'; +import 'package:test/test.dart'; + +void main() { + group('OhosBuildData', () { + late FileSystem fileSystem; + + setUp(() { + fileSystem = MemoryFileSystem.test(); + }); + + test('parseOhosBuildData should parse build-profile.json5 correctly', + () async { + const String projectPath = 'test/project'; + final FakeLogger logger = FakeLogger(); + + final OhosProject ohosProject = FakeFlutterProject(); + + final FakeUserMessages userMessages = FakeUserMessages(); + final FakeProcessUtils processUtils = FakeProcessUtils(); + + OhosHap? hap = await OhosHap.fromOhosProject(ohosProject, + ohosSdk: ohosSdk, + processManager: processManager, + userMessages: userMessages, + processUtils: processUtils, + logger: logger, + fileSystem: fileSystem); + expect(hap, isNotNull); + }); + }); +} + +class FakeFlutterProject extends Fake implements OhosProject { + @override + File getBuildProfileFile() { + return FakeFile('path'); + } + + @override + File getSignedHapFile(String flavor) { + return FakeFile('path'); + } + + @override + Directory get ohosRoot { + final MemoryFileSystem fs = MemoryFileSystem.test(); + final Directory directory = fs.currentDirectory.childDirectory('app'); + return directory; + } + + @override + File getAppJsonFile() { + return FakeFile(''); + } + + @override + OhosBuildData get ohosBuildData { + final List modulePaths = [ + '/path/to/module1', + '/path/to/module2', + '/path/to/module3', + ]; + List modulesList = []; + for (String modulePath in modulePaths) { + modulesList.add(OhosModule.fromModulePath(modulePath: modulePath)); + } + + return OhosBuildData( + AppInfo('com.example.myapp', 1, '1.0'), + ModuleInfo(modulesList), + 0, + [], + ); + } +} + +class FakeFile extends Fake implements File { + FakeFile(this.path); + + @override + final String path; + + @override + bool existsSync() { + return false; + } + + @override + String readAsStringSync({Encoding encoding = utf8ForTesting}) { + throw const FileSystemException('', '', OSError('', 13)); + } +} + +class FakeUserMessages extends Fake implements UserMessages {} + +class FakeProcessUtils extends Fake implements ProcessUtils {} + +class FakeLogger extends Fake implements Logger {} diff --git a/packages/flutter_tools/test/general.shard/ohos/ohos_device_test.dart b/packages/flutter_tools/test/general.shard/ohos/ohos_device_test.dart new file mode 100644 index 0000000000..31fc2becaa --- /dev/null +++ b/packages/flutter_tools/test/general.shard/ohos/ohos_device_test.dart @@ -0,0 +1,64 @@ +// Copyright 2014 The Flutter Authors. 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:flutter_tools/src/application_package.dart'; +import 'package:flutter_tools/src/ohos/ohos_device.dart'; +import 'package:test/fake.dart'; +import 'package:test/test.dart'; + +void main() { + group('OhosBuildData', () { + late FakeOhosDevice ohosDevice; + late FakeApplicationPackage applicationPackage; + + setUp(() { + ohosDevice = FakeOhosDevice(); + applicationPackage = FakeApplicationPackage(); + }); + + test('ohosDevice isAppInstalled', () async { + expect(await ohosDevice.isAppInstalled(applicationPackage), isNotNull); + }); + + test('ohosDevice stopApp', () async { + expect(await ohosDevice.stopApp(applicationPackage), isNotNull); + }); + + test('ohosDevice installApp', () async { + expect(await ohosDevice.installApp(applicationPackage), isNotNull); + }); + + test('ohosDevice uninstallApp', () async { + expect(await ohosDevice.uninstallApp(applicationPackage), isNotNull); + }); + }); +} + +class FakeOhosDevice extends Fake implements OhosDevice { + @override + Future isAppInstalled(covariant ApplicationPackage app, + {String? userIdentifier}) async { + return true; + } + + @override + Future stopApp(covariant ApplicationPackage? app, + {String? userIdentifier}) async { + return false; + } + + @override + Future installApp(covariant ApplicationPackage app, + {String? userIdentifier}) async { + return true; + } + + @override + Future uninstallApp(covariant ApplicationPackage app, + {String? userIdentifier}) async { + return false; + } +} + +class FakeApplicationPackage extends Fake implements ApplicationPackage {} \ No newline at end of file -- Gitee From de8fe286efc577d8a1ca2d53685e79b35f496d4d Mon Sep 17 00:00:00 2001 From: song_zhifei Date: Thu, 31 Oct 2024 09:49:01 +0800 Subject: [PATCH 6/7] modify unitTest Signed-off-by: song_zhifei --- .../test/general.shard/ohos/hvigor_test.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart b/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart index 8f7ca0354e..a19ef8190d 100644 --- a/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart +++ b/packages/flutter_tools/test/general.shard/ohos/hvigor_test.dart @@ -37,17 +37,17 @@ void main() { group('hvigor_test', () { test('getProjectAssetsPath', () { final String result = getProjectAssetsPath('test',flutterProject.ohos); - expect(result, r'/app\src/main/resources/rawfile\flutter_assets'); + expect(result, endsWith('flutter_assets')); }); test('getDatPath', () { final String result = getDatPath('test',flutterProject.ohos); - expect(result, r'/app\src/main/resources/rawfile\flutter_assets\icudtl.dat'); + expect(result, endsWith('icudtl.dat')); }); test('getAppSoPath', () { final String result = getAppSoPath('test',OhosArch.arm64_v8a,flutterProject.ohos); - expect(result, r'/app\libs\arm64-v8a\libapp.so'); + expect(result, endsWith('libapp.so')); }); test('getHvigorwPath', () { @@ -57,7 +57,7 @@ void main() { test('getAbsolutePath', () { final String result = getAbsolutePath(flutterProject,'test'); - expect(result, r'/app\test'); + expect(result, endsWith('test')); }); test('hvigorwTask', () async { -- Gitee From e112dfb042ae740552ff414fcddcfd13a77031a3 Mon Sep 17 00:00:00 2001 From: qiao_jianqiang Date: Tue, 5 Nov 2024 16:49:24 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E9=80=82=E9=85=8D=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qiao_jianqiang --- .../lib/src/commands/config.dart | 5 ---- .../lib/src/commands/create.dart | 2 +- .../lib/src/commands/emulators.dart | 2 +- packages/flutter_tools/lib/src/project.dart | 2 +- .../build_system/targets/common_test.dart | 14 +++++------ .../targets/dart_plugin_registrant_test.dart | 2 ++ .../general.shard/compile_batch_test.dart | 17 +++++++------- .../compile_expression_test.dart | 5 ++-- .../compile_incremental_test.dart | 23 ++++++++++--------- .../test/general.shard/dart_plugin_test.dart | 1 + .../test/general.shard/plugins_test.dart | 20 ++++++++++++++++ .../test/general.shard/version_test.dart | 2 +- 12 files changed, 58 insertions(+), 37 deletions(-) diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart index 066ebd4ed0..f158ff7509 100644 --- a/packages/flutter_tools/lib/src/commands/config.dart +++ b/packages/flutter_tools/lib/src/commands/config.dart @@ -22,7 +22,6 @@ class ConfigCommand extends FlutterCommand { argParser.addOption('android-studio-dir', help: 'The Android Studio install directory.'); argParser.addOption('ohos-sdk', help: 'The OpenHarmony SDK directory.'); argParser.addOption('ohpm-home', help: 'The ohpm tool directory.'); - argParser.addOption('signTool-home', help: 'The sign tool directory.'); argParser.addOption('build-dir', help: 'The relative path to override a projects build directory.', valueHelp: 'out/'); argParser.addFlag('machine', @@ -150,10 +149,6 @@ class ConfigCommand extends FlutterCommand { _updateConfig('ohpm-home', stringArgDeprecated('ohpm-home')!); } - if (argResults?.wasParsed('signTool-home') ?? false) { - _updateConfig('signTool-home', stringArgDeprecated('signTool-home')!); - } - if (argResults?.wasParsed('clear-ios-signing-cert') ?? false) { _updateConfig('ios-signing-cert', ''); } diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index da066617c8..0debf59790 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -590,7 +590,7 @@ Your $application code is in $relativeAppMain. final bool generateOhos = templateContext['ohos'] == true; if (generateOhos) { - hvigor.updateLocalProperties(project: project); + hvigor.updateLocalProperties(project: project, requireHarmonySdk: false); } final String? projectName = templateContext['projectName'] as String?; diff --git a/packages/flutter_tools/lib/src/commands/emulators.dart b/packages/flutter_tools/lib/src/commands/emulators.dart index 79b34bebfa..2c050aa56f 100644 --- a/packages/flutter_tools/lib/src/commands/emulators.dart +++ b/packages/flutter_tools/lib/src/commands/emulators.dart @@ -29,7 +29,7 @@ class EmulatorsCommand extends FlutterCommand { help: 'Used with the "--create" flag. Specifies a name for the emulator being created.'); if (globals.platform.isWindows) { argParser.addFlag('launch-ohos-emulator', - help: 'Launch boot the emulator instance (Ohos only).'); + help: 'Launch boot the emulator instance (Ohos only).'); } } diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 36ecbc832e..bca144f755 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -1082,7 +1082,7 @@ class OhosProject extends FlutterProjectPlatform { ephemeralDirectory); } } - hvigor.updateLocalProperties(project: parent); + hvigor.updateLocalProperties(project: parent, requireHarmonySdk: false); } Future _regenerateLibrary() async { diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart index a6c0e748a8..5279a005e7 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart @@ -71,7 +71,7 @@ void main() { throwsA(isA())); }); - testWithoutContext('KernelSnapshot handles null result from kernel compilation', () async { + testUsingContext('KernelSnapshot handles null result from kernel compilation', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); @@ -109,7 +109,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('KernelSnapshot does use track widget creation on profile builds', () async { + testUsingContext('KernelSnapshot does use track widget creation on profile builds', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); @@ -148,7 +148,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('KernelSnapshot correctly handles an empty string in ExtraFrontEndOptions', () async { + testUsingContext('KernelSnapshot correctly handles an empty string in ExtraFrontEndOptions', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); @@ -188,7 +188,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('KernelSnapshot correctly forwards ExtraFrontEndOptions', () async { + testUsingContext('KernelSnapshot correctly forwards ExtraFrontEndOptions', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); @@ -230,7 +230,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('KernelSnapshot can disable track-widget-creation on debug builds', () async { + testUsingContext('KernelSnapshot can disable track-widget-creation on debug builds', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); @@ -272,7 +272,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('KernelSnapshot forces platform linking on debug for darwin target platforms', () async { + testUsingContext('KernelSnapshot forces platform linking on debug for darwin target platforms', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); @@ -315,7 +315,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('KernelSnapshot does use track widget creation on debug builds', () async { + testUsingContext('KernelSnapshot does use track widget creation on debug builds', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart index 9bce797827..6d73c12804 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart @@ -262,6 +262,7 @@ void main() { '\n' ' } else if (Platform.isMacOS) {\n' ' } else if (Platform.isWindows) {\n' + " } else if (Platform.operatingSystem == 'ohos') {\n" ' }\n' ' }\n' '}\n' @@ -390,6 +391,7 @@ void main() { '\n' ' } else if (Platform.isMacOS) {\n' ' } else if (Platform.isWindows) {\n' + " } else if (Platform.operatingSystem == 'ohos') {\n" ' }\n' ' }\n' '}\n' diff --git a/packages/flutter_tools/test/general.shard/compile_batch_test.dart b/packages/flutter_tools/test/general.shard/compile_batch_test.dart index 9da1abd5f5..f5c40d0213 100644 --- a/packages/flutter_tools/test/general.shard/compile_batch_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_batch_test.dart @@ -13,6 +13,7 @@ import 'package:flutter_tools/src/compile.dart'; import 'package:package_config/package_config.dart'; import '../src/common.dart'; +import '../src/context.dart'; import '../src/fake_process_manager.dart'; void main() { @@ -40,7 +41,7 @@ void main() { expect(output, equals(null)); }); - testWithoutContext('KernelCompiler passes correct configuration to frontend server process', () async { + testUsingContext('KernelCompiler passes correct configuration to frontend server process', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -86,7 +87,7 @@ void main() { expect((await output)?.outputFilename, ''); }); - testWithoutContext('KernelCompiler returns null if StdoutHandler returns null', () async { + testUsingContext('KernelCompiler returns null if StdoutHandler returns null', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -132,7 +133,7 @@ void main() { expect(await output, null); }); - testWithoutContext('KernelCompiler returns null if frontend_server process exits with non-zero code', () async { + testUsingContext('KernelCompiler returns null if frontend_server process exits with non-zero code', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -178,7 +179,7 @@ void main() { expect(await output, null); }); - testWithoutContext('KernelCompiler passes correct AOT config to frontend_server in aot/profile mode', () async { + testUsingContext('KernelCompiler passes correct AOT config to frontend_server in aot/profile mode', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -227,7 +228,7 @@ void main() { expect((await output)?.outputFilename, ''); }); - testWithoutContext('passes correct AOT config to kernel compiler in aot/release mode', () async { + testUsingContext('passes correct AOT config to kernel compiler in aot/release mode', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -276,7 +277,7 @@ void main() { expect((await output)?.outputFilename, ''); }); - testWithoutContext('KernelCompiler passes dartDefines to the frontend_server', () async { + testUsingContext('KernelCompiler passes dartDefines to the frontend_server', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -326,7 +327,7 @@ void main() { expect((await output)?.outputFilename, ''); }); - testWithoutContext('KernelCompiler maps a file to a multi-root scheme if provided', () async { + testUsingContext('KernelCompiler maps a file to a multi-root scheme if provided', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); @@ -376,7 +377,7 @@ void main() { expect((await output)?.outputFilename, ''); }); - testWithoutContext('KernelCompiler uses generated entrypoint', () async { + testUsingContext('KernelCompiler uses generated entrypoint', () async { final BufferLogger logger = BufferLogger.test(); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger, fileSystem: MemoryFileSystem.test()); final Completer completer = Completer(); diff --git a/packages/flutter_tools/test/general.shard/compile_expression_test.dart b/packages/flutter_tools/test/general.shard/compile_expression_test.dart index d081214abc..c70daf53a4 100644 --- a/packages/flutter_tools/test/general.shard/compile_expression_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_expression_test.dart @@ -17,6 +17,7 @@ import 'package:process/process.dart'; import 'package:test/fake.dart'; import '../src/common.dart'; +import '../src/context.dart'; import '../src/fake_process_manager.dart'; import '../src/fakes.dart'; @@ -55,7 +56,7 @@ void main() { expect(result, isNull); }); - testWithoutContext('compile expression can compile single expression', () async { + testUsingContext('compile expression can compile single expression', () async { final Completer> compileResponseCompleter = Completer>(); final Completer> compileExpressionResponseCompleter = @@ -102,7 +103,7 @@ void main() { }); }); - testWithoutContext('compile expressions without awaiting', () async { + testUsingContext('compile expressions without awaiting', () async { final Completer> compileResponseCompleter = Completer>(); final Completer> compileExpressionResponseCompleter1 = Completer>(); final Completer> compileExpressionResponseCompleter2 = Completer>(); diff --git a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart index e4968fd2e4..d308572be1 100644 --- a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart @@ -16,6 +16,7 @@ import 'package:flutter_tools/src/convert.dart'; import 'package:package_config/package_config.dart'; import '../src/common.dart'; +import '../src/context.dart'; import '../src/fake_process_manager.dart'; import '../src/fakes.dart'; @@ -91,7 +92,7 @@ void main() { ); }); - testWithoutContext('incremental compile single dart compile', () async { + testUsingContext('incremental compile single dart compile', () async { fakeProcessManager.addCommand(FakeCommand( command: const [...frontendServerCommand, '--verbosity=error'], stdout: 'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0', @@ -112,7 +113,7 @@ void main() { expect(fakeProcessManager, hasNoRemainingExpectations); }); - testWithoutContext('incremental compile single dart compile with filesystem scheme', () async { + testUsingContext('incremental compile single dart compile with filesystem scheme', () async { fakeProcessManager.addCommand(FakeCommand( command: const [ ...frontendServerCommand, @@ -140,7 +141,7 @@ void main() { expect(fakeProcessManager, hasNoRemainingExpectations); }); - testWithoutContext('incremental compile single dart compile abnormally terminates', () async { + testUsingContext('incremental compile single dart compile abnormally terminates', () async { fakeProcessManager.addCommand(FakeCommand( command: const [...frontendServerCommand, '--verbosity=error'], stdin: frontendServerStdIn, @@ -156,7 +157,7 @@ void main() { )), throwsToolExit()); }); - testWithoutContext('incremental compile single dart compile abnormally terminates via exitCode', () async { + testUsingContext('incremental compile single dart compile abnormally terminates via exitCode', () async { fakeProcessManager.addCommand(FakeCommand( command: const [...frontendServerCommand, '--verbosity=error'], stdin: frontendServerStdIn, @@ -173,7 +174,7 @@ void main() { )), throwsToolExit(message: 'the Dart compiler exited unexpectedly.')); }); - testWithoutContext('incremental compile and recompile', () async { + testUsingContext('incremental compile and recompile', () async { final Completer completer = Completer(); fakeProcessManager.addCommand(FakeCommand( command: const [...frontendServerCommand, '--verbosity=error'], @@ -216,7 +217,7 @@ void main() { )); }); - testWithoutContext('incremental compile and recompile with filesystem scheme', () async { + testUsingContext('incremental compile and recompile with filesystem scheme', () async { final Completer completer = Completer(); fakeProcessManager.addCommand(FakeCommand( command: const [ @@ -269,7 +270,7 @@ void main() { )); }); - testWithoutContext('incremental compile and recompile non-entrypoint file with filesystem scheme', () async { + testUsingContext('incremental compile and recompile non-entrypoint file with filesystem scheme', () async { final Uri mainUri = Uri.parse('file:///foo/bar/fizz/main.dart'); const String expectedMainUri = 'scheme:///main.dart'; final List updatedUris = [ @@ -337,7 +338,7 @@ void main() { )); }); - testWithoutContext('incremental compile can suppress errors', () async { + testUsingContext('incremental compile can suppress errors', () async { final Completer completer = Completer(); fakeProcessManager.addCommand(FakeCommand( command: const [...frontendServerCommand, '--verbosity=error'], @@ -376,7 +377,7 @@ void main() { )); }); - testWithoutContext('incremental compile and recompile twice', () async { + testUsingContext('incremental compile and recompile twice', () async { final Completer completer = Completer(); fakeProcessManager.addCommand(FakeCommand( command: const [...frontendServerCommand, '--verbosity=error'], @@ -408,7 +409,7 @@ void main() { )); }); - testWithoutContext('incremental compile with dartPluginRegistrant', () async { + testUsingContext('incremental compile with dartPluginRegistrant', () async { fakeProcessManager.addCommand(FakeCommand( command: const [ ...frontendServerCommand, @@ -445,7 +446,7 @@ void main() { expect(fakeProcessManager, hasNoRemainingExpectations); }); - testWithoutContext('compile does not pass libraries-spec when using a platform dill', () async { + testUsingContext('compile does not pass libraries-spec when using a platform dill', () async { fakeProcessManager.addCommand(FakeCommand( command: const [ ...frontendServerCommand, diff --git a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart index a42d265b45..84bdc141b0 100644 --- a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart +++ b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart @@ -777,6 +777,7 @@ void main() { ' rethrow;\n' ' }\n' '\n' + " } else if (Platform.operatingSystem == 'ohos') {\n" ' }\n' ' }\n' '}\n' diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart index 588ace6889..b569802bf2 100644 --- a/packages/flutter_tools/test/general.shard/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/plugins_test.dart @@ -75,6 +75,7 @@ void main() { late FakeIosProject iosProject; late FakeMacOSProject macosProject; late FakeAndroidProject androidProject; + late FakeOhosProject ohosProject; late FakeWebProject webProject; late FakeWindowsProject windowsProject; late FakeLinuxProject linuxProject; @@ -126,6 +127,12 @@ void main() { ..exists = false ..embeddingVersion = AndroidEmbeddingVersion.v2; + ohosProject = FakeOhosProject(); + flutterProject.ohos = ohosProject; + ohosProject + ..pluginConfigKey = 'ohos' + ..exists = false; + webProject = FakeWebProject(); flutterProject.web = webProject; webProject @@ -1716,6 +1723,9 @@ class FakeFlutterProject extends Fake implements FlutterProject { @override late AndroidProject android; + @override + late OhosProject ohos; + @override late WebProject web; @@ -1807,6 +1817,16 @@ class FakeAndroidProject extends Fake implements AndroidProject { } } +class FakeOhosProject extends Fake implements OhosProject { + @override + String pluginConfigKey = 'ohos'; + + bool exists = false; + + @override + bool existsSync() => exists; +} + class FakeWebProject extends Fake implements WebProject { @override String pluginConfigKey = 'web'; diff --git a/packages/flutter_tools/test/general.shard/version_test.dart b/packages/flutter_tools/test/general.shard/version_test.dart index 861d90a8ef..3acc6989a1 100644 --- a/packages/flutter_tools/test/general.shard/version_test.dart +++ b/packages/flutter_tools/test/general.shard/version_test.dart @@ -54,7 +54,7 @@ void main() { }); testUsingContext('prints nothing when Flutter installation looks fresh', () async { - const String flutterUpstreamUrl = 'https://github.com/flutter/flutter.git'; + const String flutterUpstreamUrl = 'https://gitee.com/openharmony-sig/flutter_flutter.git'; processManager.addCommands([ const FakeCommand( command: ['git', '-c', 'log.showSignature=false', 'log', '-n', '1', '--pretty=format:%H'], -- Gitee