001 package org.hackystat.projectbrowser.test; 002 003 import java.util.Properties; 004 import javax.xml.datatype.XMLGregorianCalendar; 005 import org.hackystat.projectbrowser.ProjectBrowserProperties; 006 import org.junit.BeforeClass; 007 import org.hackystat.sensorbase.client.SensorBaseClient; 008 import org.hackystat.sensorbase.client.SensorBaseClientException; 009 import org.hackystat.sensorbase.client.SensorBaseClient.InvitationReply; 010 import org.hackystat.sensorbase.resource.projects.jaxb.Project; 011 import org.hackystat.sensorbase.resource.projects.jaxb.ProjectRef; 012 import org.hackystat.simdata.SimData; 013 import org.hackystat.utilities.tstamp.Tstamp; 014 015 /** 016 * Supports JUnit testing of the ProjectBrowser by creating test instances of the sensorbase, 017 * dailyprojectdata, and telemetry services. 018 * @author Philip Johnson 019 * 020 */ 021 public class ProjectBrowserTestHelper { 022 /** The Sensorbase server used in these tests. */ 023 private static org.hackystat.sensorbase.server.Server sensorbaseServer; 024 /** The DailyProjectData server used in these tests. */ 025 private static org.hackystat.dailyprojectdata.server.Server dpdServer; 026 /** The Telemetry server used in these tests. */ 027 private static org.hackystat.telemetry.service.server.Server telemetryServer; 028 029 /** The test domain for all users in this simulation. */ 030 private static final String testdomain = "@hackystat.org"; 031 032 protected static final String TEST_USER = "TestUser@hackystat.org"; 033 protected static final String TEST_INVITEE = "TestInvitee@hackystat.org"; 034 protected static final String TEST_NEW_INVITEE = TEST_INVITEE; 035 protected static final String TEST_NEW_SPECTATOR = "TestSpectator@hackystat.org"; 036 protected static final String TEST_EDIT_SPECTATOR = "TestSpectator@hackystat.org"; 037 038 /** 039 * Constructor. 040 */ 041 public ProjectBrowserTestHelper () { 042 // Does nothing. 043 } 044 045 /** 046 * Starts the servers going for these tests. 047 * @throws Exception If problems occur setting up the server. 048 */ 049 @BeforeClass 050 public static void setupServer() throws Exception { 051 // Create testing versions of the Sensorbase, DPD, and Telemetry servers. 052 ProjectBrowserTestHelper.sensorbaseServer = 053 org.hackystat.sensorbase.server.Server.newTestInstance(); 054 ProjectBrowserTestHelper.dpdServer = 055 org.hackystat.dailyprojectdata.server.Server.newTestInstance(); 056 ProjectBrowserTestHelper.telemetryServer = 057 org.hackystat.telemetry.service.server.Server.newTestInstance(); 058 059 SensorBaseClient.registerUser(sensorbaseServer.getHostName(), TEST_INVITEE); 060 SensorBaseClient.registerUser(sensorbaseServer.getHostName(), TEST_USER); 061 SensorBaseClient.registerUser(sensorbaseServer.getHostName(), TEST_NEW_SPECTATOR); 062 063 } 064 065 /** 066 * Returns the hostname associated with this Telemetry test server. 067 * @return The host name, including the context root. 068 */ 069 protected String getTelemetryHostName() { 070 return ProjectBrowserTestHelper.telemetryServer.getHostName(); 071 } 072 073 /** 074 * Returns the sensorbase hostname that this Telemetry server communicates with. 075 * @return The host name, including the context root. 076 */ 077 protected String getSensorBaseHostName() { 078 return ProjectBrowserTestHelper.sensorbaseServer.getHostName(); 079 } 080 081 /** 082 * Returns the sensorbase hostname that this Telemetry server communicates with. 083 * @return The host name, including the context root. 084 */ 085 protected String getDailyProjectDataHostName() { 086 return ProjectBrowserTestHelper.dpdServer.getHostName(); 087 } 088 089 /** 090 * Returns a Properties instance with the SensorBase, DPD, and Telemetry services 091 * ProjectBrowserProperties set to test values. 092 * @return A Properties instances with the service host names set to test values. 093 */ 094 protected Properties getTestProperties() { 095 Properties testProperties = new Properties(); 096 testProperties.put(ProjectBrowserProperties.SENSORBASE_HOST_KEY, getSensorBaseHostName()); 097 testProperties.put(ProjectBrowserProperties.DAILYPROJECTDATA_HOST_KEY, 098 getDailyProjectDataHostName()); 099 testProperties.put(ProjectBrowserProperties.TELEMETRY_HOST_KEY, getTelemetryHostName()); 100 testProperties.put(ProjectBrowserProperties.WICKET_CONFIGURATION_KEY, "development"); 101 return testProperties; 102 } 103 104 /** 105 * Generate a set of data for testing. 106 * Effort is decrease 1 per day, end with 3. 107 * Size increases by 50 LOC per day, end with 1000. 108 * Complexity decrease by 1 per day, end with 3. 109 * Builds and unit tests success/pass number decrease by 1 per day, end with 2. 110 * Both fail twice a day. 111 * Coverage decrease by 3% per day, end with 60%. 112 * Commits twice a day, churn decrease by 5 per time, 10 per day, end with 20. 113 * Code issues decrease by 2 per day, end with 0. 114 * @param user name of the test user. 115 * DONOT include the "@hackystat.org", this method will add that in. 116 * @param projectName name of the test project. 117 * @param endTime end time of the test data. 118 * @param days number of days before endTime that this data will cover. 119 */ 120 protected void generateSimData(String user, String projectName, 121 XMLGregorianCalendar endTime, int days) { 122 try { 123 124 SimData simData = new SimData(getSensorBaseHostName()); 125 XMLGregorianCalendar start = Tstamp.incrementDays(endTime, -100); 126 XMLGregorianCalendar end = Tstamp.incrementDays(endTime, 60); 127 String SUCCESS = "Success"; 128 String FAILURE = "Failure"; 129 String PASS = "pass"; 130 String FAIL = "fail"; 131 String userDir = "/" + user + "/src/org/hackystat/" + projectName + "/Testing/"; 132 String userFile = userDir + "testFile.java"; 133 String LOGPREFIX = "ProjectBrowserTestHelper: Making data for day: "; 134 135 simData.makeUser(user); 136 simData.makeProject(projectName, user, start, end, "*/" + projectName + "/*"); 137 138 simData.getLogger().info(LOGPREFIX + endTime); 139 140 for (int i = 0; i < days; ++i) { 141 XMLGregorianCalendar day = Tstamp.incrementDays(endTime, -i); 142 // Effort is decrease 1 per day, end with 3. 143 simData.addDevEvents(user, day, (12 * (3 + i)), userFile); 144 145 // Size increases by 50 LOC per day, end with 1000. 146 int joeFileSize = 1000 - (i * 50); 147 if (joeFileSize < 100) { 148 joeFileSize = 100; 149 } 150 simData.addFileMetric(user, day, userFile, joeFileSize, day); 151 152 // Complexity decrease by 1 per day, end with 3. 153 simData.addComplexity(user, day, userFile, joeFileSize, day, 3 + i); 154 155 // Builds and unit tests success/pass number decrease by 1 per day, end with 2. 156 // Both fail twice a day. 157 simData.addBuilds(user, day, userDir, SUCCESS, 2 + i); 158 simData.addBuilds(user, day, userDir, FAILURE, 2); 159 simData.addUnitTests(user, day, userFile, PASS, 2 + i); 160 simData.addUnitTests(user, day, userFile, FAIL, 2); 161 162 // Coverage decrease by 3% per day, end with 60%. 163 int joeCoverage = 50 + i * 3; 164 if (joeCoverage > 95) { 165 joeCoverage = 95; 166 } 167 simData.addCoverage(user, day, userFile, joeCoverage, joeFileSize, day); 168 169 // Commits twice a day, churn decrease by 5 per time, 10 per day, end with 20. 170 simData.addCommit(user, day, userFile, 20 + i * 5); 171 simData.addCommit(user, day, userFile, 20 + i * 5); 172 173 // Code issues decrease by 2 per day, end with 0. 174 simData.addCodeIssues(user, day, userFile, i * 2); 175 176 } 177 simData.quitShells(); 178 } 179 catch (Exception e) { 180 e.printStackTrace(); 181 } 182 } 183 184 /** 185 * Adds newMember to projectName owned by owner. 186 * The newMember is invited by the owner, and then newMember accepts. 187 * @param projectName The name of the project. 188 * @param owner The owner of the project (without domain name). 189 * @param newMember The member to be added (without domain name). 190 */ 191 192 public void addMember(String projectName, String owner, String newMember) { 193 String ownerEmail = owner + testdomain; 194 String newMemberEmail = newMember + testdomain; 195 SensorBaseClient ownerClient = 196 new SensorBaseClient(getSensorBaseHostName(), ownerEmail, ownerEmail); 197 SensorBaseClient newMemberClient = 198 new SensorBaseClient(getSensorBaseHostName(), newMemberEmail, newMemberEmail); 199 try { 200 Project project = ownerClient.getProject(ownerEmail, projectName); 201 project.getInvitations().getInvitation().add(newMemberEmail); 202 ownerClient.putProject(project); 203 newMemberClient.reply(ownerEmail, projectName, InvitationReply.ACCEPT); 204 } 205 catch (SensorBaseClientException e) { 206 e.printStackTrace(); 207 } 208 } 209 210 /** 211 * Clear data associated with the given user. 212 * @param user the given user. 213 */ 214 public void clearData(String user) { 215 SensorBaseClient client = new SensorBaseClient(getSensorBaseHostName(), user, user); 216 try { 217 client.authenticate(); 218 client.deleteSensorData(user); 219 for (ProjectRef ref : client.getProjectIndex(user).getProjectRef()) { 220 Project project = client.getProject(ref); 221 System.err.println("Removing project " + project.getName() + project.getOwner()); 222 if (user.equals(project.getOwner()) && !"Default".equals(project.getName())) { 223 client.deleteProject(user, project.getName()); 224 } 225 } 226 client.deleteUser(user); 227 } 228 catch (SensorBaseClientException e) { 229 System.out.println("Errors when clearing data associated with " + user + ": " + 230 e.getMessage()); 231 e.printStackTrace(); 232 } 233 } 234 }