From 054aba324163f0db1c1689f243832ab0819699cc Mon Sep 17 00:00:00 2001 From: Josh Story Date: Sun, 6 Mar 2022 10:50:35 -0800 Subject: [PATCH] add tests to exercise codepaths dealing with buffer overlows --- .../ReactDOMFizzServerBrowser-test.js | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js index ad6176e3fa5e6..9fb4dc0b6773e 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js @@ -248,4 +248,44 @@ describe('ReactDOMFizzServer', () => { expect(rendered).toBe(false); expect(isComplete).toBe(true); }); + + // @gate experimental + it('should stream large contents that might overlow individual buffers', async () => { + let str492 = `(492) This string is intentionally 492 bytes long because we want to make sure we process chunks that will overflow buffer boundaries. It will repeat to fill out the bytes required (inclusive of this prompt):: foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux q :: total count (492)`; + let str2049 = `(2049) This string is intentionally 2049 bytes long because we want to make sure we process chunks that will overflow buffer boundaries. It will repeat to fill out the bytes required (inclusive of this prompt):: foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy thud foo bar qux quux corge grault garply waldo fred plugh xyzzy :: total count (2049)`; + + // this specific layout is somewhat contrived to exercise the landing on + // an exact view boundary. it's not critical to test this edge case but + // since we are setting up a test in general for larger chunks I contrived it + // as such for now. I don't think it needs to be maintained if in the future + // the view sizes change or become dynamic becasue of the use of byobRequest + let stream; + stream = await ReactDOMFizzServer.renderToReadableStream( + <> +
+ {''} +
+
{str492}
+
{str492}
+ , + ); + + let result; + result = await readResult(stream); + expect(result).toMatchInlineSnapshot( + `"
${str492}
${str492}
"`, + ); + + // this size 2049 was chosen to be a couple base 2 orders larger than the current view + // size. if the size changes in the future hopefully this will still exercise + // a chunk that is too large for the view size. + stream = await ReactDOMFizzServer.renderToReadableStream( + <> +
{str2049}
+ , + ); + + result = await readResult(stream); + expect(result).toMatchInlineSnapshot(`"
${str2049}
"`); + }); });