changeset 58:1efaaa71adef controller-tests

fixed TW-32456 + tests
author Evgeniy.Koshkin
date Tue, 19 Nov 2013 20:47:29 +0400
parents 6f126251a955
children e80f230ea128
files server-tests/src/DownloadSymbolsControllerTest.java server-tests/src/MetadataStorageMock.java server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java
diffstat 3 files changed, 118 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/server-tests/src/DownloadSymbolsControllerTest.java	Fri Nov 15 16:46:11 2013 +0400
+++ b/server-tests/src/DownloadSymbolsControllerTest.java	Tue Nov 19 20:47:29 2013 +0400
@@ -18,12 +18,17 @@
 import jetbrains.buildServer.controllers.BaseController;
 import jetbrains.buildServer.controllers.BaseControllerTestCase;
 import jetbrains.buildServer.controllers.interceptors.auth.HttpAuthenticationManager;
-import jetbrains.buildServer.serverSide.metadata.MetadataStorage;
+import jetbrains.buildServer.serverSide.RunningBuildEx;
+import jetbrains.buildServer.serverSide.auth.Permission;
+import jetbrains.buildServer.serverSide.auth.RoleScope;
 import jetbrains.buildServer.symbols.AuthHelper;
 import jetbrains.buildServer.symbols.DownloadSymbolsController;
