Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Image block: Fix flaky tests #52442

Merged
merged 2 commits into from Jul 27, 2023
Merged

Conversation

artemiomorales
Copy link
Contributor

What?

The image tests have recently been flagged as flaky. This PR attempts to address that.

Why?

We want our tests run efficiently and reliably.

How?

I believe this issue may be caused by inconsistent uploading behavior in the beforeEach(). I've moved the upload logic outside of that call and instead do it manually for most of the tests now.

Testing Instructions

Unfortunately, I'm not sure it's possible to test this locally. You can try running npm run test:e2e:playwright -- image.spec.js to make sure the tests pass, but the flakiness appears to only be present on Github.

Testing Instructions for Keyboard

N/A

Screenshots or screencast

N/A

@artemiomorales
Copy link
Contributor Author

I want to try and run these tests a few times here on Github to see if the flakiness gets resolved. If anyone has any suggestions on how else I can attempt to address this, please let me know! 🙏

@github-actions
Copy link

github-actions bot commented Jul 7, 2023

Size Change: +3.01 kB (0%)

Total Size: 1.44 MB

Filename Size Change
build/block-editor/index.min.js 210 kB +768 B (0%)
build/block-editor/style-rtl.css 14.8 kB +3 B (0%)
build/block-editor/style.css 14.8 kB +3 B (0%)
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB +65 B (+2%)
build/block-library/blocks/navigation/view.min.js 469 B +31 B (+7%) 🔍
build/block-library/blocks/preformatted/style-rtl.css 125 B +22 B (+21%) 🚨
build/block-library/blocks/preformatted/style.css 125 B +22 B (+21%) 🚨
build/block-library/blocks/search/view.min.js 631 B +100 B (+19%) ⚠️
build/block-library/blocks/social-links/style-rtl.css 1.44 kB +12 B (+1%)
build/block-library/blocks/social-links/style.css 1.43 kB +11 B (+1%)
build/block-library/index.min.js 202 kB +530 B (0%)
build/block-library/style-rtl.css 13.7 kB +20 B (0%)
build/block-library/style.css 13.8 kB +19 B (0%)
build/blocks/index.min.js 51 kB +16 B (0%)
build/commands/index.min.js 15 kB +109 B (+1%)
build/commands/style-rtl.css 835 B +8 B (+1%)
build/commands/style.css 834 B +7 B (+1%)
build/components/index.min.js 241 kB +213 B (0%)
build/compose/index.min.js 12.1 kB +35 B (0%)
build/core-commands/index.min.js 2.44 kB +130 B (+6%) 🔍
build/edit-post/index.min.js 35.3 kB +6 B (0%)
build/edit-post/style-rtl.css 7.58 kB +1 B (0%)
build/edit-site/index.min.js 89.7 kB +803 B (+1%)
build/edit-site/style-rtl.css 13.2 kB +32 B (0%)
build/edit-site/style.css 13.2 kB +31 B (0%)
build/interactivity/index.min.js 10.5 kB +16 B (0%)
build/rich-text/index.min.js 11 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 6.99 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.26 kB
build/block-editor/content.css 4.25 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 178 B
build/block-library/blocks/details/style.css 178 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.42 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.46 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 587 B
build/block-library/blocks/search/style.css 584 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/core-data/index.min.js 16.4 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.28 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/style.css 7.57 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.4 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.62 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.18 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/plugins/index.min.js 1.77 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 951 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.71 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.83 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@artemiomorales
Copy link
Contributor Author

artemiomorales commented Jul 8, 2023

@Mamaduka I created this pull request based on your comment on #51305.

I've so far been unable to reproduce the unreliability of the tests locally, so the fixes I've pushed here are a guess as to what might be causing the issue based on where the tests have been failing.

Two questions:
1.) Do you have any suggestions on how best to approach this?
2.) How does the 'flaky' status get removed? Does the system automatically remove it once enough tests have passed without issue?

Copy link
Member

@Mamaduka Mamaduka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@artemiomorales, when you check the logs in flaky test issues, you'll see that most are failing with the following error:

Expected pattern: /b3dbc133-fbc9-417f-abd4-5aa4f9974d9e/
Received string:  "blob:http://localhost:8889/f4e413c1-7eed-403f-b80d-a48f50798650"

This means the image URL is a blob instead of a string. The image block will display a blob while an image is uploading to show immediate feedback.

I usually use traces from test failure artifacts for debugging the e2e test.

See the Playwright docs for more details - https://playwright.dev/docs/trace-viewer.

Copy link
Member

@Mamaduka Mamaduka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@artemiomorales, do you mind rebasing the branch on top of the trunk? Then we can land this after all checks are green.

@artemiomorales
Copy link
Contributor Author

artemiomorales commented Jul 19, 2023

@Mamaduka Okay so the good news is I've managed to reproduce this locally but it seems this PR as is won't address the issue. Like you said, it looks like the tests are failing because it's taking too long to upload the responsive image.

