Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quellcode-Bibliothek test_queue.js

  Sprache: JAVA
 

/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */


ChromeUtils.defineESModuleGetters(this, {
  PageDataService: "resource:///modules/pagedata/PageDataService.sys.mjs",
  TestUtils: "resource://testing-common/TestUtils.sys.mjs",
});

// Test that urls are retrieved in the expected order.
add_task(async function test_queueOrder() {
  Services.prefs.setIntPref("browser.pagedata.maxBackgroundFetches"0);
  // Pretend we are idle.
  PageDataService.observe(null"idle"null);

  let pageDataResults = [
    {
      date: Date.now(),
      url: "http://www.mozilla.org/1",
      siteName: "Mozilla",
      data: {},
    },
    {
      date: Date.now() - 3600,
      url: "http://www.google.com/2",
      siteName: "Google",
      data: {},
    },
    {
      date: Date.now() + 3600,
      url: "http://www.example.com/3",
      image: "http://www.example.com/banner.jpg",
      data: {},
    },
    {
      date: Date.now() / 2,
      url: "http://www.wikipedia.org/4",
      data: {},
    },
    {
      date: Date.now() / 3,
      url: "http://www.microsoft.com/5",
      data: {
        [PageDataSchema.DATA_TYPE.PRODUCT]: {
          name: "Windows 11",
        },
      },
    },
  ];

  let requests = [];
  PageDataService.fetchPageData = url => {
    requests.push(url);

    for (let pageData of pageDataResults) {
      if (pageData.url == url) {
        return Promise.resolve(pageData);
      }
    }

    return Promise.reject(new Error("Unknown url"));
  };

  let { promise: completePromise, resolve } = Promise.withResolvers();

  let results = [];
  let listener = (_, pageData) => {
    results.push(pageData);
    if (results.length == pageDataResults.length) {
      resolve();
    }
  };

  PageDataService.on("page-data", listener);

  for (let pageData of pageDataResults) {
    PageDataService.queueFetch(pageData.url);
  }

  await completePromise;
  PageDataService.off("page-data", listener);

  Assert.deepEqual(
    requests,
    pageDataResults.map(pd => pd.url)
  );

  // Because our fetch implementation is essentially synchronous the results
  // will be in a known order. This isn't guaranteed by the API though.
  Assert.deepEqual(results, pageDataResults);

  delete PageDataService.fetchPageData;
});

// Tests that limiting the number of fetches works.
add_task(async function test_queueLimit() {
  Services.prefs.setIntPref("browser.pagedata.maxBackgroundFetches"3);
  // Pretend we are idle.
  PageDataService.observe(null"idle"null);

  let requests = [];
  PageDataService.fetchPageData = url => {
    let { promise, resolve, reject } = Promise.withResolvers();
    requests.push({ url, resolve, reject });

    return promise;
  };

  let results = [];
  let listener = (_, pageData) => {
    results.push(pageData?.url);
  };

  PageDataService.on("page-data", listener);

  PageDataService.queueFetch("https://www.mozilla.org/1");
  PageDataService.queueFetch("https://www.mozilla.org/2");
  PageDataService.queueFetch("https://www.mozilla.org/3");
  PageDataService.queueFetch("https://www.mozilla.org/4");
  PageDataService.queueFetch("https://www.mozilla.org/5");
  PageDataService.queueFetch("https://www.mozilla.org/6");
  PageDataService.queueFetch("https://www.mozilla.org/7");
  PageDataService.queueFetch("https://www.mozilla.org/8");
  PageDataService.queueFetch("https://www.mozilla.org/9");
  PageDataService.queueFetch("https://www.mozilla.org/10");
  PageDataService.queueFetch("https://www.mozilla.org/11");

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
    ]
  );

  // Completing or rejecting a request should start new ones.

  requests[1].resolve({
    date: 2345,
    url: "https://www.mozilla.org/2",
    siteName: "Test 2",
    data: {},
  });

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
    ]
  );

  requests[3].reject(new Error("Fail"));

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
    ]
  );

  // Increasing the limit should start more requests.
  Services.prefs.setIntPref("browser.pagedata.maxBackgroundFetches"5);

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
    ]
  );

  // Dropping the limit shouldn't start anything new.
  Services.prefs.setIntPref("browser.pagedata.maxBackgroundFetches"3);

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
    ]
  );

  // But resolving should also not start new requests.
  requests[5].resolve({
    date: 345334,
    url: "https://www.mozilla.org/6",
    siteName: "Test 6",
    data: {},
  });

  requests[0].resolve({
    date: 343446434,
    url: "https://www.mozilla.org/1",
    siteName: "Test 1",
    data: {},
  });

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
    ]
  );

  // Until a previous request completes.
  requests[4].resolve(null);

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
      "https://www.mozilla.org/8",
    ]
  );

  // Inifinite queue should work.
  Services.prefs.setIntPref("browser.pagedata.maxBackgroundFetches"0);

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
      "https://www.mozilla.org/8",
      "https://www.mozilla.org/9",
      "https://www.mozilla.org/10",
      "https://www.mozilla.org/11",
    ]
  );

  requests[10].resolve({
    date: 345334,
    url: "https://www.mozilla.org/11",
    data: {},
  });
  requests[2].resolve({
    date: 345334,
    url: "https://www.mozilla.org/3",
    data: {},
  });
  requests[7].resolve({
    date: 345334,
    url: "https://www.mozilla.org/8",
    data: {},
  });
  requests[6].resolve({
    date: 345334,
    url: "https://www.mozilla.org/7",
    data: {},
  });
  requests[8].resolve({
    date: 345334,
    url: "https://www.mozilla.org/9",
    data: {},
  });
  requests[9].resolve({
    date: 345334,
    url: "https://www.mozilla.org/10",
    data: {},
  });

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
      "https://www.mozilla.org/8",
      "https://www.mozilla.org/9",
      "https://www.mozilla.org/10",
      "https://www.mozilla.org/11",
    ]
  );

  PageDataService.off("page-data", listener);

  delete PageDataService.fetchPageData;

  Assert.deepEqual(results, [
    "https://www.mozilla.org/2",
    "https://www.mozilla.org/6",
    "https://www.mozilla.org/1",
    "https://www.mozilla.org/11",
    "https://www.mozilla.org/3",
    "https://www.mozilla.org/8",
    "https://www.mozilla.org/7",
    "https://www.mozilla.org/9",
    "https://www.mozilla.org/10",
  ]);
});

// Tests that the user idle state stops and starts fetches.
add_task(async function test_idle() {
  Services.prefs.setIntPref("browser.pagedata.maxBackgroundFetches"3);
  // Pretend we are active.
  PageDataService.observe(null"active"null);

  let requests = [];
  PageDataService.fetchPageData = url => {
    let { promise, resolve, reject } = Promise.withResolvers();
    requests.push({ url, resolve, reject });

    return promise;
  };

  let results = [];
  let listener = (_, pageData) => {
    results.push(pageData?.url);
  };

  PageDataService.on("page-data", listener);

  PageDataService.queueFetch("https://www.mozilla.org/1");
  PageDataService.queueFetch("https://www.mozilla.org/2");
  PageDataService.queueFetch("https://www.mozilla.org/3");
  PageDataService.queueFetch("https://www.mozilla.org/4");
  PageDataService.queueFetch("https://www.mozilla.org/5");
  PageDataService.queueFetch("https://www.mozilla.org/6");
  PageDataService.queueFetch("https://www.mozilla.org/7");

  await TestUtils.waitForTick();

  // Nothing will start when active.
  Assert.deepEqual(
    requests.map(r => r.url),
    []
  );

  // Pretend we are idle.
  PageDataService.observe(null"idle"null);

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
    ]
  );

  // Completing or rejecting a request should start new ones.

  requests[1].resolve({
    date: 2345,
    url: "https://www.mozilla.org/2",
    data: {},
  });

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
    ]
  );

  // But not when active
  PageDataService.observe(null"active"null);

  requests[3].resolve({
    date: 2345,
    url: "https://www.mozilla.org/4",
    data: {},
  });
  requests[0].resolve({
    date: 2345,
    url: "https://www.mozilla.org/1",
    data: {},
  });
  requests[2].resolve({
    date: 2345,
    url: "https://www.mozilla.org/3",
    data: {},
  });

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
    ]
  );

  // Going idle should start more workers
  PageDataService.observe(null"idle"null);

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
    ]
  );

  requests[4].resolve({
    date: 2345,
    url: "https://www.mozilla.org/5",
    data: {},
  });
  requests[5].resolve({
    date: 2345,
    url: "https://www.mozilla.org/6",
    data: {},
  });
  requests[6].resolve({
    date: 2345,
    url: "https://www.mozilla.org/7",
    data: {},
  });

  await TestUtils.waitForTick();

  Assert.deepEqual(
    requests.map(r => r.url),
    [
      "https://www.mozilla.org/1",
      "https://www.mozilla.org/2",
      "https://www.mozilla.org/3",
      "https://www.mozilla.org/4",
      "https://www.mozilla.org/5",
      "https://www.mozilla.org/6",
      "https://www.mozilla.org/7",
    ]
  );

  PageDataService.off("page-data", listener);

  delete PageDataService.fetchPageData;

  Assert.deepEqual(results, [
    "https://www.mozilla.org/2",
    "https://www.mozilla.org/4",
    "https://www.mozilla.org/1",
    "https://www.mozilla.org/3",
    "https://www.mozilla.org/5",
    "https://www.mozilla.org/6",
    "https://www.mozilla.org/7",
  ]);
});

Messung V0.5 in Prozent
C=92 H=90 G=90

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.25Bemerkung:  (vorverarbeitet am  2026-06-05) ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik