{% extends "tables/base.html" %}
{% comment %}

Copyright 2012 Google Inc. All Rights Reserved.

This template builds the main test summary as a single table for the
Test Dashboard.

The table includes a variable number of columns that reflects the test
netbooks used and a variable number of rows that represent builds.

The build cells are hyperlinks, the timing cells include popup text and
the status cells are hyperlinks to details pages.
{% endcomment %}
{% block title %}ChromeOS Test Dashboard{% endblock %}

{% block header_block %}
{% include 'tables/summary/header.html' %}
{% endblock %}

{% block html_block %}
{% comment %}
-------------------------------------------------------------------------------
- A table of quick links to test pages.                                       -
-------------------------------------------------------------------------------
{% endcomment %}
<div class="div_statustitle"><b><a href="http://cautotest">CAutotest</a></b> BVT Test Results</div>
<table class="standalone top">
  <tr>
    <th class="roundedheader tableheader">Build</th>
    {% for board, netbook in tpl_summary_data.platforms %}
    <th class="roundedheader tableheader">
      {{ board }}<br>
      {{ netbook }}<br>
    </th>
    {% endfor %}
  </tr>
  {% for release in tpl_summary_data.releases %}
  <tr>
    <td style="text-align:center;">{{ release }}</td>
    {% for board, netbook in tpl_summary_data.platforms %}
    <td style="text-align:center;">
      {% if board in tpl_summary_data.irregular %}
      <a class="info" href="{{ netbook }}/{{ board }}"
      {% else %}
      <a class="info" href="{{ netbook }}/{{ board }}-{{ release }}"
      {% endif %}
         onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
        combined
        {% if board in tpl_summary_data.irregular %}
        <span style="width:300px">View test and performance results for {{ board }} on {{ netbook }}
        {% else %}
        <span style="width:300px">View test and performance results for {{ board }}-{{ release }} on {{ netbook }}
        {% endif %}
        </span>
      </a>
      &nbsp;
      {% if board in tpl_summary_data.irregular %}
      <a class="info" href="{{ netbook }}/{{ board }}/perf_index.html"
      {% else %}
        {% if "x86-" in board %}
        <a class="info" href="eagle_eye/graphs/{{ release }}-{{ netbook }}.html"
        {% else %}
        <a class="info" href="eagle_eye/graphs/{{ release }}-{{ board }}.html"
        {% endif %}
      {% endif %}
         onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
        perf
        {% if board in tpl_summary_data.irregular %}
        <span style="width:300px">View performance plots for {{ board }} on {{ netbook }}
        {% else %}
        <span style="width:300px">View performance plots for {{ board }}-{{ release }} on {{ netbook }}
        {% endif %}
        </span>
        </span>
      </a>
    </td>
    {% endfor %}
  </tr>
  {% endfor %}
