<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1037329
-->
<head>
  <meta charset="utf-8">
  <title>System Update API Test</title>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1037329">Test System Update API</a>
<script type="application/javascript;version=1.8">

'use strict';

SimpleTest.waitForExplicitFinish();

function setup() {
  window.gUrl = SimpleTest.getTestFileURL('preload-SystemUpdateManager-jsm.js');
  window.gScript = SpecialPowers.loadChromeScript(gUrl);
  return Promise.resolve();
}

function testGetProviders() {
  return new Promise(function(resolve, reject) {
    navigator.updateManager.getProviders().then(function(providerInfos) {
      info('num of providers: ' + providerInfos.length);
      for (let providerInfo of providerInfos) {
        info('provider info: ' + JSON.stringify(providerInfo));
      }
      resolve(providerInfos);
    });
  });
}

function testSetActiveProvider(providerInfos) {
  return new Promise(function(resolve, reject) {
    //Find the mock provider for our testing provider instead.
    //Set the mock provider as active provider.
    let targetProvider = providerInfos[0];
    for(let provider of providerInfos) {
      if(provider.uuid == "{17a84227-28f4-453d-9b80-9ae75a5682e0}") {
        info('target provider uuid: ' + provider.uuid);
        targetProvider = provider;
        break;
      }
    }
    is("{17a84227-28f4-453d-9b80-9ae75a5682e0}", targetProvider.uuid, 'get the dynamically added provider');
    navigator.updateManager.setActiveProvider(targetProvider.uuid).then(function(activeProvider) {
      info('active provider info: ' + JSON.stringify(activeProvider.info));
      is(activeProvider.name, targetProvider.name, 'expected name of active provider');
      is(activeProvider.uuid, targetProvider.uuid, 'expected uuid of active provider');
      resolve({name : activeProvider.name, uuid : activeProvider.uuid});
    });
  });
}

function testGetActiveProvider(providerInfo) {
  info('test GetActiveProvider');
  return new Promise(function(resolve, reject) {
    navigator.updateManager.getActiveProvider().then(function(activeProvider) {
      is(activeProvider.name, providerInfo.name, 'expected name of active provider');
      is(activeProvider.uuid, providerInfo.uuid, 'expected uuid of active provider');
      resolve(activeProvider);
    });
  });
}

function testCheckForUpdate(provider) {
  info('test CheckForUpdate');
  return new Promise(function(resolve, reject) {
    provider.addEventListener('updateavailable', function(event) {
      ok(true, 'receive updateavailable event');
      info('event: ' + JSON.stringify(event.detail));
      resolve(provider);
    });
    provider.checkForUpdate();
  });
}

function testStartDownload(provider) {
  info('test StartDownload');
  return new Promise(function(resolve, reject) {
    provider.addEventListener('progress', function(event) {
      ok(true, 'receive progress event');
      is(event.loaded, 10, 'expected loaded');
      is(event.total, 100, 'expected total');
      resolve(provider);
    });
    provider.startDownload();
  });
}
function testStopDownload(provider) {
  info('test StopDownload');
  return new Promise(function(resolve, reject) {
    provider.stopDownload();
    resolve(provider);
  });
}
function testApplyUpdate(provider) {
  info('test ApplyUpdate');
  return new Promise(function(resolve, reject) {
    provider.applyUpdate();
    resolve(provider);
  });
}
function testGetParameter(provider) {
  info('test GetParameter');
  return new Promise(function(resolve, reject) {
    let dummy = provider.getParameter('dummy');
    is(dummy, 'dummy-value', 'expected parameter');
    resolve(provider);
  });
}
function testSetParameter(provider) {
  info('test SetParameter');
  return new Promise(function(resolve, reject) {
    provider.setParameter('dummy', 'dummy-value');
    resolve();
  });
}
function testSetActiveProviderError() {
  info('test setActiveProvider error');
  return new Promise(function(resolve, reject) {
    navigator.updateManager.setActiveProvider('something not exsited').then(function(provider) {
      ok(false, 'should not success');
      resolve();
    }, function(reason) {
      info('error message: ' + reason);
      ok(true, 'expected error while setActiveProvider');
      resolve();
    });
  });
}


function runTest() {
  ok(navigator.updateManager, 'should have navigator.updateManager');

  setup()
  .then(testGetProviders)
  .then(testSetActiveProvider)
  .then(testGetActiveProvider)
  .then(testCheckForUpdate)
  .then(testStartDownload)
  .then(testStopDownload)
  .then(testApplyUpdate)
  .then(testGetParameter)
  .then(testSetParameter)
  .then(testSetActiveProviderError)
  .then(function() {
    info('test finished');
    gScript.destroy();
    SimpleTest.finish();
  });
}

SpecialPowers.pushPermissions([
    {type: 'system-update', allow: true, context: document},
  ], function() {
    SpecialPowers.pushPrefEnv({
        'set': [
          ['dom.system_update.enabled', true],
          ['dom.system_update.debug', true],
          ['dom.system_update.active', '@mozilla.org/test-update-provider;1'],
        ]
      }, runTest);
  }
);
</script>
</pre>
</body>
</html>