Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-21089

assert.throws() doesn't check 2nd argument properly

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 3.4.0-rc2
    • Component/s: Testing Infrastructure
    • Labels:
      None
    • Backwards Compatibility:
      Fully Compatible
    • Operating System:
      ALL
    • Sprint:
      TIG 2016-10-10, TIG 2016-10-31

      Description

      The test checks if typeof(params) is "string", but the message says "2nd argument to assert.throws has to be an array", and the usage of params as the 2nd argument to Function.apply confirms it should be an array or array-like object.

      assert.throws = function(func, params, msg) {
          if (assert._debug && msg) print("in assert for: " + msg);
          if (params && typeof(params) == "string") {
              throw ("2nd argument to assert.throws has to be an array, not " + params);
          }
          try {
              func.apply(null, params);
          }
          catch (e) {
              return e;
          }
          doassert("did not throw exception: " + msg);
      };
      

      Similarly for assert.doesNotThrow.

      Since func.apply will throw an exception if params is an unexpected type, this will make assert.throws always succeed in these cases.

      > if (assert.throws(function(){throw("the exception")}, [])) print("success")
      success
      > assert.throws(function(){throw("the exception")}, [])
      the exception
      > if (assert.throws(function(){}, [])) print("success")
      assert: did not throw exception: undefined
      doassert@src/mongo/shell/assert.js:15:14
      assert.throws@src/mongo/shell/assert.js:229:5
      @(shell):1:5
       
      2015-10-23T16:33:38.936+1100 E QUERY    [thread1] Error: did not throw exception: undefined :
      doassert@src/mongo/shell/assert.js:15:14
      assert.throws@src/mongo/shell/assert.js:229:5
      @(shell):1:5
       
      > if (assert.throws(function(){}, 3)) print("success")
      success  // crap
      > assert.throws(function(){}, 3)
      TypeError: second argument to Function.prototype.apply must be an array
      

      Likewise, assert.doesNotThrow will always fail (obviously less concerning, and there are only 56 uses of assert.doesNotThrow).

      The error message should probably also use doassert rather than calling throw directly.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              robert.guo Robert Guo
              Reporter:
              kevin.pulo Kevin Pulo
              Participants:
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: