@@ -373,6 +373,80 @@ public void testBrowseTopDir() throws Exception {
373373 .andExpect (content ().json ("[\" http://localhost/vscode/unpkg/foo/bar/1.3.4/extension.vsixmanifest\" ,\" http://localhost/vscode/unpkg/foo/bar/1.3.4/extension/\" ]" ));
374374 }
375375
376+ @ Test
377+ public void testBrowseTopDirTargetPlatform () throws Exception {
378+ var version = "1.3.4" ;
379+ var targetPlatform = "linux-x64" ;
380+ var extensionName = "bar" ;
381+ var namespaceName = "foo" ;
382+ var namespace = new Namespace ();
383+ namespace .setName (namespaceName );
384+ var extension = new Extension ();
385+ extension .setId (0L );
386+ extension .setName (extensionName );
387+ extension .setNamespace (namespace );
388+ var extVersion = new ExtensionVersion ();
389+ extVersion .setId (1L );
390+ extVersion .setVersion (version );
391+ extVersion .setTargetPlatform (targetPlatform );
392+ extVersion .setExtension (extension );
393+
394+ Mockito .when (repositories .findActiveExtensionVersionByVersion (version , targetPlatform , extensionName , namespaceName ))
395+ .thenReturn (extVersion );
396+
397+ var vsixResource = mockFileResource (15 , extVersion , "extension.vsixmanifest" , RESOURCE , STORAGE_DB , "<xml></xml>" .getBytes (StandardCharsets .UTF_8 ));
398+ var manifestResource = mockFileResource (16 , extVersion , "extension/package.json" , RESOURCE , STORAGE_DB , "{\" package\" :\" json\" }" .getBytes (StandardCharsets .UTF_8 ));
399+ var readmeResource = mockFileResource (17 , extVersion , "extension/README.md" , RESOURCE , STORAGE_DB , "README" .getBytes (StandardCharsets .UTF_8 ));
400+ var changelogResource = mockFileResource (18 , extVersion , "extension/CHANGELOG.md" , RESOURCE , STORAGE_DB , "CHANGELOG" .getBytes (StandardCharsets .UTF_8 ));
401+ var licenseResource = mockFileResource (19 , extVersion , "extension/LICENSE.txt" , RESOURCE , STORAGE_DB , "LICENSE" .getBytes (StandardCharsets .UTF_8 ));
402+ var iconResource = mockFileResource (20 , extVersion , "extension/images/icon128.png" , RESOURCE , STORAGE_DB , "ICON128" .getBytes (StandardCharsets .UTF_8 ));
403+
404+ Mockito .when (repositories .findResourceFileResources (1L , "" ))
405+ .thenReturn (List .of (vsixResource , manifestResource , readmeResource , changelogResource , licenseResource , iconResource ));
406+
407+ mockMvc .perform (get ("/vscode/unpkg/{namespaceName}/{extensionName}/{version}?target={targetPlatform}" , namespaceName , extensionName , version , targetPlatform ))
408+ .andExpect (status ().isOk ())
409+ .andExpect (content ().contentType (MediaType .APPLICATION_JSON ))
410+ .andExpect (content ().json ("[\" http://localhost/vscode/unpkg/foo/bar/1.3.4+linux-x64/extension.vsixmanifest\" ,\" http://localhost/vscode/unpkg/foo/bar/1.3.4+linux-x64/extension/\" ]" ));
411+ }
412+
413+ @ Test
414+ public void testBrowseTopDirVersionTargetPlatform () throws Exception {
415+ var version = "1.3.4-rc-1+armhf" ;
416+ var targetPlatform = "darwin-x64" ;
417+ var extensionName = "bar" ;
418+ var namespaceName = "foo" ;
419+ var namespace = new Namespace ();
420+ namespace .setName (namespaceName );
421+ var extension = new Extension ();
422+ extension .setId (0L );
423+ extension .setName (extensionName );
424+ extension .setNamespace (namespace );
425+ var extVersion = new ExtensionVersion ();
426+ extVersion .setId (1L );
427+ extVersion .setVersion (version );
428+ extVersion .setTargetPlatform (targetPlatform );
429+ extVersion .setExtension (extension );
430+
431+ Mockito .when (repositories .findActiveExtensionVersionByVersion (version , targetPlatform , extensionName , namespaceName ))
432+ .thenReturn (extVersion );
433+
434+ var vsixResource = mockFileResource (15 , extVersion , "extension.vsixmanifest" , RESOURCE , STORAGE_DB , "<xml></xml>" .getBytes (StandardCharsets .UTF_8 ));
435+ var manifestResource = mockFileResource (16 , extVersion , "extension/package.json" , RESOURCE , STORAGE_DB , "{\" package\" :\" json\" }" .getBytes (StandardCharsets .UTF_8 ));
436+ var readmeResource = mockFileResource (17 , extVersion , "extension/README.md" , RESOURCE , STORAGE_DB , "README" .getBytes (StandardCharsets .UTF_8 ));
437+ var changelogResource = mockFileResource (18 , extVersion , "extension/CHANGELOG.md" , RESOURCE , STORAGE_DB , "CHANGELOG" .getBytes (StandardCharsets .UTF_8 ));
438+ var licenseResource = mockFileResource (19 , extVersion , "extension/LICENSE.txt" , RESOURCE , STORAGE_DB , "LICENSE" .getBytes (StandardCharsets .UTF_8 ));
439+ var iconResource = mockFileResource (20 , extVersion , "extension/images/icon128.png" , RESOURCE , STORAGE_DB , "ICON128" .getBytes (StandardCharsets .UTF_8 ));
440+
441+ Mockito .when (repositories .findResourceFileResources (1L , "" ))
442+ .thenReturn (List .of (vsixResource , manifestResource , readmeResource , changelogResource , licenseResource , iconResource ));
443+
444+ mockMvc .perform (get ("/vscode/unpkg/{namespaceName}/{extensionName}/{version}+{targetPlatform}" , namespaceName , extensionName , version , targetPlatform ))
445+ .andExpect (status ().isOk ())
446+ .andExpect (content ().contentType (MediaType .APPLICATION_JSON ))
447+ .andExpect (content ().json ("[\" http://localhost/vscode/unpkg/foo/bar/1.3.4-rc-1+armhf+darwin-x64/extension.vsixmanifest\" ,\" http://localhost/vscode/unpkg/foo/bar/1.3.4-rc-1+armhf+darwin-x64/extension/\" ]" ));
448+ }
449+
376450 @ Test
377451 public void testBrowseVsixManifest () throws Exception {
378452 var version = "1.3.4" ;
@@ -601,6 +675,95 @@ public void testBrowseIcon() throws Exception {
601675 .andExpect (content ().bytes (content ));
602676 }
603677
678+ @ Test
679+ public void testBrowseIconTargetPlatform () throws Exception {
680+ var version = "1.3.4" ;
681+ var targetPlatform = "win32-x64" ;
682+ var extensionName = "bar" ;
683+ var namespaceName = "foo" ;
684+ var namespace = new Namespace ();
685+ namespace .setName (namespaceName );
686+ var extension = new Extension ();
687+ extension .setId (0L );
688+ extension .setName (extensionName );
689+ extension .setNamespace (namespace );
690+ var extVersion = new ExtensionVersion ();
691+ extVersion .setId (1L );
692+ extVersion .setVersion (version );
693+ extVersion .setTargetPlatform (targetPlatform );
694+ extVersion .setExtension (extension );
695+ Mockito .when (repositories .findActiveExtensionVersionByVersion (version , targetPlatform , extensionName , namespaceName ))
696+ .thenReturn (extVersion );
697+
698+ var content = "ICON128" .getBytes (StandardCharsets .UTF_8 );
699+ var iconResource = mockFileResource (20 , extVersion , "extension/images/icon128.png" , RESOURCE , STORAGE_DB , content );
700+ Mockito .when (repositories .findResourceFileResources (1L , "extension/images/icon128.png" ))
701+ .thenReturn (List .of (iconResource ));
702+
703+ mockMvc .perform (get ("/vscode/unpkg/{namespaceName}/{extensionName}/{version}/{path}?target={targetPlatform}" , namespaceName , extensionName , version , "extension/images/icon128.png" , targetPlatform ))
704+ .andExpect (status ().isOk ())
705+ .andExpect (content ().bytes (content ));
706+ }
707+
708+ @ Test
709+ public void testBrowseIconVersionTargetPlatform () throws Exception {
710+ var version = "1.3.4-ga+armhf" ;
711+ var targetPlatform = "alpine-x64" ;
712+ var extensionName = "bar" ;
713+ var namespaceName = "foo" ;
714+ var namespace = new Namespace ();
715+ namespace .setName (namespaceName );
716+ var extension = new Extension ();
717+ extension .setId (0L );
718+ extension .setName (extensionName );
719+ extension .setNamespace (namespace );
720+ var extVersion = new ExtensionVersion ();
721+ extVersion .setId (1L );
722+ extVersion .setVersion (version );
723+ extVersion .setTargetPlatform (targetPlatform );
724+ extVersion .setExtension (extension );
725+ Mockito .when (repositories .findActiveExtensionVersionByVersion (version , targetPlatform , extensionName , namespaceName ))
726+ .thenReturn (extVersion );
727+
728+ var content = "ICON128" .getBytes (StandardCharsets .UTF_8 );
729+ var iconResource = mockFileResource (20 , extVersion , "extension/images/icon128.png" , RESOURCE , STORAGE_DB , content );
730+ Mockito .when (repositories .findResourceFileResources (1L , "extension/images/icon128.png" ))
731+ .thenReturn (List .of (iconResource ));
732+
733+ mockMvc .perform (get ("/vscode/unpkg/{namespaceName}/{extensionName}/{version}+{targetPlatform}/{path}" , namespaceName , extensionName , version , targetPlatform , "extension/images/icon128.png" ))
734+ .andExpect (status ().isOk ())
735+ .andExpect (content ().bytes (content ));
736+ }
737+
738+ @ Test
739+ public void testBrowseIconVersionInvalidTargetPlatform () throws Exception {
740+ var version = "1.3.4-ga+armhf" ;
741+ var extensionName = "bar" ;
742+ var namespaceName = "foo" ;
743+ var namespace = new Namespace ();
744+ namespace .setName (namespaceName );
745+ var extension = new Extension ();
746+ extension .setId (0L );
747+ extension .setName (extensionName );
748+ extension .setNamespace (namespace );
749+ var extVersion = new ExtensionVersion ();
750+ extVersion .setId (1L );
751+ extVersion .setVersion (version );
752+ extVersion .setTargetPlatform (TargetPlatform .NAME_UNIVERSAL );
753+ extVersion .setExtension (extension );
754+ Mockito .when (repositories .findActiveExtensionVersionsByVersion (version , extensionName , namespaceName ))
755+ .thenReturn (List .of (extVersion ));
756+
757+ var content = "ICON128" .getBytes (StandardCharsets .UTF_8 );
758+ var iconResource = mockFileResource (20 , extVersion , "extension/images/icon128.png" , RESOURCE , STORAGE_DB , content );
759+ Mockito .when (repositories .findResourceFileResources (1L , "extension/images/icon128.png" ))
760+ .thenReturn (List .of (iconResource ));
761+
762+ mockMvc .perform (get ("/vscode/unpkg/{namespaceName}/{extensionName}/{version}/{path}" , namespaceName , extensionName , version , "extension/images/icon128.png" ))
763+ .andExpect (status ().isOk ())
764+ .andExpect (content ().bytes (content ));
765+ }
766+
604767 @ Test
605768 public void testDownload () throws Exception {
606769 mockExtensionVersion ();
0 commit comments