@@ -79,7 +79,8 @@ public void Setup()
7979 new JavaLanguageService ( _mockProcessHelper . Object , _mockGitHelper . Object , _mockMavenHelper . Object , Mock . Of < IPythonHelper > ( ) , mockCopilotAgentRunner . Object , languageLogger , _commonValidationHelpers . Object , _mockPackageInfoHelper . Object , Mock . Of < IFileHelper > ( ) , _mockSpecGenSdkConfigHelper . Object , Mock . Of < IChangelogHelper > ( ) ) ,
8080 new JavaScriptLanguageService ( _mockProcessHelper . Object , _mockNpxHelper . Object , Mock . Of < ICopilotAgentRunner > ( ) , _mockGitHelper . Object , languageLogger , _commonValidationHelpers . Object , _mockPackageInfoHelper . Object , Mock . Of < IFileHelper > ( ) , _mockSpecGenSdkConfigHelper . Object , Mock . Of < IChangelogHelper > ( ) ) ,
8181 new GoLanguageService ( _mockProcessHelper . Object , _mockPowerShellHelper . Object , _mockGitHelper . Object , languageLogger , _commonValidationHelpers . Object , _mockPackageInfoHelper . Object , Mock . Of < IFileHelper > ( ) , _mockSpecGenSdkConfigHelper . Object , Mock . Of < IChangelogHelper > ( ) ) ,
82- new DotnetLanguageService ( _mockProcessHelper . Object , _mockPowerShellHelper . Object , Mock . Of < ICopilotAgentRunner > ( ) , _mockGitHelper . Object , languageLogger , _commonValidationHelpers . Object , _mockPackageInfoHelper . Object , Mock . Of < IFileHelper > ( ) , _mockSpecGenSdkConfigHelper . Object , Mock . Of < IChangelogHelper > ( ) )
82+ new DotnetLanguageService ( _mockProcessHelper . Object , _mockPowerShellHelper . Object , Mock . Of < ICopilotAgentRunner > ( ) , _mockGitHelper . Object , languageLogger , _commonValidationHelpers . Object , _mockPackageInfoHelper . Object , Mock . Of < IFileHelper > ( ) , _mockSpecGenSdkConfigHelper . Object , Mock . Of < IChangelogHelper > ( ) ) ,
83+ new RustLanguageService ( _mockProcessHelper . Object , _mockPowerShellHelper . Object , _mockGitHelper . Object , languageLogger , _commonValidationHelpers . Object , _mockPackageInfoHelper . Object , Mock . Of < IFileHelper > ( ) , _mockSpecGenSdkConfigHelper . Object , Mock . Of < IChangelogHelper > ( ) )
8384 ] ;
8485
8586 _tool = new PackTool (
@@ -501,6 +502,141 @@ public async Task PackAsync_Python_Failure_ReturnsError()
501502
502503 #endregion
503504
505+ #region Rust Pack Tests
506+
507+ [ Test ]
508+ public async Task PackAsync_Rust_Success_ReturnsSuccessWithArtifact ( )
509+ {
510+ // Arrange
511+ SetupRustRepo ( ) ;
512+ SetupRustPackScript ( ) ;
513+
514+ // Create package in a properly named subdirectory
515+ var packageDir = Path . Combine ( _tempDirectory . DirectoryPath , "sdk" , "core" , "azure_core" ) ;
516+ Directory . CreateDirectory ( packageDir ) ;
517+ File . WriteAllText ( Path . Combine ( packageDir , "Cargo.toml" ) , "[package]\n name = \" azure_core\" \n " ) ;
518+ SetupCargoMetadata ( "azure_core" , "0.34.0" ) ;
519+
520+ _mockPowerShellHelper
521+ . Setup ( x => x . Run ( It . IsAny < PowershellOptions > ( ) , It . IsAny < CancellationToken > ( ) ) )
522+ . ReturnsAsync ( new ProcessResult { ExitCode = 0 , OutputDetails = [ ( StdioLevel . StandardOutput , "Finished packing crates" ) ] } ) ;
523+
524+ // Create the .crate artifact at the expected location
525+ var targetPackageDir = Path . Combine ( _tempDirectory . DirectoryPath , "target" , "package" ) ;
526+ Directory . CreateDirectory ( targetPackageDir ) ;
527+ File . WriteAllText ( Path . Combine ( targetPackageDir , "azure_core-0.34.0.crate" ) , "fake crate" ) ;
528+
529+ // Act
530+ var result = await _tool . PackAsync ( null , packageDir ) ;
531+
532+ // Assert
533+ Assert . That ( result . ResponseErrors , Is . Null . Or . Empty ) ;
534+ Assert . That ( result . Message , Does . Contain ( "Pack completed successfully" ) ) ;
535+ }
536+
537+ [ Test ]
538+ public async Task PackAsync_Rust_WithOutputPath_PassesOutputArg ( )
539+ {
540+ // Arrange
541+ SetupRustRepo ( ) ;
542+ SetupRustPackScript ( ) ;
543+
544+ var packageDir = Path . Combine ( _tempDirectory . DirectoryPath , "sdk" , "core" , "azure_core" ) ;
545+ Directory . CreateDirectory ( packageDir ) ;
546+ File . WriteAllText ( Path . Combine ( packageDir , "Cargo.toml" ) , "[package]\n name = \" azure_core\" \n " ) ;
547+ SetupCargoMetadata ( "azure_core" , "0.34.0" ) ;
548+
549+ var outputDir = Path . Combine ( _tempDirectory . DirectoryPath , "output" ) ;
550+ Directory . CreateDirectory ( outputDir ) ;
551+
552+ _mockPowerShellHelper
553+ . Setup ( x => x . Run ( It . IsAny < PowershellOptions > ( ) , It . IsAny < CancellationToken > ( ) ) )
554+ . ReturnsAsync ( new ProcessResult { ExitCode = 0 , OutputDetails = [ ] } ) ;
555+
556+ // Act
557+ var result = await _tool . PackAsync ( null , packageDir , outputDir ) ;
558+
559+ // Assert
560+ Assert . That ( result . ResponseErrors , Is . Null . Or . Empty ) ;
561+ _mockPowerShellHelper . Verify ( x => x . Run (
562+ It . Is < PowershellOptions > ( o =>
563+ o . Args . Contains ( "-OutputPath" ) &&
564+ o . Args . Contains ( outputDir ) ) ,
565+ It . IsAny < CancellationToken > ( ) ) , Times . Once ) ;
566+ }
567+
568+ [ Test ]
569+ public async Task PackAsync_Rust_ScriptFails_ReturnsFailure ( )
570+ {
571+ // Arrange
572+ SetupRustRepo ( ) ;
573+ SetupRustPackScript ( ) ;
574+
575+ var packageDir = Path . Combine ( _tempDirectory . DirectoryPath , "sdk" , "core" , "azure_core" ) ;
576+ Directory . CreateDirectory ( packageDir ) ;
577+ File . WriteAllText ( Path . Combine ( packageDir , "Cargo.toml" ) , "[package]\n name = \" azure_core\" \n " ) ;
578+ SetupCargoMetadata ( "azure_core" , "0.34.0" ) ;
579+
580+ _mockPowerShellHelper
581+ . Setup ( x => x . Run ( It . IsAny < PowershellOptions > ( ) , It . IsAny < CancellationToken > ( ) ) )
582+ . ReturnsAsync ( new ProcessResult { ExitCode = 1 , OutputDetails = [ ( StdioLevel . StandardError , "cargo publish failed" ) ] } ) ;
583+
584+ // Act
585+ var result = await _tool . PackAsync ( null , packageDir ) ;
586+
587+ // Assert
588+ Assert . That ( result . ResponseErrors ? . First ( ) , Does . Contain ( "Pack failed with exit code 1" ) ) ;
589+ }
590+
591+ [ Test ]
592+ public async Task PackAsync_Rust_MissingPackScript_ReturnsFailure ( )
593+ {
594+ // Arrange
595+ SetupRustRepo ( ) ;
596+ // Do NOT create the pack script
597+
598+ var packageDir = Path . Combine ( _tempDirectory . DirectoryPath , "sdk" , "core" , "azure_core" ) ;
599+ Directory . CreateDirectory ( packageDir ) ;
600+ File . WriteAllText ( Path . Combine ( packageDir , "Cargo.toml" ) , "[package]\n name = \" azure_core\" \n " ) ;
601+ SetupCargoMetadata ( "azure_core" , "0.34.0" ) ;
602+
603+ // Act
604+ var result = await _tool . PackAsync ( null , packageDir ) ;
605+
606+ // Assert
607+ Assert . That ( result . ResponseErrors ? . First ( ) , Does . Contain ( "Pack script not found" ) ) ;
608+ }
609+
610+ [ Test ]
611+ public async Task PackAsync_Rust_PassesNoVerifyAndPackageNames ( )
612+ {
613+ // Arrange
614+ SetupRustRepo ( ) ;
615+ SetupRustPackScript ( ) ;
616+
617+ var packageDir = Path . Combine ( _tempDirectory . DirectoryPath , "sdk" , "core" , "azure_core" ) ;
618+ Directory . CreateDirectory ( packageDir ) ;
619+ File . WriteAllText ( Path . Combine ( packageDir , "Cargo.toml" ) , "[package]\n name = \" azure_core\" \n " ) ;
620+ SetupCargoMetadata ( "azure_core" , "0.34.0" ) ;
621+
622+ _mockPowerShellHelper
623+ . Setup ( x => x . Run ( It . IsAny < PowershellOptions > ( ) , It . IsAny < CancellationToken > ( ) ) )
624+ . ReturnsAsync ( new ProcessResult { ExitCode = 0 , OutputDetails = [ ] } ) ;
625+
626+ // Act
627+ await _tool . PackAsync ( null , packageDir ) ;
628+
629+ // Assert
630+ _mockPowerShellHelper . Verify ( x => x . Run (
631+ It . Is < PowershellOptions > ( o =>
632+ o . Args . Contains ( "-PackageNames" ) &&
633+ o . Args . Contains ( "azure_core" ) &&
634+ o . Args . Contains ( "-NoVerify" ) ) ,
635+ It . IsAny < CancellationToken > ( ) ) , Times . Once ) ;
636+ }
637+
638+ #endregion
639+
504640 #region Exception Handling Tests
505641
506642 [ Test ]
@@ -598,5 +734,30 @@ private void SetupGoRepo()
598734 . ReturnsAsync ( _tempDirectory . DirectoryPath ) ;
599735 }
600736
737+ private void SetupRustRepo ( )
738+ {
739+ _mockGitHelper
740+ . Setup ( x => x . GetRepoNameAsync ( It . IsAny < string > ( ) , It . IsAny < CancellationToken > ( ) ) )
741+ . ReturnsAsync ( "azure-sdk-for-rust" ) ;
742+ _mockGitHelper
743+ . Setup ( x => x . DiscoverRepoRootAsync ( It . IsAny < string > ( ) , It . IsAny < CancellationToken > ( ) ) )
744+ . ReturnsAsync ( _tempDirectory . DirectoryPath ) ;
745+ }
746+
747+ private void SetupRustPackScript ( )
748+ {
749+ var scriptDir = Path . Combine ( _tempDirectory . DirectoryPath , "eng" , "scripts" ) ;
750+ Directory . CreateDirectory ( scriptDir ) ;
751+ File . WriteAllText ( Path . Combine ( scriptDir , "Pack-Crates.ps1" ) , "# pack script" ) ;
752+ }
753+
754+ private void SetupCargoMetadata ( string name , string version )
755+ {
756+ var json = System . Text . Json . JsonSerializer . Serialize ( new { packages = new [ ] { new { name , version } } } ) ;
757+ _mockProcessHelper
758+ . Setup ( x => x . Run ( It . Is < ProcessOptions > ( o => o . Args . Contains ( "metadata" ) ) , It . IsAny < CancellationToken > ( ) ) )
759+ . ReturnsAsync ( new ProcessResult { ExitCode = 0 , OutputDetails = [ ( StdioLevel . StandardOutput , json ) ] } ) ;
760+ }
761+
601762 #endregion
602763}
0 commit comments