Locally, I've been testing using a throttled network and have removed the use of the large responsive image wherever it isn't being explicitly used. It's still present in two tests though and am not quite sure how to resolve yet, as increasing the test timeout seems to have no effect.

Will keep hammering at this, though am happy to hear ideas!

@dmsnell
Copy link
Contributor

dmsnell commented Jul 25, 2023

@artemiomorales are we sure it's taking too long to upload and it isn't that we're running through test code before we give the editor time to update? after image upload, the image block has to dispatch some actions to update its attributes, which is what we're seeing with the blobs. I don't see anywhere that we're explicitly running all queued tasks and microtasks which would give space for those dispatches to resolve, if they need to.

you might try wrapping a setTimeout inside a Promise and run the assertion code inside the timeout. this would put it at the end of the processing chain and hopefully give time for the store to update.

I'm worried that if we try to solve this by using a smaller image we're going to be chasing the problem every so often because we've left in the race condition and simply tried to get ahead of it instead of eliminating the race which is at the heart of the flakiness.

another potential option to try is to manually dispatch some action in the test code after update, or even inside that timeout.

// Give the image block the chance to update after the upload is finished.
await new Promise( resolve => {
	setImmediate( async () => {
		const image = imageBlock.locator( 'role=img' );
		await expect( image ).toBeVisibile();
		await expect( image ).toHaveAttribute(  );
	} );
} );

await editor.openDocumentSettingsSidebar();

@Mamaduka
Copy link
Member

Maybe we should skip these tests while trying to find a stable solution for the flakiness. They fail often.

@kevin940726
Copy link
Member

Expected pattern: /b3dbc133-fbc9-417f-abd4-5aa4f9974d9e/
Received string:  "blob:http://localhost:8889/f4e413c1-7eed-403f-b80d-a48f50798650"

This means the image URL is a blob instead of a string. The image block will display a blob while an image is uploading to show immediate feedback.

IIRC, the image block sets a temporary blob url before the upload finishes. This means that when the test timeouts (5s) the image still has the temporary url. It's possible that the upload is taking too long for the test. Maybe we should just try increasing the timeout for that action.

await expect( image ).toHaveAttribute(
	'src',
-	new RegExp( filename )
+	new RegExp( filename ),
+	{ timeout: 10_000 }
);

I don't see anywhere that we're explicitly running all queued tasks and microtasks which would give space for those dispatches to resolve, if they need to.

Playwright automatically waits and retries until the assertion passes. So, yes, we're waiting, just implicitly, matching what end users do. IMHO we shouldn't rely on implementation details in e2e tests. Instead, we should wait, retry, and fail with a reasonable timeout.

@Mamaduka
Copy link
Member

The image block wrapper receives the is-transient class while the media uploads. We can also wait for it not to have this class, but I guess this also counts as testing implementation details.

