<html>
<head>
  <title>task-sk demo</title>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
  <script src="/res/common/js/common.js"></script>
  <script src="/res/imp/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  <script type="text/javascript" charset="utf-8">
    // task1 is a task to display.
    var task1 = {
      "attempt": 0,
      "commits": null,
      "created": "2019-02-19T13:27:33.565771Z",
      "dbModified": "2019-02-19T13:29:14.946038Z",
      "finished": "2019-02-19T13:29:14.669965Z",
      "id": "QT5J8rNsgnumXH67JwTr",
      "isolatedOutput": "f43fcadbbffe79a92f5da6792ed992581aa620bd",
      "jobs": [
        "aYwjrLWysQRUW2lGFQvR",
        // This is job2.id.
        "ABCDEF"
      ],
      "max_attempts": 2,
      "parentTaskIds": [
        "J1iwABakhHfGNzGc0n0G",
        "db0BuaY14LAtgqirQr0h"
      ],
      "properties": null,
      "retryOf": "",
      "started": "2019-02-19T13:27:33.920761Z",
      "status": "FAILURE",
      "swarmingBotId": "skia-gce-215",
      "swarmingTaskId": "431ec237d09f5410",
      "issue": "193176",
      "patch_repo": "https://skia.googlesource.com/skia.git",
      "patchset": "2",
      "server": "https://skia-review.googlesource.com",
      "repo": "https://skia.googlesource.com/skia.git",
      "revision": "9883def4f8661f8eec4ccbae2e34d7fcb14bf65d",
      "name": "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit",
      "forcedJobId": ""
    };

    // job1 represents real task data.
    var job1 = {
      "buildbucketBuildId": 8921090193851453000,
      "buildbucketLeaseKey": 0,
      "created": "2019-02-19T13:20:52.277737Z",
      "dbModified": "2019-02-19T13:33:14.64704Z",
      "dependencies": {
        "Build-Debian9-EMCC-wasm-Release-CanvasKit": [
          "Housekeeper-PerCommit-BundleRecipes"
        ],
        "Housekeeper-PerCommit-BundleRecipes": [],
        [task1.name]: [
          "Housekeeper-PerCommit-BundleRecipes",
          "Build-Debian9-EMCC-wasm-Release-CanvasKit"
        ],
        "Upload-Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          "Housekeeper-PerCommit-BundleRecipes",
          task1.name
        ]
      },
      "finished": "2019-02-19T13:32:46.274182Z",
      "id": task1.jobs[0],
      "isForce": false,
      "name": "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit",
      "priority": 0,
      "issue": "193176",
      "patch_repo": "https://skia.googlesource.com/skia.git",
      "patchset": "2",
      "server": "https://skia-review.googlesource.com",
      "repo": "https://skia.googlesource.com/skia.git",
      "revision": "9883def4f8661f8eec4ccbae2e34d7fcb14bf65d",
      "status": "SUCCESS",
      "tasks": {
        "Build-Debian9-EMCC-wasm-Release-CanvasKit": [
          {
            "attempt": 0,
            "id": "J1iwABakhHfGNzGc0n0G",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ebd696ac4fe10"
          }
        ],
        "Housekeeper-PerCommit-BundleRecipes": [
          {
            "attempt": 0,
            "id": "db0BuaY14LAtgqirQr0h",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ebc8bdc182810"
          }
        ],
        [task1.name]: [
          {
            "attempt": task1.attempt,
            "id": task1.id,
            "max_attempts": task1.max_attempts,
            "status": task1.status,
            "swarmingTaskId": task1.swarmingTaskId
          },
          {
            "attempt": 1,
            "id": "fmHFVsREalHNMozGW7Pg",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ec43eb083e010"
          }
        ],
        "Upload-Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          {
            "attempt": 0,
            "id": "6qz24baK8BCl8ubhKo5K",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ec69823433510"
          }
        ]
      },
    };

    // job2 is fake data but is more visually interesting.
    var job2 = {
        "created": (new Date(new Date().getTime() - 5000000)).toUTCString(),
        "dbModified": "2016-10-10T19:56:44.572122663Z",
        "dependencies": {
          "F": ["E"],
          "E": ["B"],
          "D": ["B"],
          [task1.name]: ["A"],
          "B": ["A"],
          "A": [],
        },
        "finished": "",
        "id": "ABCDEF",
        "isForce": false,
        "name": "ABCDEF",
        "priority": 0.8,
        "issue": "2410843002",
        "patchset": "1",
        "server": "https://codereview.chromium.org",
        "repo": "https://skia.googlesource.com/skia.git",
        "revision": "6ca48820407244bbdeb8f9e0ed7d76dd94270460",
        "status": "",
        "tasks": {
          "A": [{
            "id": "A1",
            "status": "SUCCESS",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          "B": [{
            "id": "B1",
            "status": "FAILURE",
            "swarmingTaskId": "31cd28b854e04d10",
          }, {
            "id": "B2",
            "status": "SUCCESS",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          [task1.name]: [{
            "id": task1.id,
            "status": task1.status,
            "swarmingTaskId": task1.swarmingTaskId,
          }],
          "D": [{
            "id": "D1",
            "status": "",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          "E": [{
            "id": "E1",
            "status": "RUNNING",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
        },
    };

    // Mock out sk.get and so we can fake a response from the server.
    sk.get = function(url) {
      return new Promise(function (resolve, reject) {
        if (url.indexOf("/json/task/") != -1) {
          resolve(JSON.stringify(task1));
        } else if (url.indexOf("/json/job/") != -1) {
          if (url.indexOf(job1.id) != -1) {
            resolve(JSON.stringify(job1));
          } else if (url.indexOf(job2.id) != -1) {
            resolve(JSON.stringify(job2));
          } else {
            reject("Unknown Job url " + url);
          }
        } else if (url == "/loginstatus/") {
          resolve('{"Email":"user@google.com","LoginURL":"https://accounts.google.com/"}');
        } else {
          reject("Unknown url " + url);
        }
      });
    };
    sk.post = function(url) {
      return new Promise(function (resolve, reject) {
        var j = task1;
        if (url.indexOf("task1") == -1) {
          j = task2;
        }
        j.status = "CANCELED";
        j.finished = (new Date()).toISOString();
        resolve(JSON.stringify(j));
      });
    };

  </script>
  <link rel="import" href="task-sk.html">
  <link rel="import" href="/res/common/imp/error-toast-sk.html">
  <link rel="import" href="/res/common/imp/login.html">
  <link rel="import" href="/res/imp/bower_components/paper-toggle-button/paper-toggle-button.html" />
</head>
<body>
  <login-sk style="display:none"></login-sk>
  <h1>task-sk demo</h1>
  <task-sk id="task_sk" task-id="task1" swarming-server="chromium-swarm.appspot.com"></task-sk>
  <error-toast-sk></error-toast-sk>
</body>
</html>
