{
  "description": "runCommand",
  "schemaVersion": "1.3",
  "createEntities": [
    {
      "client": {
        "id": "client",
        "useMultipleMongoses": false,
        "observeEvents": [
          "commandStartedEvent"
        ]
      }
    },
    {
      "database": {
        "id": "db",
        "client": "client",
        "databaseName": "db"
      }
    },
    {
      "collection": {
        "id": "collection",
        "database": "db",
        "collectionName": "collection"
      }
    },
    {
      "database": {
        "id": "dbWithRC",
        "client": "client",
        "databaseName": "dbWithRC",
        "databaseOptions": {
          "readConcern": {
            "level": "local"
          }
        }
      }
    },
    {
      "database": {
        "id": "dbWithWC",
        "client": "client",
        "databaseName": "dbWithWC",
        "databaseOptions": {
          "writeConcern": {
            "w": 0
          }
        }
      }
    },
    {
      "session": {
        "id": "session",
        "client": "client"
      }
    },
    {
      "client": {
        "id": "clientWithStableApi",
        "observeEvents": [
          "commandStartedEvent"
        ],
        "serverApi": {
          "version": "1",
          "strict": true
        }
      }
    },
    {
      "database": {
        "id": "dbWithStableApi",
        "client": "clientWithStableApi",
        "databaseName": "dbWithStableApi"
      }
    }
  ],
  "initialData": [
    {
      "collectionName": "collection",
      "databaseName": "db",
      "documents": []
    }
  ],
  "tests": [
    {
      "description": "always attaches $db and implicit lsid to given command and omits default readPreference",
      "operations": [
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "$db": "db",
                  "lsid": {
                    "$$exists": true
                  },
                  "$readPreference": {
                    "$$exists": false
                  }
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "always gossips the $clusterTime on the sent command",
      "runOnRequirements": [
        {
          "topologies": [
            "replicaset",
            "sharded"
          ]
        }
      ],
      "operations": [
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            }
          },
          "expectResult": {
            "ok": 1
          }
        },
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "commandName": "ping"
              }
            },
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "$clusterTime": {
                    "$$exists": true
                  }
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "attaches the provided session lsid to given command",
      "operations": [
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            },
            "session": "session"
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "lsid": {
                    "$$sessionLsid": "session"
                  },
                  "$db": "db"
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "attaches the provided $readPreference to given command",
      "runOnRequirements": [
        {
          "topologies": [
            "replicaset",
            "sharded-replicaset",
            "load-balanced",
            "sharded"
          ]
        }
      ],
      "operations": [
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            },
            "readPreference": {
              "mode": "nearest"
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "$readPreference": {
                    "mode": "nearest"
                  },
                  "$db": "db"
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "does not attach $readPreference to given command on standalone",
      "runOnRequirements": [
        {
          "topologies": [
            "single"
          ]
        }
      ],
      "operations": [
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            },
            "readPreference": {
              "mode": "nearest"
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "$readPreference": {
                    "$$exists": false
                  },
                  "$db": "db"
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "does not attach primary $readPreference to given command",
      "operations": [
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            },
            "readPreference": {
              "mode": "primary"
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "$readPreference": {
                    "$$exists": false
                  },
                  "$db": "db"
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "does not inherit readConcern specified at the db level",
      "operations": [
        {
          "name": "runCommand",
          "object": "dbWithRC",
          "arguments": {
            "commandName": "aggregate",
            "command": {
              "aggregate": "collection",
              "pipeline": [],
              "cursor": {}
            }
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "aggregate": "collection",
                  "readConcern": {
                    "$$exists": false
                  },
                  "$db": "dbWithRC"
                },
                "commandName": "aggregate"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "does not inherit writeConcern specified at the db level",
      "operations": [
        {
          "name": "runCommand",
          "object": "dbWithWC",
          "arguments": {
            "commandName": "insert",
            "command": {
              "insert": "collection",
              "documents": [
                {
                  "foo": "bar"
                }
              ],
              "ordered": true
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "insert": "collection",
                  "writeConcern": {
                    "$$exists": false
                  },
                  "$db": "dbWithWC"
                },
                "commandName": "insert"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "does not retry retryable errors on given command",
      "runOnRequirements": [
        {
          "minServerVersion": "4.2"
        }
      ],
      "operations": [
        {
          "name": "failPoint",
          "object": "testRunner",
          "arguments": {
            "client": "client",
            "failPoint": {
              "configureFailPoint": "failCommand",
              "mode": {
                "times": 1
              },
              "data": {
                "failCommands": [
                  "ping"
                ],
                "closeConnection": true
              }
            }
          }
        },
        {
          "name": "runCommand",
          "object": "db",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            }
          },
          "expectError": {
            "isClientError": true
          }
        }
      ]
    },
    {
      "description": "attaches transaction fields to given command",
      "runOnRequirements": [
        {
          "minServerVersion": "4.0",
          "topologies": [
            "replicaset"
          ]
        },
        {
          "minServerVersion": "4.2",
          "topologies": [
            "sharded-replicaset",
            "load-balanced"
          ]
        }
      ],
      "operations": [
        {
          "name": "withTransaction",
          "object": "session",
          "arguments": {
            "callback": [
              {
                "name": "runCommand",
                "object": "db",
                "arguments": {
                  "session": "session",
                  "commandName": "insert",
                  "command": {
                    "insert": "collection",
                    "documents": [
                      {
                        "foo": "transaction"
                      }
                    ],
                    "ordered": true
                  }
                },
                "expectResult": {
                  "$$unsetOrMatches": {
                    "insertedId": {
                      "$$unsetOrMatches": 1
                    }
                  }
                }
              }
            ]
          }
        }
      ],
      "expectEvents": [
        {
          "client": "client",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "insert": "collection",
                  "documents": [
                    {
                      "foo": "transaction"
                    }
                  ],
                  "ordered": true,
                  "lsid": {
                    "$$sessionLsid": "session"
                  },
                  "txnNumber": 1,
                  "startTransaction": true,
                  "autocommit": false,
                  "readConcern": {
                    "$$exists": false
                  },
                  "writeConcern": {
                    "$$exists": false
                  }
                },
                "commandName": "insert",
                "databaseName": "db"
              }
            },
            {
              "commandStartedEvent": {
                "command": {
                  "commitTransaction": 1,
                  "lsid": {
                    "$$sessionLsid": "session"
                  },
                  "txnNumber": 1,
                  "autocommit": false,
                  "writeConcern": {
                    "$$exists": false
                  },
                  "readConcern": {
                    "$$exists": false
                  }
                },
                "commandName": "commitTransaction",
                "databaseName": "admin"
              }
            }
          ]
        }
      ]
    },
    {
      "description": "attaches apiVersion fields to given command when stableApi is configured on the client",
      "runOnRequirements": [
        {
          "minServerVersion": "5.0"
        }
      ],
      "operations": [
        {
          "name": "runCommand",
          "object": "dbWithStableApi",
          "arguments": {
            "commandName": "ping",
            "command": {
              "ping": 1
            }
          },
          "expectResult": {
            "ok": 1
          }
        }
      ],
      "expectEvents": [
        {
          "client": "clientWithStableApi",
          "events": [
            {
              "commandStartedEvent": {
                "command": {
                  "ping": 1,
                  "$db": "dbWithStableApi",
                  "apiVersion": "1",
                  "apiStrict": true,
                  "apiDeprecationErrors": {
                    "$$unsetOrMatches": false
                  }
                },
                "commandName": "ping"
              }
            }
          ]
        }
      ]
    }
  ]
}
