001    package org.hackystat.dailyprojectdata.resource.issue;
002    
003    import static org.junit.Assert.assertEquals;
004    import java.util.logging.Logger;
005    import javax.xml.datatype.XMLGregorianCalendar;
006    import org.hackystat.dailyprojectdata.resource.issue.jaxb.IssueData;
007    import org.hackystat.sensorbase.resource.sensordata.jaxb.SensorData;
008    import org.hackystat.utilities.tstamp.Tstamp;
009    import org.junit.Test;
010    
011    /**
012     * Test IssueDataParser.
013     * @author Shaoxuan Zhang
014     *
015     */
016    public class TestIssueDataParser {
017    
018      private IssueDataParser parser = new IssueDataParser(Logger.getLogger("IssueDpdTester"));
019      
020      protected static final String ACCEPTED = "Accepted";
021      protected static final String FIXED = "Fixed";
022      protected static final String DEFECT = "Defect";
023      protected static final String ENHANCEMENT = "Enhancement";
024      protected static final String MEDIUM = "Medium";
025      protected static final String HIGH = "High";
026    
027      protected static final String testDataOwner = "testDataOwner@hackystat.org";
028      protected static final String testUser1 = "tester1@hackystat.org";
029      protected static final String testUser2 = "tester2@hackystat.org";
030      protected static final String testProject = "hackystat-test-project";
031      
032      protected static final String[] columnKeyOrder = {
033          IssueDataParser.TYPE_PROPERTY_KEY, IssueDataParser.STATUS_PROPERTY_KEY, 
034          IssueDataParser.PRIORITY_PROPERTY_KEY, IssueDataParser.MILESTONE_PROPERTY_KEY, 
035          IssueDataParser.OWNER_PROPERTY_KEY};
036      protected static final String[] testData1T1 = 
037          {"21", DEFECT, ACCEPTED, MEDIUM, "", testUser1, "2008-09-07T11:00:00"};
038      protected static final String[] testData1T2 = 
039          {"21", ENHANCEMENT, FIXED, MEDIUM, "8.4", testUser1, "2008-09-07T11:00:00"};
040      protected static final String[] testData2T1 = 
041          {"23", ENHANCEMENT, ACCEPTED, MEDIUM, "", testUser1, "2009-07-20T10:24:06"};
042      protected static final String[] testData2T2 = 
043          {"23", ENHANCEMENT, ACCEPTED, HIGH, "", testUser2, "2009-07-20T10:24:06"};
044      protected final XMLGregorianCalendar testTime1;
045      protected final XMLGregorianCalendar testTime2;
046      
047      private final SensorData testData1;
048      private final SensorData testData2;
049      
050      /**
051       * Constructor, prepare the test data.
052       * @throws Exception if error when making XMLGregorianCalendar timestamps.
053       */
054      public TestIssueDataParser() throws Exception {
055        testTime1 = Tstamp.makeTimestamp("2009-07-20T11:00:00");
056        testTime2 = Tstamp.makeTimestamp("2009-07-22T00:00:00");
057        testData1 = makeIssueSensorData(testDataOwner, new String[][]{testData1T1, testData1T2}, 
058            new XMLGregorianCalendar[]{testTime1, testTime2});
059        testData2 = makeIssueSensorData(testDataOwner, new String[][]{testData2T1, testData2T2}, 
060            new XMLGregorianCalendar[]{testTime1, testTime2});
061      }
062    
063      /**
064       * Test IsOpenStatus().
065       */
066      @Test public void testIsOpenStatus() {
067        String[] openStatusValues = {"New", "Accepted", "Started"};
068        String[] closeStatusValues = {"Fixed", "Verified", "Invalid", "Duplicate", "WontFix", "Done"};
069        for (String openStatus : openStatusValues) {
070          assertEquals(openStatus + " should be an open status.", 
071              true, parser.isOpenStatus(openStatus));
072        }
073        for (String closeStatus : closeStatusValues) {
074          assertEquals(closeStatus + " should be an close status.", 
075              false, parser.isOpenStatus(closeStatus));
076        }
077      }
078      
079      /**
080       * Test parser to parse issue sensordata.
081       */
082      @Test public void testParser() {
083        /*
084        System.out.println("testSensorData1");
085        for (Property p : testSensorData1.getProperties().getProperty()) {
086          System.out.println("  " + p.getKey() + " : " + p.getValue());
087        }
088        */
089        IssueData issueData1T1 = parser.getIssueDpd(testData1, testTime1);
090        IssueData issueData1T2 = parser.getIssueDpd(testData1, testTime2);
091        IssueData issueData2T1 = parser.getIssueDpd(testData2, testTime1);
092        IssueData issueData2T2 = parser.getIssueDpd(testData2, testTime2);
093        assertEquals("Compare id of data1 from two time.", issueData1T1.getId(), issueData1T2.getId());
094        assertEquals("Compare id of data2 to predefined value.", 23, issueData2T1.getId());
095        
096        assertEquals("Testing type of data1 when 1st update.", DEFECT, issueData1T1.getType());
097        assertEquals("Testing type of data1 when 2nd update.", ENHANCEMENT, issueData1T2.getType());
098        
099        assertEquals("Testing status of data1 when 1st update.", ACCEPTED, issueData1T1.getStatus());
100        assertEquals("Testing status of data1 when 2nd update.", FIXED, issueData1T2.getStatus());
101        
102        assertEquals("Testing milestone of data1 when 1st update.", null, issueData1T1.getMilestone());
103        assertEquals("Testing milestone of data1 when 2nd update.", "8.4", issueData1T2.getMilestone());
104    
105        assertEquals("Testing status of data2 when 1st update.", ACCEPTED, issueData2T1.getStatus());
106        assertEquals("Testing status of data2 when 2nd update.", ACCEPTED, issueData2T2.getStatus());
107        
108        assertEquals("Testing priority of data2 when 1st update.", MEDIUM, issueData2T1.getPriority());
109        assertEquals("Testing priority of data2 when 2nd update.", HIGH, issueData2T2.getPriority());
110        
111        assertEquals("Testing owner of data2 when 1st update.", testUser1, issueData2T1.getOwner());
112        assertEquals("Testing owner of data2 when 2nd update.", testUser2, issueData2T2.getOwner());
113      }
114    
115    
116      /**
117       * Make the issue sensordata. 
118       * Example input parameters:
119       * strings = {{"21", "Enhancement", "Accepted", "Medium", "", "rlcox0"},
120                    {"21", "Enhancement", "Fixed", "High", "8.4", "rlcox0"}}
121         timestamps = {"2009-07-20T11:00:00", "2009-07-22T00:00:00"}
122         @param dataOwner owner of the data.
123       * @param strings Array of String array which contain state values in order.
124       * @param timestamps Array of timestamp of each String array in 1st parameter.
125       * @return the sensordata.
126       */
127      public static SensorData makeIssueSensorData(String dataOwner, String[][] strings,
128          XMLGregorianCalendar[] timestamps) {
129        String sdt = "Issue";
130        String tool = "GoogleProjectHosting";
131        
132        SensorData sensorData = new SensorData();
133        sensorData.setTool(tool);
134        sensorData.setOwner(dataOwner);
135        sensorData.setSensorDataType(sdt);
136        try {
137          sensorData.setTimestamp(Tstamp.makeTimestamp(strings[0][6]));
138        }
139        catch (Exception e) {
140          e.printStackTrace();
141        }
142        String id = strings[0][0];
143        sensorData.setResource("http://code.google.com/p/" + testProject + "/issues/detail?id=" + id);
144        sensorData.setRuntime(Tstamp.makeTimestamp());
145        //add id
146        sensorData.addProperty(IssueDataParser.ID_PROPERTY_KEY, id);
147        for (int i = 0; i < strings.length; i++) {
148          String[] values = strings[i];
149          String timeString = timestamps[i].toString();
150          //add other state values.
151          for (int j = 0; j < columnKeyOrder.length; j++) {
152            if (values[j + 1].length() > 0) {
153              sensorData.addProperty(columnKeyOrder[j], 
154                  values[j + 1] + IssueDataParser.TIMESTAMP_SEPARATOR + timeString);
155            }
156          }
157        }
158        return sensorData;
159      }
160    }