{
  "test_browser": {
    "Browser": {
      "Should retrieve interface name from cache when interface index is no longer valid": [
        {
          "test": "equal"
        },
        {
          "test": "ok"
        },
        {
          "test": "ok"
        },
        {
          "test": "equal"
        }
      ]
    }
  },
  "test_dns_sd": {
    "DNSServiceRef": [
      {
        "test": "ok",
        "message": "DNSServiceRef must be truthy"
      },
      {
        "test": "strictEqual",
        "message": "File descriptor must be -1"
      },
      {
        "test": "strictEqual",
        "message": "DNSServiceRef must not be initialized"
      }
    ],
    "DNSServiceRegister()": [
      {
        "test": "doesNotThrow",
        "message": "Call with minimal argumentss must succeed."
      },
      {
        "test": "notStrictEqual",
        "message": "File descriptor must not be -1 after initialization"
      },
      {
        "test": "strictEqual",
        "message": "DNSServiceRef must be initialized"
      },
      {
        "test": "throws",
        "message": "Duplicate initialization of DNSServiceRef must throw"
      },
      {
        "test": "doesNotThrow",
        "message": "Call with all arguments on must succed.",
        "error": {
          "errorCode": -65537
        }
      },
      {
        "test": "throws",
        "message": "Call with zero arguments must throw."
      },
      {
        "test": "throws",
        "message": "Call with eight arguments must throw."
      },
      {
        "test": "throws",
        "message": "'flags' must be a number, not a string."
      },
      {
        "test": "throws",
        "message": "'flags' must be a number, not a string."
      },
      {
        "test": "throws",
        "message": "'interfaceIndex' must be a number, not a string."
      },
      {
        "test": "throws",
        "message": "'name' must be a string, not a number."
      },
      {
        "test": "throws",
        "message": "'regtype' must be a string, not null."
      },
      {
        "test": "throws",
        "message": "'regtype' has to be a string, not a number."
      },
      {
        "test": "throws",
        "message": "'domain' must not be a string, not a number."
      },
      {
        "test": "throws",
        "message": "'host' must be a string, not a number."
      },
      {
        "test": "throws",
        "message": "'port' must be a number, not a string."
      },
      {
        "test": "throws",
        "message": "'txtRecord' must be a TXTRecordRef or buffer, not a number."
      },
      {
        "test": "throws",
        "message": "'callback' must be a function, not a string."
      },
      {
        "test": "throws",
        "message": "port number must be <= 65535."
      },
      {
        "test": "throws",
        "message": "port number must >= 0."
      }
    ],
    "DNSServiceProcessResult()": [
      {
        "test": "throws"
      },
      {
        "test": "throws"
      },
      {
        "test": "throws"
      },
      {
        "test": "throws"
      },
      {
        "test": "strictEqual",
        "message": "serviceRef must be identical"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be of type number"
      },
      {
        "test": "strictEqual",
        "message": "'errorCode' must be of type number"
      },
      {
        "test": "strictEqual",
        "message": "'errorCode' must be kDNSServiceErr_NoError"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be of type string"
      },
      {
        "test": "strictEqual",
        "message": "'serviceType' must be of type string"
      },
      {
        "test": "strictEqual",
        "message": "'domain' must be of type string"
      },
      {
        "test": "strictEqual",
        "message": "'context' must be of type string (in this test)"
      },
      {
        "test": "strictEqual",
        "message": "expected 'foobar' but got 'foobar'"
      }
    ],
    "DNSServiceRefSockFD()": [
      {
        "test": "throws",
        "message": "call with uninitialized serviceRef must throw"
      },
      {
        "test": "doesNotThrow",
        "message": "DNSServiceRefSockFD() must not throw"
      },
      {
        "test": "notEqual",
        "message": "file descriptor must not be -1"
      },
      {
        "test": "strictEqual",
        "message": "result of DNSServiceRefSockFD() and fd getter must be the same"
      },
      {
        "test": "throws",
        "message": "argument must be a DNSServiceRef"
      },
      {
        "test": "throws",
        "message": "must throw when called with not enough arguments"
      }
    ],
    "DNSServiceBrowse()": [
      {
        "test": "doesNotThrow",
        "message": "DNSServiceBrowse() must not throw"
      },
      {
        "test": "throws",
        "message": "serviceRef already initialized"
      },
      {
        "test": "throws",
        "message": "not enough arguments"
      },
      {
        "test": "throws",
        "message": "'serviceRef' must not be a string"
      },
      {
        "test": "throws",
        "message": "'flags' must be a number, not a string"
      },
      {
        "test": "throws",
        "message": "'interfaceIndex' must be a number, not a string"
      },
      {
        "test": "throws",
        "message": "'regtype' must be a string, not null"
      },
      {
        "test": "throws",
        "message": "'regtype' must be a string, not a number"
      },
      {
        "test": "throws",
        "message": "'domain' must be a string, not a number"
      },
      {
        "test": "throws",
        "message": "'callback' must be a function, not a number"
      },
      {
        "test": "doesNotThrow",
        "message": "DNSServiceBrowse() must not throw"
      },
      {
        "test": "doesNotThrow",
        "message": "DNSServiceBrowse() must not throw"
      },
      {
        "test": "doesNotThrow",
        "message": "DNSServiceBrowse() must not throw"
      }
    ],
    "DNSServiceRefDeallocate()": [
      {
        "test": "strictEqual",
        "message": "'initialized' must be true after inititalization"
      },
      {
        "test": "strictEqual",
        "message": "'initialized' must be false after deallocation"
      },
      {
        "test": "strictEqual",
        "message": "'fd' must be -1 after deallocation"
      },
      {
        "test": "throws",
        "message": "serviceRef is already deallocated"
      },
      {
        "test": "throws",
        "message": "not enough arguments"
      },
      {
        "test": "throws",
        "message": "argument must be DNSServiceRef, not undefined"
      },
      {
        "test": "throws",
        "message": "to many arguments"
      },
      {
        "test": "throws",
        "message": "call with non serviceRef object must throw"
      }
    ],
    "DNSServiceResolve()": [
      {
        "test": "doesNotThrow",
        "message": "DNSServiceResolve() must not throw"
      },
      {
        "test": "strictEqual",
        "message": "'initialized' must be true after inititalization"
      },
      {
        "test": "throws",
        "message": "duplicate initialization must throw"
      },
      {
        "test": "throws",
        "message": "not enough arguments"
      },
      {
        "test": "throws",
        "message": "serviceRef must be DNSServiceRef object"
      },
      {
        "test": "throws",
        "message": "'flags' must be a number, not a string"
      },
      {
        "test": "throws",
        "message": "'interfaceIndex' must be a number, not null"
      },
      {
        "test": "throws",
        "message": "'name' must be a string, not null"
      },
      {
        "test": "throws",
        "message": "'regtype' must be a string, not null"
      },
      {
        "test": "throws",
        "message": "'domain' must be a string, not null"
      },
      {
        "test": "throws",
        "message": "'callback' must be a function, not null"
      }
    ],
    "DNSServiceEnumerateDomains()": [
      {
        "test": "doesNotThrow",
        "message": "DNSServiceEnumerateDomains() must not throw"
      },
      {
        "test": "notEqual",
        "message": "'fd' must not be -1 after inititalization"
      },
      {
        "test": "strictEqual",
        "message": "'initialized' must be true after inititalization"
      },
      {
        "test": "doesNotThrow",
        "message": "DNSServiceEnumerateDomains() must not throw"
      },
      {
        "test": "doesNotThrow",
        "message": "DNSServiceEnumerateDomains() must not throw"
      },
      {
        "test": "throws",
        "message": "dupliate inititalization of serviceRef must throw"
      },
      {
        "test": "throws",
        "message": "'flags' must be a number, not a string"
      },
      {
        "test": "throws",
        "message": "'flags' must be kDNSServiceFlagsBrowseDomains or kDNSServiceFlagsRegistrationDomains"
      },
      {
        "test": "throws",
        "message": "'interfaceIndex' must be number, not a string"
      },
      {
        "test": "throws",
        "message": "'callback' must be function, not a string"
      },
      {
        "test": "throws",
        "message": "'callback' must be function, not null"
      },
      {
        "test": "throws",
        "message": "not enough arguments"
      },
      {
        "test": "throws",
        "message": "serviceRef must be a DNSServiceRef object"
      }
    ],
    "DNSServiceGetAddrInfo": [],
    "TXTRecordRef": [
      {
        "test": "strictEqual",
        "message": "length must be 8 bytes after adding 'foo=bar'"
      },
      {
        "test": "strictEqual",
        "message": "length must be 22 bytes after adding 'foobar=foobar'"
      },
      {
        "test": "strictEqual",
        "message": "length must be 33 bytes after adding 'buffer=raw'"
      },
      {
        "test": "throws",
        "message": "TXTRecordCreate() must throw when called without arguments"
      },
      {
        "test": "throws",
        "message": "TXTRecordCreate() must throw when called with a string"
      },
      {
        "test": "throws",
        "message": "duplicate call to TXTRecordCreate() must throw"
      },
      {
        "test": "throws",
        "message": "txtRecord must be a TXTRecordRef object"
      },
      {
        "test": "throws",
        "message": "txtRecord must be a TXTRecordRef object"
      },
      {
        "test": "doesNotThrow",
        "message": "TXTRecordCreate() with undefined buffer must succeed"
      },
      {
        "test": "throws",
        "message": "illegal buffer argument must throw"
      },
      {
        "test": "throws",
        "message": "illegal buffer argument must throw"
      },
      {
        "test": "throws",
        "message": "illegal argument must throw"
      },
      {
        "test": "throws",
        "message": "illegal argument must throw"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called without arguments"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called with non TXTRecordRef object"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called with non TXTRecordRef object"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called with non TXTRecordRef object"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called with non string key"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called with strange value"
      },
      {
        "test": "throws",
        "message": "TXTRecordSetValue() must throw when called with strange value"
      },
      {
        "test": "throws",
        "message": "not enough arguments must throw"
      },
      {
        "test": "throws",
        "message": "illegal arguments must throw"
      },
      {
        "test": "throws",
        "message": "illegal arguments must throw"
      },
      {
        "test": "doesNotThrow",
        "message": "deallocating a txtRecord must not throw"
      },
      {
        "test": "throws",
        "message": "TXTRecordDeallocate() must throw when called without arguments"
      },
      {
        "test": "throws",
        "message": "TXTRecordDeallocate() must throw when called with more than one argument"
      },
      {
        "test": "throws",
        "message": "txtRecordBufferToObject() must throw when called with no arguments"
      },
      {
        "test": "throws",
        "message": "txtRecordBufferToObject() must throw when called with a non-object"
      },
      {
        "test": "throws",
        "message": "txtRecordBufferToObject() must throw when called with strange objects"
      }
    ],
    "buildException()": [
      {
        "test": "strictEqual",
        "message": "buildException(kDNSServiceErr_NoError) must return undefined"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_Unknwon) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NoSuchName) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NoMemory) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException() must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_BadReference) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_BadState) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_BadFlags) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_Unsupported) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NotInitialized) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_AlreadyRegistered) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NameConflict) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_Invalid) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_Firewall) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_Incompatible) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_BadInterfaceIndex) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_Refused) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NoSuchRecord) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NoAuth) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NoSuchKey) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_NATTraversal) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_DoubleNAT) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok",
        "message": "buildException(kDNSServiceErr_BadTime) must return an Error object"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "throws",
        "message": "not enough arguments"
      },
      {
        "test": "throws",
        "message": "argument must be a string"
      }
    ],
    "exportConstants()": [
      {
        "test": "ok"
      },
      {
        "test": "throws"
      },
      {
        "test": "throws"
      }
    ]
  },
  "test_functional": {
    "simple browsing": [
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "ok",
        "message": "'flags' must have kDNSServiceFlagsAdd set"
      },
      {
        "test": "strictEqual",
        "message": "'fullname' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'host' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'port' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'port' must match the advertisement"
      },
      {
        "test": "ok",
        "message": "'service' must have a address property"
      },
      {
        "test": "ok",
        "message": "'addresses' must be an array"
      },
      {
        "test": "ok",
        "message": "addresses must not be empty"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be a service type object"
      },
      {
        "test": "strictEqual",
        "message": "type must match the target type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be ServiceType object"
      },
      {
        "test": "strictEqual",
        "message": "'type' must match target type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "'fullname' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'host' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'port' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'port' must match"
      },
      {
        "test": "ok",
        "message": "'service' must have a addresses property"
      },
      {
        "test": "ok",
        "message": "'addresses' must be a string"
      },
      {
        "test": "ok",
        "message": "'addresses' must not be empty"
      },
      {
        "test": "ok",
        "message": "'service' must have a rawTxtRecord property"
      },
      {
        "test": "ok",
        "message": "'rawTxtRecord' must be truthy"
      },
      {
        "test": "ok",
        "message": "'txtRecord' must be truthy"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "strictEqual",
        "message": "property type in txtRecord must match"
      },
      {
        "test": "strictEqual",
        "message": "property chunky in txtRecord must match"
      },
      {
        "test": "strictEqual",
        "message": "property strips in txtRecord must match"
      },
      {
        "test": "strictEqual",
        "message": "property buffer in txtRecord must match"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be a service type object"
      },
      {
        "test": "strictEqual",
        "message": "type must match the target type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be ServiceType object"
      },
      {
        "test": "strictEqual",
        "message": "'type' must match target type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "'fullname' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'host' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'port' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'port' must match"
      },
      {
        "test": "ok",
        "message": "'service' must have a addresses property"
      },
      {
        "test": "ok",
        "message": "'addresses' must be a string"
      },
      {
        "test": "ok",
        "message": "'addresses' must not be empty"
      },
      {
        "test": "ok",
        "message": "'service' must have a rawTxtRecord property"
      },
      {
        "test": "ok",
        "message": "'rawTxtRecord' must be truthy"
      },
      {
        "test": "ok",
        "message": "'txtRecord' must be truthy"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "strictEqual",
        "message": "property type in txtRecord must match"
      },
      {
        "test": "strictEqual",
        "message": "property chunky in txtRecord must match"
      },
      {
        "test": "strictEqual",
        "message": "property strips in txtRecord must match"
      },
      {
        "test": "strictEqual",
        "message": "property buffer in txtRecord must match"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be a service type object"
      },
      {
        "test": "strictEqual",
        "message": "type must match the target type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be a ServiceType object"
      },
      {
        "test": "strictEqual",
        "message": "'type' must match target aervice type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be a service type object"
      },
      {
        "test": "strictEqual",
        "message": "type must match the target type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'interfaceIndex' must be a number"
      },
      {
        "test": "strictEqual",
        "message": "'name' must be a string"
      },
      {
        "test": "ok",
        "message": "'type' must be a ServiceType object"
      },
      {
        "test": "strictEqual",
        "message": "'type' must match target aervice type"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must be a string"
      },
      {
        "test": "strictEqual",
        "message": "'replyDomain' must match 'local.'"
      },
      {
        "test": "strictEqual",
        "message": "must have a networkInterface"
      },
      {
        "test": "ok",
        "message": "must have context"
      },
      {
        "test": "strictEqual",
        "message": "property must match input"
      }
    ],
    "create ads": [
      {
        "test": "ok",
        "message": "service must have a flags property"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "ok",
        "message": "'type' must be a ServiceType object"
      },
      {
        "test": "strictEqual",
        "message": "'type' must be as advertised"
      },
      {
        "test": "ok",
        "message": "service must have a flags property"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be a number"
      },
      {
        "test": "ok",
        "message": "'type' must be a ServiceType object"
      },
      {
        "test": "strictEqual",
        "message": "'type' must be as advertised"
      }
    ],
    "browseThemAll()": [],
    "resolver sequence": [
      {
        "test": "ok",
        "message": "service must not have a 'host' property"
      },
      {
        "test": "ok",
        "message": "service must not have a 'port' property"
      },
      {
        "test": "ok",
        "message": "service must not have a 'fullname' property"
      },
      {
        "test": "ok",
        "message": "service must not have an 'addresses' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'host' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'port' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'fullname' property"
      },
      {
        "test": "ok",
        "message": "service must not have an 'addresses' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'host' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'port' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'fullname' property"
      },
      {
        "test": "ok",
        "message": "service must have an 'addresses' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'host' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'port' property"
      },
      {
        "test": "ok",
        "message": "service must have a 'fullname' property"
      },
      {
        "test": "ok",
        "message": "service must have an 'addresses' property"
      }
    ],
    "local advertisement invisible on external interfaces": []
  },
  "test_network_interface": {
    "if_nametoindex <-> if_indextoname": [
      {
        "test": "ok"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok"
      },
      {
        "test": "strictEqual"
      }
    ],
    "interfaceIndex": [
      {
        "test": "strictEqual"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "strictEqual"
      },
      {
        "test": "ok"
      },
      {
        "test": "ok"
      },
      {
        "test": "strictEqual"
      }
    ]
  },
  "test_odd_ends": {
    "DNSServiceEnumerateDomains": [
      {
        "test": "strictEqual",
        "message": "error must be NoError"
      },
      {
        "test": "strictEqual",
        "message": "'flags' must be of type number"
      },
      {
        "test": "strictEqual",
        "message": "'iface' must be of type number"
      }
    ]
  },
  "test_service_type": {
    "protocol helpers": [
      {
        "test": "strictEqual",
        "message": "comparing simple udp service type"
      },
      {
        "test": "strictEqual",
        "message": "comparing tcp service type with subtype"
      },
      {
        "test": "strictEqual",
        "message": "comparing tcp service types with two subtypes"
      }
    ],
    "makeServiceType()": [
      {
        "test": "strictEqual",
        "message": "construct from string form"
      },
      {
        "test": "strictEqual",
        "message": "construct from tokens"
      },
      {
        "test": "strictEqual",
        "message": "construct from tokens with underscores"
      },
      {
        "test": "strictEqual",
        "message": "construct from array"
      },
      {
        "test": "strictEqual",
        "message": "construct with protocol helper"
      },
      {
        "test": "strictEqual",
        "message": "construct from object (json)"
      }
    ],
    "json round-trip": [
      {
        "test": "strictEqual",
        "message": "construct from result of JSON.parse(JSON.stringify(...))"
      }
    ],
    "ServiceType() constructor": [
      {
        "test": "strictEqual",
        "message": "construct from tokens"
      },
      {
        "test": "strictEqual",
        "message": "construct from array"
      },
      {
        "test": "strictEqual",
        "message": "construct from object"
      }
    ],
    "illegal arguments": [
      {
        "test": "throws",
        "message": "service type to long"
      },
      {
        "test": "throws",
        "message": "illegal characters in primary type"
      },
      {
        "test": "throws",
        "message": "subtype to long"
      },
      {
        "test": "throws",
        "message": "illegal characters in subtype"
      },
      {
        "test": "throws",
        "message": "illegal chars in subtype"
      },
      {
        "test": "throws",
        "message": "type token already present"
      },
      {
        "test": "throws",
        "message": "missing properties"
      },
      {
        "test": "throws",
        "message": "illegal protocol"
      },
      {
        "test": "throws",
        "message": "attempt to construct from number"
      },
      {
        "test": "throws",
        "message": "aatempt to construct with an empty string"
      }
    ]
  }
}