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    }