Skip to content

Flaky Tests Hub #844

Description

@doc-han

Description

This is a space dedicated to tracking known flaky tests and systematically resolving them.

Note

  1. Pick one, create issue if it doesn't exist and reference here via related issue
  2. After your issue's related PR has been merged and related issue is closed on a good note. click the checkmark!

Flaky Tests

  • [skipped] "synchronously create a placeholder before generating the docs"
    Reason[1]: Promise functions start resolving as soon as they've been called. await doesn't tell a promise to start resolving but rather blocks execution only in the scope of its async function.
    Reason[2]: A placeholder is supposed to be generated quickly before the promise is resolved. Here, we're trying to test in between the time the placeholder is generator and when the promise with the actual data is resolved. Since there's no good mechanism to test in-between promise call and resolution, it makes this test very flaky. Hence, an error is thrown when the placeholder doesn't exist but we try doing JSON.parse(readFileSync(path, 'utf8'));
    test.serial(
    'synchronously create a placeholder before generating the docs',
    async (t) => {
    const path = `${DOCS_PATH}/${specifier}.json`;
    // a placeholder should not exist when we start
    const empty = await loadJSON(path);
    t.falsy(empty);
    const promise = docsHandler(options, logger, mockGen);
    // the placeholder should already be created
    const placeholder = JSON.parse(readFileSync(path, 'utf8'));
    t.truthy(placeholder);
    t.true(placeholder.loading);
    t.assert(typeof placeholder.timestamp === 'number');
    // politely wait for the promise to run
    await promise.then();
    }
    );

    Related Issue: no issue created

  • "allow a job to complete after receiving a sigterm"
    Reason: workerProcess.kill('SIGTERM') doesn't kill a process exactly after it has been called. It's async and may take some time to actually kill the process. Hence at times, the job gets processed before, other times not depending on computer resource available.
    test.serial('allow a job to complete after receiving a sigterm', (t) => {
    return new Promise(async (done) => {
    let didKill = false;
    const port = getPort();
    lightning = initLightning(port);
    const job = createJob({
    // This job needs no adaptor (no autoinstall here!) and returns state after 1 second
    adaptor: '',
    body: 'export default [(s) => new Promise((resolve) => setTimeout(() => resolve(s), 1000))]',
    });
    const attempt = createRun([], [job], []);
    lightning.once('run:complete', (evt) => {
    t.true(didKill); // Did we kill the server before this returned?
    t.is(evt.payload.reason, 'success'); // did the attempt succeed?
    t.pass('ok');
    // Give the server some time to shut down
    setTimeout(async () => {
    // The webserver should not respond
    await t.throwsAsync(() => fetch('http://localhost:2222/'), {
    message: 'fetch failed',
    });
    const finishTimeout = setTimeout(() => {
    done();
    }, 500);
    // Lightning should receive no more claims
    lightning.on('claim', () => {
    clearTimeout(finishTimeout);
    t.fail();
    done();
    });
    }, 10);
    });
    workerProcess = await spawnServer(port);
    lightning.enqueueRun(attempt);
    // give the attempt time to start, then kill the server
    setTimeout(() => {
    didKill = true;
    workerProcess.kill('SIGTERM');
    }, 100);
    });
    });

    SKIPPED

  • There's something failing intermittently in integration tests Log
    I think it's this?
integration-tests/worker test: [worker] ✘ 29bbf427-4414-47d4-9901-b5f79aa092cc failed to send run:complete event. This run will be lost!
integration-tests/worker test: [worker] ✘ Unexpected keys: timestamp

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status
    Product Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions