Merge "Checks table: Order checks according to state and then name"
diff --git a/gr-checks/gr-checks-change-list-header-view.html b/gr-checks/gr-checks-change-list-header-view.html
index 9ddc13a..efdf442 100644
--- a/gr-checks/gr-checks-change-list-header-view.html
+++ b/gr-checks/gr-checks-change-list-header-view.html
@@ -1,11 +1,11 @@
 <dom-module id="gr-checks-change-list-header-view">
-  <style>
-    :host {
-      display: table-cell;
-      padding: 0 3px;
-    }
-  </style>
   <template>
+    <style>
+      :host {
+        display: table-cell;
+        padding: 0 3px;
+      }
+    </style>
     Checks
   </template>
 
diff --git a/gr-checks/gr-checks-change-list-item-cell-view.html b/gr-checks/gr-checks-change-list-item-cell-view.html
index 61af378..8536a66 100644
--- a/gr-checks/gr-checks-change-list-item-cell-view.html
+++ b/gr-checks/gr-checks-change-list-item-cell-view.html
@@ -1,12 +1,12 @@
 <dom-module id="gr-checks-change-list-item-cell-view">
-  <style>
-    :host {
-      display: inline-block;
-      text-align: center;
-      width: 100%;
-    }
-  </style>
   <template>
+    <style>
+      :host {
+        display: inline-block;
+        text-align: center;
+        width: 100%;
+      }
+    </style>
   </template>
 
   <script src="gr-checks-change-list-item-cell-view.js"></script>
diff --git a/gr-checks/gr-checks-chip-view.html b/gr-checks/gr-checks-chip-view.html
index 2bda0de..e4358b5 100644
--- a/gr-checks/gr-checks-chip-view.html
+++ b/gr-checks/gr-checks-chip-view.html
@@ -4,6 +4,7 @@
 
       :host {
         display: inline-block;
+        cursor: pointer;
       }
 
       .chip {
@@ -20,7 +21,7 @@
     <template is="dom-if" if="[[_hasChecks]]">
       Checks:
       <span class$="[[_chipClasses]]">
-        <gr-checks-status status="[[_status]]"></gr-checks-status>
+        <gr-checks-status status="[[_status]]" downgrade-failure-to-warning="[[_downgradeFailureToWarning]]"></gr-checks-status>
         [[_statusString]]
       </span>
     </template>
diff --git a/gr-checks/gr-checks-chip-view.js b/gr-checks/gr-checks-chip-view.js
index 70ce5d0..3ed66e1 100644
--- a/gr-checks/gr-checks-chip-view.js
+++ b/gr-checks/gr-checks-chip-view.js
@@ -45,6 +45,22 @@
     }, {total: checks.length});
   }
 
+  function downgradeFailureToWarning(checks) {
+    const hasFailedCheck = checks.some(
+      (check) => {
+        return check.state == Statuses.FAILED;
+      }
+    )
+    if (!hasFailedCheck) return false;
+    const hasRequiredFailedCheck = checks.some(
+      (check) => {
+        return check.state == Statuses.FAILED && check.blocking && check.blocking.length > 0;
+      }
+    )
+    return !hasRequiredFailedCheck;
+  }
+
+
   Polymer({
     is: 'gr-checks-chip-view',
     _legacyUndefinedCheck: true,
@@ -62,12 +78,34 @@
         computed: '_computeStatusString(_status, _checkStatuses)',
       },
       _chipClasses: {type: String, computed: '_computeChipClass(_status)'},
+      _downgradeFailureToWarning: {
+        type: Boolean,
+        value: false
+      }
     },
 
     observers: [
       '_fetchChecks(change, revision, getChecks)',
     ],
 
