Revert "Part 1: Skia Gold Testing (#33688)" (#36094)
This reverts commit eb0b17902876f1a75eb7180c0b9f3571efb312b8.
Skia Gold post-submit test were failing due to the service account not being found on Cirrus.
diff --git a/.cirrus.yml b/.cirrus.yml
index 5baaa6c..204112c 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -72,11 +72,7 @@
env:
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
SHARD: tests
- DEPOT_TOOLS: "tmp/depot_tools"
- GOLDCTL: "$DEPOT_TOOLS/goldctl"
- GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
SUBSHARD: framework_other
- goldctl_script: ./dev/bots/download_goldctl.sh
test_script:
- dart --enable-asserts ./dev/bots/test.dart
container:
@@ -321,9 +317,6 @@
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
SHARD: tests
SUBSHARD: framework_other
- GOLDCTL: "C:\\Windows\\Temp\\goldctl_tool\\goldctl.exe"
- GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
- goldctl_script: powershell dev\bots\download_goldctl.ps1
test_all_script:
- dart --enable-asserts dev\bots\test.dart
- name: tests_extras-windows
@@ -500,10 +493,6 @@
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
SHARD: tests
SUBSHARD: extras
- DEPOT_TOOLS: "tmp/depot_tools"
- GOLDCTL: "$DEPOT_TOOLS/goldctl"
- GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
- goldctl_script: ./dev/bots/download_goldctl.sh
test_all_script:
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
- dart --enable-asserts dev/bots/test.dart
diff --git a/dev/bots/download_goldctl.ps1 b/dev/bots/download_goldctl.ps1
deleted file mode 100644
index b983539..0000000
--- a/dev/bots/download_goldctl.ps1
+++ /dev/null
@@ -1,5 +0,0 @@
-$url= "https://chrome-infra-packages.appspot.com/p/skia/tools/goldctl/windows-amd64/+/"
-$path = "c:\Windows\Temp\goldctl.zip"
-
-(New-Object System.Net.WebClient).DownloadFile($path, $output)
-Expand-Archive -LiteralPath $path -DestinationPath "C:\Windows\Temp\goldctl_tool"
diff --git a/dev/bots/download_goldctl.sh b/dev/bots/download_goldctl.sh
deleted file mode 100755
index 9ef81cc..0000000
--- a/dev/bots/download_goldctl.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git ./tmp/depot_tools
-cd tmp/depot_tools
-echo -e '# Ensure File\n$ServiceURL https://chrome-infra-packages.appspot.com\n\n# Skia Gold Client goldctl\nskia/tools/goldctl/${platform} latest' > ensure.txt
-./cipd ensure -ensure-file ensure.txt -root .
diff --git a/packages/flutter/test/cupertino/date_picker_test.dart b/packages/flutter/test/cupertino/date_picker_test.dart
index 0b8908f..ae90212 100644
--- a/packages/flutter/test/cupertino/date_picker_test.dart
+++ b/packages/flutter/test/cupertino/date_picker_test.dart
@@ -847,6 +847,7 @@
'date_picker_test.datetime.initial.png',
version: 1,
),
+ skip: !isLinux
);
// Slightly drag the hour component to make the current hour off-center.
@@ -859,6 +860,7 @@
'date_picker_test.datetime.drag.png',
version: 1,
),
+ skip: !isLinux
);
});
});
diff --git a/packages/flutter/test/cupertino/nav_bar_test.dart b/packages/flutter/test/cupertino/nav_bar_test.dart
index 56afa4a..96afba3 100644
--- a/packages/flutter/test/cupertino/nav_bar_test.dart
+++ b/packages/flutter/test/cupertino/nav_bar_test.dart
@@ -805,6 +805,9 @@
),
);
},
+ // TODO(xster): remove once https://github.com/flutter/flutter/issues/17483
+ // is fixed.
+ skip: !isLinux,
);
testWidgets(
@@ -839,7 +842,10 @@
),
);
},
- );
+ // TODO(xster): remove once https://github.com/flutter/flutter/issues/17483
+ // is fixed.
+ skip: !isLinux,
+ );
testWidgets('NavBar draws a light system bar for a dark background', (WidgetTester tester) async {
diff --git a/packages/flutter/test/cupertino/segmented_control_test.dart b/packages/flutter/test/cupertino/segmented_control_test.dart
index 71556c8..4cacef6 100644
--- a/packages/flutter/test/cupertino/segmented_control_test.dart
+++ b/packages/flutter/test/cupertino/segmented_control_test.dart
@@ -1417,7 +1417,7 @@
version: 0,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Golden Test Pressed State', (WidgetTester tester) async {
final Map<int, Widget> children = <int, Widget>{};
@@ -1458,5 +1458,5 @@
version: 0,
),
);
- });
+ }, skip: !isLinux);
}
diff --git a/packages/flutter/test/cupertino/text_field_test.dart b/packages/flutter/test/cupertino/text_field_test.dart
index dcdc751..a4ebbd1 100644
--- a/packages/flutter/test/cupertino/text_field_test.dart
+++ b/packages/flutter/test/cupertino/text_field_test.dart
@@ -481,7 +481,7 @@
version: 2,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Cupertino cursor iOS golden', (WidgetTester tester) async {
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
@@ -514,7 +514,7 @@
version: 2,
),
);
- });
+ }, skip: !isLinux);
testWidgets(
'can control text content via controller',
@@ -2901,6 +2901,7 @@
'text_field_test.disabled.png',
version: 0,
),
+ skip: !isLinux,
);
});
diff --git a/packages/flutter/test/material/bottom_app_bar_test.dart b/packages/flutter/test/material/bottom_app_bar_test.dart
index 7f1b3dc..4a07398 100644
--- a/packages/flutter/test/material/bottom_app_bar_test.dart
+++ b/packages/flutter/test/material/bottom_app_bar_test.dart
@@ -75,6 +75,7 @@
'bottom_app_bar.custom_shape.1.png',
version: null,
),
+ skip: !isLinux,
);
await pump(FloatingActionButtonLocation.centerDocked);
await tester.pumpAndSettle();
@@ -84,6 +85,7 @@
'bottom_app_bar.custom_shape.2.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/material/bottom_app_bar_theme_test.dart b/packages/flutter/test/material/bottom_app_bar_theme_test.dart
index 3b4cd47..4bbb597 100644
--- a/packages/flutter/test/material/bottom_app_bar_theme_test.dart
+++ b/packages/flutter/test/material/bottom_app_bar_theme_test.dart
@@ -84,6 +84,7 @@
'bottom_app_bar_theme.custom_shape.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/material/bottom_navigation_bar_test.dart b/packages/flutter/test/material/bottom_navigation_bar_test.dart
index d8bc3a7..e8b277c 100644
--- a/packages/flutter/test/material/bottom_navigation_bar_test.dart
+++ b/packages/flutter/test/material/bottom_navigation_bar_test.dart
@@ -1438,6 +1438,7 @@
'bottom_navigation_bar.shifting_transition.$pump.png',
version: 2,
),
+ skip: !isLinux,
);
}
}, skip: isBrowser);
diff --git a/packages/flutter/test/material/card_theme_test.dart b/packages/flutter/test/material/card_theme_test.dart
index abdf8cc..8dedd6c 100644
--- a/packages/flutter/test/material/card_theme_test.dart
+++ b/packages/flutter/test/material/card_theme_test.dart
@@ -141,6 +141,7 @@
'card_theme.custom_shape.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
}
diff --git a/packages/flutter/test/material/dialog_theme_test.dart b/packages/flutter/test/material/dialog_theme_test.dart
index 133ecc1..64378ab 100644
--- a/packages/flutter/test/material/dialog_theme_test.dart
+++ b/packages/flutter/test/material/dialog_theme_test.dart
@@ -134,6 +134,7 @@
'dialog_theme.dialog_with_custom_border.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart
index 03c480c..b16d9bc 100644
--- a/packages/flutter/test/material/dropdown_test.dart
+++ b/packages/flutter/test/material/dropdown_test.dart
@@ -144,6 +144,7 @@
'dropdown_test.default.png',
version: 0,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -159,6 +160,7 @@
'dropdown_test.expanded.png',
version: 0,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/material/floating_action_button_test.dart b/packages/flutter/test/material/floating_action_button_test.dart
index 5be8270..8b89ba8 100644
--- a/packages/flutter/test/material/floating_action_button_test.dart
+++ b/packages/flutter/test/material/floating_action_button_test.dart
@@ -740,6 +740,7 @@
'floating_action_button_test.clip.png',
version: 2,
),
+ skip: !isLinux,
);
});
diff --git a/packages/flutter/test/material/input_decorator_test.dart b/packages/flutter/test/material/input_decorator_test.dart
index 1d35a7d..4051825 100644
--- a/packages/flutter/test/material/input_decorator_test.dart
+++ b/packages/flutter/test/material/input_decorator_test.dart
@@ -2844,6 +2844,7 @@
'input_decorator.outline_icon_label.ltr.png',
version: null,
),
+ skip: !isLinux,
);
await tester.pumpWidget(buildFrame(TextDirection.rtl));
@@ -2853,8 +2854,10 @@
'input_decorator.outline_icon_label.rtl.png',
version: null,
),
+ skip: !isLinux,
);
},
+ skip: !isLinux,
);
testWidgets('InputDecorator draws and animates hoverColor', (WidgetTester tester) async {
diff --git a/packages/flutter/test/material/material_test.dart b/packages/flutter/test/material/material_test.dart
index dac7865..cb5b103 100644
--- a/packages/flutter/test/material/material_test.dart
+++ b/packages/flutter/test/material/material_test.dart
@@ -620,6 +620,7 @@
'material.border_paint_above.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -663,6 +664,7 @@
'material.border_paint_below.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
});
diff --git a/packages/flutter/test/material/radio_test.dart b/packages/flutter/test/material/radio_test.dart
index bf817a5..29d8748 100644
--- a/packages/flutter/test/material/radio_test.dart
+++ b/packages/flutter/test/material/radio_test.dart
@@ -280,6 +280,7 @@
'radio.ink_ripple.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
}
diff --git a/packages/flutter/test/material/tab_bar_theme_test.dart b/packages/flutter/test/material/tab_bar_theme_test.dart
index bb97c5d..f17d4e0 100644
--- a/packages/flutter/test/material/tab_bar_theme_test.dart
+++ b/packages/flutter/test/material/tab_bar_theme_test.dart
@@ -271,6 +271,7 @@
'tab_bar_theme.tab_indicator_size_tab.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -285,6 +286,7 @@
'tab_bar_theme.tab_indicator_size_label.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -304,6 +306,7 @@
'tab_bar_theme.custom_tab_indicator.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -323,6 +326,7 @@
'tab_bar_theme.beveled_rect_indicator.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
}
diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart
index 0f0b0d7..a432de8 100644
--- a/packages/flutter/test/material/text_field_test.dart
+++ b/packages/flutter/test/material/text_field_test.dart
@@ -416,7 +416,7 @@
version: 0,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Material cursor iOS golden', (WidgetTester tester) async {
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
@@ -448,7 +448,7 @@
version: 0,
),
);
- });
+ }, skip: !isLinux);
testWidgets('text field selection toolbar renders correctly inside opacity', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -501,6 +501,7 @@
'text_field_opacity_test.0.png',
version: 2,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/painting/continous_rectangle_border_test.dart b/packages/flutter/test/painting/continous_rectangle_border_test.dart
index f644fb0..70e4526 100644
--- a/packages/flutter/test/painting/continous_rectangle_border_test.dart
+++ b/packages/flutter/test/painting/continous_rectangle_border_test.dart
@@ -75,6 +75,7 @@
'continuous_rectangle_border.golden_test_even_radii.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -99,6 +100,7 @@
'continuous_rectangle_border.golden_test_varying_radii.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -120,6 +122,7 @@
'continuous_rectangle_border.golden_test_large_radii.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/rendering/localized_fonts_test.dart b/packages/flutter/test/rendering/localized_fonts_test.dart
index e269699..025bb56 100644
--- a/packages/flutter/test/rendering/localized_fonts_test.dart
+++ b/packages/flutter/test/rendering/localized_fonts_test.dart
@@ -55,6 +55,7 @@
),
);
},
+ skip: !isLinux,
);
testWidgets(
@@ -109,6 +110,7 @@
),
);
},
+ skip: !isLinux,
);
testWidgets(
@@ -155,6 +157,7 @@
),
);
},
+ skip: !isLinux,
);
}
diff --git a/packages/flutter/test/widgets/backdrop_filter_test.dart b/packages/flutter/test/widgets/backdrop_filter_test.dart
index db339be..c728f50 100644
--- a/packages/flutter/test/widgets/backdrop_filter_test.dart
+++ b/packages/flutter/test/widgets/backdrop_filter_test.dart
@@ -47,6 +47,7 @@
'backdrop_filter_test.cull_rect.png',
version: 1,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
}
diff --git a/packages/flutter/test/widgets/editable_text_cursor_test.dart b/packages/flutter/test/widgets/editable_text_cursor_test.dart
index 3c72be4..08c2d0f 100644
--- a/packages/flutter/test/widgets/editable_text_cursor_test.dart
+++ b/packages/flutter/test/widgets/editable_text_cursor_test.dart
@@ -95,7 +95,7 @@
version: 3,
),
);
- });
+ }, skip: !isLinux);
testWidgets('cursor layout has correct radius', (WidgetTester tester) async {
final GlobalKey<EditableTextState> editableTextKey = GlobalKey<EditableTextState>();
@@ -149,7 +149,7 @@
version: 3,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Cursor animates on iOS', (WidgetTester tester) async {
final Widget widget = MaterialApp(
@@ -759,5 +759,6 @@
),
);
debugDefaultTargetPlatformOverride = null;
- });
+ }, skip: !isLinux);
+
}
diff --git a/packages/flutter/test/widgets/invert_colors_test.dart b/packages/flutter/test/widgets/invert_colors_test.dart
index 8489f6e..bedb76c 100644
--- a/packages/flutter/test/widgets/invert_colors_test.dart
+++ b/packages/flutter/test/widgets/invert_colors_test.dart
@@ -24,6 +24,7 @@
'invert_colors_test.0.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -45,6 +46,7 @@
'invert_colors_test.1.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
}
diff --git a/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart b/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart
index b52e538..eacb3e5 100644
--- a/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart
+++ b/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart
@@ -539,6 +539,7 @@
'list_wheel_scroll_view.center_child.magnified.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -596,6 +597,7 @@
'list_wheel_scroll_view.curved_wheel.left.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/widgets/opacity_test.dart b/packages/flutter/test/widgets/opacity_test.dart
index 1d173b3..0446459 100644
--- a/packages/flutter/test/widgets/opacity_test.dart
+++ b/packages/flutter/test/widgets/opacity_test.dart
@@ -181,6 +181,7 @@
'opacity_test.offset.png',
version: 1,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/widgets/physical_model_test.dart b/packages/flutter/test/widgets/physical_model_test.dart
index 5e043f8..c425fb4 100644
--- a/packages/flutter/test/widgets/physical_model_test.dart
+++ b/packages/flutter/test/widgets/physical_model_test.dart
@@ -114,6 +114,7 @@
'physical_model_overflow.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
diff --git a/packages/flutter/test/widgets/shadow_test.dart b/packages/flutter/test/widgets/shadow_test.dart
index f573974..bf5d6e2 100644
--- a/packages/flutter/test/widgets/shadow_test.dart
+++ b/packages/flutter/test/widgets/shadow_test.dart
@@ -37,7 +37,8 @@
'shadow.BoxDecoration.enabled.png',
version: null,
),
- );
+ skip: !isLinux
+ ); // shadows render differently on different platforms
debugDisableShadows = true;
}, skip: isBrowser);
@@ -69,7 +70,7 @@
);
}
debugDisableShadows = true;
- });
+ }, skip: !isLinux); // shadows render differently on different platforms
testWidgets('Shadows with PhysicalLayer', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -106,7 +107,8 @@
'shadow.PhysicalModel.enabled.png',
version: null,
),
- );
+ skip: !isLinux,
+ ); // shadows render differently on different platforms
debugDisableShadows = true;
}, skip: isBrowser);
@@ -142,5 +144,5 @@
);
}
debugDisableShadows = true;
- });
+ }, skip: !isLinux); // shadows render differently on different platforms
}
diff --git a/packages/flutter/test/widgets/text_golden_test.dart b/packages/flutter/test/widgets/text_golden_test.dart
index 4b0d29a..ce798a0 100644
--- a/packages/flutter/test/widgets/text_golden_test.dart
+++ b/packages/flutter/test/widgets/text_golden_test.dart
@@ -62,7 +62,7 @@
version: null,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Text Foreground', (WidgetTester tester) async {
@@ -147,7 +147,7 @@
version: null,
),
);
- });
+ }, skip: !isLinux);
// TODO(garyq): This test requires an update when the background
// drawing from the beginning of the line bug is fixed. The current
@@ -200,7 +200,7 @@
version: null,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Text Fade', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -239,7 +239,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux);
testWidgets('Default Strut text', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -267,7 +267,8 @@
version: null,
),
);
- });
+ }, skip: true); // Should only be on linux (skip: !isLinux).
+ // Disabled for now until font inconsistency is resolved.
testWidgets('Strut text 1', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -297,7 +298,8 @@
version: 1,
),
);
- });
+ }, skip: true); // Should only be on linux (skip: !isLinux).
+ // Disabled for now until font inconsistency is resolved.
testWidgets('Strut text 2', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -328,7 +330,8 @@
version: 1,
),
);
- });
+ }, skip: true); // Should only be on linux (skip: !isLinux).
+ // Disabled for now until font inconsistency is resolved.
testWidgets('Strut text rich', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -382,7 +385,8 @@
version: 1,
),
);
- });
+ }, skip: true); // Should only be on linux (skip: !isLinux).
+ // Disabled for now until font inconsistency is resolved.
testWidgets('Strut text font fallback', (WidgetTester tester) async {
// Font Fallback
@@ -420,7 +424,8 @@
version: 1,
),
);
- });
+ }, skip: true); // Should only be on linux (skip: !isLinux).
+ // Disabled for now until font inconsistency is resolved.
testWidgets('Strut text rich forceStrutHeight', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -474,7 +479,8 @@
version: 1,
),
);
- });
+ }, skip: true); // Should only be on linux (skip: !isLinux).
+ // Disabled for now until font inconsistency is resolved.
testWidgets('Decoration thickness', (WidgetTester tester) async {
final TextDecoration allDecorations = TextDecoration.combine(
@@ -515,7 +521,7 @@
version: 0,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Decoration thickness', (WidgetTester tester) async {
final TextDecoration allDecorations = TextDecoration.combine(
@@ -557,7 +563,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -654,7 +660,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget textfield', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -702,7 +708,7 @@
version: 2,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
// This tests if multiple Text.rich widgets are able to inline nest within each other.
testWidgets('Text Inline widget nesting', (WidgetTester tester) async {
@@ -834,7 +840,7 @@
version: 2,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget baseline', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -944,7 +950,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget aboveBaseline', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -1054,7 +1060,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget belowBaseline', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -1164,7 +1170,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget top', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -1274,7 +1280,7 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
testWidgets('Text Inline widget middle', (WidgetTester tester) async {
await tester.pumpWidget(
@@ -1384,5 +1390,5 @@
version: 1,
),
);
- });
+ }, skip: !isLinux); // Coretext uses different thicknesses for decoration
}
diff --git a/packages/flutter/test/widgets/widget_inspector_test.dart b/packages/flutter/test/widgets/widget_inspector_test.dart
index 09ea5f4..c77591d 100644
--- a/packages/flutter/test/widgets/widget_inspector_test.dart
+++ b/packages/flutter/test/widgets/widget_inspector_test.dart
@@ -2028,6 +2028,7 @@
'inspector.repaint_boundary_margin.png',
version: null,
),
+ skip: !isLinux,
);
// Regression test for how rendering with a pixel scale other than 1.0
@@ -2041,6 +2042,7 @@
'inspector.repaint_boundary_margin_small.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2052,6 +2054,7 @@
'inspector.repaint_boundary_margin_large.png',
version: null,
),
+ skip: !isLinux,
);
final Layer layerParent = layer.parent;
@@ -2070,6 +2073,7 @@
'inspector.repaint_boundary.png',
version: null,
),
+ skip: !isLinux,
);
// Verify that taking a screenshot didn't change the layers associated with
@@ -2090,6 +2094,7 @@
'inspector.repaint_boundary_margin.png',
version: null,
),
+ skip: !isLinux,
);
// Verify that taking a screenshot didn't change the layers associated with
@@ -2113,6 +2118,7 @@
'inspector.repaint_boundary_debugPaint.png',
version: null,
),
+ skip: !isLinux,
);
// Verify that taking a screenshot with debug paint on did not change
// the number of children the layer has.
@@ -2126,6 +2132,7 @@
'inspector.repaint_boundary.png',
version: null,
),
+ skip: !isLinux,
);
expect(renderObject.debugLayer, equals(layer));
@@ -2142,6 +2149,7 @@
'inspector.container.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2155,6 +2163,7 @@
'inspector.container_debugPaint.png',
version: null,
),
+ skip: !isLinux,
);
{
@@ -2178,6 +2187,7 @@
'inspector.container_debugPaint.png',
version: null,
),
+ skip: !isLinux,
);
expect(container.debugNeedsLayout, isFalse);
}
@@ -2193,6 +2203,7 @@
'inspector.container_small.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2206,6 +2217,7 @@
'inspector.container_large.png',
version: null,
),
+ skip: !isLinux,
);
// This screenshot will show the clip rect debug paint but no other
@@ -2221,6 +2233,7 @@
'inspector.clipRect_debugPaint.png',
version: null,
),
+ skip: !isLinux,
);
final Element clipRect = find.byType(ClipRRect).evaluate().single;
@@ -2240,6 +2253,7 @@
'inspector.clipRect_debugPaint_margin.png',
version: null,
),
+ skip: !isLinux,
);
// Verify we get the same image if we go through the service extension
@@ -2282,6 +2296,7 @@
'inspector.padding_debugPaint.png',
version: null,
),
+ skip: !isLinux,
);
// The bounds for this box crop its rendered content.
@@ -2296,6 +2311,7 @@
'inspector.sizedBox_debugPaint.png',
version: 1,
),
+ skip: !isLinux,
);
// Verify that setting a margin includes the previously cropped content.
@@ -2311,6 +2327,7 @@
'inspector.sizedBox_debugPaint_margin.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -2385,6 +2402,7 @@
'inspector.composited_transform.only_offsets.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2397,6 +2415,7 @@
'inspector.composited_transform.only_offsets_follower.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2405,6 +2424,7 @@
'inspector.composited_transform.only_offsets_small.png',
version: 1,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2417,6 +2437,7 @@
'inspector.composited_transform.only_offsets_target.png',
version: null,
),
+ skip: !isLinux,
);
}, skip: isBrowser);
@@ -2492,6 +2513,7 @@
'inspector.composited_transform.with_rotations.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2504,6 +2526,7 @@
'inspector.composited_transform.with_rotations_small.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2516,6 +2539,7 @@
'inspector.composited_transform.with_rotations_target.png',
version: null,
),
+ skip: !isLinux,
);
await expectLater(
@@ -2528,6 +2552,7 @@
'inspector.composited_transform.with_rotations_follower.png',
version: null,
),
+ skip: !isLinux,
);
// Make sure taking screenshots hasn't modified the positions of the
diff --git a/packages/flutter_goldens/lib/flutter_goldens.dart b/packages/flutter_goldens/lib/flutter_goldens.dart
index 3784c0d..4f28df3 100644
--- a/packages/flutter_goldens/lib/flutter_goldens.dart
+++ b/packages/flutter_goldens/lib/flutter_goldens.dart
@@ -9,88 +9,19 @@
import 'package:file/local.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:meta/meta.dart';
-import 'package:platform/platform.dart';
import 'package:flutter_goldens_client/client.dart';
-import 'package:flutter_goldens_client/skia_client.dart';
-
export 'package:flutter_goldens_client/client.dart';
-export 'package:flutter_goldens_client/skia_client.dart';
/// Main method that can be used in a `flutter_test_config.dart` file to set
/// [goldenFileComparator] to an instance of [FlutterGoldenFileComparator] that
-/// works for the current test. _Which_ FlutterGoldenFileComparator is
-/// instantiated is based on the current testing environment.
+/// works for the current test.
Future<void> main(FutureOr<void> testMain()) async {
- const Platform platform = LocalPlatform();
- if (FlutterSkiaGoldFileComparator.isAvailableOnPlatform(platform)) {
- goldenFileComparator = await FlutterSkiaGoldFileComparator.fromDefaultComparator();
- } else if (FlutterGoldensRepositoryFileComparator.isAvailableOnPlatform(platform)) {
- goldenFileComparator = await FlutterGoldensRepositoryFileComparator.fromDefaultComparator();
- } else {
- goldenFileComparator = FlutterSkippingGoldenFileComparator.fromDefaultComparator();
- }
+ goldenFileComparator = await FlutterGoldenFileComparator.fromDefaultComparator();
await testMain();
}
-/// Abstract base class golden file comparator specific to the `flutter/flutter`
-/// repository.
-abstract class FlutterGoldenFileComparator extends GoldenFileComparator {
- /// Creates a [FlutterGoldenFileComparator] that will resolve golden file
- /// URIs relative to the specified [basedir].
- ///
- /// The [fs] and [platform] parameters useful in tests, where the default file
- /// system and platform can be replaced by mock instances.
- @visibleForTesting
- FlutterGoldenFileComparator(
- this.basedir, {
- this.fs = const LocalFileSystem(),
- this.platform = const LocalPlatform(),
- }) : assert(basedir != null),
- assert(fs != null),
- assert(platform != null);
-
- /// The directory to which golden file URIs will be resolved in [compare] and
- /// [update].
- final Uri basedir;
-
- /// The file system used to perform file access.
- @visibleForTesting
- final FileSystem fs;
-
- /// A wrapper for the [dart:io.Platform] API.
- @visibleForTesting
- final Platform platform;
-
- @override
- Future<void> update(Uri golden, Uint8List imageBytes) async {
- final File goldenFile = getGoldenFile(golden);
- await goldenFile.parent.create(recursive: true);
- await goldenFile.writeAsBytes(imageBytes, flush: true);
- }
-
- /// Calculate the appropriate basedir for the current test context.
- @protected
- @visibleForTesting
- static Directory getBaseDirectory(GoldensClient goldens, LocalFileComparator defaultComparator) {
- final FileSystem fs = goldens.fs;
- final Directory testDirectory = fs.directory(defaultComparator.basedir);
- final String testDirectoryRelativePath = fs.path.relative(testDirectory.path, from: goldens.flutterRoot.path);
- return goldens.comparisonRoot.childDirectory(testDirectoryRelativePath);
- }
-
- /// Returns the golden [File] identified by the given [Uri].
- @protected
- File getGoldenFile(Uri uri) {
- assert(basedir.scheme == 'file');
- final File goldenFile = fs.directory(basedir).childFile(fs.file(uri).path);
- assert(goldenFile.uri.scheme == 'file');
- return goldenFile;
- }
-}
-
-/// A [FlutterGoldenFileComparator] for testing golden images against the
-/// `flutter/goldens` repository.
+/// A golden file comparator specific to the `flutter/flutter` repository.
///
/// Within the https://github.com/flutter/flutter repository, it's important
/// not to check-in binaries in order to keep the size of the repository to a
@@ -98,61 +29,59 @@
/// files from a sibling repository, `flutter/goldens`.
///
/// This comparator will locally clone the `flutter/goldens` repository into
-/// the `$FLUTTER_ROOT/bin/cache/pkg/goldens` folder using the
-/// [GoldensRepositoryClient], then perform the comparison against the files
-/// therein.
-///
-/// See also:
-///
-/// * [GoldenFileComparator], the abstract class that
-/// [FlutterGoldenFileComparator] implements.
-/// * [FlutterSkiaGoldFileComparator], another [FlutterGoldenFileComparator]
-/// that tests golden images through Skia Gold.
-class FlutterGoldensRepositoryFileComparator extends FlutterGoldenFileComparator {
- /// Creates a [FlutterGoldensRepositoryFileComparator] that will test golden
- /// file images against the `flutter/goldens` repository.
+/// the `$FLUTTER_ROOT/bin/cache/pkg/goldens` folder, then perform the comparison against
+/// the files therein.
+class FlutterGoldenFileComparator implements GoldenFileComparator {
+ /// Creates a [FlutterGoldenFileComparator] that will resolve golden file
+ /// URIs relative to the specified [basedir].
///
- /// The [fs] and [platform] parameters useful in tests, where the default file
- /// system and platform can be replaced by mock instances.
- FlutterGoldensRepositoryFileComparator(
- Uri basedir, {
- FileSystem fs = const LocalFileSystem(),
- Platform platform = const LocalPlatform(),
- }) : super(
- basedir,
- fs: fs,
- platform: platform,
- );
+ /// The [fs] parameter exists for testing purposes only.
+ @visibleForTesting
+ FlutterGoldenFileComparator(
+ this.basedir, {
+ this.fs = const LocalFileSystem(),
+ });
- /// Creates a new [FlutterGoldensRespositoryFileComparator] that mirrors the
- /// relative path resolution of the default [goldenFileComparator].
+ /// The directory to which golden file URIs will be resolved in [compare] and [update].
+ final Uri basedir;
+
+ /// The file system used to perform file access.
+ @visibleForTesting
+ final FileSystem fs;
+
+ /// Creates a new [FlutterGoldenFileComparator] that mirrors the relative
+ /// path resolution of the default [goldenFileComparator].
///
/// By the time the future completes, the clone of the `flutter/goldens`
- /// repository is guaranteed to be ready to use.
+ /// repository is guaranteed to be ready use.
///
/// The [goldens] and [defaultComparator] parameters are visible for testing
/// purposes only.
- static Future<FlutterGoldensRepositoryFileComparator> fromDefaultComparator({
- GoldensRepositoryClient goldens,
+ static Future<FlutterGoldenFileComparator> fromDefaultComparator({
+ GoldensClient goldens,
LocalFileComparator defaultComparator,
}) async {
defaultComparator ??= goldenFileComparator;
// Prepare the goldens repo.
- goldens ??= GoldensRepositoryClient();
+ goldens ??= GoldensClient();
await goldens.prepare();
- final Directory baseDirectory = FlutterGoldenFileComparator.getBaseDirectory(goldens, defaultComparator);
- return FlutterGoldensRepositoryFileComparator(baseDirectory.uri);
+ // Calculate the appropriate basedir for the current test context.
+ final FileSystem fs = goldens.fs;
+ final Directory testDirectory = fs.directory(defaultComparator.basedir);
+ final String testDirectoryRelativePath = fs.path.relative(testDirectory.path, from: goldens.flutterRoot.path);
+ return FlutterGoldenFileComparator(goldens.repositoryRoot.childDirectory(testDirectoryRelativePath).uri);
}
@override
Future<bool> compare(Uint8List imageBytes, Uri golden) async {
- final File goldenFile = getGoldenFile(golden);
+ final File goldenFile = _getGoldenFile(golden);
if (!goldenFile.existsSync()) {
throw TestFailure('Could not be compared against non-existent file: "$golden"');
}
final List<int> goldenBytes = await goldenFile.readAsBytes();
+ // TODO(tvolkert): Improve the intelligence of this comparison.
if (goldenBytes.length != imageBytes.length) {
return false;
}
@@ -164,130 +93,14 @@
return true;
}
- /// Decides based on the current platform whether goldens tests should be
- /// performed against the flutter/goldens repository.
- static bool isAvailableOnPlatform(Platform platform) => platform.isLinux;
-}
-
-/// A [FlutterGoldenFileComparator] for testing golden images with Skia Gold.
-///
-/// For testing across all platforms, the [SkiaGoldClient] is used to upload
-/// images for framework-related golden tests and process results. Currently
-/// these tests are designed to be run post-submit on Cirrus CI, informed by the
-/// environment.
-///
-/// See also:
-///
-/// * [GoldenFileComparator], the abstract class that
-/// [FlutterGoldenFileComparator] implements.
-/// * [FlutterGoldensRepositoryFileComparator], another
-/// [FlutterGoldenFileComparator] that tests golden images using the
-/// flutter/goldens repository.
-class FlutterSkiaGoldFileComparator extends FlutterGoldenFileComparator {
- /// Creates a [FlutterSkiaGoldFileComparator] that will test golden file
- /// images against Skia Gold.
- ///
- /// The [fs] and [platform] parameters useful in tests, where the default file
- /// system and platform can be replaced by mock instances.
- FlutterSkiaGoldFileComparator(
- final Uri basedir,
- this.skiaClient, {
- FileSystem fs = const LocalFileSystem(),
- Platform platform = const LocalPlatform(),
- }) : super(
- basedir,
- fs: fs,
- platform: platform,
- );
-
- final SkiaGoldClient skiaClient;
-
- /// Creates a new [FlutterSkiaGoldFileComparator] that mirrors the relative
- /// path resolution of the default [goldenFileComparator].
- ///
- /// The [goldens] and [defaultComparator] parameters are visible for testing
- /// purposes only.
- static Future<FlutterSkiaGoldFileComparator> fromDefaultComparator({
- SkiaGoldClient goldens,
- LocalFileComparator defaultComparator,
- }) async {
- defaultComparator ??= goldenFileComparator;
- goldens ??= SkiaGoldClient();
-
- final Directory baseDirectory = FlutterGoldenFileComparator.getBaseDirectory(goldens, defaultComparator);
- if (!baseDirectory.existsSync())
- baseDirectory.createSync(recursive: true);
- await goldens.auth(baseDirectory);
- await goldens.imgtestInit();
- return FlutterSkiaGoldFileComparator(baseDirectory.uri, goldens);
- }
-
@override
- Future<bool> compare(Uint8List imageBytes, Uri golden) async {
- golden = _addPrefix(golden);
- await update(golden, imageBytes);
-
- final File goldenFile = getGoldenFile(golden);
- if (!goldenFile.existsSync()) {
- throw TestFailure('Could not be compared against non-existent file: "$golden"');
- }
- return await skiaClient.imgtestAdd(golden.path, goldenFile);
+ Future<void> update(Uri golden, Uint8List imageBytes) async {
+ final File goldenFile = _getGoldenFile(golden);
+ await goldenFile.parent.create(recursive: true);
+ await goldenFile.writeAsBytes(imageBytes, flush: true);
}
- @override
- Uri getTestUri(Uri key, int version) => key;
-
- /// Decides based on the current environment whether goldens tests should be
- /// performed against Skia Gold.
- static bool isAvailableOnPlatform(Platform platform) {
- final String cirrusCI = platform.environment['CIRRUS_CI'] ?? '';
- final String cirrusPR = platform.environment['CIRRUS_PR'] ?? '';
- final String cirrusBranch = platform.environment['CIRRUS_BRANCH'] ?? '';
- return cirrusCI.isNotEmpty && cirrusPR.isEmpty && cirrusBranch == 'master';
+ File _getGoldenFile(Uri uri) {
+ return fs.directory(basedir).childFile(fs.file(uri).path);
}
-
- /// Prepends the golden Uri with the library name that encloses the current
- /// test.
- Uri _addPrefix(Uri golden) {
- final String prefix = basedir.pathSegments[basedir.pathSegments.length - 2];
- return Uri.parse(prefix + '.' + golden.toString());
- }
-}
-
-/// A [FlutterGoldenFileComparator] for skipping golden image tests when Skia
-/// Gold is unavailable or the current platform that is executing tests is not
-/// Linux.
-///
-/// See also:
-///
-/// * [FlutterGoldensRepositoryFileComparator], another
-/// [FlutterGoldenFileComparator] that tests golden images using the
-/// flutter/goldens repository.
-/// * [FlutterSkiaGoldFileComparator], another [FlutterGoldenFileComparator]
-/// that tests golden images through Skia Gold.
-class FlutterSkippingGoldenFileComparator extends FlutterGoldenFileComparator {
- /// Creates a [FlutterSkippingGoldenFileComparator] that will skip tests that
- /// are not in the right environment for golden file testing.
- FlutterSkippingGoldenFileComparator(Uri basedir) : super(basedir);
-
- /// Creates a new [FlutterSkippingGoldenFileComparator] that mirrors the relative
- /// path resolution of the default [goldenFileComparator].
- static FlutterSkippingGoldenFileComparator fromDefaultComparator({
- LocalFileComparator defaultComparator,
- }) {
- defaultComparator ??= goldenFileComparator;
- return FlutterSkippingGoldenFileComparator(defaultComparator.basedir);
- }
-
- @override
- Future<bool> compare(Uint8List imageBytes, Uri golden) async {
- print('Skipping "$golden" test : Skia Gold is not available in this testing '
- 'environment and flutter/goldens repository comparison is only available '
- 'on Linux machines.'
- );
- return true;
- }
-
- @override
- Future<void> update(Uri golden, Uint8List imageBytes) => null;
}
diff --git a/packages/flutter_goldens/test/flutter_goldens_test.dart b/packages/flutter_goldens/test/flutter_goldens_test.dart
index 4f15200..19645ed 100644
--- a/packages/flutter_goldens/test/flutter_goldens_test.dart
+++ b/packages/flutter_goldens/test/flutter_goldens_test.dart
@@ -34,13 +34,13 @@
});
group('GoldensClient', () {
- GoldensRepositoryClient goldens;
+ GoldensClient goldens;
setUp(() {
- goldens = GoldensRepositoryClient(
+ goldens = GoldensClient(
fs: fs,
- process: process,
platform: platform,
+ process: process,
);
});
@@ -60,65 +60,32 @@
});
});
- group('SkiaGoldClient', () {
- SkiaGoldClient goldens;
-
- setUp(() {
- goldens = SkiaGoldClient(
- fs: fs,
- process: process,
- platform: platform,
- );
- });
-
- group('auth', () {
- test('performs minimal work if already authorized', () async {
- final Directory workDirectory = fs.directory('/workDirectory')..createSync(recursive: true);
- fs.file('/workDirectory/temp/auth_opt.json')..createSync(recursive: true);
- when(process.run(any)).thenAnswer((_) => Future<io.ProcessResult>.value(io.ProcessResult(123, 0, '', '')));
- await goldens.auth(workDirectory);
-
- // Verify that we spawned no process calls
- final VerificationResult verifyProcessRun =
- verifyNever(process.run(captureAny, workingDirectory: captureAnyNamed('workingDirectory')));
- expect(verifyProcessRun.callCount, 0);
- });
- });
- });
-
group('FlutterGoldenFileComparator', () {
- test('calculates the basedir correctly', () async {
- final MockSkiaGoldClient goldens = MockSkiaGoldClient();
- final MockLocalFileComparator defaultComparator = MockLocalFileComparator();
- final Directory flutterRoot = fs.directory('/foo')..createSync(recursive: true);
- final Directory goldensRoot = flutterRoot.childDirectory('bar')..createSync(recursive: true);
- when(goldens.fs).thenReturn(fs);
- when(goldens.flutterRoot).thenReturn(flutterRoot);
- when(goldens.comparisonRoot).thenReturn(goldensRoot);
- when(defaultComparator.basedir).thenReturn(flutterRoot.childDirectory('baz').uri);
- final Directory basedir = FlutterGoldenFileComparator.getBaseDirectory(goldens, defaultComparator);
- expect(basedir.uri, fs.directory('/foo/bar/baz').uri);
- });
- });
-
- group('FlutterGoldensRepositoryFileComparator', () {
MemoryFileSystem fs;
- FlutterGoldensRepositoryFileComparator comparator;
+ FlutterGoldenFileComparator comparator;
setUp(() {
fs = MemoryFileSystem();
- platform = FakePlatform(
- operatingSystem: 'linux',
- environment: <String, String>{'FLUTTER_ROOT': _kFlutterRoot},
- );
final Directory flutterRoot = fs.directory('/path/to/flutter')..createSync(recursive: true);
final Directory goldensRoot = flutterRoot.childDirectory('bin/cache/goldens')..createSync(recursive: true);
final Directory testDirectory = goldensRoot.childDirectory('test/foo/bar')..createSync(recursive: true);
- comparator = FlutterGoldensRepositoryFileComparator(
- testDirectory.uri,
- fs: fs,
- platform: platform,
- );
+ comparator = FlutterGoldenFileComparator(testDirectory.uri, fs: fs);
+ });
+
+ group('fromDefaultComparator', () {
+ test('calculates the basedir correctly', () async {
+ final MockGoldensClient goldens = MockGoldensClient();
+ final MockLocalFileComparator defaultComparator = MockLocalFileComparator();
+ final Directory flutterRoot = fs.directory('/foo')..createSync(recursive: true);
+ final Directory goldensRoot = flutterRoot.childDirectory('bar')..createSync(recursive: true);
+ when(goldens.fs).thenReturn(fs);
+ when(goldens.flutterRoot).thenReturn(flutterRoot);
+ when(goldens.repositoryRoot).thenReturn(goldensRoot);
+ when(defaultComparator.basedir).thenReturn(flutterRoot.childDirectory('baz').uri);
+ comparator = await FlutterGoldenFileComparator.fromDefaultComparator(
+ goldens: goldens, defaultComparator: defaultComparator);
+ expect(comparator.basedir, fs.directory('/foo/bar/baz').uri);
+ });
});
group('compare', () {
@@ -165,44 +132,9 @@
expect(goldenFile.readAsBytesSync(), <int>[1, 2, 3]);
});
});
-
- group('getTestUri', () {
- test('incorporates version number', () {
- final Uri key = comparator.getTestUri(Uri.parse('foo.png'), 1);
- expect(key, Uri.parse('foo.1.png'));
- });
- test('ignores null version number', () {
- final Uri key = comparator.getTestUri(Uri.parse('foo.png'), null);
- expect(key, Uri.parse('foo.png'));
- });
- });
- });
-
- group('FlutterSkiaGoldFileComparator', () {
- FlutterSkiaGoldFileComparator comparator;
-
- setUp(() {
- final Directory flutterRoot = fs.directory('/path/to/flutter')..createSync(recursive: true);
- final Directory goldensRoot = flutterRoot.childDirectory('bin/cache/goldens')..createSync(recursive: true);
- final Directory testDirectory = goldensRoot.childDirectory('test/foo/bar')..createSync(recursive: true);
- comparator = FlutterSkiaGoldFileComparator(
- testDirectory.uri,
- MockSkiaGoldClient(),
- fs: fs,
- platform: platform,
- );
- });
-
- group('getTestUri', () {
- test('ignores version number', () {
- final Uri key = comparator.getTestUri(Uri.parse('foo.png'), 1);
- expect(key, Uri.parse('foo.png'));
- });
- });
});
}
class MockProcessManager extends Mock implements ProcessManager {}
-class MockGoldensRepositoryClient extends Mock implements GoldensRepositoryClient {}
-class MockSkiaGoldClient extends Mock implements SkiaGoldClient {}
+class MockGoldensClient extends Mock implements GoldensClient {}
class MockLocalFileComparator extends Mock implements LocalFileComparator {}
diff --git a/packages/flutter_goldens_client/lib/client.dart b/packages/flutter_goldens_client/lib/client.dart
index d5257a5..3f6952f 100644
--- a/packages/flutter_goldens_client/lib/client.dart
+++ b/packages/flutter_goldens_client/lib/client.dart
@@ -16,11 +16,11 @@
const String _kFlutterRootKey = 'FLUTTER_ROOT';
-/// An base class that provides shared information to the
-/// [FlutterGoldenFileComparator] as well as the [SkiaGoldClient] and
-/// [GoldensRepositoryClient].
-abstract class GoldensClient {
- /// Creates a handle to the local environment of golden file images.
+/// A class that represents a clone of the https://github.com/flutter/goldens
+/// repository, nested within the `bin/cache` directory of the caller's Flutter
+/// repository.
+class GoldensClient {
+ /// Create a handle to a local clone of the goldens repository.
GoldensClient({
this.fs = const LocalFileSystem(),
this.platform = const LocalPlatform(),
@@ -46,32 +46,17 @@
/// subprocesses.
final ProcessManager process;
+ RandomAccessFile _lock;
+
/// The local [Directory] where the Flutter repository is hosted.
///
/// Uses the [fs] file system.
Directory get flutterRoot => fs.directory(platform.environment[_kFlutterRootKey]);
- /// The local [Directory] where the goldens files are located.
+ /// The local [Directory] where the goldens repository is hosted.
///
/// Uses the [fs] file system.
- Directory get comparisonRoot => flutterRoot.childDirectory(fs.path.join('bin', 'cache', 'pkg', 'goldens'));
-}
-
-/// A class that represents a clone of the https://github.com/flutter/goldens
-/// repository, nested within the `bin/cache` directory of the caller's Flutter
-/// repository.
-class GoldensRepositoryClient extends GoldensClient {
- GoldensRepositoryClient({
- FileSystem fs = const LocalFileSystem(),
- ProcessManager process = const LocalProcessManager(),
- Platform platform = const LocalPlatform(),
- }) : super(
- fs: fs,
- process: process,
- platform: platform,
- );
-
- RandomAccessFile _lock;
+ Directory get repositoryRoot => flutterRoot.childDirectory(fs.path.join('bin', 'cache', 'pkg', 'goldens'));
/// Prepares the local clone of the `flutter/goldens` repository for golden
/// file testing.
@@ -104,46 +89,46 @@
}
}
- Future<String> _getCurrentCommit() async {
- if (!comparisonRoot.existsSync()) {
- return null;
- } else {
- final io.ProcessResult revParse = await process.run(
- <String>['git', 'rev-parse', 'HEAD'],
- workingDirectory: comparisonRoot.path,
- );
- return revParse.exitCode == 0 ? revParse.stdout.trim() : null;
- }
- }
-
Future<String> _getGoldensCommit() async {
final File versionFile = flutterRoot.childFile(fs.path.join('bin', 'internal', 'goldens.version'));
return (await versionFile.readAsString()).trim();
}
+ Future<String> _getCurrentCommit() async {
+ if (!repositoryRoot.existsSync()) {
+ return null;
+ } else {
+ final io.ProcessResult revParse = await process.run(
+ <String>['git', 'rev-parse', 'HEAD'],
+ workingDirectory: repositoryRoot.path,
+ );
+ return revParse.exitCode == 0 ? revParse.stdout.trim() : null;
+ }
+ }
+
Future<void> _initRepository() async {
- await comparisonRoot.create(recursive: true);
+ await repositoryRoot.create(recursive: true);
await _runCommands(
<String>[
'git init',
'git remote add upstream https://github.com/flutter/goldens.git',
'git remote set-url --push upstream git@github.com:flutter/goldens.git',
],
- workingDirectory: comparisonRoot,
+ workingDirectory: repositoryRoot,
);
}
Future<void> _checkCanSync() async {
final io.ProcessResult result = await process.run(
<String>['git', 'status', '--porcelain'],
- workingDirectory: comparisonRoot.path,
+ workingDirectory: repositoryRoot.path,
);
if (result.stdout.trim().isNotEmpty) {
final StringBuffer buf = StringBuffer();
buf
- ..writeln('flutter_goldens git checkout at ${comparisonRoot.path} has local changes and cannot be synced.')
+ ..writeln('flutter_goldens git checkout at ${repositoryRoot.path} has local changes and cannot be synced.')
..writeln('To reset your client to a clean state, and lose any local golden test changes:')
- ..writeln('cd ${comparisonRoot.path}')
+ ..writeln('cd ${repositoryRoot.path}')
..writeln('git reset --hard HEAD')
..writeln('git clean -x -d -f -f');
throw NonZeroExitCode(1, buf.toString());
@@ -157,7 +142,7 @@
'git fetch upstream $commit',
'git reset --hard FETCH_HEAD',
],
- workingDirectory: comparisonRoot,
+ workingDirectory: repositoryRoot,
);
}
@@ -189,7 +174,6 @@
_lock = null;
}
}
-
/// Exception that signals a process' exit with a non-zero exit code.
class NonZeroExitCode implements Exception {
/// Create an exception that represents a non-zero exit code.
diff --git a/packages/flutter_goldens_client/lib/skia_client.dart b/packages/flutter_goldens_client/lib/skia_client.dart
deleted file mode 100644
index fe3d7be..0000000
--- a/packages/flutter_goldens_client/lib/skia_client.dart
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2019 The Chromium 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 'dart:async';
-import 'dart:convert';
-import 'dart:io' as io;
-
-import 'package:file/file.dart';
-import 'package:file/local.dart';
-import 'package:path/path.dart' as path;
-import 'package:platform/platform.dart';
-import 'package:process/process.dart';
-
-import 'package:flutter_goldens_client/client.dart';
-
-// If you are here trying to figure out how to use golden files in the Flutter
-// repo itself, consider reading this wiki page:
-// https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package%3Aflutter
-
-// TODO(Piinks): This file will replace ./client.dart when transition to Skia
-// Gold testing is complete
-
-const String _kGoldctlKey = 'GOLDCTL';
-const String _kServiceAccountKey = 'GOLD_SERVICE_ACCOUNT';
-
-/// An extension of the [GoldensClient] class that interfaces with Skia Gold
-/// for golden file testing.
-class SkiaGoldClient extends GoldensClient {
- SkiaGoldClient({
- FileSystem fs = const LocalFileSystem(),
- ProcessManager process = const LocalProcessManager(),
- Platform platform = const LocalPlatform(),
- }) : super(
- fs: fs,
- process: process,
- platform: platform,
- );
-
- /// The local [Directory] within the [comparisonRoot] for the current test
- /// context. In this directory, the client will create image and json files
- /// for the goldctl tool to use.
- ///
- /// This is informed by the [FlutterGoldenFileComparator] [basedir]. It cannot
- /// be null.
- Directory _workDirectory;
-
- /// The path to the local [Directory] where the goldctl tool is hosted.
- ///
- /// Uses the [platform] environment in this implementation.
- String get _goldctl => platform.environment[_kGoldctlKey];
-
- /// The path to the local [Directory] where the service account key is
- /// hosted.
- ///
- /// Uses the [platform] environment in this implementation.
- String get _serviceAccount => platform.environment[_kServiceAccountKey];
-
- /// Prepares the local work space for golden file testing and calls the
- /// goldctl `auth` command.
- ///
- /// This ensures that the goldctl tool is authorized and ready for testing. It
- /// will only be called once for each instance of
- /// [FlutterSkiaGoldFileComparator].
- ///
- /// The [workDirectory] parameter specifies the current directory that golden
- /// tests are executing in, relative to the library of the given test. It is
- /// informed by the basedir of the [FlutterSkiaGoldFileComparator].
- Future<void> auth(Directory workDirectory) async {
- assert(workDirectory != null);
- _workDirectory = workDirectory;
- if (_clientIsAuthorized())
- return;
-
- final File authorization = _workDirectory.childFile('serviceAccount.json');
- await authorization.writeAsString(_serviceAccount);
-
- final List<String> authArguments = <String>[
- 'auth',
- '--service-account', authorization.path,
- '--work-dir', _workDirectory.childDirectory('temp').path,
- ];
-
- final io.ProcessResult authResults = await io.Process.run(
- _goldctl,
- authArguments,
- );
-
- if (authResults.exitCode != 0) {
- final StringBuffer buf = StringBuffer()
- ..writeln('Flutter + Skia Gold auth failed.')
- ..writeln('stdout: ${authResults.stdout}')
- ..writeln('stderr: ${authResults.stderr}');
- throw NonZeroExitCode(authResults.exitCode, buf.toString());
- }
- }
-
- /// Executes the `imgtest init` command in the goldctl tool.
- ///
- /// The `imgtest` command collects and uploads test results to the Skia Gold
- /// backend, the `init` argument initializes the testing environment.
- Future<void> imgtestInit() async {
- final String commitHash = await _getCurrentCommit();
- final File keys = _workDirectory.childFile('keys.json');
- final File failures = _workDirectory.childFile('failures.json');
-
- await keys.writeAsString(_getKeysJSON());
- await failures.create();
-
- final List<String> imgtestInitArguments = <String>[
- 'imgtest', 'init',
- '--instance', 'flutter',
- '--work-dir', _workDirectory.childDirectory('temp').path,
- '--commit', commitHash,
- '--keys-file', keys.path,
- '--failure-file', failures.path,
- '--passfail',
- ];
-
- if (imgtestInitArguments.contains(null)) {
- final StringBuffer buf = StringBuffer();
- buf.writeln('Null argument for Skia Gold imgtest init:');
- imgtestInitArguments.forEach(buf.writeln);
- throw NonZeroExitCode(1, buf.toString());
- }
-
- final io.ProcessResult imgtestInitResult = await io.Process.run(
- _goldctl,
- imgtestInitArguments,
- );
-
- if (imgtestInitResult.exitCode != 0) {
- final StringBuffer buf = StringBuffer()
- ..writeln('Flutter + Skia Gold imgtest init failed.')
- ..writeln('stdout: ${imgtestInitResult.stdout}')
- ..writeln('stderr: ${imgtestInitResult.stderr}');
- throw NonZeroExitCode(imgtestInitResult.exitCode, buf.toString());
- }
- }
-
- /// Executes the `imgtest add` command in the goldctl tool.
- ///
- /// The `imgtest` command collects and uploads test results to the Skia Gold
- /// backend, the `add` argument uploads the current image test. A response is
- /// returned from the invocation of this command that indicates a pass or fail
- /// result.
- ///
- /// The testName and goldenFile parameters reference the current comparison
- /// being evaluated by the [FlutterSkiaGoldFileComparator].
- Future<bool> imgtestAdd(String testName, File goldenFile) async {
- assert(testName != null);
- assert(goldenFile != null);
-
- final List<String> imgtestArguments = <String>[
- 'imgtest', 'add',
- '--work-dir', _workDirectory.childDirectory('temp').path,
- '--test-name', testName.split(path.extension(testName.toString()))[0],
- '--png-file', goldenFile.path,
- ];
-
- await io.Process.run(
- _goldctl,
- imgtestArguments,
- );
-
- // TODO(Piinks): Comment on PR if triage is needed, https://github.com/flutter/flutter/issues/34673
- // So as not to turn the tree red in this initial implementation, this will
- // return true for now.
- // The ProcessResult that returns from line 157 contains the pass/fail
- // result of the test & links to the dashboard and diffs.
- return true;
- }
-
- /// Returns the current commit hash of the Flutter repository.
- Future<String> _getCurrentCommit() async {
- if (!flutterRoot.existsSync()) {
- final StringBuffer buf = StringBuffer()
- ..writeln('Flutter root could not be found: $flutterRoot');
- throw NonZeroExitCode(1, buf.toString());
- } else {
- final io.ProcessResult revParse = await process.run(
- <String>['git', 'rev-parse', 'HEAD'],
- workingDirectory: flutterRoot.path,
- );
- return revParse.exitCode == 0 ? revParse.stdout.trim() : null;
- }
- }
-
- /// Returns a JSON String with keys value pairs used to uniquely identify the
- /// configuration that generated the given golden file.
- ///
- /// Currently, the only key value pair being tracked is the platform the image
- /// was rendered on.
- String _getKeysJSON() {
- return json.encode(
- <String, dynamic>{
- 'Platform' : platform.operatingSystem,
- }
- );
- }
-
- /// Returns a boolean value to prevent the client from re-authorizing itself
- /// for multiple tests.
- bool _clientIsAuthorized() {
- final File authFile = _workDirectory.childFile(super.fs.path.join(
- 'temp',
- 'auth_opt.json',
- ));
- return authFile.existsSync();
- }
-}
diff --git a/packages/flutter_test/lib/src/goldens.dart b/packages/flutter_test/lib/src/goldens.dart
index 1bc6fcd..6672755 100644
--- a/packages/flutter_test/lib/src/goldens.dart
+++ b/packages/flutter_test/lib/src/goldens.dart
@@ -45,26 +45,6 @@
/// The method by which [golden] is located and by which its bytes are written
/// is left up to the implementation class.
Future<void> update(Uri golden, Uint8List imageBytes);
-
- /// Returns a new golden file [Uri] to incorporate any [version] number with
- /// the [key].
- ///
- /// The [version] is an optional int that can be used to differentiate
- /// historical golden files.
- ///
- /// Version numbers are used in golden file tests for package:flutter. You can
- /// learn more about these tests [here](https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package:flutter).
- Uri getTestUri(Uri key, int version) {
- if (version == null)
- return key;
- final String keyString = key.toString();
- final String extension = path.extension(keyString);
- return Uri.parse(
- keyString
- .split(extension)
- .join() + '.' + version.toString() + extension
- );
- }
}
/// Compares rasterized image bytes against a golden image file.
@@ -146,11 +126,6 @@
Future<void> update(Uri golden, Uint8List imageBytes) {
throw StateError('goldenFileComparator has not been initialized');
}
-
- @override
- Uri getTestUri(Uri key, int version) {
- return key;
- }
}
/// The default [GoldenFileComparator] implementation for `flutter test`.
@@ -165,7 +140,7 @@
///
/// When using `flutter test --update-goldens`, [LocalFileComparator]
/// updates the files on disk to match the rendering.
-class LocalFileComparator extends GoldenFileComparator {
+class LocalFileComparator implements GoldenFileComparator {
/// Creates a new [LocalFileComparator] for the specified [testFile].
///
/// Golden file keys will be interpreted as file paths relative to the
diff --git a/packages/flutter_test/lib/src/matchers.dart b/packages/flutter_test/lib/src/matchers.dart
index a97299c..9f32de0 100644
--- a/packages/flutter_test/lib/src/matchers.dart
+++ b/packages/flutter_test/lib/src/matchers.dart
@@ -1712,7 +1712,7 @@
imageFuture = _captureImage(elements.single);
}
- final Uri testNameUri = goldenFileComparator.getTestUri(key, version);
+ final Uri testNameUri = _getTestNameUri(key, version);
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
return binding.runAsync<String>(() async {
@@ -1734,9 +1734,19 @@
}
@override
- Description describe(Description description) {
- final Uri testNameUri = goldenFileComparator.getTestUri(key, version);
- return description.add('one widget whose rasterized image matches golden image "$testNameUri"');
+ Description describe(Description description) =>
+ description.add('one widget whose rasterized image matches golden image "${_getTestNameUri(key, version)}"');
+
+ Uri _getTestNameUri(Uri key, int version) {
+ return version == null ? key : Uri.parse(
+ key
+ .toString()
+ .splitMapJoin(
+ RegExp(r'.png'),
+ onMatch: (Match m) => '${'.' + version.toString() + m.group(0)}',
+ onNonMatch: (String n) => '$n'
+ )
+ );
}
}
diff --git a/packages/flutter_test/test/goldens_test.dart b/packages/flutter_test/test/goldens_test.dart
index 004b336..5d03642 100644
--- a/packages/flutter_test/test/goldens_test.dart
+++ b/packages/flutter_test/test/goldens_test.dart
@@ -182,18 +182,5 @@
expect(fs.file(fix('/foo.png')).readAsBytesSync(), newBytes);
});
});
-
- group('getTestUri', () {
- test('updates file name with version number', () {
- final Uri key = Uri.parse('foo.png');
- final Uri key1 = comparator.getTestUri(key, 1);
- expect(key1, Uri.parse('foo.1.png'));
- });
- test('does nothing for null version number', () {
- final Uri key = Uri.parse('foo.png');
- final Uri keyNull = comparator.getTestUri(key, null);
- expect(keyNull, Uri.parse('foo.png'));
- });
- });
});
}
diff --git a/packages/flutter_test/test/matchers_test.dart b/packages/flutter_test/test/matchers_test.dart
index 05f5981..b2108e2 100644
--- a/packages/flutter_test/test/matchers_test.dart
+++ b/packages/flutter_test/test/matchers_test.dart
@@ -335,6 +335,30 @@
expect(comparator.imageBytes, hasLength(greaterThan(0)));
expect(comparator.golden, Uri.parse('foo.png'));
});
+
+ testWidgets('Comparator succeeds incorporating version number', (WidgetTester tester) async {
+ await tester.pumpWidget(boilerplate(const Text('hello')));
+ final Finder finder = find.byType(Text);
+ await expectLater(finder, matchesGoldenFile(
+ 'foo.png',
+ version: 1,
+ ));
+ expect(comparator.invocation, _ComparatorInvocation.compare);
+ expect(comparator.imageBytes, hasLength(greaterThan(0)));
+ expect(comparator.golden, Uri.parse('foo.1.png'));
+ });
+
+ testWidgets('Comparator succeeds with null version number', (WidgetTester tester) async {
+ await tester.pumpWidget(boilerplate(const Text('hello')));
+ final Finder finder = find.byType(Text);
+ await expectLater(finder, matchesGoldenFile(
+ 'foo.png',
+ version: null,
+ ));
+ expect(comparator.invocation, _ComparatorInvocation.compare);
+ expect(comparator.imageBytes, hasLength(greaterThan(0)));
+ expect(comparator.golden, Uri.parse('foo.png'));
+ });
});
group('does not match', () {
@@ -389,6 +413,40 @@
expect(error.message, contains('too many widgets'));
}
});
+
+ testWidgets('Comparator failure incorporates version number', (WidgetTester tester) async {
+ comparator.behavior = _ComparatorBehavior.returnFalse;
+ await tester.pumpWidget(boilerplate(const Text('hello')));
+ final Finder finder = find.byType(Text);
+ try {
+ await expectLater(finder, matchesGoldenFile(
+ 'foo.png',
+ version: 1,
+ ));
+ fail('TestFailure expected but not thrown');
+ } on TestFailure catch (error) {
+ expect(comparator.invocation, _ComparatorInvocation.compare);
+ expect(error.message, contains('does not match'));
+ expect(error.message, contains('foo.1.png'));
+ }
+ });
+
+ testWidgets('Comparator failure with null version number', (WidgetTester tester) async {
+ comparator.behavior = _ComparatorBehavior.returnFalse;
+ await tester.pumpWidget(boilerplate(const Text('hello')));
+ final Finder finder = find.byType(Text);
+ try {
+ await expectLater(finder, matchesGoldenFile(
+ 'foo.png',
+ version: null,
+ ));
+ fail('TestFailure expected but not thrown');
+ } on TestFailure catch (error) {
+ expect(comparator.invocation, _ComparatorInvocation.compare);
+ expect(error.message, contains('does not match'));
+ expect(error.message, contains('foo.png'));
+ }
+ });
});
testWidgets('calls update on comparator if autoUpdateGoldenFiles is true', (WidgetTester tester) async {
@@ -650,11 +708,6 @@
this.imageBytes = imageBytes;
return Future<void>.value();
}
-
- @override
- Uri getTestUri(Uri key, int version) {
- return key;
- }
}
class _FakeSemanticsNode extends SemanticsNode {