001    package org.hackystat.sensorbase.resource.projects;
002    
003    import static org.junit.Assert.assertEquals;
004    
005    import java.util.ArrayList;
006    import java.util.List;
007    
008    import javax.xml.datatype.XMLGregorianCalendar;
009    
010    import org.hackystat.sensorbase.client.SensorBaseClient;
011    import org.hackystat.sensorbase.client.SensorBaseClientException;
012    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
013    import org.hackystat.sensorbase.resource.projects.jaxb.UriPatterns;
014    import org.hackystat.sensorbase.resource.sensordata.jaxb.SensorData;
015    import org.hackystat.sensorbase.resource.sensordata.jaxb.SensorDataIndex;
016    import org.hackystat.sensorbase.test.SensorBaseRestApiHelper;
017    import org.hackystat.utilities.tstamp.Tstamp;
018    import org.junit.BeforeClass;
019    import org.junit.Test;
020    
021    
022    /**
023     * Tests that UriPattern processing works correctly.
024     * @author Philip Johnson
025     */
026    public class TestProjectUriPatterns extends SensorBaseRestApiHelper {
027      
028      private static String testUser = "TestProjectUriPatterns@hackystat.org";
029      private static String testProject = "TestProjectUriPatterns";
030      private static SensorBaseClient client;
031      
032      /**
033       * Setup this user, and make sure there is no data or project for them.
034       * 
035       * @throws Exception If problems occur setting up the server.
036       */
037      @BeforeClass
038      public static void setupMembership() throws Exception {
039        SensorBaseClient.registerUser(getHostName(), testUser);
040        client = new SensorBaseClient(getHostName(), testUser, testUser);
041        client.deleteProject(testUser, testProject);
042        client.deleteSensorData(testUser);
043      }
044      
045      /**
046       * Test various URI patterns.
047       * @throws SensorBaseClientException if problems occur. 
048       */
049      @Test
050      public void testDefaultUriPatterns() throws SensorBaseClientException {
051        
052        // Note that each time the project is PUT, it gets the current time as its
053        // start time. Thus, all old data is no longer within scope for the project.
054        
055        // [1] Test the Default UriPattern.
056        List<String> uriPatterns = new ArrayList<String>();
057        uriPatterns.add("*");
058        putProject(testProject, uriPatterns);
059        putSensorData("file://foo/bar/baz.java");
060        putSensorData("file://foo\\bar\\baz.java");
061        SensorDataIndex index = client.getProjectSensorData(testUser, testProject);
062        assertEquals("[1] * uriPattern", 2, index.getSensorDataRef().size());
063    
064        // [2] Test empty string, which matches nothing.
065        uriPatterns.set(0, "");
066        putProject(testProject, uriPatterns);
067        putSensorData("file://foo/bar/baz.java");
068        index = client.getProjectSensorData(testUser, testProject);
069        assertEquals("[2] Empty uriPattern", 0, index.getSensorDataRef().size());
070    
071        // [3] Test a wildcard.
072        uriPatterns.set(0, "*/foo/*/baz.java");
073        putProject(testProject, uriPatterns);
074        putSensorData("file://foo/bar/baz.java");
075        putSensorData("file://\\foo\\bar\\baz.java");
076        putSensorData("file://qux/bar/baz.java");
077        index = client.getProjectSensorData(testUser, testProject);
078        assertEquals("[3] wildcard uriPattern", 2, index.getSensorDataRef().size());
079        
080        // [4.1] Test path separators
081        uriPatterns.set(0, "*/foo/*/baz.java");
082        putProject(testProject, uriPatterns);
083        putSensorData("\\foo\\bar\\baz.java");
084        putSensorData("/foo/bar/baz.java");
085        putSensorData("\\qux\\bar\\baz.java");
086        index = client.getProjectSensorData(testUser, testProject);
087        assertEquals("[4.1] path separator", 2, index.getSensorDataRef().size());
088        
089        // [4.2] Test path separators
090        uriPatterns.set(0, "*\\foo\\*\\baz.java");
091        putProject(testProject, uriPatterns);
092        putSensorData("\\foo\\bar\\baz.java");  
093        putSensorData("/foo/bar/baz.java");  
094        putSensorData("foo/bar/baz.java");  
095        putSensorData("\\qux\\bar\\baz.java");  
096        index = client.getProjectSensorData(testUser, testProject);
097        assertEquals("[4.2] path separator", 2, index.getSensorDataRef().size());
098        
099        // [5] Test multiple URI patterns.
100        uriPatterns.set(0, "foo.java");
101        uriPatterns.add("bar.java");
102        putProject(testProject, uriPatterns);
103        putSensorData("foo.java");  
104        putSensorData("bar.java");  
105        putSensorData("baz.java");  
106        putSensorData("qux.java");  
107        index = client.getProjectSensorData(testUser, testProject);
108        assertEquals("[5] multi URIs", 2, index.getSensorDataRef().size());
109        
110        // [6] Test path separators with mixture.
111        // NOTE: This illustrates limitation of current mechanism.  
112        // Cannot include 'file://' in UriPattern and then match against '\' path separator
113        uriPatterns.set(0, "file://*/foo.java");
114        uriPatterns.set(1, "file://*/bar.java");
115        putProject(testProject, uriPatterns);
116        putSensorData("file:///foo.java"); // matches.
117        putSensorData("file://\\foo.java"); // should match, but doesn't!
118        index = client.getProjectSensorData(testUser, testProject);
119        assertEquals("[6] mixture", 1, index.getSensorDataRef().size());
120      }
121      
122      /**
123       * Defines a project with the passed name and uriPatterns
124       * The project start time is now, and the end time is one day from now.
125       * @param projectName The name of the Project.
126       * @param uriPatterns The uri patterns.
127       * @throws SensorBaseClientException if problems occur. 
128       */
129      private void putProject(String projectName, List<String> uriPatterns) 
130      throws SensorBaseClientException {
131        String owner = testUser;
132        Project project = new Project();
133        project.setOwner(owner);
134        project.setName(projectName);
135        project.setDescription("Project for UriPattern testing.");
136        XMLGregorianCalendar tstamp = Tstamp.makeTimestamp();
137        project.setStartTime(tstamp);
138        project.setEndTime(Tstamp.incrementDays(tstamp, 1));
139        UriPatterns uris = new UriPatterns();
140        if (uriPatterns != null) {
141          uris.getUriPattern().addAll(uriPatterns);
142        }
143        project.setUriPatterns(uris);
144        client.putProject(project);
145      }
146      
147     
148      /**
149       * Creates a sample SensorData instance with a given resource.
150       * @param resource The resource string.
151       * @throws SensorBaseClientException if problems occur. 
152       */
153      private void putSensorData(String resource) throws SensorBaseClientException {
154        SensorData data = new SensorData();
155        data.setOwner(testUser);
156        data.setTool("Subversion");
157        data.setSensorDataType("TestSdt");
158        data.setTimestamp(Tstamp.makeTimestamp());
159        data.setResource(resource);
160        data.setRuntime(Tstamp.makeTimestamp());
161        client.putSensorData(data);
162      }
163    
164    }