From ef08427fe28d9f7b41bd5102b5b060f5c67ed2de Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Oct 2019 10:54:00 -0700 Subject: [PATCH 1/6] add option for bulk-updating screenshots; update screenshots --- lib/web_ui/dev/felt.dart | 2 +- lib/web_ui/dev/goldens_lock.yaml | 3 +- lib/web_ui/dev/test_platform.dart | 31 +++++++++++++----- lib/web_ui/dev/test_runner.dart | 21 ++++++++++-- lib/web_ui/test/golden_files/smoke_test.png | Bin 2413 -> 2159 bytes .../golden_success_smoke_test.dart | 1 + 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/lib/web_ui/dev/felt.dart b/lib/web_ui/dev/felt.dart index ca9eafbb3d0a5..b1754c1e11562 100644 --- a/lib/web_ui/dev/felt.dart +++ b/lib/web_ui/dev/felt.dart @@ -15,7 +15,7 @@ CommandRunner runner = CommandRunner( 'Command-line utility for building and testing Flutter web engine.', ) ..addCommand(LicensesCommand()) - ..addCommand(TestsCommand()) + ..addCommand(TestCommand()) ..addCommand(BuildCommand()); void main(List args) async { diff --git a/lib/web_ui/dev/goldens_lock.yaml b/lib/web_ui/dev/goldens_lock.yaml index 1b72c1367e6bf..77186e753d3b3 100644 --- a/lib/web_ui/dev/goldens_lock.yaml +++ b/lib/web_ui/dev/goldens_lock.yaml @@ -1,2 +1,3 @@ repository: https://github.com/flutter/goldens.git -revision: dd993a32c23c5c542f083134467e7cda09cac975 +# TODO: DO NOT SUBMIT - this SHA is from a pending PR +revision: 1fda4f5305bbbd787c0b2a3e0f04b6aa358e64ce diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index ab2c08c675d92..5c475dcab3705 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -55,14 +55,16 @@ class BrowserPlatform extends PlatformPlugin { /// /// [root] is the root directory that the server should serve. It defaults to /// the working directory. - static Future start({String root}) async { + static Future start({String root, bool isUpdateScreenshotGoldens: false}) async { var server = shelf_io.IOServer(await HttpMultiServer.loopback(0)); return BrowserPlatform._( - server, - Configuration.current, - p.fromUri(await Isolate.resolvePackageUri( - Uri.parse('package:test/src/runner/browser/static/favicon.ico'))), - root: root); + server, + Configuration.current, + p.fromUri(await Isolate.resolvePackageUri( + Uri.parse('package:test/src/runner/browser/static/favicon.ico'))), + root: root, + isUpdateScreenshotGoldens: isUpdateScreenshotGoldens, + ); } /// The test runner configuration. @@ -99,8 +101,11 @@ class BrowserPlatform extends PlatformPlugin { /// Whether [close] has been called. bool get _closed => _closeMemo.hasRun; + /// Whether to update screenshot golden files. + final bool isUpdateScreenshotGoldens; + BrowserPlatform._(this._server, Configuration config, String faviconPath, - {String root}) + {String root, this.isUpdateScreenshotGoldens}) : _config = config, _root = root == null ? p.current : root, _http = config.pubServeUrl == null ? null : HttpClient() { @@ -147,6 +152,10 @@ class BrowserPlatform extends PlatformPlugin { } Future _diffScreenshot(String filename, bool write, [ Map region ]) async { + if (isUpdateScreenshotGoldens) { + write = true; + } + String goldensDirectory; if (filename.startsWith('__local__')) { filename = filename.substring('__local__/'.length); @@ -213,8 +222,14 @@ To automatically create this file call matchGoldenFile('$filename', write: true) if (write) { // Don't even bother with the comparison, just write and return + print('Updating screenshot golden: $file'); file.writeAsBytesSync(encodePng(screenshot), flush: true); - return 'Golden file $filename was updated. You can remove "write: true" in the call to matchGoldenFile.'; + if (isUpdateScreenshotGoldens) { + // Do not fail tests when bulk-updating screenshot goldens. + return 'OK'; + } else { + return 'Golden file $filename was updated. You can remove "write: true" in the call to matchGoldenFile.'; + } } ImageDiff diff = ImageDiff(golden: decodeNamedImage(file.readAsBytesSync(), filename), other: screenshot); diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index 1dc88669b7458..1110787a668e2 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -19,8 +19,8 @@ import 'test_platform.dart'; import 'environment.dart'; import 'utils.dart'; -class TestsCommand extends Command { - TestsCommand() { +class TestCommand extends Command { + TestCommand() { argParser ..addMultiOption( 'target', @@ -32,6 +32,13 @@ class TestsCommand extends Command { help: 'Pauses the browser before running a test, giving you an ' 'opportunity to add breakpoints or inspect loaded code before ' 'running the code.', + ) + ..addFlag( + 'update-screenshot-goldens', + defaultsTo: false, + help: 'When running screenshot tests writes them to the file system into ' + '.dart_tool/goldens. Use this option to bulk-update all screenshots, ' + 'for example, when a new browser version affects pixels.', ); addChromeVersionOption(argParser); @@ -73,6 +80,10 @@ class TestsCommand extends Command { /// See [ChromeInstallerCommand.chromeVersion]. String get chromeVersion => argResults['chrome-version']; + /// When running screenshot tests writes them to the file system into + /// ".dart_tool/goldens". + bool get isUpdateScreenshotGoldens => argResults['update-screenshot-goldens']; + Future _runTargetTests(List targets) async { await _runTestBatch(targets, concurrency: 1, expectFailure: false); _checkExitCode(); @@ -234,7 +245,11 @@ class TestsCommand extends Command { ...testFiles.map((f) => f.relativeToWebUi).toList(), ]; hack.registerPlatformPlugin([Runtime.chrome], () { - return BrowserPlatform.start(root: io.Directory.current.path); + return BrowserPlatform.start( + root: io.Directory.current.path, + // It doesn't make sense to update a screenshot for a test that is expected to fail. + isUpdateScreenshotGoldens: !expectFailure && isUpdateScreenshotGoldens, + ); }); // We want to run tests with `web_ui` as a working directory. diff --git a/lib/web_ui/test/golden_files/smoke_test.png b/lib/web_ui/test/golden_files/smoke_test.png index e136d923394b50c7b2a7f4beeea91524e7ac47c2..5b0f5dcd278497f7b15df5c08dfdac76a07d45fb 100644 GIT binary patch literal 2159 zcmeHJ=~vQe6o$%auak4e%2Q}{m?_Q3Emzb`#U;uaZKy;^8#Fa@Hy}{UI+>}skhmmd z7KWylhNy+wVx^=MsFOZeCx}-?|I*I&wKCl+~=Nq%l`yo^9JJ$ zAP{J?kGIEPAQ0FMIKN-_3t&su*w=tS>yG$%91X;QXGAfXr}`lsU!hUqjGYA(gF6&o zv&=BxM-PgRV$WvAR_rxk?mV#n_o1~1_HOE;95%auKil7Clj}cOrKLVlGvBO7KMZf2 z4)yRVR*$d_MHI*HlHyd89eTXvu(ftNaWSQX9zDY%Tj*3K>rL+&p|op2bw=PduMFKx z5B`^{HcPMc%JJ2zXHQ;Hf3H=GMmui{K9pDs>f3dtL+n^g|54zLe(Cv4)3bz$Zl#o- z#u%s#s(R>0Wyl0on4!-Y1D>m%NRXCa<}(ATj73txNmnEpzIfUZH+Qa8UiX|YuWzS? ze<;pR)l5*6#&Ya*84(-N+1n(p_dIXwb){u?v8i`>YaSs%HAxQo2oET6)jA|s4^77t zimN*5q{TB)1CP%Tl%EiS0;nHWMLRmiwgJg>mxSp7HfN8@@wm8)ZuIdZGe%VKME;w=5K0lmCD^Hmo{BzdU zA>F|dPZ6@Bg@$b-oGVoOiO!N2b9t-n<0KtPGb~{U-|{Wlgl=SUwojrtgl;}OjF*;2 z_LSN(vD_kTkPZ%CQ3`CeJHYOOz+{jDv#{0W$Gwro-^~A}$YMH|RC2%T3rULU&yCnG zD{3*OP0Wf$Rf0uNLXT-2FNvBRzbN)cPxUcnWLKTHF!*wCxfF;&F@*SW)OraQ){gd~ z(bIHzW2cmh>m}Aa=ftje&6>$F7@3=ifz-Qj@0#pZ2;q5H%)OmqDeu)vJp$ z{7YO07H8Pv0gYz7t8k*IWa#Ll_k!1NmzNbhXn4%fGiD=6q7mF!j#WJz<+=a0-YMV&AS|E_#3vE zdan9gZ3xE^uKajxJ1IDKxHVZmg>L7vo5qC$5O7GZWv>uWhas;eQCcKR(KSvEo-#r= z5RvhK5M)4m|LS(Zy?Vnr-G@uZ79!A!$|hnhtbU8#I53auG%n(z1YOm^v#h97uP7$e zu+I%xRTHw*hUwgk>akpiv6OP-x#S@)G9(znnvmf--{3pG~Mm=s&zlz gPYC|UF3|tN%<#>a^2i$m7737#=LwHG_jA|&1)q88!~g&Q literal 2413 zcmeHJ`B#!zAAc&(RHk{HCbh^&t8w1U&=yM#Ethsh5G#{1m*YAP71snGCf*Z}-gJW(n7ZhaqXr{)62hAq5 zerZ#?r!Pt_cDPs_oII3aTAX_o2+f*?-f@@=POxIhV(>PjYdV(n$x|<# z%GNudDmh($t`w5ka&KBSNRwU?h0CAT^LH%jXCxmO`st4$Z15cY(xm8YcIjBQiDjJZ zvLb8t>uoLUT<_la+#)N&>SmrbkG4HM)A+=wSJQtIa5Q_Pdw$z!#PdC35tTb?S9@BF z9}l!Y*(8pmZR~WeX}QmZeQJ^<%2hP_u3(?Vl)}-!Uf%LDcFl^h^tv&kp|l!N=5D{$ zv47A$ef(;5wrL5H1&{C=zp|qDMeZ6h1r6Xn_|fG0$Si*tRAHRl>ADx&CbwcbmG#ytaxfDs<`xd&dM~s zPNx*W1m1@DkHTl@g-`VYm8+p71UWpObvA3}q=&3vk4n%yMr`LQ-XdTw7n#~4t&6h~ zbrM`*1KxkylhC20WcG?1v9AUmhaikj2dLRg8N+x1{8ht+cfD)9J{=>q;=B$Dy8r)t7lpSyY&G5Xvk1F{w2@6K6`J5dQI*z*%NlR+XyJZq{} z#w&w$80$i)#pfeZhhz2;aF-T9u*(=xJmGtJB*|Vl!LlBl$0HAFyFD95K^k9mS^0#` z4#!e=#|=EvQ?9O9DU6&QNgE4?o+W5G^6Tr6k9-H@(6 zB{iGP_dAjVs-b;qASAdnXRYTW0{G~dH+K)u#7(K`9lHbvbw6f&xJOdOMulef?Gu&Y zWZc0dXmXFkK8kiBFI6h8iyy9=`tYDwD9g25;;vV{uGoWS!uSEeJ+-(Bh{%waLM#GE zR?yK2T-aiOkz24qSB(7OR3)rs{F;p*pnT$Jt&26aUf|vSngVbC#+67(6<@f7Q}Des zPm3Y6S`AZ&T-?w#qTsECW*c!VC=a`&=kncd%w~RK1ir)L28YCK!xyw^8PN7;pSM|2 zD+828LjZuHM}*Tqh=27*V{ZP0XPl7=m;cz+s-&Rj-g8QaNl;>_Qj77P1nu)Ab9xpu zvt`j(9%_?ULz+>DF<~q+qa=t-R3mQtnv`%d{E8dQmQ0RvyKhYbJ-$0YuMYfbt-)PnWJX!XfW*^vB!&s5Sa5v8 z(7 z8MWqUJgUMw>vFg}Avmo6+3ET}6XB~LQZC2AsgBUB0+9YSzQ0`i8yTWz^#A|> diff --git a/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart b/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart index c4366eb4310a7..00e8e652ef08e 100644 --- a/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart +++ b/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart @@ -10,6 +10,7 @@ import 'package:web_engine_tester/golden_tester.dart'; void main() { test('screenshot test reports success', () async { + html.document.body.style.fontFamily = 'Roboto'; html.document.body.innerHtml = 'Hello world!'; await matchGoldenFile('__local__/smoke_test.png', region: Rect.fromLTWH(0, 0, 320, 200)); }); From e2da9ae02cff27d693a70b699465053fccc7e0ae Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Oct 2019 12:32:20 -0700 Subject: [PATCH 2/6] use bundled Roboto font --- lib/web_ui/dev/test_runner.dart | 29 +++++++++++-------- lib/web_ui/lib/assets/.gitignore | 2 +- .../lib/src/engine/text/font_collection.dart | 10 +++++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index 1110787a668e2..e9a5c233da776 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -54,7 +54,7 @@ class TestCommand extends Command { Future run() async { Chrome.version = chromeVersion; - _copyAhemFontIntoWebUi(); + _copyTestFontsIntoWebUi(); await _buildHostPage(); final List targets = @@ -272,15 +272,20 @@ class TestCommand extends Command { } } -void _copyAhemFontIntoWebUi() { - final io.File sourceAhemTtf = io.File(path.join( - environment.flutterDirectory.path, - 'third_party', - 'txt', - 'third_party', - 'fonts', - 'ahem.ttf')); - final String destinationAhemTtfPath = - path.join(environment.webUiRootDir.path, 'lib', 'assets', 'ahem.ttf'); - sourceAhemTtf.copySync(destinationAhemTtfPath); +const List _kTestFonts = ['ahem.ttf', 'Roboto-Light.ttf']; + +void _copyTestFontsIntoWebUi() { + final String fontsPath = path.join( + environment.flutterDirectory.path, + 'third_party', + 'txt', + 'third_party', + 'fonts', + ); + + for (String fontFile in _kTestFonts) { + final io.File sourceTtf = io.File(path.join(fontsPath, fontFile)); + final String destinationTtfPath = path.join(environment.webUiRootDir.path, 'lib', 'assets', fontFile); + sourceTtf.copySync(destinationTtfPath); + } } diff --git a/lib/web_ui/lib/assets/.gitignore b/lib/web_ui/lib/assets/.gitignore index 252e3401e5f02..6ca895932c4e5 100644 --- a/lib/web_ui/lib/assets/.gitignore +++ b/lib/web_ui/lib/assets/.gitignore @@ -1 +1 @@ -ahem.ttf \ No newline at end of file +*.ttf \ No newline at end of file diff --git a/lib/web_ui/lib/src/engine/text/font_collection.dart b/lib/web_ui/lib/src/engine/text/font_collection.dart index b6daf744a922d..0a6d4d419af5d 100644 --- a/lib/web_ui/lib/src/engine/text/font_collection.dart +++ b/lib/web_ui/lib/src/engine/text/font_collection.dart @@ -4,8 +4,10 @@ part of engine; -const String _testFontFamily = 'Ahem'; -const String _testFontUrl = 'packages/ui/assets/ahem.ttf'; +const String _ahemFontFamily = 'Ahem'; +const String _ahemFontUrl = 'packages/ui/assets/ahem.ttf'; +const String _robotoFontFamily = 'Roboto'; +const String _robotoFontUrl = 'packages/ui/assets/Roboto-Light.ttf'; /// This class is responsible for registering and loading fonts. /// @@ -75,7 +77,9 @@ class FontCollection { void debugRegisterTestFonts() { _testFontManager = _FontManager(); _testFontManager.registerAsset( - _testFontFamily, 'url($_testFontUrl)', const {}); + _ahemFontFamily, 'url($_ahemFontUrl)', const {}); + _testFontManager.registerAsset( + _robotoFontFamily, 'url($_robotoFontUrl)', const {}); } /// Returns a [Future] that completes when the registered fonts are loaded From 39ac372b5a5e7ad1914b49049e78a5ddadebb02d Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Oct 2019 12:46:28 -0700 Subject: [PATCH 3/6] switch to Roboto-Regular --- lib/web_ui/dev/test_runner.dart | 2 +- lib/web_ui/lib/src/engine/text/font_collection.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index e9a5c233da776..3954ce17140a9 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -272,7 +272,7 @@ class TestCommand extends Command { } } -const List _kTestFonts = ['ahem.ttf', 'Roboto-Light.ttf']; +const List _kTestFonts = ['ahem.ttf', 'Roboto-Regular.ttf']; void _copyTestFontsIntoWebUi() { final String fontsPath = path.join( diff --git a/lib/web_ui/lib/src/engine/text/font_collection.dart b/lib/web_ui/lib/src/engine/text/font_collection.dart index 0a6d4d419af5d..799b959b90803 100644 --- a/lib/web_ui/lib/src/engine/text/font_collection.dart +++ b/lib/web_ui/lib/src/engine/text/font_collection.dart @@ -7,7 +7,7 @@ part of engine; const String _ahemFontFamily = 'Ahem'; const String _ahemFontUrl = 'packages/ui/assets/ahem.ttf'; const String _robotoFontFamily = 'Roboto'; -const String _robotoFontUrl = 'packages/ui/assets/Roboto-Light.ttf'; +const String _robotoFontUrl = 'packages/ui/assets/Roboto-Regular.ttf'; /// This class is responsible for registering and loading fonts. /// From dc5c289538751565a309c121c28180e14dfbe7fa Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Oct 2019 13:02:33 -0700 Subject: [PATCH 4/6] make golden smoke test use the engine --- lib/web_ui/test/golden_files/smoke_test.png | Bin 2159 -> 1769 bytes .../golden_success_smoke_test.dart | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/test/golden_files/smoke_test.png b/lib/web_ui/test/golden_files/smoke_test.png index 5b0f5dcd278497f7b15df5c08dfdac76a07d45fb..f1b4a7fef0439a1daa15cfd46e7f5f352a50044d 100644 GIT binary patch literal 1769 zcmeH||5K6&0LEWQ(=yGvGE0*#TW&2)S81ydGZidPQhZ}Z*%vcP!!J416JC(YtW0g! zPFE@}mzgi7l_E;PYg40nD%WdwzKCp8MQAH;zP+ zoR)7`4gi2t1UWPY0BnL6{cDG%i+a~~j}QQsK8XlD5SwkISJNL=CwRyWi2r)|t?S?V zN9`m>I^SRM`@>bmW5$zj-! zLJ>-p_e5Fjtrs6_N2o&SEL%OH79j+M`C}fB83XWLdreM2cPY;|w_qKOuy7u29dSmi z#JhT#AiGM}M;FTG-VqU>Q`{NAmwuFG=mY~byIzRx28T<9{X8pzG|p!Z@WIlP@vL^I zX~??`=~$D!)iKbL)U3&rP2lF%G2;Nz81`F8rNu?)X-_{4ZS&Xr=lR^Yf@E~+r zK@%BEGJ0!s2KaDAmS@noI$0Qy@==-M$!*b%KNkjBU+}E`Y*6k&HTDET+xB5BOqR(L z{~cp|?FG`}<5=>I?Zk;j1?($%q^rn+oe51kRYJZ=tk{z4_ojJ!u8$jH?XT(3a}+S>_qV@7K~|36`13^cul2*4sp?7MVK4^AvL-^mINbH6BHy zNyfPzqohHmuGDYjOwK8${tiEOopgIv?MUa2GD1jyqzZ z`9xH}KB|A7itbj%5~jPmZ9dHn!KLx=!el#q(0LS7Z|;~H2D3DvND)Mp3pkgGbtF9K z6BlEAUj{NNHC}xt}d~ z%f^_{hP@hsDONgrjHeBUm=Dl!&R=?|shegUxB^#X>TKN4AJCl6hn?K7Em1wJW8O5s za))x%y{!Y6VS9X?#PG_qO;~>qV^Q|pPsO-qg9*j8XfmmW9|3wZG zC9Xd=Aoc2VWwlI4*KUq6tl$;Ji%#a5nbZ23ioPYPa6Y3vT68I~@?P@*WIBPS%b6M$ zNn}nn5iA+EzO%b_BhZ9Q&U)yTC)wpiK{-imc2U5c0D@&OKPZv#;aAz?!Yvrj!lB{`M>lVQio~R6XrlGyFBuoCxLxBJO{1SbggE&{zxQmbJ}m6r zE7bjYSSZMWDS22^YuLNbW_e{sn+?Qju9#LOKv(-*x2YSY7L)eVT=Q!4P_f0biZs)} z5X6a+KvZh#wMdw2vjgtE#t lZ@01i5`9_Y|7T+?_4Re~S+bi2TD&kIA}lJjKIGKpe*rp9_nrU% literal 2159 zcmeHJ=~vQe6o$%auak4e%2Q}{m?_Q3Emzb`#U;uaZKy;^8#Fa@Hy}{UI+>}skhmmd z7KWylhNy+wVx^=MsFOZeCx}-?|I*I&wKCl+~=Nq%l`yo^9JJ$ zAP{J?kGIEPAQ0FMIKN-_3t&su*w=tS>yG$%91X;QXGAfXr}`lsU!hUqjGYA(gF6&o zv&=BxM-PgRV$WvAR_rxk?mV#n_o1~1_HOE;95%auKil7Clj}cOrKLVlGvBO7KMZf2 z4)yRVR*$d_MHI*HlHyd89eTXvu(ftNaWSQX9zDY%Tj*3K>rL+&p|op2bw=PduMFKx z5B`^{HcPMc%JJ2zXHQ;Hf3H=GMmui{K9pDs>f3dtL+n^g|54zLe(Cv4)3bz$Zl#o- z#u%s#s(R>0Wyl0on4!-Y1D>m%NRXCa<}(ATj73txNmnEpzIfUZH+Qa8UiX|YuWzS? ze<;pR)l5*6#&Ya*84(-N+1n(p_dIXwb){u?v8i`>YaSs%HAxQo2oET6)jA|s4^77t zimN*5q{TB)1CP%Tl%EiS0;nHWMLRmiwgJg>mxSp7HfN8@@wm8)ZuIdZGe%VKME;w=5K0lmCD^Hmo{BzdU zA>F|dPZ6@Bg@$b-oGVoOiO!N2b9t-n<0KtPGb~{U-|{Wlgl=SUwojrtgl;}OjF*;2 z_LSN(vD_kTkPZ%CQ3`CeJHYOOz+{jDv#{0W$Gwro-^~A}$YMH|RC2%T3rULU&yCnG zD{3*OP0Wf$Rf0uNLXT-2FNvBRzbN)cPxUcnWLKTHF!*wCxfF;&F@*SW)OraQ){gd~ z(bIHzW2cmh>m}Aa=ftje&6>$F7@3=ifz-Qj@0#pZ2;q5H%)OmqDeu)vJp$ z{7YO07H8Pv0gYz7t8k*IWa#Ll_k!1NmzNbhXn4%fGiD=6q7mF!j#WJz<+=a0-YMV&AS|E_#3vE zdan9gZ3xE^uKajxJ1IDKxHVZmg>L7vo5qC$5O7GZWv>uWhas;eQCcKR(KSvEo-#r= z5RvhK5M)4m|LS(Zy?Vnr-G@uZ79!A!$|hnhtbU8#I53auG%n(z1YOm^v#h97uP7$e zu+I%xRTHw*hUwgk>akpiv6OP-x#S@)G9(znnvmf--{3pG~Mm=s&zlz gPYC|UF3|tN%<#>a^2i$m7737#=LwHG_jA|&1)q88!~g&Q diff --git a/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart b/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart index 00e8e652ef08e..6b451af43b21a 100644 --- a/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart +++ b/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart @@ -6,9 +6,13 @@ import 'dart:html' as html; import 'package:test/test.dart'; import 'package:ui/ui.dart'; +import 'package:ui/src/engine.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() { +void main() async { + debugEmulateFlutterTesterEnvironment = true; + await webOnlyInitializePlatform(assetManager: WebOnlyMockAssetManager()); + test('screenshot test reports success', () async { html.document.body.style.fontFamily = 'Roboto'; html.document.body.innerHtml = 'Hello world!'; From 6a997919865d0e18019a12a318a19dab1a37f0e1 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Oct 2019 13:21:15 -0700 Subject: [PATCH 5/6] use the real SHA --- lib/web_ui/dev/goldens_lock.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/web_ui/dev/goldens_lock.yaml b/lib/web_ui/dev/goldens_lock.yaml index 77186e753d3b3..004237536a306 100644 --- a/lib/web_ui/dev/goldens_lock.yaml +++ b/lib/web_ui/dev/goldens_lock.yaml @@ -1,3 +1,2 @@ repository: https://github.com/flutter/goldens.git -# TODO: DO NOT SUBMIT - this SHA is from a pending PR -revision: 1fda4f5305bbbd787c0b2a3e0f04b6aa358e64ce +revision: 17a42169bbf6739421fce8a0a1695eb3405375b6 From 427a000b0a62f92ef3336efc2ada1177f2835b79 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Oct 2019 13:43:26 -0700 Subject: [PATCH 6/6] doUpdateScreenshotGoldens --- lib/web_ui/dev/test_platform.dart | 12 ++++++------ lib/web_ui/dev/test_runner.dart | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 5c475dcab3705..8426676be88c3 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -55,7 +55,7 @@ class BrowserPlatform extends PlatformPlugin { /// /// [root] is the root directory that the server should serve. It defaults to /// the working directory. - static Future start({String root, bool isUpdateScreenshotGoldens: false}) async { + static Future start({String root, bool doUpdateScreenshotGoldens: false}) async { var server = shelf_io.IOServer(await HttpMultiServer.loopback(0)); return BrowserPlatform._( server, @@ -63,7 +63,7 @@ class BrowserPlatform extends PlatformPlugin { p.fromUri(await Isolate.resolvePackageUri( Uri.parse('package:test/src/runner/browser/static/favicon.ico'))), root: root, - isUpdateScreenshotGoldens: isUpdateScreenshotGoldens, + doUpdateScreenshotGoldens: doUpdateScreenshotGoldens, ); } @@ -102,10 +102,10 @@ class BrowserPlatform extends PlatformPlugin { bool get _closed => _closeMemo.hasRun; /// Whether to update screenshot golden files. - final bool isUpdateScreenshotGoldens; + final bool doUpdateScreenshotGoldens; BrowserPlatform._(this._server, Configuration config, String faviconPath, - {String root, this.isUpdateScreenshotGoldens}) + {String root, this.doUpdateScreenshotGoldens}) : _config = config, _root = root == null ? p.current : root, _http = config.pubServeUrl == null ? null : HttpClient() { @@ -152,7 +152,7 @@ class BrowserPlatform extends PlatformPlugin { } Future _diffScreenshot(String filename, bool write, [ Map region ]) async { - if (isUpdateScreenshotGoldens) { + if (doUpdateScreenshotGoldens) { write = true; } @@ -224,7 +224,7 @@ To automatically create this file call matchGoldenFile('$filename', write: true) // Don't even bother with the comparison, just write and return print('Updating screenshot golden: $file'); file.writeAsBytesSync(encodePng(screenshot), flush: true); - if (isUpdateScreenshotGoldens) { + if (doUpdateScreenshotGoldens) { // Do not fail tests when bulk-updating screenshot goldens. return 'OK'; } else { diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index 3954ce17140a9..4a19873a95d5e 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -82,7 +82,7 @@ class TestCommand extends Command { /// When running screenshot tests writes them to the file system into /// ".dart_tool/goldens". - bool get isUpdateScreenshotGoldens => argResults['update-screenshot-goldens']; + bool get doUpdateScreenshotGoldens => argResults['update-screenshot-goldens']; Future _runTargetTests(List targets) async { await _runTestBatch(targets, concurrency: 1, expectFailure: false); @@ -248,7 +248,7 @@ class TestCommand extends Command { return BrowserPlatform.start( root: io.Directory.current.path, // It doesn't make sense to update a screenshot for a test that is expected to fail. - isUpdateScreenshotGoldens: !expectFailure && isUpdateScreenshotGoldens, + doUpdateScreenshotGoldens: !expectFailure && doUpdateScreenshotGoldens, ); });