Skip to content

Commit 7bbe613

Browse files
authored
Merge branch 'trunk' into blueprint-editor
2 parents c001fa4 + f6425d1 commit 7bbe613

File tree

5 files changed

+114
-92
lines changed

5 files changed

+114
-92
lines changed

packages/php-wasm/node/src/test/php-dynamic-loading.spec.ts

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -65,55 +65,59 @@ describe.each(phpVersions)('PHP %s', async (phpVersion) => {
6565
);
6666
});
6767

68-
it('communicates with default DBGP port', async () => {
69-
const queries = [
70-
'feature_set -i 1 -n resolved_breakpoints -v 1',
71-
'feature_set -i 2 -n notify_ok -v 1',
72-
'feature_set -i 3 -n extended_properties -v 1',
73-
'feature_set -i 4 -n breakpoint_include_return_value -v 1',
74-
'feature_set -i 5 -n max_children -v 100',
75-
'run -i 6',
76-
'stop -i 7',
77-
];
78-
79-
let responses = '';
80-
let i = 0;
81-
let stopped = false;
82-
83-
const server = createServer();
84-
85-
server.on('connection', (tcpSource) => {
86-
tcpSource.on('data', (data) => {
87-
if (queries[i]) {
88-
responses += new TextDecoder().decode(data);
89-
const payload = `${Buffer.byteLength(queries[i])}\x00${
90-
queries[i]
91-
}\x00`;
92-
tcpSource.write(new TextEncoder().encode(payload));
93-
i++;
94-
} else {
95-
stopped = true;
96-
server.close();
97-
}
68+
it(
69+
'communicates with default DBGP port',
70+
async () => {
71+
const queries = [
72+
'feature_set -i 1 -n resolved_breakpoints -v 1',
73+
'feature_set -i 2 -n notify_ok -v 1',
74+
'feature_set -i 3 -n extended_properties -v 1',
75+
'feature_set -i 4 -n breakpoint_include_return_value -v 1',
76+
'feature_set -i 5 -n max_children -v 100',
77+
'run -i 6',
78+
'stop -i 7',
79+
];
80+
81+
let responses = '';
82+
let i = 0;
83+
let stopped = false;
84+
85+
const server = createServer();
86+
87+
server.on('connection', (tcpSource) => {
88+
tcpSource.on('data', (data) => {
89+
if (queries[i]) {
90+
responses += new TextDecoder().decode(data);
91+
const payload = `${Buffer.byteLength(
92+
queries[i]
93+
)}\x00${queries[i]}\x00`;
94+
tcpSource.write(new TextEncoder().encode(payload));
95+
i++;
96+
} else {
97+
stopped = true;
98+
server.close();
99+
}
100+
});
98101
});
99-
});
100102

101-
server.listen(9003);
103+
server.listen(9003);
102104

103-
const result = await php.runStream({
104-
code: `<?php
105+
const result = await php.runStream({
106+
code: `<?php
105107
echo "Hello Xdebug World";`,
106-
});
108+
});
107109

108-
await vi.waitUntil(() => stopped, { timeout: 5000 });
110+
await vi.waitUntil(() => stopped, { timeout: 5000 });
109111

110-
expect(responses).toContain(
111-
'<init xmlns="urn:debugger_protocol_v1"'
112-
);
113-
expect(responses).toContain('success="1"></response>');
112+
expect(responses).toContain(
113+
'<init xmlns="urn:debugger_protocol_v1"'
114+
);
115+
expect(responses).toContain('success="1"></response>');
114116

115-
expect(await result.stdoutText).toEqual('Hello Xdebug World');
116-
});
117+
expect(await result.stdoutText).toEqual('Hello Xdebug World');
118+
},
119+
{ timeout: 20_000 }
120+
);
117121
});
118122

119123
describe('Intl', () => {

packages/php-wasm/node/src/test/php-networking.spec.ts

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,21 @@ describe.each(phpVersions)('PHP %s', (phpVersion) => {
180180
}
181181
});
182182

183-
it('should support multi handle requests', async () => {
184-
try {
185-
const serverUrl = await startServer();
186-
const php = new PHP(
187-
await loadNodeRuntime(phpVersion, options)
188-
);
189-
await setPhpIniEntries(php, {
190-
allow_url_fopen: 1,
191-
disable_functions: '',
192-
});
193-
php.writeFile(
194-
'/tmp/test.php',
195-
`<?php
183+
it(
184+
'should support multi handle requests',
185+
async () => {
186+
try {
187+
const serverUrl = await startServer();
188+
const php = new PHP(
189+
await loadNodeRuntime(phpVersion, options)
190+
);
191+
await setPhpIniEntries(php, {
192+
allow_url_fopen: 1,
193+
disable_functions: '',
194+
});
195+
php.writeFile(
196+
'/tmp/test.php',
197+
`<?php
196198
$ch1 = curl_init();
197199
curl_setopt($ch1, CURLOPT_URL, "${serverUrl}");
198200
curl_setopt($ch1, CURLOPT_TCP_NODELAY, 0);
@@ -216,18 +218,20 @@ describe.each(phpVersions)('PHP %s', (phpVersion) => {
216218
curl_close($ch1);
217219
curl_close($ch2);
218220
`
219-
);
220-
const { text } = await php.run({
221-
scriptPath: '/tmp/test.php',
222-
});
223-
php.exit();
224-
expect(text).toEqual(
225-
'response from express\nresponse from express'
226-
);
227-
} finally {
228-
await stopServer(server);
229-
}
230-
});
221+
);
222+
const { text } = await php.run({
223+
scriptPath: '/tmp/test.php',
224+
});
225+
php.exit();
226+
expect(text).toEqual(
227+
'response from express\nresponse from express'
228+
);
229+
} finally {
230+
await stopServer(server);
231+
}
232+
},
233+
{ timeout: 20_000 }
234+
);
231235

232236
it('should follow redirects', async () => {
233237
try {

packages/playground/website/playwright/e2e/blueprints.spec.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -536,21 +536,23 @@ test('HTTPS requests via file_get_contents() to CORS-disabled URLs should succee
536536
path: '/wordpress/https-test.php',
537537
/**
538538
* The URL is valid, but the server does not provide the CORS headers required by fetch().
539+
* example.com is intentionally CORS-disabled and stable, making the assertion less flaky
540+
* than relying on playground.wordpress.net which occasionally returns transient 400s
541+
* when fetched from Firefox in CI.
539542
*/
540543
data: `<?php
541-
var_dump(
542-
strlen(
543-
file_get_contents(
544-
'https://playground.wordpress.net/test-fixtures/cors-file.html'
545-
)
546-
)
547-
);
544+
// Retry once through the runtime CORS proxy layer if the first fetch fails
545+
$contents = @file_get_contents('https://example.com/');
546+
if ($contents === false) {
547+
$contents = @file_get_contents('https://example.com/');
548+
}
549+
var_dump(strpos($contents ?: '', 'Example Domain') !== false);
548550
`,
549551
},
550552
],
551553
};
552554
await website.goto(`/#${JSON.stringify(blueprint)}`);
553-
await expect(wordpress.locator('body')).toContainText('int(340)');
555+
await expect(wordpress.locator('body')).toContainText('bool(true)');
554556
});
555557

556558
test('PHP Shutdown should work', async ({ website, wordpress }) => {

packages/playground/website/playwright/playwright.ci.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,9 @@ export default defineConfig({
1515
'nx run playground-php-cors-proxy:start& npx nx run playground-website:preview:ci',
1616
url: 'http://127.0.0.1/',
1717
reuseExistingServer: false,
18+
env: {
19+
CORS_PROXY_URL: 'http://127.0.0.1:5263/cors-proxy.php?',
20+
DEBUG: 'pw:webserver',
21+
},
1822
},
1923
});

packages/playground/wordpress/src/test/database.spec.ts

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ describe('Test database', () => {
3838

3939
it("should not start WordPress when SQLite ZIP not specified, the SQLite driver directory doesn't exist and MySQL can't be used", async () => {
4040
await expect(async () => {
41-
await bootWordPressAndRequestHandler({
41+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
42+
await using handler = await bootWordPressAndRequestHandler({
4243
createPhpRuntime: async () =>
4344
await loadNodeRuntime(RecommendedPHPVersion),
4445
siteUrl: 'http://playground-domain/',
@@ -48,26 +49,33 @@ describe('Test database', () => {
4849
}).rejects.toThrow('Error connecting to the MySQL database.');
4950
});
5051

51-
it('should install WordPress when SQL data path specified, even without SQLite ZIP path or SQLite driver directory', async () => {
52-
const handler = await bootWordPressAndRequestHandler({
53-
createPhpRuntime: async () =>
54-
await loadNodeRuntime(RecommendedPHPVersion),
55-
siteUrl: 'http://playground-domain/',
56-
wordPressZip: await getWordPressModule(),
57-
sqliteIntegrationPluginZip: await getSqliteDriverModule(),
58-
dataSqlPath: '/wordpress/wp-content/database/.ht.sqlite',
59-
});
52+
it(
53+
'should install WordPress when SQL data path specified, even without SQLite ZIP path or SQLite driver directory',
54+
async () => {
55+
await using handler = await bootWordPressAndRequestHandler({
56+
createPhpRuntime: async () =>
57+
await loadNodeRuntime(RecommendedPHPVersion),
58+
siteUrl: 'http://playground-domain/',
59+
wordPressZip: await getWordPressModule(),
60+
sqliteIntegrationPluginZip: await getSqliteDriverModule(),
61+
dataSqlPath: '/wordpress/wp-content/database/.ht.sqlite',
62+
});
6063

61-
const loadedWordPressVersion = await getLoadedWordPressVersion(handler);
62-
expect(loadedWordPressVersion).toBeTruthy();
63-
expect(Object.keys(MinifiedWordPressVersions)).toContain(
64-
loadedWordPressVersion
65-
);
66-
});
64+
const loadedWordPressVersion = await getLoadedWordPressVersion(
65+
handler
66+
);
67+
expect(loadedWordPressVersion).toBeTruthy();
68+
expect(Object.keys(MinifiedWordPressVersions)).toContain(
69+
loadedWordPressVersion
70+
);
71+
},
72+
{ timeout: 30_000 }
73+
);
6774

6875
it("should fail when the SQLite driver directory exists, but doesn't contain a valid driver", async () => {
6976
await expect(async () => {
70-
await bootWordPressAndRequestHandler({
77+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
78+
await using handler = await bootWordPressAndRequestHandler({
7179
createPhpRuntime: async () =>
7280
await loadNodeRuntime(RecommendedPHPVersion),
7381
siteUrl: 'http://playground-domain/',

0 commit comments

Comments
 (0)