@@ -472,6 +472,240 @@ func TestHash(t *testing.T) {
472472 })
473473}
474474
475+ func TestCleanUp (t * testing.T ) {
476+ gitImplementer := & GitImplementer {}
477+
478+ t .Run ("cleanup old directories but preserve current" , func (t * testing.T ) {
479+ // Create old directories that should be cleaned up
480+ oldDir1 , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
481+ if err != nil {
482+ t .Fatalf ("Failed to create temp dir: %v" , err )
483+ }
484+
485+ oldDir2 , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
486+ if err != nil {
487+ t .Fatalf ("Failed to create temp dir: %v" , err )
488+ }
489+
490+ // Create current directory (should be preserved)
491+ currentDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
492+ if err != nil {
493+ t .Fatalf ("Failed to create temp dir: %v" , err )
494+ }
495+
496+ // Age the old directories
497+ oldTime := time .Now ().Add (- 2 * time .Hour )
498+ if err := os .Chtimes (oldDir1 , oldTime , oldTime ); err != nil {
499+ t .Fatalf ("Failed to change times for old dir 1: %v" , err )
500+ }
501+ if err := os .Chtimes (oldDir2 , oldTime , oldTime ); err != nil {
502+ t .Fatalf ("Failed to change times for old dir 2: %v" , err )
503+ }
504+
505+ // Run cleanup with 1 hour max age
506+ err = gitImplementer .CleanUp (currentDir , 1 * time .Hour )
507+ if err != nil {
508+ t .Errorf ("CleanUp returned error: %v" , err )
509+ }
510+
511+ // Verify old directories were removed
512+ if _ , err := os .Stat (oldDir1 ); ! os .IsNotExist (err ) {
513+ t .Error ("Old directory 1 should have been removed" )
514+ os .RemoveAll (oldDir1 ) // cleanup
515+ }
516+
517+ if _ , err := os .Stat (oldDir2 ); ! os .IsNotExist (err ) {
518+ t .Error ("Old directory 2 should have been removed" )
519+ os .RemoveAll (oldDir2 ) // cleanup
520+ }
521+
522+ // Verify current directory is preserved
523+ if _ , err := os .Stat (currentDir ); os .IsNotExist (err ) {
524+ t .Error ("Current directory should not have been removed" )
525+ } else {
526+ os .RemoveAll (currentDir ) // cleanup
527+ }
528+ })
529+
530+ t .Run ("respects maxAge parameter" , func (t * testing.T ) {
531+ // Create recent directory that shouldn't be cleaned
532+ recentDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
533+ if err != nil {
534+ t .Fatalf ("Failed to create temp dir: %v" , err )
535+ }
536+ defer os .RemoveAll (recentDir )
537+
538+ currentDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
539+ if err != nil {
540+ t .Fatalf ("Failed to create temp dir: %v" , err )
541+ }
542+ defer os .RemoveAll (currentDir )
543+
544+ // Age the recent directory only slightly
545+ recentTime := time .Now ().Add (- 30 * time .Minute )
546+ if err := os .Chtimes (recentDir , recentTime , recentTime ); err != nil {
547+ t .Fatalf ("Failed to change times for recent dir: %v" , err )
548+ }
549+
550+ // Run cleanup with 1 hour max age
551+ err = gitImplementer .CleanUp (currentDir , 1 * time .Hour )
552+ if err != nil {
553+ t .Errorf ("CleanUp returned error: %v" , err )
554+ }
555+
556+ // Recent directory should still exist
557+ if _ , err := os .Stat (recentDir ); os .IsNotExist (err ) {
558+ t .Error ("Recent directory should not have been removed" )
559+ }
560+ })
561+
562+ t .Run ("ignores non-matching directories" , func (t * testing.T ) {
563+ // Create directory with different prefix
564+ otherDir , err := os .MkdirTemp ("" , "other-prefix-" )
565+ if err != nil {
566+ t .Fatalf ("Failed to create temp dir: %v" , err )
567+ }
568+ defer os .RemoveAll (otherDir )
569+
570+ currentDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
571+ if err != nil {
572+ t .Fatalf ("Failed to create temp dir: %v" , err )
573+ }
574+ defer os .RemoveAll (currentDir )
575+
576+ // Age the other directory
577+ oldTime := time .Now ().Add (- 2 * time .Hour )
578+ if err := os .Chtimes (otherDir , oldTime , oldTime ); err != nil {
579+ t .Fatalf ("Failed to change times for other dir: %v" , err )
580+ }
581+
582+ // Run cleanup
583+ err = gitImplementer .CleanUp (currentDir , 1 * time .Hour )
584+ if err != nil {
585+ t .Errorf ("CleanUp returned error: %v" , err )
586+ }
587+
588+ // Other directory should still exist (different prefix)
589+ if _ , err := os .Stat (otherDir ); os .IsNotExist (err ) {
590+ t .Error ("Directory with different prefix should not have been removed" )
591+ }
592+ })
593+
594+ t .Run ("handles empty current directory parameter" , func (t * testing.T ) {
595+ // Create old directory
596+ oldDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
597+ if err != nil {
598+ t .Fatalf ("Failed to create temp dir: %v" , err )
599+ }
600+
601+ // Age the directory
602+ oldTime := time .Now ().Add (- 2 * time .Hour )
603+ if err := os .Chtimes (oldDir , oldTime , oldTime ); err != nil {
604+ t .Fatalf ("Failed to change times for old dir: %v" , err )
605+ }
606+
607+ // Run cleanup with empty current directory
608+ err = gitImplementer .CleanUp ("" , 1 * time .Hour )
609+ if err != nil {
610+ t .Errorf ("CleanUp returned error: %v" , err )
611+ }
612+
613+ // Old directory should be removed since no current directory to preserve
614+ if _ , err := os .Stat (oldDir ); ! os .IsNotExist (err ) {
615+ t .Error ("Old directory should have been removed when no current directory specified" )
616+ os .RemoveAll (oldDir ) // cleanup
617+ }
618+ })
619+
620+ t .Run ("cleanup with zero max age removes all old directories" , func (t * testing.T ) {
621+ // Create multiple directories
622+ dirs := make ([]string , 3 )
623+ for i := 0 ; i < 3 ; i ++ {
624+ dir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
625+ if err != nil {
626+ t .Fatalf ("Failed to create temp dir: %v" , err )
627+ }
628+ dirs [i ] = dir
629+ }
630+
631+ currentDir := dirs [2 ] // Last one is current
632+
633+ // Age the first two directories slightly
634+ oldTime := time .Now ().Add (- 1 * time .Second )
635+ if err := os .Chtimes (dirs [0 ], oldTime , oldTime ); err != nil {
636+ t .Fatalf ("Failed to change times for dir 0: %v" , err )
637+ }
638+ if err := os .Chtimes (dirs [1 ], oldTime , oldTime ); err != nil {
639+ t .Fatalf ("Failed to change times for dir 1: %v" , err )
640+ }
641+
642+ // Run cleanup with zero max age
643+ err := gitImplementer .CleanUp (currentDir , 0 )
644+ if err != nil {
645+ t .Errorf ("CleanUp returned error: %v" , err )
646+ }
647+
648+ // First two should be removed
649+ for i := 0 ; i < 2 ; i ++ {
650+ if _ , err := os .Stat (dirs [i ]); ! os .IsNotExist (err ) {
651+ t .Errorf ("Directory %d should have been removed" , i )
652+ os .RemoveAll (dirs [i ])
653+ }
654+ }
655+
656+ // Current should remain
657+ if _ , err := os .Stat (currentDir ); os .IsNotExist (err ) {
658+ t .Error ("Current directory should not have been removed" )
659+ } else {
660+ os .RemoveAll (currentDir )
661+ }
662+ })
663+
664+ t .Run ("handles directories with files inside" , func (t * testing.T ) {
665+ // Create directory with files (simulating actual git clone)
666+ oldDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
667+ if err != nil {
668+ t .Fatalf ("Failed to create temp dir: %v" , err )
669+ }
670+
671+ // Create some files inside
672+ testFile := filepath .Join (oldDir , "test.txt" )
673+ if err := os .WriteFile (testFile , []byte ("test content" ), 0644 ); err != nil {
674+ t .Fatalf ("Failed to create test file: %v" , err )
675+ }
676+
677+ // Create subdirectory
678+ subDir := filepath .Join (oldDir , "subdir" )
679+ if err := os .Mkdir (subDir , 0755 ); err != nil {
680+ t .Fatalf ("Failed to create subdirectory: %v" , err )
681+ }
682+
683+ currentDir , err := os .MkdirTemp ("" , "cdk8s-git-clone-" )
684+ if err != nil {
685+ t .Fatalf ("Failed to create temp dir: %v" , err )
686+ }
687+ defer os .RemoveAll (currentDir )
688+
689+ // Age the old directory
690+ oldTime := time .Now ().Add (- 2 * time .Hour )
691+ if err := os .Chtimes (oldDir , oldTime , oldTime ); err != nil {
692+ t .Fatalf ("Failed to change times for old dir: %v" , err )
693+ }
694+
695+ // Run cleanup
696+ err = gitImplementer .CleanUp (currentDir , 1 * time .Hour )
697+ if err != nil {
698+ t .Errorf ("CleanUp returned error: %v" , err )
699+ }
700+
701+ // Directory and all contents should be removed
702+ if _ , err := os .Stat (oldDir ); ! os .IsNotExist (err ) {
703+ t .Error ("Directory with contents should have been removed" )
704+ os .RemoveAll (oldDir ) // cleanup
705+ }
706+ })
707+ }
708+
475709func TestIsUrl (t * testing.T ) {
476710 tests := []struct {
477711 name string
0 commit comments