From b0ac5a8b62df1ca7b301c823d423e53b94101917 Mon Sep 17 00:00:00 2001 From: Zach Anderson Date: Thu, 24 Aug 2023 19:57:31 -0700 Subject: [PATCH] Remove --enable-software-rendering from iOS scenario tests --- .../Scenarios.xcodeproj/project.pbxproj | 8 ++++++ .../ScenariosUITests/GoldenTestManager.m | 19 ++++++++++--- .../PlatformViewGestureRecognizerTests.m | 3 +-- .../ScenariosUITests/SpawnEngineTest.m | 2 +- .../UnobstructedPlatformViewTests.m | 3 +-- ...one SE (3rd generation)_16.2_simulator.png | Bin 0 -> 22069 bytes ...one SE (3rd generation)_16.2_simulator.png | Bin 0 -> 22069 bytes testing/scenario_app/run_ios_tests.sh | 25 +++++++++++++++++- 8 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 81e3520794ddd..ec69054a447da 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -32,6 +32,8 @@ 248D76EF22E388380012F0C1 /* PlatformViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 248D76EE22E388380012F0C1 /* PlatformViewUITests.m */; }; 248FDFC422FE7CD0009CC7CD /* FlutterEngineTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 248FDFC322FE7CD0009CC7CD /* FlutterEngineTest.m */; }; 24F1FB89230B4579005ACE7C /* TextPlatformView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24F1FB87230B4579005ACE7C /* TextPlatformView.m */; }; + 3BFD97202A990CF50094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 3BFD971E2A990CF40094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png */; }; + 3BFD97212A990CF50094F51B /* golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 3BFD971F2A990CF40094F51B /* golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png */; }; 4F06F1B32473296E000AF246 /* LocalizationInitializationTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F06F1B124731F66000AF246 /* LocalizationInitializationTest.m */; }; 6402EBD124147BDA00987DCB /* UnobstructedPlatformViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6402EBD024147BDA00987DCB /* UnobstructedPlatformViewTests.m */; }; 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */; }; @@ -150,6 +152,8 @@ 24D47D1E230CA4480069DD5E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 24F1FB87230B4579005ACE7C /* TextPlatformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextPlatformView.m; sourceTree = ""; }; 24F1FB88230B4579005ACE7C /* TextPlatformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextPlatformView.h; sourceTree = ""; }; + 3BFD971E2A990CF40094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; + 3BFD971F2A990CF40094F51B /* golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; 4F06F1B124731F66000AF246 /* LocalizationInitializationTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LocalizationInitializationTest.m; sourceTree = ""; }; 6402EBD024147BDA00987DCB /* UnobstructedPlatformViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UnobstructedPlatformViewTests.m; sourceTree = ""; }; 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenPlatformViewTests.h; sourceTree = ""; }; @@ -310,6 +314,8 @@ F7B464DC2759D02B00079189 /* Goldens */ = { isa = PBXGroup; children = ( + 3BFD971E2A990CF40094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png */, + 3BFD971F2A990CF40094F51B /* golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png */, 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */, 6860CE242A01B2FF00B68EC5 /* golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png */, 6860CE232A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png */, @@ -472,6 +478,7 @@ 684FFF8F29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 6860CE262A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8A29F9C10700281002 /* golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, + 3BFD97212A990CF50094F51B /* golden_spawn_engine_works_impeller_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8429F9C10700281002 /* golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF7C29F9C10700281002 /* golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF7F29F9C10700281002 /* golden_platform_view_rotate_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, @@ -481,6 +488,7 @@ 684FFF7E29F9C10700281002 /* golden_platform_view_opacity_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8729F9C10700281002 /* golden_platform_view_multiple_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, + 3BFD97202A990CF50094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8D29F9C10700281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8329F9C10700281002 /* golden_platform_view_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8B29F9C10700281002 /* golden_platform_view_clippath_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index 78bda2122b80f..96f65fe760491 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -55,7 +55,18 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { }; }); _identifier = launchArgsMap[launchArg]; - NSString* prefix = [NSString stringWithFormat:@"golden_%@_", _identifier]; + + NSString* impeller = @""; + NSNumber* enableImpeller = [[NSBundle bundleWithIdentifier:@"dev.flutter.ScenariosUITests"] + objectForInfoDictionaryKey:@"FLTEnableImpeller"]; + if (enableImpeller != nil) { + impeller = enableImpeller.boolValue ? @"impeller_" : @""; + } else { + NSLog(@"FLTEnableImpeller was nil"); + } + NSLog(@"impeller = '%@'", impeller); + + NSString* prefix = [NSString stringWithFormat:@"golden_%@_%@", _identifier, impeller]; _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; _launchArg = launchArg; } @@ -65,8 +76,8 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { - (void)checkGoldenForTest:(XCTestCase*)test { XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; if (!_goldenImage.image) { - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = [_goldenImage.goldenName stringByAppendingString:@"_new"]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot.image]; + attachment.name = [_goldenImage.goldenName stringByAppendingString:@"_new.png"]; attachment.lifetime = XCTAttachmentLifetimeKeepAlways; [test addAttachment:attachment]; // Instead of XCTFail because that definition changed between Xcode 11 and 12 whereas this impl @@ -79,7 +90,7 @@ - (void)checkGoldenForTest:(XCTestCase*)test { if (![_goldenImage compareGoldenToImage:screenshot.image]) { XCTAttachment* screenshotAttachment = [XCTAttachment attachmentWithImage:screenshot.image]; - screenshotAttachment.name = [_goldenImage.goldenName stringByAppendingString:@"_actual"]; + screenshotAttachment.name = [_goldenImage.goldenName stringByAppendingString:@"_actual.png"]; screenshotAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; [test addAttachment:screenshotAttachment]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m index 18bf5574063b7..5bd831f0948b5 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGestureRecognizerTests.m @@ -18,8 +18,7 @@ - (void)setUp { - (void)testRejectPolicyUtilTouchesEnded { XCUIApplication* app = [[XCUIApplication alloc] init]; - app.launchArguments = - @[ @"--gesture-reject-after-touches-ended", @"--enable-software-rendering" ]; + app.launchArguments = @[ @"--gesture-reject-after-touches-ended" ]; [app launch]; NSPredicate* predicateToFindPlatformView = diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m index 2e529965e9bd9..f00a8c988bdfd 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/SpawnEngineTest.m @@ -13,7 +13,7 @@ - (void)testSpawnEngineWorks { self.continueAfterFailure = NO; XCUIApplication* application = [[XCUIApplication alloc] init]; - application.launchArguments = @[ @"--spawn-engine-works", @"--enable-software-rendering" ]; + application.launchArguments = @[ @"--spawn-engine-works" ]; [application launch]; XCUIElement* addTextField = application.textFields[@"ready"]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m index 3397e4b1effa2..2e9ed55dc6195 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/UnobstructedPlatformViewTests.m @@ -23,8 +23,7 @@ - (void)setUp { // +---+ - (void)testNoOverlay { XCUIApplication* app = [[XCUIApplication alloc] init]; - app.launchArguments = - @[ @"--platform-view-no-overlay-intersection", @"--enable-software-rendering" ]; + app.launchArguments = @[ @"--platform-view-no-overlay-intersection" ]; [app launch]; XCUIElement* platform_view = app.otherElements[@"platform_view[0]"]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_bogus_font_text_impeller_iPhone SE (3rd generation)_16.2_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..f14162a33b707bf39d2e2f3e5ac6bba6ed7de77c GIT binary patch literal 22069 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