+    listeners: {
+      'tap': 'showChecksTable'
+    },
+
+    showChecksTable() {
+      this.dispatchEvent(
+        new CustomEvent(
+          'show-checks-table',
+          {
+            bubbles: true,
+            composed: true,
+            detail: {
+              tab: 'change-view-tab-content-checks'
+            }
+          })
+        );
+    },
+
     /**
      * @param {!Defs.Change} change
      * @param {!Defs.Revision} revision
@@ -79,6 +117,7 @@
         if (checks.length > 0) {
           this.set(
               '_checkStatuses', computeCheckStatuses(checks));
+          this.set('_downgradeFailureToWarning', downgradeFailureToWarning(checks));
         }
       });
     },
diff --git a/gr-checks/gr-checks-item.html b/gr-checks/gr-checks-item.html
index 18d85bb..64a061b 100644
--- a/gr-checks/gr-checks-item.html
+++ b/gr-checks/gr-checks-item.html
@@ -23,7 +23,7 @@
     <td>[[check.checker_name]]</td>
     <td>[[_requiredForMerge]]</td>
     <td>
-      <gr-checks-status show-text status="[[check.state]]"></gr-checks-status>
+      <gr-checks-status show-text status="[[check.state]]" downgrade-failure-to-warning="[[false]]"></gr-checks-status>
     </td>
     <td><!--Check System--></td>
     <td>[[_startTime]]</td>
diff --git a/gr-checks/gr-checks-status.html b/gr-checks/gr-checks-status.html
index ba5eef0..a1072bd 100644
--- a/gr-checks/gr-checks-status.html
+++ b/gr-checks/gr-checks-status.html
@@ -14,22 +14,19 @@
           text-align: center;
           width: 16px;
         }
-        .successful > i {
-          background-color: #00C752;
-        }
-        .failed > i {
-          background-color: #DA4236;
-        }
-        .in-progress > i {
-          background-color: #ddd;
-        }
-        .unevaluated > i {
-          background-color: black;
+        svg {
+          display: inline-block;
+          vertical-align: middle;
         }
       </style>
     <span class$="[[_className]]">
       <template is="dom-if" if="[[_isUnevaluated(status)]]">
-        <i>&#x23F9;</i>
+        <svg width="18" height="18" xmlns="http://www.w3.org/2000/svg">
+          <g fill="none" fill-rule="evenodd">
+            <path d="M0 0h18v18H0z"/>
+            <path d="M9 11.8a2.8 2.8 0 1 1 0-5.6 2.8 2.8 0 0 1 0 5.6M9 2a7 7 0 1 0 0 14A7 7 0 0 0 9 2" fill="#9E9E9E"/>
+          </g>
+        </svg>
         <template is="dom-if" if="[[showText]]">
           <span>
             Unevaluated
@@ -37,7 +34,12 @@
         </template>
       </template>
       <template is="dom-if" if="[[_isInProgress(status)]]">
-        <i>…</i>
+        <svg width="18" height="18" xmlns="http://www.w3.org/2000/svg">
+          <g fill="none" fill-rule="evenodd">
+            <path d="M12.184 9.293c-.86 0-1.641-.39-2.15-.976L9.8 9.489l.82.78V13.2h-.78v-2.344l-.821-.781-.39 1.719-2.736-.547.157-.782 1.914.391.625-3.164-.703.273v1.328h-.782V7.457l2.032-.86c.117 0 .196-.039.313-.039.273 0 .508.157.664.391l.39.625c.313.547.939.938 1.68.938v.781zM10.034 4.8c.43 0 .782.352.782.782 0 .43-.352.781-.781.781a.783.783 0 0 1-.782-.781c0-.43.352-.782.782-.782zM9 2a7 7 0 1 0 .002 14.002A7 7 0 0 0 9 2z" fill="#9C27B0"/>
+            <path d="M0 0h18v18H0z"/>
+          </g>
+        </svg>
         <template is="dom-if" if="[[showText]]">
           <span>
             In progress
@@ -45,7 +47,12 @@
         </template>
       </template>
       <template is="dom-if" if="[[_isSuccessful(status)]]">
-        <i>✓</i>
+        <svg width="18" height="18" xmlns="http://www.w3.org/2000/svg">
+          <g fill="none" fill-rule="evenodd">
+            <path d="M9 2C5.136 2 2 5.136 2 9s3.136 7 7 7 7-3.136 7-7-3.136-7-7-7zM7.6 12.5L4.1 9l.987-.987L7.6 10.519l5.313-5.313.987.994-6.3 6.3z" fill="#00C752"/>
+            <path d="M0 0h18v18H0z"/>
+          </g>
+        </svg>
         <template is="dom-if" if="[[showText]]">
           <span>
             Successful
@@ -53,7 +60,28 @@
         </template>
       </template>
       <template is="dom-if" if="[[_isFailed(status)]]">
-        <i>!</i>
+        <svg width="18" height="18" xmlns="http://www.w3.org/2000/svg">
+          <g fill="none" fill-rule="evenodd">
+            <path d="M9 2a7 7 0 1 0 0 14A7 7 0 0 0 9 2zm-1 8V5h2v5H8zm0 3v-2h2v2H8z" fill="#DA4236"/>
+            <path d="M0 0h18v18H0z"/>
+          </g>
+        </svg>
+        <template is="dom-if" if="[[showText]]">
+          <span>
+            Failed
+          </span>
+        </template>
+      </template>
+      <template is="dom-if" if="[[_isWarning(status)]]">
+        <svg width="18" height="18" xmlns="http://www.w3.org/2000/svg">
+          <g fill="none" fill-rule="evenodd">
+            <g transform="translate(2 2)">
+              <circle fill="#F29900" cx="6.921" cy="6.921" r="6.921"/>
+              <path d="M6.92 1.3l4.686 8.2H2.235L6.92 1.3zm-.584 5.271h1.171V3.643H6.336V6.57zm0 2.258h1.171V7.657H6.336V8.83z" fill="#F8F9FA"/>
+            </g>
+            <path d="M0 0h18v18H0z"/>
+          </g>
+        </svg>
         <template is="dom-if" if="[[showText]]">
           <span>
             Failed
diff --git a/gr-checks/gr-checks-status.js b/gr-checks/gr-checks-status.js
index 721c3cf..0f18339 100644
--- a/gr-checks/gr-checks-status.js
+++ b/gr-checks/gr-checks-status.js
@@ -12,7 +12,7 @@
         reflectToAttribute: true,
       },
       status: String,
-      _className: {type: String, computed: '_computeClassName(status)'},
+      downgradeFailureToWarning: Boolean
     },
 
     _isUnevaluated(status) {
@@ -28,11 +28,12 @@
     },
 
     _isFailed(status) {
-      return window.Gerrit.Checks.isFailed(status);
+      return !this.downgradeFailureToWarning && window.Gerrit.Checks.isFailed(status);
     },
 
-    _computeClassName(status) {
-      return window.Gerrit.Checks.statusClass(status);
+    _isWarning(status) {
+      return this.downgradeFailureToWarning && window.Gerrit.Checks.isFailed(status);
     },
+
   });
 })();
diff --git a/java/com/google/gerrit/plugins/checks/CheckerUuid.java b/java/com/google/gerrit/plugins/checks/CheckerUuid.java
index f34ab7d..c3609b4 100644
--- a/java/com/google/gerrit/plugins/checks/CheckerUuid.java
+++ b/java/com/google/gerrit/plugins/checks/CheckerUuid.java
@@ -147,12 +147,12 @@
   }
 
   @Override
-  public String toString() {
+  public final String toString() {
     return get();
   }
 
   @Override
-  public int compareTo(CheckerUuid o) {
+  public final int compareTo(CheckerUuid o) {
     return get().compareTo(o.get());
   }
 }
diff --git a/java/com/google/gerrit/plugins/checks/CombinedCheckStateCache.java b/java/com/google/gerrit/plugins/checks/CombinedCheckStateCache.java
index c348550..bcbd429 100644
--- a/java/com/google/gerrit/plugins/checks/CombinedCheckStateCache.java
+++ b/java/com/google/gerrit/plugins/checks/CombinedCheckStateCache.java
@@ -87,8 +87,9 @@
               new Description("Latency for reloading combined check state")
                   .setCumulative()
                   .setUnit(Units.MILLISECONDS),
-              Field.ofBoolean(
-                  "updated", "whether reloading resulted in updating the cached value"));
+              Field.ofBoolean("updated")
+                  .description("whether reloading resulted in updating the cached value")
+                  .build());
       reloadCount = AtomicLongMap.create();
     }