+import jetbrains.buildServer.users.SUser;
 import org.apache.commons.httpclient.HttpStatus;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import java.io.File;
 import java.io.IOException;
 
 /**
@@ -31,18 +36,70 @@
  */
 public class DownloadSymbolsControllerTest extends BaseControllerTestCase {
 
+  private MetadataStorageMock myBuildMetadataStorage;
+
+  @Override
+  @BeforeMethod
+  public void setUp() throws Exception {
+    myBuildMetadataStorage = new MetadataStorageMock();
+    super.setUp();
+    myFixture.getServerSettings().setGuestLoginAllowed(true);
+  }
+
   @Override
   protected BaseController createController() throws IOException {
-    MetadataStorage buildMetadataStorage = myFixture.getSingletonService(MetadataStorage.class);
     AuthorizationInterceptor authInterceptor = myFixture.getSingletonService(AuthorizationInterceptor.class);
     AuthHelper authHelper = new AuthHelper(myFixture.getServerSettings(), myFixture.getUserModel(), myFixture.getSingletonService(HttpAuthenticationManager.class));
-    return new DownloadSymbolsController(myServer, myWebManager, authInterceptor,  myFixture.getSecurityContext(), buildMetadataStorage, authHelper);
+    return new DownloadSymbolsController(myServer, myWebManager, authInterceptor,  myFixture.getSecurityContext(), myBuildMetadataStorage, authHelper);
+  }
+
+  @Test
+  public void request_pdb_simple() throws Throwable {
+    myFixture.getServerSettings().setPerProjectPermissionsEnabled(true);
+    SUser user = myFixture.getUserModel().getGuestUser();
+    user.addRole(RoleScope.projectScope(myProject.getProjectId()), getProjectDevRole());
+    assertTrue(user.isPermissionGrantedForProject(myProject.getProjectId(), Permission.VIEW_BUILD_RUNTIME_DATA));
+
+    myRequest.setRequestURI("mock", getRegisterPdbUrl("secur32.pdb", "8EF4E863187C45E78F4632152CC82FEB"));
+    doGet();
+    assertEquals(HttpStatus.SC_OK, myResponse.getStatus());
+  }
+
+  @Test
+  public void request_pdb_invalid_url() throws Exception {
+    myRequest.setRequestURI("mock", "/app/symbols/foo");
+    doGet();
+    assertEquals(HttpStatus.SC_NOT_FOUND, myResponse.getStatus());
   }
 
   @Test
   public void request_not_existent_pdb() throws Exception {
-    myRequest.setRequestURI("mock", "/app/symbols/boo");
+    myRequest.setRequestURI("mock", "/app/symbols/fileName/FileId2/fileName");
     doGet();
     assertEquals(HttpStatus.SC_NOT_FOUND, myResponse.getStatus());
   }
+
+  @Test
+  public void request_pdb_unauthorized() throws Exception {
+    myFixture.getServerSettings().setGuestLoginAllowed(false);
+    myRequest.setRequestURI("mock", getRegisterPdbUrl("secur32.pdb", "8EF4E863187C45E78F4632152CC82FEB"));
+    doGet();
+    assertEquals(HttpStatus.SC_UNAUTHORIZED, myResponse.getStatus());
+  }
+
+  @Test
+  public void request_pdb_no_permissions_granted() throws Exception {
+    myRequest.setRequestURI("mock", getRegisterPdbUrl("secur32.pdb", "8EF4E863187C45E78F4632152CC82FEB"));
+    doGet();
+    assertEquals(HttpStatus.SC_UNAUTHORIZED, myResponse.getStatus());
+  }
+
+  private String getRegisterPdbUrl(String fileName, String fileSignature) throws IOException {
+    final File artDirectory = createTempDir();
+    new File(artDirectory, "foo").createNewFile();
+    myBuildType.setArtifactPaths(artDirectory.getAbsolutePath());
+    RunningBuildEx build = startBuild();
+    myBuildMetadataStorage.addEntry(build.getBuildId(), fileName, fileSignature);
+    return String.format("/app/symbols/%s/%s/%s", fileName, fileSignature, fileName);
+  }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server-tests/src/MetadataStorageMock.java	Tue Nov 19 20:47:29 2013 +0400
@@ -0,0 +1,47 @@
+import jetbrains.buildServer.serverSide.metadata.BuildMetadataEntry;
+import jetbrains.buildServer.serverSide.metadata.MetadataStorage;
+import jetbrains.buildServer.symbols.BuildSymbolsIndexProvider;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+class MetadataStorageMock implements MetadataStorage {
+
+  private List<BuildMetadataEntry> myEntries = new ArrayList<BuildMetadataEntry>();
+
+  public void addEntry(final long buildId, final String fileName, final String fileSignature) {
+    myEntries.add(new BuildMetadataEntry() {
+      public long getBuildId() {
+        return buildId;
+      }
+
+      @NotNull
+      public String getKey() {
+        return fileSignature;
+      }
+
+      @NotNull
+      public Map<String, String> getMetadata() {
+        HashMap<String, String> map = new HashMap<String, String>();
+        map.put(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY, "foo");
+        map.put(BuildSymbolsIndexProvider.FILE_NAME_KEY, fileName);
+        return map;
+      }
+    });
+  }
+
+  @NotNull
+  public Iterator<BuildMetadataEntry> getAllEntries(@NotNull String s) {
+    return myEntries.iterator();
+  }
+
+  @NotNull
+  public Iterator<BuildMetadataEntry> getEntriesByKey(@NotNull String s, @NotNull String s2) {
+    return myEntries.iterator();
+  }
+
+  @NotNull
+  public Iterator<BuildMetadataEntry> getBuildEntry(long l, @NotNull String s) {
+    return myEntries.iterator();
+  }
+}
\ No newline at end of file
--- a/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java	Fri Nov 15 16:46:11 2013 +0400
+++ b/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java	Tue Nov 19 20:47:29 2013 +0400
@@ -89,14 +89,15 @@
     final String guid = signature.substring(0, signature.length() - 1); //last symbol is PEDebugType
     LOG.debug(String.format("Symbol file requested. File name: %s. Guid: %s.", fileName, guid));
 
+    final String projectId = findRelatedProjectId(guid);
+    if(projectId == null) {
+      WebUtil.notFound(request, response, "File not found", null);
+      return null;
+    }
+
     final SUser user = myAuthHelper.getAuthenticatedUser(request, response, new Predicate<SUser>() {
       public boolean apply(SUser user) {
         try{
-          final String projectId = findRelatedProjectId(guid);
-          if(projectId == null) {
-            WebUtil.notFound(request, response, "File not found", null);
-            return false;
-          }
           boolean hasPermissions = user.isPermissionGrantedForProject(projectId, Permission.VIEW_BUILD_RUNTIME_DATA);
           if(!hasPermissions) response.sendError(HttpServletResponse.SC_FORBIDDEN, String.format("You have no access to PDB files in the project with id %s.", projectId));
           return hasPermissions;
@@ -148,6 +149,10 @@
     final Map<String,String> metadata = entry.getMetadata();
     final String storedFileName = metadata.get(BuildSymbolsIndexProvider.FILE_NAME_KEY);
     final String artifactPath = metadata.get(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY);
+    if(storedFileName == null || artifactPath == null){
+      LOG.debug(String.format("Metadata stored for guid '%s' is invalid.", guid));
+      return null;
+    }
     if(!storedFileName.equals(fileName)){
       LOG.debug(String.format("File name '%s' stored for guid '%s' differs from requested '%s'.", storedFileName, guid, fileName));
       return null;