Revision: 5664
Author:   [email protected]
Date:     Tue Feb 11 19:44:18 2014 UTC
Log:      Fix repair-framework not fully respecting acceptableProblems.
https://codereview.appspot.com/61930043

* getCurrentSeverity would report the severity as if 'permit' is false;
  fixed by checking permit inside getCurrentSeverity.
* 'doNotRepair' would cause a problem to never be removed from
  yetToRepair; fixed by having runTests check doNotRepair.

Supporting changes:
* Added tests for acceptableProblems in test-repair-framework.
* Verify that acceptableProblems is not modified after it is used.

[email protected]

http://code.google.com/p/google-caja/source/detail?r=5664

Modified:
 /trunk/src/com/google/caja/ses/repair-framework.js
 /trunk/tests/com/google/caja/ses/test-repair-framework.js

=======================================
--- /trunk/src/com/google/caja/ses/repair-framework.js Mon Feb 3 22:59:21 2014 UTC +++ /trunk/src/com/google/caja/ses/repair-framework.js Tue Feb 11 19:44:18 2014 UTC
@@ -244,6 +244,12 @@
      */
     var acceptableProblems = {};

+    /**
+     * Whether acceptableProblems has been used and therefore should not be
+     * modified.
+     */
+    var acceptableProblemsLocked = false;
+
     /**
* As we start to repair, this will track the worst *post-repair* severity
      * seen so far.
@@ -308,6 +314,7 @@

     var defaultDisposition = { permit: false, doNotRepair: false };
     function disposition(problem) {
+      acceptableProblemsLocked = true;
       return Object.prototype.hasOwnProperty.call(acceptableProblems,
problem.id) ? acceptableProblems[problem.id] : defaultDisposition;
     }
@@ -335,7 +342,8 @@
           repairsPerformed.lastIndexOf(problem.repair) !== -1;

         // Update yetToRepair and plannedSeverity
- if (repairPerformed || !problem.repair) { // repair attempted/absent
+        if (repairPerformed || !problem.repair ||
+            disposition(problem).doNotRepair) {  // repair attempted/absent

           if (report.postSeverity.level > severities.SAFE.level
               && disposition(problem).permit) {
@@ -452,7 +460,9 @@
     };

     this.setAcceptableProblems = function(value) {
-      // TODO(kpreid): Check some condition? Do only once?
+      if (acceptableProblemsLocked) {
+        throw new Error('Too late to setAcceptableProblems.');
+      }
       acceptableProblems = value;
     };

@@ -469,9 +479,8 @@
     this.getCurrentSeverity = function() {
       var severity = plannedSeverity;
       yetToRepair.forEach(function(problem) {
- // TODO(kpreid): Fix interaction of this with acceptableProblems config
-
-        if (problem.preSeverity.level > severity.level) {
+        if (problem.preSeverity.level > severity.level &&
+            !disposition(problem).permit) {
           severity = problem.preSeverity;
         }
       });
@@ -504,6 +513,11 @@
     // TODO(kpreid): Replace uses of this with higher level ops
     this.updateMaxSeverity = function updateMaxSeverity(severity) {
       if (severity.level > plannedSeverity.level) {
+ // This is a useful breakpoint for answering the question "why is the
+        // severity as high as it is".
+        // if (severity.level > maxAcceptableSeverity.level) {
+        //   console.info('Increasing planned severity.');
+        // }
         plannedSeverity = severity;
       }
     };
=======================================
--- /trunk/tests/com/google/caja/ses/test-repair-framework.js Mon Feb 3 22:59:21 2014 UTC +++ /trunk/tests/com/google/caja/ses/test-repair-framework.js Tue Feb 11 19:44:18 2014 UTC
@@ -141,6 +141,55 @@
     jsunitPass();
   });

+  jsunitRegister('testAcceptableProblems', function() {
+    var repairer = new ses._Repairer();
+
+    repairer.setAcceptableProblems({
+      'DNR': { doNotRepair: true },
+      'PERMIT': { permit: true },
+      'PERMIT_DNR': { permit: true, doNotRepair: true },
+    });
+    var repaired_pd = false;
+    var repaired_d = false;
+    repairer.registerProblem({
+      id: 'PERMIT',
+      test: function() { return true; },
+      repair: undefined,
+      preSeverity: severities.UNSAFE_SPEC_VIOLATION,
+      canRepair: false,
+    });
+    repairer.registerProblem({
+      id: 'DNR',
+      test: function() { return !repaired_d; },
+      repair: function() { repaired_d = true; },
+      preSeverity: severities.SAFE_SPEC_VIOLATION,
+      canRepair: true,
+    });
+    repairer.registerProblem({
+      id: 'PERMIT_DNR',
+      test: function() { return !repaired_pd; },
+      repair: function() { repaired_pd = true; },
+      preSeverity: severities.UNSAFE_SPEC_VIOLATION,
+      canRepair: true,
+    });
+    repairer.runTests('test without repair');
+    assertEquals('cur sev 1', severities.SAFE_SPEC_VIOLATION,
+        repairer.getCurrentSeverity());
+    assertEquals('plan sev 1', severities.SAFE_SPEC_VIOLATION,
+        repairer.getPlannedSeverity());
+    repairer.testAndRepair();
+    assertFalse('not repaired DNR', repaired_d);
+    assertFalse('not repaired permit&DNR', repaired_pd);
+ // We expect SAFE_SPEC_VIOLATION because problem 'DNR' is doNotRepair but
+    // it is not permitted, so its severity should show up.
+    assertEquals('cur sev 2', severities.SAFE_SPEC_VIOLATION,
+        repairer.getCurrentSeverity());
+    assertEquals('plan sev 2', severities.SAFE_SPEC_VIOLATION,
+        repairer.getPlannedSeverity());
+
+    jsunitPass();
+  });
+
   jsunitRegister('testRepairOutcomes', function() {
     var repairer = new ses._Repairer();

--

--- You received this message because you are subscribed to the Google Groups "Google Caja Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to