// Tests that planSummary is not duplicated in an active getmore currentOp entry.
// This test runs a getMore in a parallel shell, which will not inherit the implicit session of
// the cursor establishing command.
TestData.disableImplicitSessions = true;

const collName = "currentop_plan_summary_no_dup";
const coll = db.getCollection(collName);
coll.drop();
for (let i = 0; i < 200; i++) {
    assert.commandWorked(coll.insert({x: 1}));
}

// Create a long-running getMore operation by sleeping for every document.
const cmdRes = assert.commandWorked(db.runCommand({
    find: collName,
    filter: {
        $where: function() {
            sleep(100);
            return true;
        }
    },
    batchSize: 0
}));
const cmdStr =
    'db.runCommand({getMore: ' + cmdRes.cursor.id.toString() + ', collection: "' + collName + '"})';
const awaitShell = startParallelShell(cmdStr);

assert.soon(function() {
    const currOp = db.currentOp({"op": "getmore"});

    assert("inprog" in currOp);
    if (currOp.inprog.length === 0) {
        return false;
    }

    const getmoreOp = currOp.inprog[0];
    if (!("planSummary" in getmoreOp)) {
        print("getMore op does not yet contain planSummary:");
        printjson(getmoreOp);
        return false;
    }

    // getmoreOp should only contain a top-level plan summary.
    // Check that it doesn't contain a sub-level duplicate.
    assert(!getmoreOp.cursor.hasOwnProperty("planSummary"),
           "getmore contains duplicated planSummary: " + tojson(getmoreOp));

    // Kill the op so that the test won't run for a long time.
    db.killOp(getmoreOp.opid);

    return true;
});
awaitShell();