const classes = classnames( className, {
'is-transient': temporaryURL,

@artemiomorales
Copy link
Contributor Author

Maybe we should skip these tests while trying to find a stable solution for the flakiness. They fail often.

@Mamaduka Sounds good! I've created a PR that disables the tests for now.

This removes the uploading of a large image from responsive
tests that do not explicitly need it.

For the tests that do need the image, it increases the timeout
to give enough time for the image to finish uploading.
@artemiomorales
Copy link
Contributor Author

are we sure it's taking too long to upload and it isn't that we're running through test code before we give the editor time to update?

IIRC, the image block sets a temporary blob url before the upload finishes. This means that when the test timeouts (5s) the image still has the temporary url. It's possible that the upload is taking too long for the test. Maybe we should just try increasing the timeout for that action.

@dmsnell @kevin940726 Thanks for taking a look at this! I've increased the timeout for the assertion on the image src attribute and it appears to fix the issue on my local. (For some reason, increasing the global timeout time doesn't work, but increasing it for that specific assertion does).

The tests passed — let's merge and give this a go.

@artemiomorales artemiomorales merged commit a6736b8 into trunk Jul 27, 2023
51 checks passed
@artemiomorales artemiomorales deleted the fix/image-block-flaky-tests branch July 27, 2023 17:57
@github-actions github-actions bot added this to the Gutenberg 16.4 milestone Jul 27, 2023
@dmsnell
Copy link
Contributor

dmsnell commented Jul 27, 2023

The tests passed — let's merge and give this a go.

can we also follow-up here and try to remove the race condition? or at a minimum add a note or a @TODO in the code? we're bound to hit it again as long as we're hoping things finish before the timeout.

@priethor priethor added [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests. [Block] Image Affects the Image Block labels Jul 27, 2023
@kevin940726
Copy link
Member

@dmsnell I don't think there's any race condition here as mentioned in #52442 (comment). Or am I misunderstanding or missing something?

@kevin940726
Copy link
Member

I don't think we have to move the logic out of beforeEach with the increased timeout. Another idea would be using requestUtils in beforeEach to upload the image so it's faster and more reliable. This can all be in a future enhancement though 🙂.

For some reason, increasing the global timeout time doesn't work, but increasing it for that specific assertion does

I believe that's because these two timeouts serve different purposes. The global timeout is the maximum duration for a test but it doesn't change the assertion/action timeout.

@dmsnell
Copy link
Contributor

dmsnell commented Jul 28, 2023

@kevin940726 I meant mainly that increasing the timeout acknowledges that the test passing depends on something that takes different amounts of time on different computers or situations. given that we don't expect the image upload to fail, it seems like we should be able to rely on discrete circumstances in some way. or maybe our timeout ought to be something ridiculous, like a minute or five minutes or an hour - something that is clearly never going to be an issue.

for instance, could we assert that the blob is there first, and then wait again for the expected URL to appear? why is the upload time varying enough that it causes the tests to be flakey. that's the inherent race. maybe it's not possible to do what I want, but expanding the timeout marginally seems to be making a flakey test less flakey, but leaving it inherently flakey.

@kevin940726
Copy link
Member

I understand, but uploading is a task that doesn't have a deterministic waiting time. The best we could do is to wait for the end result. Oftentimes, the default action timeout (5s) makes sense as what end users would wait until they think something went wrong. The problem isn't that we're using the waiting technique, it's that uploading takes too long. I don't think uploading a 50KB image should take more than 5 seconds. Perhaps there's something unexpected happening in the backend and we should fix that instead. For now, increasing that one action's timeout fixes the cause of the flakiness but doesn't fix the "bug" we have in the app.

@dmsnell
Copy link
Contributor

dmsnell commented Jul 28, 2023

For now, increasing that one action's timeout fixes the cause of the flakiness but doesn't fix the "bug" we have in the app.

I agree that this was a good change to clear up the failing tests; I just wanted to see if we could find the cause of the problem instead of finishing the work here. Maybe there's no solution 🤷‍♂️

@kevin940726
Copy link
Member

I agreed! I believe the cause of the problem is in the backend and we probably can't fix it here. Good to keep in mind in case of a future refactor of the media library though!

@dmsnell
Copy link
Contributor

dmsnell commented Jul 28, 2023

when you say "backend" what are you talking about? isn't this all running within Playwright/Chromium?

@kevin940726
Copy link
Member

I mean the PHP side, where we process the uploads. Playwright merely operates the browser, it has no controls over the backend. This is what I'm seeing when manually uploading the same image in chrome devtools:

image

It took 3 seconds for the server to process the 50KB image. It's fair to assume it might take longer on a resource-limited machine like in the CI environment. I'm guessing it might depend on the size and resolution of the image that makes it take so long to process.

@dmsnell
Copy link
Contributor

dmsnell commented Jul 28, 2023

hm. this is interesting @kevin940726, thanks for clarifying.

though Playwright doesn't have control over the PHP, I guess we do.

I wonder if we could modify the WP environment for these tests to return earlier so that the delay goes away. this fundamental problem, of the PHP taking a while to respond, is there for all our tests that involve exchanges with the server.

on the other hand, does this test even rely on getting the original filename back into the image source? what if we merely tested that the image is created with a src that is either the test image file or the blob? Given that it doesn't appear like we're intending on testing the ability to upload a file, or either that we're testing that after an upload is successful, that the image block replaces the blob with the real URL (because this functionality should already be covered by image block tests and upload tests), maybe all we care about is that the image appears and we need to find a way to match it without relying on the URL itself…?

@kevin940726
Copy link
Member

though Playwright doesn't have control over the PHP, I guess we do.

Yep! But I think the code is in Core though and probably limited here.

Given that it doesn't appear like we're intending on testing the ability to upload a file, or either that we're testing that after an upload is successful, that the image block replaces the blob with the real UR

Exactly. That's why I proposed switching to requestUtils in #52442 (comment) and doing the uploading directly via REST API for performance. I believe some test cases already cover the uploading flow in the same file so we don't have to repeat them over and over again. (I'm guilty of not proposing this earlier when first reviewing the code)

In theory, we can upload it once in a beforeAll and just choose it in each test case. Similar techniques can be seen in

const media = await requestUtils.uploadMedia( filepath );
await editor.insertBlock( {
name: 'core/image',
attributes: {
// Specify alt text so that it can be queried by role selectors.
alt: filename,
id: media.id,
url: media.source_url,
},
} );

@dmsnell
Copy link
Contributor

dmsnell commented Jul 30, 2023

sounds like a good idea @kevin940726 - thanks for suggesting it and providing an example.

@mikachan mikachan added [Feature] Blocks Overall functionality of blocks [Type] Enhancement A suggestion for improvement. labels Aug 2, 2023
@priethor priethor removed the [Type] Enhancement A suggestion for improvement. label Aug 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Image Affects the Image Block [Feature] Blocks Overall functionality of blocks [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants