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 }