const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

function shouldHaveChanged(a, b)
{
  if (a.length != b.length) {
    throw Error("TEST-UNEXPECTED-FAIL: telemetry count array size changed");
  }

  for (let i = 0; i < a.length; ++i) {
    if (a[i] == b[i]) {
      continue;
    }
    return; // something was different, that's all that matters
  }
  throw Error("TEST-UNEXPECTED-FAIL: telemetry data didn't change");
}

function TestStartupCacheTelemetry() { }

TestStartupCacheTelemetry.prototype = {
  classID: Components.ID("{73cbeffd-d6c7-42f0-aaf3-f176430dcfc8}"),
  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),

  saveInitial: function() {
    let t = Services.telemetry;
    this._age = t.getHistogramById("STARTUP_CACHE_AGE_HOURS").snapshot.counts;
    this._invalid = t.getHistogramById("STARTUP_CACHE_INVALID").snapshot.counts;
  },

  checkFinal: function() {
    let t = Services.telemetry;
    let newAge = t.getHistogramById("STARTUP_CACHE_AGE_HOURS").snapshot.counts;
    shouldHaveChanged(this._age, newAge);

    let newInvalid = t.getHistogramById("STARTUP_CACHE_INVALID").snapshot.counts;
    shouldHaveChanged(this._invalid, newInvalid);
  },

  observe: function(subject, topic, data) {
    switch (topic) {
    case "save-initial":
      this.saveInitial();
      break;

    case "check-final":
      this.checkFinal();
      break;

    default:
      throw Error("BADDOG, NO MILKBONE FOR YOU");
    }
  },
};

this.NSGetFactory = XPCOMUtils.generateNSGetFactory([TestStartupCacheTelemetry]);