</table>
<br>
{% comment %}
-------------------------------------------------------------------------------
- The waterfall-like table of BVT test results.                               -
-------------------------------------------------------------------------------
{% endcomment %}
<table>
  <tr>
    <th class="roundedheader tableheader">Build</th>
    <th class="roundedheader tableheader">Start Time</th>
    {% for board, netbook in tpl_summary_data.platforms %}
    <th class="roundedheader tableheader">
      {{ board }}<br>
      {{ netbook }}<br>
    </th>
  {% endfor %}
  </tr>
  {% for build, build_release, start_time, build_results in tpl_summary_data.results %}
  <tr>
    <td onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)"
    {% if tpl_summary_data.releases.0|slice:"1:" == build_release %}
      class="build buildborder">
      <a class="info" onclick="return false">
      <span>This is a TOT build.</span>
    {% else %}
      {% if tpl_summary_data.releases.1|slice:"1:" == build_release %}
        class="buildminusone buildborder">
      {% else %}
        class="buildminustwo buildborder">
      {% endif %}
      <a class="info" onclick="return false">
      <span>This is a branch build.</span>
    {% endif %}
      {{ build }}
    </td>
    <td class="build buildborder">{{ start_time }}</td>
    {% for board, pure_board, netbook, full_build, job_attempted, job_good, passed, total, xpassed, xtotal, kernel, failed_tests, crashes, crash_count, crash_cat in build_results %}
      {% if job_attempted %}
        {% ifequal total 0 %}
        <td align="center" class="failure"">
            <a class="info" target="_blank"
               href="http://cautotest/new_tko/#tab_id=spreadsheet_view&row=job_name%252Ctest_name&column=platform&condition=job_name+regexp+%2527{{ pure_board }}.*/{{ build }}.*/.*bvt/.*%2527+and+not+test_name+regexp+%2527CLIENT_JOB.*%2527"
               onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
              <table><tbody><tr>
                <td>
                  {{ passed }}/{{ total }}
                  {% if xtotal %}
                    {% ifnotequal xpassed xtotal %}
                    <br>({{ xpassed }}/{{ xtotal }})
                    {% endifnotequal %}
                  {% endif %}
                </td>
                {% if crash_count %}
                  <td class="warning_summary">
                  <a class="info"
                     href="{{ netbook }}/{{ board }}/{{ crash_cat }}.html">({{ crash_count }})
                  </a>
                  </td>
                {% endif %}
              </tr></tbody></table>
              <span style="width:300px">
                {% if xtotal %}
                  {% ifnotequal xpassed xtotal %}
                  <div style="color:red;"><b>Experimental Failed Tests:</b> {{ failed_tests.1 }}.</div>
                  {% endifnotequal %}
                {% endif %}
                View CAutotest job details for {{ build }} and {{ board }} on {{ netbook }}
                {% if crash_count %}
                  <div style="color:orange;font-weight:bold;">{{ crash_count }} Crashes.</div>
                  {% for test_name, crash_info in crashes %}
                    <b>{{ test_name }}:</b><br>
                    {% for one_crash in crash_info %}
                      &nbsp;&nbsp;{{ one_crash }}<br>
                    {% endfor %}
                  {% endfor %}
                {% endif %}
              </span>
            </a>
        </td>
        {% else %}
          {% ifequal passed total%}
            {% if job_good %}
            <td align="center" class="success">
            <a class="info" href="{{ netbook }}/{{ board }}/bvt.html"
               onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
              <table><tbody><tr>
                <td>
                  {{ passed }}/{{ total }}
                  {% if xtotal %}
                    {% ifnotequal xpassed xtotal %}
                    <br>({{ xpassed }}/{{ xtotal }})
                    {% endifnotequal %}
                  {% endif %}
                </td>
                {% if crash_count %}
                  <td class="warning_summary">
                  <a class="info"
                     href="{{ netbook }}/{{ board }}/{{ crash_cat }}.html">({{ crash_count }})
                  </a>
                  </td>
                {% endif %}
              </tr></tbody></table>
              <span style="width:300px">
                {% if xtotal %}
                  {% ifnotequal xpassed xtotal %}
                  <div style="color:red;"><b>Experimental Failed Tests:</b> {{ failed_tests.1 }}.</div>
                  {% endifnotequal %}
                {% endif %}
                View bvt test results for {{ board }} on {{ netbook }}
                {% if crash_count %}
                  <div style="color:orange;font-weight:bold;">{{ crash_count }} Crashes.</div>
                  {% for test_name, crash_info in crashes %}
                    <b>{{ test_name }}:</b><br>
                    {% for one_crash in crash_info %}
                      &nbsp;&nbsp;{{ one_crash }}<br>
                    {% endfor %}
                  {% endfor %}
                {% endif %}
              </span>
            </a>
            {% else %}
            <td align="center" class="failure"">
            <a class="info" target="_blank"
               href="http://cautotest/new_tko/#tab_id=spreadsheet_view&row=job_name%252Ctest_name&column=platform&condition=job_name+regexp+%2527{{ pure_board }}.*/{{ build }}.*/.*bvt/.*%2527+and+not+test_name+regexp+%2527CLIENT_JOB.*%2527"
               onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
              <table><tbody><tr>
                <td>
                  {{ passed }}/{{ total }}
                  {% if xtotal %}
                    {% ifnotequal xpassed xtotal %}
                    <br>({{ xpassed }}/{{ xtotal }})
                    {% endifnotequal %}
                  {% endif %}
                </td>
                {% if crash_count %}
                  <td class="warning_summary">
                  <a class="info"
                     href="{{ netbook }}/{{ board }}/{{ crash_cat }}.html">({{ crash_count }})
                  </a>
                  </td>
                {% endif %}
              </tr></tbody></table>
              <span style="width:300px">
                {% if xtotal %}
                  {% ifnotequal xpassed xtotal %}
                  <div style="color:red;"><b>Experimental Failed Tests:</b> {{ failed_tests.1 }}.</div>
                  {% endifnotequal %}
                {% endif %}
                View CAutotest job details for {{ build }} and {{ board }} on {{ netbook }}
                {% if crash_count %}
                  <div style="color:orange;font-weight:bold;">{{ crash_count }} Crashes.</div>
                  {% for test_name, crash_info in crashes %}
                    <b>{{ test_name }}:</b><br>
                    {% for one_crash in crash_info %}
                      &nbsp;&nbsp;{{ one_crash }}<br>
                    {% endfor %}
                  {% endfor %}
                {% endif %}
              </span>
            </a>
            {% endif %}
          {% else %}
          <td align="center" class="failure"">
          <a class="info" href="{{ netbook }}/{{ board }}/bvt.html"
             onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
            <table><tbody><tr>
              <td>
                {{ passed }}/{{ total }}
                {% if xtotal %}
                  {% ifnotequal xpassed xtotal %}
                  <br>({{ xpassed }}/{{ xtotal }})
                  {% endifnotequal %}
                {% endif %}
              </td>
              {% if crash_count %}
                <td class="warning_summary">
                <a class="info"
                   href="{{ netbook }}/{{ board }}/{{ crash_cat }}.html">({{ crash_count }})
                </a>
                </td>
              {% endif %}
            </tr></tbody></table>
            <span style="width:300px">
              <div style="color:red;"><b>Failed Tests:</b> {{ failed_tests.0 }}.</div>
              {% if xtotal %}
                {% ifnotequal xpassed xtotal %}
                <div style="color:red;"><b>Experimental Failed Tests:</b> {{ failed_tests.1 }}.</div>
                {% endifnotequal %}
              {% endif %}
              View bvt test results for {{ board }} on {{ netbook }}
              {% if crash_count %}
                <div style="color:orange;font-weight:bold;">{{ crash_count }} Crashes.</div>
                {% for test_name, crash_info in crashes %}
                  <b>{{ test_name }}:</b><br>
                  {% for one_crash in crash_info %}
                    &nbsp;&nbsp;{{ one_crash }}<br>
                  {% endfor %}
                {% endfor %}
              {% endif %}
            </span>
          </a>
          <a class="info" target="_blank"
             href="https://groups.google.com/a/google.com/forum/?fromgroups#!searchin/chromeos-automated-test-failures/bvt$20{{ board }}$20{{ full_build }}"
             onmouseover="fixTooltip(event, this)" onmouseout="clearTooltip(this)">
            summary
            <span style="width:300px">
              View test <b>failure summary</b> for {{ full_build }} and {{ board }} on {{ netbook }}
            </span>
          </a>
          {% endifequal %}
        {% endifequal %}
        </td>
      {% else %}
      <td align="center">None</td>
      {% endif %}
    {% endfor %}
  </tr>
  {% endfor %}
</table>
{% endblock %}
