@@ -24,8 +24,8 @@ import tmpdir from '../common/tmpdir.js';
2424tmpdir . refresh ( ) ;
2525
2626let dirc = 0 ;
27- function nextdir ( ) {
28- return tmpdir . resolve ( `copy_${ ++ dirc } ` ) ;
27+ function nextdir ( dirname ) {
28+ return tmpdir . resolve ( dirname || `copy_${ ++ dirc } ` ) ;
2929}
3030
3131// Synchronous implementation of copy.
@@ -312,6 +312,45 @@ function nextdir() {
312312 ) ;
313313}
314314
315+ // It must not throw error if attempt is made to copy to dest
316+ // directory with same prefix as src directory
317+ // regression test for https://github.com/nodejs/node/issues/54285
318+ {
319+ const src = nextdir ( 'prefix' ) ;
320+ const dest = nextdir ( 'prefix-a' ) ;
321+ mkdirSync ( src ) ;
322+ mkdirSync ( dest ) ;
323+ cpSync ( src , dest , mustNotMutateObjectDeep ( { recursive : true } ) ) ;
324+ }
325+
326+ // It must not throw error if attempt is made to copy to dest
327+ // directory if the parent of dest has same prefix as src directory
328+ // regression test for https://github.com/nodejs/node/issues/54285
329+ {
330+ const src = nextdir ( 'aa' ) ;
331+ const destParent = nextdir ( 'aaa' ) ;
332+ const dest = nextdir ( 'aaa/aabb' ) ;
333+ mkdirSync ( src ) ;
334+ mkdirSync ( destParent ) ;
335+ mkdirSync ( dest ) ;
336+ cpSync ( src , dest , mustNotMutateObjectDeep ( { recursive : true } ) ) ;
337+ }
338+
339+ // It throws error if attempt is made to copy src to dest
340+ // when src is parent directory of the parent of dest
341+ {
342+ const src = nextdir ( 'a' ) ;
343+ const destParent = nextdir ( 'a/b' ) ;
344+ const dest = nextdir ( 'a/b/c' ) ;
345+ mkdirSync ( src ) ;
346+ mkdirSync ( destParent ) ;
347+ mkdirSync ( dest ) ;
348+ assert . throws (
349+ ( ) => cpSync ( src , dest , mustNotMutateObjectDeep ( { recursive : true } ) ) ,
350+ { code : 'ERR_FS_CP_EINVAL' } ,
351+ ) ;
352+ }
353+
315354// It throws error if attempt is made to copy to subdirectory of self.
316355{
317356 const src = './test/fixtures/copy/kitchen-sink' ;
0 commit comments