text: db.indexStatsCommand.drop();
  db.createCollection("indexStatsCommand");
  
  t = db.indexStatsCommand;
  
  for (var i = 0; i < 3000; ++i) {
      t.insert({i: i, d: i % 13});
  }
  
  function textWithIndexVersion(version) {
      var indexName = 'test_d_' + version;
      t.ensureIndex({d: 1}, {v: version, name: indexName});
  
      var result = t.indexStats({index: indexName});
      if (result["bad cmd"]) {
          print("storageDetails command not available: skipping");
          return;
      }
  
      assert.commandWorked(result);
  
      assert(result.index === indexName);
      assert(result.isIdIndex === false);
      assert(isObject(result.keyPattern));
      assert.neq(result.keyPattern, null);
      assert(isString(result.storageNs));
      assert(isNumber(result.bucketBodyBytes));
      assert.eq(result.depth, 1);
      assert(isObject(result.overall));
      assert.neq(result.overall, null);
  
      function checkStats(data) {
          assert(data.count instanceof NumberLong);
          assert(isNumber(data.mean));
          assert(isNumber(data.stddev));
          assert(isNumber(data.min));
          assert(isNumber(data.max));
      }
  
      function checkAreaStats(data) {
          assert(isNumber(data.numBuckets));
  
          assert(isObject(data.keyCount));
          assert.neq(data.keyCount, null);
          checkStats(data.keyCount);
  
          assert(isObject(data.usedKeyCount));
          assert.neq(data.usedKeyCount, null);
          checkStats(data.usedKeyCount);
  
          assert(isObject(data.bsonRatio));
          assert.neq(data.bsonRatio, null);
          checkStats(data.bsonRatio);
  
          assert(isObject(data.keyNodeRatio));
          assert.neq(data.keyNodeRatio, null);
          checkStats(data.keyNodeRatio);
  
          assert(isObject(data.fillRatio));
          assert.neq(data.fillRatio, null);
          checkStats(data.fillRatio);
      }
  
      assert(isObject(result.overall));
      checkAreaStats(result.overall);
  
      assert(result.perLevel instanceof Array);
      for (var i = 0; i < result.perLevel.length; ++i) {
          assert(isObject(result.perLevel[i]));
          checkAreaStats(result.perLevel[i]);
      }
  
      result = t.indexStats();
      assert.commandFailed(result);
      assert(result.errmsg.match(/index name is required/));
  
      result = t.indexStats({index: "nonexistent"})
      assert.commandFailed(result);
      assert(result.errmsg.match(/index does not exist/));
  
      result = t.indexStats({index: "_id_", expandNodes: ['string']})
      assert.commandFailed(result);
      assert(result.errmsg.match(/expandNodes.*numbers/));
  
      t.dropIndex(indexName);
  }
  
  [0, 1].map(textWithIndexVersion);
  