@@ -38,7 +38,7 @@ class EmptyJavaBase extends JavaBase {
3838 ) : Promise < JavaDownloadRelease > {
3939 const availableVersion = '11.0.9' ;
4040 if ( ! semver . satisfies ( availableVersion , range ) ) {
41- throw new Error ( 'Available version not found' ) ;
41+ throw this . createVersionNotFoundError ( range , [ availableVersion ] ) ;
4242 }
4343
4444 return {
@@ -248,6 +248,7 @@ describe('setupJava', () => {
248248 let spyCoreExportVariable : jest . SpyInstance ;
249249 let spyCoreAddPath : jest . SpyInstance ;
250250 let spyCoreSetOutput : jest . SpyInstance ;
251+ let spyCoreError : jest . SpyInstance ;
251252
252253 beforeEach ( ( ) => {
253254 spyGetToolcachePath = jest . spyOn ( util , 'getToolcachePath' ) ;
@@ -287,6 +288,10 @@ describe('setupJava', () => {
287288 spyCoreSetOutput = jest . spyOn ( core , 'setOutput' ) ;
288289 spyCoreSetOutput . mockImplementation ( ( ) => undefined ) ;
289290
291+ // Mock core.error to suppress error logs
292+ spyCoreError = jest . spyOn ( core , 'error' ) ;
293+ spyCoreError . mockImplementation ( ( ) => undefined ) ;
294+
290295 jest . spyOn ( os , 'arch' ) . mockReturnValue ( 'x86' as ReturnType < typeof os . arch > ) ;
291296 } ) ;
292297
@@ -530,19 +535,16 @@ describe('setupJava', () => {
530535 checkLatest : false
531536 }
532537 ]
533- ] ) (
534- 'should throw an error for Available version not found for %s' ,
535- async input => {
536- mockJavaBase = new EmptyJavaBase ( input ) ;
537- await expect ( mockJavaBase . setupJava ( ) ) . rejects . toThrow (
538- 'Available version not found'
539- ) ;
540- expect ( spyTcFindAllVersions ) . toHaveBeenCalled ( ) ;
541- expect ( spyCoreAddPath ) . not . toHaveBeenCalled ( ) ;
542- expect ( spyCoreExportVariable ) . not . toHaveBeenCalled ( ) ;
543- expect ( spyCoreSetOutput ) . not . toHaveBeenCalled ( ) ;
544- }
545- ) ;
538+ ] ) ( 'should throw an error for version not found for %s' , async input => {
539+ mockJavaBase = new EmptyJavaBase ( input ) ;
540+ await expect ( mockJavaBase . setupJava ( ) ) . rejects . toThrow (
541+ `No matching version found for SemVer '${ input . version } '`
542+ ) ;
543+ expect ( spyTcFindAllVersions ) . toHaveBeenCalled ( ) ;
544+ expect ( spyCoreAddPath ) . not . toHaveBeenCalled ( ) ;
545+ expect ( spyCoreExportVariable ) . not . toHaveBeenCalled ( ) ;
546+ expect ( spyCoreSetOutput ) . not . toHaveBeenCalled ( ) ;
547+ } ) ;
546548} ) ;
547549
548550describe ( 'normalizeVersion' , ( ) => {
@@ -570,6 +572,97 @@ describe('normalizeVersion', () => {
570572 } ) ;
571573} ) ;
572574
575+ describe ( 'createVersionNotFoundError' , ( ) => {
576+ it ( 'should include all required fields in error message without available versions' , ( ) => {
577+ const mockJavaBase = new EmptyJavaBase ( {
578+ version : '17.0.5' ,
579+ architecture : 'x64' ,
580+ packageType : 'jdk' ,
581+ checkLatest : false
582+ } ) ;
583+
584+ const error = ( mockJavaBase as any ) . createVersionNotFoundError ( '17.0.5' ) ;
585+
586+ expect ( error . message ) . toContain (
587+ "No matching version found for SemVer '17.0.5'"
588+ ) ;
589+ expect ( error . message ) . toContain ( 'Distribution: Empty' ) ;
590+ expect ( error . message ) . toContain ( 'Package type: jdk' ) ;
591+ expect ( error . message ) . toContain ( 'Architecture: x64' ) ;
592+ } ) ;
593+
594+ it ( 'should include available versions when provided' , ( ) => {
595+ const mockJavaBase = new EmptyJavaBase ( {
596+ version : '17.0.5' ,
597+ architecture : 'x64' ,
598+ packageType : 'jdk' ,
599+ checkLatest : false
600+ } ) ;
601+
602+ const availableVersions = [ '11.0.1' , '11.0.2' , '17.0.1' , '17.0.2' ] ;
603+ const error = ( mockJavaBase as any ) . createVersionNotFoundError (
604+ '17.0.5' ,
605+ availableVersions
606+ ) ;
607+
608+ expect ( error . message ) . toContain (
609+ "No matching version found for SemVer '17.0.5'"
610+ ) ;
611+ expect ( error . message ) . toContain ( 'Distribution: Empty' ) ;
612+ expect ( error . message ) . toContain ( 'Package type: jdk' ) ;
613+ expect ( error . message ) . toContain ( 'Architecture: x64' ) ;
614+ expect ( error . message ) . toContain (
615+ 'Available versions: 11.0.1, 11.0.2, 17.0.1, 17.0.2'
616+ ) ;
617+ } ) ;
618+
619+ it ( 'should truncate available versions when there are many' , ( ) => {
620+ const mockJavaBase = new EmptyJavaBase ( {
621+ version : '17.0.5' ,
622+ architecture : 'x64' ,
623+ packageType : 'jdk' ,
624+ checkLatest : false
625+ } ) ;
626+
627+ // Create 60 versions to test truncation
628+ const availableVersions = Array . from ( { length : 60 } , ( _ , i ) => `11.0.${ i } ` ) ;
629+ const error = ( mockJavaBase as any ) . createVersionNotFoundError (
630+ '17.0.5' ,
631+ availableVersions
632+ ) ;
633+
634+ expect ( error . message ) . toContain ( 'Available versions:' ) ;
635+ expect ( error . message ) . toContain ( '...' ) ;
636+ expect ( error . message ) . toContain ( '(showing first 50 of 60 versions' ) ;
637+ } ) ;
638+
639+ it ( 'should include additional context when provided' , ( ) => {
640+ const mockJavaBase = new EmptyJavaBase ( {
641+ version : '17.0.5' ,
642+ architecture : 'x64' ,
643+ packageType : 'jdk' ,
644+ checkLatest : false
645+ } ) ;
646+
647+ const availableVersions = [ '11.0.1' , '11.0.2' ] ;
648+ const additionalContext = 'Platform: linux' ;
649+ const error = ( mockJavaBase as any ) . createVersionNotFoundError (
650+ '17.0.5' ,
651+ availableVersions ,
652+ additionalContext
653+ ) ;
654+
655+ expect ( error . message ) . toContain (
656+ "No matching version found for SemVer '17.0.5'"
657+ ) ;
658+ expect ( error . message ) . toContain ( 'Distribution: Empty' ) ;
659+ expect ( error . message ) . toContain ( 'Package type: jdk' ) ;
660+ expect ( error . message ) . toContain ( 'Architecture: x64' ) ;
661+ expect ( error . message ) . toContain ( 'Platform: linux' ) ;
662+ expect ( error . message ) . toContain ( 'Available versions: 11.0.1, 11.0.2' ) ;
663+ } ) ;
664+ } ) ;
665+
573666describe ( 'getToolcacheVersionName' , ( ) => {
574667 const DummyJavaBase = JavaBase as any ;
575668
0 commit comments