diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index e09b844..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is for unifying the coding style for different editors and IDEs
-# editorconfig.org
-
-root = true
-
-[*]
-end_of_line = lf
-charset = utf-8
-insert_final_newline = true
-trim_trailing_whitespace = true
-indent_style = space
-indent_size = 2
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 7dcba34..0000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "parserOptions": {
-    "ecmaVersion": 6
-  },
-  "rules": {
-    "no-debugger": "error",
-    "no-var": "error",
-    "prefer-arrow-callback": "error",
-    "prefer-const": "error",
-    "prefer-template": "error"
-  },
-  "extends": ["plugin:prettier/recommended"]
-}
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 460a955..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-docker-compose.yml
-Dockerfile
-.nyc_output
-coverage
-package-lock.json
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 89ed1e8..0000000
--- a/.prettierignore
+++ /dev/null
@@ -1 +0,0 @@
-lib/version.js
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index c345257..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,16 +0,0 @@
-FROM node:12
-MAINTAINER awaterman@salesforce.com
-LABEL Description="Vendor=\"Salesforce.com\" Version=\"1.0\""
-RUN apt-get update && \
-apt-get install -y vim && \
-mkdir /home/cookie && \
-groupadd -r cookie && useradd -r -g cookie cookie && \
-usermod -a -G sudo cookie && \
-chown -R cookie:cookie /home/cookie && \
-chmod -R a+w /usr/local/lib/node_modules && \
-chmod -R a+w /usr/local/bin
-WORKDIR /home/cookie
-USER cookie
-RUN npm install -g istanbul
-ENV term=xterm-256color
-
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index d73f92b..0000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Docker Composition for installing, building and developing
-# tough-cookie in the latest Node environment. Please see 
-# our Dockerfile for more details.
-#
-version: '2'
-services:
-  toughcookie:
-    build: .
-    volumes:
-      - .:/home/cookie
-    tty: true
-    stdin_open: true
-    command: "/bin/bash"
diff --git a/lib/cookie.js b/lib/cookie.js
index a042893..73af4c8 100644
--- a/lib/cookie.js
+++ b/lib/cookie.js
@@ -1,5 +1,5 @@
 /*!
- * Copyright (c) 2015, Salesforce.com, Inc.
+ * Copyright (c) 2015-2020, Salesforce.com, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -30,14 +30,15 @@
  */
 "use strict";
 const punycode = require("punycode");
-const urlParse = require("url").parse;
-const util = require("util");
+const urlParse = require("url-parse");
 const pubsuffix = require("./pubsuffix-psl");
 const Store = require("./store").Store;
 const MemoryCookieStore = require("./memstore").MemoryCookieStore;
 const pathMatch = require("./pathMatch").pathMatch;
+const validators = require("./validators.js");
 const VERSION = require("./version");
 const { fromCallback } = require("universalify");
+const { getCustomInspectSymbol } = require("./utilHelper");
 
 // From RFC6265 S4.1.1
 // note that it excludes \x3B ";"
@@ -79,6 +80,7 @@ const SAME_SITE_CONTEXT_VAL_ERR =
   'Invalid sameSiteContext option for getCookies(); expected one of "strict", "lax", or "none"';
 
 function checkSameSiteContext(value) {
+  validators.validate(validators.isNonEmptyString(value), value);
   const context = String(value).toLowerCase();
   if (context === "none" || context === "lax" || context === "strict") {
     return context;
@@ -97,7 +99,23 @@ const PrefixSecurityEnum = Object.freeze({
 // * all capturing groups converted to non-capturing -- "(?:)"
 // * support for IPv6 Scoped Literal ("%eth1") removed
 // * lowercase hexadecimal only
-var IP_REGEX_LOWERCASE =/(?:^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$)|(?:^(?:(?:[a-f\d]{1,4}:){7}(?:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,2}|:)|(?:[a-f\d]{1,4}:){4}(?:(?::[a-f\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,3}|:)|(?:[a-f\d]{1,4}:){3}(?:(?::[a-f\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,4}|:)|(?:[a-f\d]{1,4}:){2}(?:(?::[a-f\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,5}|:)|(?:[a-f\d]{1,4}:){1}(?:(?::[a-f\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,6}|:)|(?::(?:(?::[a-f\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,7}|:)))$)/;
+const IP_REGEX_LOWERCASE = /(?:^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$)|(?:^(?:(?:[a-f\d]{1,4}:){7}(?:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,2}|:)|(?:[a-f\d]{1,4}:){4}(?:(?::[a-f\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,3}|:)|(?:[a-f\d]{1,4}:){3}(?:(?::[a-f\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,4}|:)|(?:[a-f\d]{1,4}:){2}(?:(?::[a-f\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,5}|:)|(?:[a-f\d]{1,4}:){1}(?:(?::[a-f\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,6}|:)|(?::(?:(?::[a-f\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,7}|:)))$)/;
+const IP_V6_REGEX = `
+\\[?(?:
+(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|
+(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|
+(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|
+(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|
+(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|
+(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|
+(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|
+(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:))
+)(?:%[0-9a-zA-Z]{1,})?\\]?
+`
+  .replace(/\s*\/\/.*$/gm, "")
+  .replace(/\n/g, "")
+  .trim();
+const IP_V6_REGEX_OBJECT = new RegExp(`^${IP_V6_REGEX}$`);
 
 /*
  * Parses a Natural number (i.e., non-negative integer) with either the
@@ -301,6 +319,7 @@ function parseDate(str) {
 }
 
 function formatDate(date) {
+  validators.validate(validators.isDate(date), date);
   return date.toUTCString();
 }
 
@@ -311,6 +330,10 @@ function canonicalDomain(str) {
   }
   str = str.trim().replace(/^\./, ""); // S4.1.2.3 & S5.2.3: ignore leading .
 
+  if (IP_V6_REGEX_OBJECT.test(str)) {
+    str = str.replace("[", "").replace("]", "");
+  }
+
   // convert to IDN if any non-ASCII characters
   if (punycode && /[^\u0001-\u007f]/.test(str)) {
     str = punycode.toASCII(str);
@@ -359,7 +382,7 @@ function domainMatch(str, domStr, canonicalize) {
 
   /* "  * The last character of the string that is not included in the
    * domain string is a %x2E (".") character." */
-  if (str.substr(idx-1,1) !== '.') {
+  if (str.substr(idx - 1, 1) !== ".") {
     return false; // doesn't align on "."
   }
 
@@ -403,6 +426,7 @@ function defaultPath(path) {
 }
 
 function trimTerminator(str) {
+  if (validators.isEmptyString(str)) return str;
   for (let t = 0; t < TERMINATORS.length; t++) {
     const terminatorIdx = str.indexOf(TERMINATORS[t]);
     if (terminatorIdx !== -1) {
@@ -415,6 +439,7 @@ function trimTerminator(str) {
 
 function parseCookiePair(cookiePair, looseMode) {
   cookiePair = trimTerminator(cookiePair);
+  validators.validate(validators.isString(cookiePair), cookiePair);
 
   let firstEq = cookiePair.indexOf("=");
   if (looseMode) {
@@ -454,6 +479,11 @@ function parse(str, options) {
   if (!options || typeof options !== "object") {
     options = {};
   }
+
+  if (validators.isEmptyString(str) || !validators.isString(str)) {
+    return null;
+  }
+
   str = str.trim();
 
   // We use a regex to parse the "name-value-pair" part of S5.2
@@ -616,6 +646,7 @@ function parse(str, options) {
  * @returns boolean
  */
 function isSecurePrefixConditionMet(cookie) {
+  validators.validate(validators.isObject(cookie), cookie);
   return !cookie.key.startsWith("__Secure-") || cookie.secure;
 }
 
@@ -631,6 +662,7 @@ function isSecurePrefixConditionMet(cookie) {
  * @returns boolean
  */
 function isHostPrefixConditionMet(cookie) {
+  validators.validate(validators.isObject(cookie));
   return (
     !cookie.key.startsWith("__Host-") ||
     (cookie.secure &&
@@ -652,7 +684,7 @@ function jsonParse(str) {
 }
 
 function fromJSON(str) {
-  if (!str) {
+  if (!str || validators.isEmptyString(str)) {
     return null;
   }
 
@@ -698,6 +730,8 @@ function fromJSON(str) {
  */
 
 function cookieCompare(a, b) {
+  validators.validate(validators.isObject(a), a);
+  validators.validate(validators.isObject(b), b);
   let cmp = 0;
 
   // descending for length: b CMP a
@@ -725,6 +759,7 @@ function cookieCompare(a, b) {
 // Gives the permutation of all possible pathMatch()es of a given path. The
 // array is in longest-to-shortest order.  Handy for indexing.
 function permutePath(path) {
+  validators.validate(validators.isString(path));
   if (path === "/") {
     return ["/"];
   }
@@ -777,8 +812,9 @@ const cookieDefaults = {
 
 class Cookie {
   constructor(options = {}) {
-    if (util.inspect.custom) {
-      this[util.inspect.custom] = this.inspect;
+    const customInspectSymbol = getCustomInspectSymbol();
+    if (customInspectSymbol) {
+      this[customInspectSymbol] = this.inspect;
     }
 
     Object.assign(this, cookieDefaults, options);
@@ -1060,6 +1096,7 @@ class CookieJar {
     if (typeof options === "boolean") {
       options = { rejectPublicSuffixes: options };
     }
+    validators.validate(validators.isObject(options), options);
     this.rejectPublicSuffixes = options.rejectPublicSuffixes;
     this.enableLooseMode = !!options.looseMode;
     this.allowSpecialUseDomain = !!options.allowSpecialUseDomain;
@@ -1076,13 +1113,31 @@ class CookieJar {
   }
 
   setCookie(cookie, url, options, cb) {
+    validators.validate(validators.isNonEmptyString(url), cb, options);
     let err;
+
+    if (validators.isFunction(url)) {
+      cb = url;
+      return cb(new Error("No URL was specified"));
+    }
+
     const context = getCookieContext(url);
-    if (typeof options === "function") {
+    if (validators.isFunction(options)) {
       cb = options;
       options = {};
     }
 
+    validators.validate(validators.isFunction(cb), cb);
+
+    if (
+      !validators.isNonEmptyString(cookie) &&
+      !validators.isObject(cookie) &&
+      cookie instanceof String &&
+      cookie.length == 0
+    ) {
+      return cb(null);
+    }
+
     const host = canonicalDomain(context.hostname);
     const loose = options.loose || this.enableLooseMode;
 
@@ -1119,8 +1174,11 @@ class CookieJar {
 
     // S5.3 step 5: public suffixes
     if (this.rejectPublicSuffixes && cookie.domain) {
-      const suffix = pubsuffix.getPublicSuffix(cookie.cdomain());
-      if (suffix == null) {
+      const suffix = pubsuffix.getPublicSuffix(cookie.cdomain(), {
+        allowSpecialUseDomain: this.allowSpecialUseDomain,
+        ignoreError: options.ignoreError
+      });
+      if (suffix == null && !IP_V6_REGEX_OBJECT.test(cookie.domain)) {
         // e.g. "com"
         err = new Error("Cookie has domain set to a public suffix");
         return cb(options.ignoreError ? null : err);
@@ -1249,11 +1307,14 @@ class CookieJar {
 
   // RFC6365 S5.4
   getCookies(url, options, cb) {
+    validators.validate(validators.isNonEmptyString(url), cb, url);
     const context = getCookieContext(url);
-    if (typeof options === "function") {
+    if (validators.isFunction(options)) {
       cb = options;
       options = {};
     }
+    validators.validate(validators.isObject(options), cb, options);
+    validators.validate(validators.isFunction(cb), cb);
 
     const host = canonicalDomain(context.hostname);
     const path = context.pathname || "/";
@@ -1369,6 +1430,7 @@ class CookieJar {
 
   getCookieString(...args) {
     const cb = args.pop();
+    validators.validate(validators.isFunction(cb), cb);
     const next = function(err, cookies) {
       if (err) {
         cb(err);
@@ -1388,6 +1450,7 @@ class CookieJar {
 
   getSetCookieStrings(...args) {
     const cb = args.pop();
+    validators.validate(validators.isFunction(cb), cb);
     const next = function(err, cookies) {
       if (err) {
         cb(err);
@@ -1405,8 +1468,9 @@ class CookieJar {
   }
 
   serialize(cb) {
+    validators.validate(validators.isFunction(cb), cb);
     let type = this.store.constructor.name;
-    if (type === "Object") {
+    if (validators.isObject(type)) {
       type = null;
     }
 
@@ -1422,6 +1486,9 @@ class CookieJar {
 
       // CookieJar configuration:
       rejectPublicSuffixes: !!this.rejectPublicSuffixes,
+      enableLooseMode: !!this.enableLooseMode,
+      allowSpecialUseDomain: !!this.allowSpecialUseDomain,
+      prefixSecurity: getNormalizedPrefixSecurity(this.prefixSecurity),
 
       // this gets filled from getAllCookies:
       cookies: []
@@ -1524,6 +1591,7 @@ class CookieJar {
   }
 
   removeAllCookies(cb) {
+    validators.validate(validators.isFunction(cb), cb);
     const store = this.store;
 
     // Check that the store implements its own removeAllCookies(). The default
@@ -1577,6 +1645,7 @@ class CookieJar {
       cb = store;
       store = null;
     }
+    validators.validate(validators.isFunction(cb), cb);
 
     let serialized;
     if (typeof strOrObj === "string") {
@@ -1588,7 +1657,12 @@ class CookieJar {
       serialized = strOrObj;
     }
 
-    const jar = new CookieJar(store, serialized.rejectPublicSuffixes);
+    const jar = new CookieJar(store, {
+      rejectPublicSuffixes: serialized.rejectPublicSuffixes,
+      looseMode: serialized.enableLooseMode,
+      allowSpecialUseDomain: serialized.allowSpecialUseDomain,
+      prefixSecurity: serialized.prefixSecurity
+    });
     jar._importCookies(serialized, err => {
       if (err) {
         return cb(err);
@@ -1600,7 +1674,10 @@ class CookieJar {
   static deserializeSync(strOrObj, store) {
     const serialized =
       typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj;
-    const jar = new CookieJar(store, serialized.rejectPublicSuffixes);
+    const jar = new CookieJar(store, {
+      rejectPublicSuffixes: serialized.rejectPublicSuffixes,
+      looseMode: serialized.enableLooseMode
+    });
 
     // catch this mistake early:
     if (!jar.store.synchronous) {
@@ -1669,3 +1746,4 @@ exports.permuteDomain = require("./permuteDomain").permuteDomain;
 exports.permutePath = permutePath;
 exports.canonicalDomain = canonicalDomain;
 exports.PrefixSecurityEnum = PrefixSecurityEnum;
+exports.ParameterError = validators.ParameterError;
diff --git a/lib/memstore.js b/lib/memstore.js
index 912eead..7c9ea0f 100644
--- a/lib/memstore.js
+++ b/lib/memstore.js
@@ -33,19 +33,21 @@ const { fromCallback } = require("universalify");
 const Store = require("./store").Store;
 const permuteDomain = require("./permuteDomain").permuteDomain;
 const pathMatch = require("./pathMatch").pathMatch;
-const util = require("util");
+const { getCustomInspectSymbol, getUtilInspect } = require("./utilHelper");
 
 class MemoryCookieStore extends Store {
   constructor() {
     super();
     this.synchronous = true;
     this.idx = {};
-    if (util.inspect.custom) {
-      this[util.inspect.custom] = this.inspect;
+    const customInspectSymbol = getCustomInspectSymbol();
+    if (customInspectSymbol) {
+      this[customInspectSymbol] = this.inspect;
     }
   }
 
   inspect() {
+    const util = { inspect: getUtilInspect(inspectFallback) };
     return `{ idx: ${util.inspect(this.idx, false, 2)} }`;
   }
 
@@ -184,7 +186,57 @@ class MemoryCookieStore extends Store {
   "removeAllCookies",
   "getAllCookies"
 ].forEach(name => {
-  MemoryCookieStore[name] = fromCallback(MemoryCookieStore.prototype[name]);
+  MemoryCookieStore.prototype[name] = fromCallback(
+    MemoryCookieStore.prototype[name]
+  );
 });
 
 exports.MemoryCookieStore = MemoryCookieStore;
+
+function inspectFallback(val) {
+  const domains = Object.keys(val);
+  if (domains.length === 0) {
+    return "{}";
+  }
+  let result = "{\n";
+  Object.keys(val).forEach((domain, i) => {
+    result += formatDomain(domain, val[domain]);
+    if (i < domains.length - 1) {
+      result += ",";
+    }
+    result += "\n";
+  });
+  result += "}";
+  return result;
+}
+
+function formatDomain(domainName, domainValue) {
+  const indent = "  ";
+  let result = `${indent}'${domainName}': {\n`;
+  Object.keys(domainValue).forEach((path, i, paths) => {
+    result += formatPath(path, domainValue[path]);
+    if (i < paths.length - 1) {
+      result += ",";
+    }
+    result += "\n";
+  });
+  result += `${indent}}`;
+  return result;
+}
+
+function formatPath(pathName, pathValue) {
+  const indent = "    ";
+  let result = `${indent}'${pathName}': {\n`;
+  Object.keys(pathValue).forEach((cookieName, i, cookieNames) => {
+    const cookie = pathValue[cookieName];
+    result += `      ${cookieName}: ${cookie.inspect()}`;
+    if (i < cookieNames.length - 1) {
+      result += ",";
+    }
+    result += "\n";
+  });
+  result += `${indent}}`;
+  return result;
+}
+
+exports.inspectFallback = inspectFallback;
diff --git a/lib/permuteDomain.js b/lib/permuteDomain.js
index 78e6cad..7553124 100644
--- a/lib/permuteDomain.js
+++ b/lib/permuteDomain.js
@@ -33,21 +33,11 @@ const pubsuffix = require("./pubsuffix-psl");
 
 // Gives the permutation of all possible domainMatch()es of a given domain. The
 // array is in shortest-to-longest order.  Handy for indexing.
-const SPECIAL_USE_DOMAINS = ["local"]; // RFC 6761
+
 function permuteDomain(domain, allowSpecialUseDomain) {
-  let pubSuf = null;
-  if (allowSpecialUseDomain) {
-    const domainParts = domain.split(".");
-    if (SPECIAL_USE_DOMAINS.includes(domainParts[domainParts.length - 1])) {
-      pubSuf = `${domainParts[domainParts.length - 2]}.${
-        domainParts[domainParts.length - 1]
-      }`;
-    } else {
-      pubSuf = pubsuffix.getPublicSuffix(domain);
-    }
-  } else {
-    pubSuf = pubsuffix.getPublicSuffix(domain);
-  }
+  const pubSuf = pubsuffix.getPublicSuffix(domain, {
+    allowSpecialUseDomain: allowSpecialUseDomain
+  });
 
   if (!pubSuf) {
     return null;
@@ -56,6 +46,11 @@ function permuteDomain(domain, allowSpecialUseDomain) {
     return [domain];
   }
 
+  // Nuke trailing dot
+  if (domain.slice(-1) == ".") {
+    domain = domain.slice(0, -1);
+  }
+
   const prefix = domain.slice(0, -(pubSuf.length + 1)); // ".example.com"
   const parts = prefix.split(".").reverse();
   let cur = pubSuf;
diff --git a/lib/pubsuffix-psl.js b/lib/pubsuffix-psl.js
index 93a8577..d555552 100644
--- a/lib/pubsuffix-psl.js
+++ b/lib/pubsuffix-psl.js
@@ -31,7 +31,39 @@
 "use strict";
 const psl = require("psl");
 
-function getPublicSuffix(domain) {
+// RFC 6761
+const SPECIAL_USE_DOMAINS = [
+  "local",
+  "example",
+  "invalid",
+  "localhost",
+  "test"
+];
+
+function getPublicSuffix(domain, options = {}) {
+  const domainParts = domain.split(".");
+  const topLevelDomain = domainParts[domainParts.length - 1];
+  const allowSpecialUseDomain = !!options.allowSpecialUseDomain;
+  const ignoreError = !!options.ignoreError;
+
+  if (
+    allowSpecialUseDomain &&
+    domainParts.length > 1 &&
+    SPECIAL_USE_DOMAINS.includes(topLevelDomain)
+  ) {
+    // If the right-most label in the name is a special-use domain (e.g. bananas.apple.localhost),
+    // then don't use PSL. This is because most special-use domains are not listed on PSL.
+    const secondLevelDomain = domainParts[domainParts.length - 2];
+    // In aforementioned example, the eTLD/pubSuf will be apple.localhost
+    return `${secondLevelDomain}.${topLevelDomain}`;
+  }
+
+  if (!ignoreError && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) {
+    throw new Error(
+      `Cookie has domain set to the public suffix "${topLevelDomain}" which is a special use domain. To allow this, configure your CookieJar with {allowSpecialUseDomain:true, rejectPublicSuffixes: false}.`
+    );
+  }
+
   return psl.get(domain);
 }
 
diff --git a/lib/utilHelper.js b/lib/utilHelper.js
new file mode 100644
index 0000000..feac125
--- /dev/null
+++ b/lib/utilHelper.js
@@ -0,0 +1,39 @@
+function requireUtil() {
+  try {
+    // eslint-disable-next-line no-restricted-modules
+    return require("util");
+  } catch (e) {
+    return null;
+  }
+}
+
+// for v10.12.0+
+function lookupCustomInspectSymbol() {
+  return Symbol.for("nodejs.util.inspect.custom");
+}
+
+// for older node environments
+function tryReadingCustomSymbolFromUtilInspect(options) {
+  const _requireUtil = options.requireUtil || requireUtil;
+  const util = _requireUtil();
+  return util ? util.inspect.custom : null;
+}
+
+exports.getUtilInspect = function getUtilInspect(fallback, options = {}) {
+  const _requireUtil = options.requireUtil || requireUtil;
+  const util = _requireUtil();
+  return function inspect(value, showHidden, depth) {
+    return util ? util.inspect(value, showHidden, depth) : fallback(value);
+  };
+};
+
+exports.getCustomInspectSymbol = function getCustomInspectSymbol(options = {}) {
+  const _lookupCustomInspectSymbol =
+    options.lookupCustomInspectSymbol || lookupCustomInspectSymbol;
+
+  // get custom inspect symbol for node environments
+  return (
+    _lookupCustomInspectSymbol() ||
+    tryReadingCustomSymbolFromUtilInspect(options)
+  );
+};
diff --git a/lib/validators.js b/lib/validators.js
new file mode 100644
index 0000000..8558164
--- /dev/null
+++ b/lib/validators.js
@@ -0,0 +1,95 @@
+/* ************************************************************************************
+Extracted from check-types.js
+https://gitlab.com/philbooth/check-types.js
+
+MIT License
+
+Copyright (c) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Phil Booth
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+************************************************************************************ */
+"use strict";
+
+/* Validation functions copied from check-types package - https://www.npmjs.com/package/check-types */
+function isFunction(data) {
+  return typeof data === "function";
+}
+
+function isNonEmptyString(data) {
+  return isString(data) && data !== "";
+}
+
+function isDate(data) {
+  return isInstanceStrict(data, Date) && isInteger(data.getTime());
+}
+
+function isEmptyString(data) {
+  return data === "" || (data instanceof String && data.toString() === "");
+}
+
+function isString(data) {
+  return typeof data === "string" || data instanceof String;
+}
+
+function isObject(data) {
+  return toString.call(data) === "[object Object]";
+}
+function isInstanceStrict(data, prototype) {
+  try {
+    return data instanceof prototype;
+  } catch (error) {
+    return false;
+  }
+}
+
+function isInteger(data) {
+  return typeof data === "number" && data % 1 === 0;
+}
+/* End validation functions */
+
+function validate(bool, cb, options) {
+  if (!isFunction(cb)) {
+    options = cb;
+    cb = null;
+  }
+  if (!isObject(options)) options = { Error: "Failed Check" };
+  if (!bool) {
+    if (cb) {
+      cb(new ParameterError(options));
+    } else {
+      throw new ParameterError(options);
+    }
+  }
+}
+
+class ParameterError extends Error {
+  constructor(...params) {
+    super(...params);
+  }
+}
+
+exports.ParameterError = ParameterError;
+exports.isFunction = isFunction;
+exports.isNonEmptyString = isNonEmptyString;
+exports.isDate = isDate;
+exports.isEmptyString = isEmptyString;
+exports.isString = isString;
+exports.isObject = isObject;
+exports.validate = validate;
diff --git a/package.json b/package.json
index e07dcb7..4d4f70f 100644
--- a/package.json
+++ b/package.json
@@ -82,7 +82,7 @@
   ],
   "scripts": {
     "version": "genversion lib/version.js && git add lib/version.js",
-    "test": "vows test/*_test.js",
+    "test": "vows test/*_test.js && npm run eslint",
     "cover": "nyc --reporter=lcov --reporter=html vows test/*_test.js",
     "eslint": "eslint --env node --ext .js .",
     "prettier": "prettier '**/*.{json,ts,yaml,md}'",
@@ -104,6 +104,7 @@
   "dependencies": {
     "psl": "^1.1.33",
     "punycode": "^2.1.1",
-    "universalify": "^0.1.2"
+    "universalify": "^0.2.0",
+    "url-parse": "^1.5.3"
   }
 }
diff --git a/test/api_test.js b/test/api_test.js
deleted file mode 100644
index 461f429..0000000
--- a/test/api_test.js
+++ /dev/null
@@ -1,582 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const async = require("async");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-
-const atNow = Date.now();
-
-function at(offset) {
-  return { now: new Date(atNow + offset) };
-}
-
-vows
-  .describe("API")
-  .addBatch({
-    "All defined": function() {
-      assert.ok(Cookie);
-      assert.ok(CookieJar);
-    }
-  })
-  .addBatch({
-    Version: function() {
-      assert.equal(tough.version, require("../package.json").version);
-    }
-  })
-  .addBatch({
-    Constructor: {
-      topic: function() {
-        return new Cookie({
-          key: "test",
-          value: "b",
-          maxAge: 60
-        });
-      },
-      "check for key property": function(c) {
-        assert.ok(c);
-        assert.equal(c.key, "test");
-      },
-      "check for value property": function(c) {
-        assert.equal(c.value, "b");
-      },
-      "check for maxAge": function(c) {
-        assert.equal(c.maxAge, 60);
-      },
-      "check for default values for unspecified properties": function(c) {
-        assert.equal(c.expires, "Infinity");
-        assert.equal(c.secure, false);
-        assert.equal(c.httpOnly, false);
-      }
-    }
-  })
-  .addBatch({
-    "CookieJar Promises": {
-      topic: () => new CookieJar(),
-      setCookie: {
-        topic(jar) {
-          jar
-            .setCookie("foo=bar", "http://example.com")
-            .then(c => this.callback(null, c), this.callback);
-        },
-        "resolves to a Cookie"(cookie) {
-          assert.ok(cookie instanceof Cookie);
-          assert.strictEqual(cookie.key, "foo");
-          assert.strictEqual(cookie.value, "bar");
-        }
-      },
-      getCookies: {
-        topic(jar) {
-          jar
-            .getCookies("http://example.com")
-            .then(cookies => this.callback(null, cookies), this.callback);
-        },
-        "resolves to an array of cookies"(cookies) {
-          assert.ok(Array.isArray(cookies), "not an array");
-          assert.ok(cookies.length > 0, "array is empty");
-          for (const cookie of cookies) {
-            assert.ok(cookie instanceof Cookie, "not instanceof Cookie");
-          }
-        }
-      },
-      getCookieString: {
-        topic(jar) {
-          jar
-            .getCookieString("http://example.com")
-            .then(cookies => this.callback(null, cookies), this.callback);
-        },
-        "resolves to a string"(cookies) {
-          assert.ok(typeof cookies === "string", "not a string");
-        }
-      },
-      getSetCookieStrings: {
-        topic(jar) {
-          jar
-            .getSetCookieStrings("http://example.com")
-            .then(cookies => this.callback(null, cookies), this.callback);
-        },
-        "resolves to a an array of strings"(cookies) {
-          assert.ok(Array.isArray(cookies), "not an array");
-          assert.ok(cookies.length > 0, "array is empty");
-          for (const cookie of cookies) {
-            assert.ok(typeof cookie === "string", "not a string");
-          }
-        }
-      },
-      removeAllCookies: {
-        topic(jar) {
-          jar.removeAllCookies().then(this.callback, this.callback);
-        },
-        "resolves to undefined"(arg) {
-          assert.ok(arg === undefined, "was not undefined");
-        }
-      },
-      serialize: {
-        topic(jar) {
-          jar
-            .serialize()
-            .then(data => this.callback(null, data), this.callback);
-        },
-        "resolves to an object"(data) {
-          assert.ok(data instanceof Object, "not an object");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "expiry option": {
-      topic: function() {
-        const cb = this.callback;
-        const cj = new CookieJar();
-        cj.setCookie(
-          "near=expiry; Domain=example.com; Path=/; Max-Age=1",
-          "http://www.example.com",
-          at(-1),
-          (err, cookie) => {
-            cb(err, { cj: cj, cookie: cookie });
-          }
-        );
-      },
-      "set the cookie": function(t) {
-        assert.ok(t.cookie, "didn't set?!");
-        assert.equal(t.cookie.key, "near");
-      },
-      "then, retrieving": {
-        topic: function(t) {
-          const cb = this.callback;
-          setTimeout(() => {
-            t.cj.getCookies(
-              "http://www.example.com",
-              { http: true, expire: false },
-              (err, cookies) => {
-                t.cookies = cookies;
-                cb(err, t);
-              }
-            );
-          }, 2000);
-        },
-        "got the cookie": function(t) {
-          assert.lengthOf(t.cookies, 1);
-          assert.equal(t.cookies[0].key, "near");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "allPaths option": {
-      topic: function() {
-        const cj = new CookieJar();
-        const apex = "http://example.com";
-        const www = "http://www.example.com";
-        const other = "http://other.example.com";
-        const tasks = [
-          ["nopath_dom=qq; Path=/; Domain=example.com", apex, {}],
-          ["path_dom=qq; Path=/foo; Domain=example.com", apex, {}],
-          ["nopath_host=qq; Path=/", www, {}],
-          ["path_host=qq; Path=/foo", www, {}],
-          ["other=qq; Path=/", other, {}],
-          ["other2=qq; Path=/foo", `${other}/foo`, {}]
-        ].map(args => cb => cj.setCookie(...args, cb));
-        const cb = this.callback;
-        async.parallel(tasks, (err, results) => {
-          cb(err, { cj: cj, cookies: results });
-        });
-      },
-      "all set": function(t) {
-        assert.equal(t.cookies.length, 6);
-        assert.ok(
-          t.cookies.every(c => {
-            return !!c;
-          })
-        );
-      },
-      "getting without allPaths": {
-        topic: function(t) {
-          const cb = this.callback;
-          const cj = t.cj;
-          cj.getCookies("http://www.example.com/", {}, (err, cookies) => {
-            cb(err, { cj: cj, cookies: cookies });
-          });
-        },
-        "found just two cookies": function(t) {
-          assert.equal(t.cookies.length, 2);
-        },
-        "all are path=/": function(t) {
-          assert.ok(
-            t.cookies.every(c => {
-              return c.path === "/";
-            })
-          );
-        },
-        "no 'other' cookies": function(t) {
-          assert.ok(
-            !t.cookies.some(c => {
-              return /^other/.test(c.name);
-            })
-          );
-        }
-      },
-      "getting without allPaths for /foo": {
-        topic: function(t) {
-          const cb = this.callback;
-          const cj = t.cj;
-          cj.getCookies("http://www.example.com/foo", {}, (err, cookies) => {
-            cb(err, { cj: cj, cookies: cookies });
-          });
-        },
-        "found four cookies": function(t) {
-          assert.equal(t.cookies.length, 4);
-        },
-        "no 'other' cookies": function(t) {
-          assert.ok(
-            !t.cookies.some(c => {
-              return /^other/.test(c.name);
-            })
-          );
-        }
-      },
-      "getting with allPaths:true": {
-        topic: function(t) {
-          const cb = this.callback;
-          const cj = t.cj;
-          cj.getCookies(
-            "http://www.example.com/",
-            { allPaths: true },
-            (err, cookies) => {
-              cb(err, { cj: cj, cookies: cookies });
-            }
-          );
-        },
-        "found four cookies": function(t) {
-          assert.equal(t.cookies.length, 4);
-        },
-        "no 'other' cookies": function(t) {
-          assert.ok(
-            !t.cookies.some(c => {
-              return /^other/.test(c.name);
-            })
-          );
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Remove cookies": {
-      topic: function() {
-        const jar = new CookieJar();
-        const cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
-        const cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
-        const cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
-        async.parallel(
-          [
-            [cookie, "http://example.com/index.html"],
-            [cookie2, "http://foo.com/index.html"],
-            [cookie3, "http://foo.com/index.html"]
-          ].map(args => cb => jar.setCookie(...args, cb)),
-          err => {
-            this.callback(err, jar);
-          }
-        );
-      },
-      "all from matching domain": function(jar) {
-        jar.store.removeCookies("example.com", null, err => {
-          assert(err == null);
-
-          jar.store.findCookies("example.com", null, (err, cookies) => {
-            assert(err == null);
-            assert(cookies != null);
-            assert(cookies.length === 0, "cookie was not removed");
-          });
-
-          jar.store.findCookies("foo.com", null, (err, cookies) => {
-            assert(err == null);
-            assert(cookies != null);
-            assert(
-              cookies.length === 2,
-              "cookies should not have been removed"
-            );
-          });
-        });
-      },
-      "from cookie store matching domain and key": function(jar) {
-        jar.store.removeCookie("foo.com", "/", "foo", err => {
-          assert(err == null);
-
-          jar.store.findCookies("foo.com", null, (err, cookies) => {
-            assert(err == null);
-            assert(cookies != null);
-            assert(cookies.length === 1, "cookie was not removed correctly");
-            assert(cookies[0].key === "a", "wrong cookie was removed");
-          });
-        });
-      }
-    }
-  })
-  .addBatch({
-    "Synchronous CookieJar": {
-      setCookieSync: {
-        topic: function() {
-          const jar = new CookieJar();
-          let cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
-          cookie = jar.setCookieSync(cookie, "http://example.com/index.html");
-          return cookie;
-        },
-        "returns a copy of the cookie": function(cookie) {
-          assert.instanceOf(cookie, Cookie);
-        }
-      },
-
-      getCookiesSync: {
-        topic: function() {
-          const jar = new CookieJar();
-          const url = "http://example.com/index.html";
-          jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
-          jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
-          return jar.getCookiesSync(url);
-        },
-        "returns the cookie array": function(err, cookies) {
-          assert.ok(!err);
-          assert.ok(Array.isArray(cookies));
-          assert.lengthOf(cookies, 2);
-          cookies.forEach(cookie => {
-            assert.instanceOf(cookie, Cookie);
-          });
-        }
-      },
-
-      getCookieStringSync: {
-        topic: function() {
-          const jar = new CookieJar();
-          const url = "http://example.com/index.html";
-          jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
-          jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
-          return jar.getCookieStringSync(url);
-        },
-        "returns the cookie header string": function(err, str) {
-          assert.ok(!err);
-          assert.typeOf(str, "string");
-        }
-      },
-
-      getSetCookieStringsSync: {
-        topic: function() {
-          const jar = new CookieJar();
-          const url = "http://example.com/index.html";
-          jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
-          jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
-          return jar.getSetCookieStringsSync(url);
-        },
-        "returns the cookie header string": function(err, headers) {
-          assert.ok(!err);
-          assert.ok(Array.isArray(headers));
-          assert.lengthOf(headers, 2);
-          headers.forEach(header => {
-            assert.typeOf(header, "string");
-          });
-        }
-      },
-
-      removeAllCookiesSync: {
-        topic: function() {
-          const jar = new CookieJar();
-          const cookie1 = Cookie.parse("a=b; Domain=example.com; Path=/");
-          const cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
-          const cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
-          jar.setCookieSync(cookie1, "http://example.com/index.html");
-          jar.setCookieSync(cookie2, "http://foo.com/index.html");
-          jar.setCookieSync(cookie3, "http://foo.com/index.html");
-
-          jar.removeAllCookiesSync();
-
-          jar.store.getAllCookies(this.callback);
-        },
-        "no cookies in the jar": function(err, cookies) {
-          assert(err == null);
-          assert(cookies != null);
-          assert(cookies.length === 0, "cookies were not removed");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Synchronous API on async CookieJar": {
-      topic: function() {
-        return new tough.Store();
-      },
-      setCookieSync: {
-        topic: function(store) {
-          const jar = new CookieJar(store);
-          try {
-            jar.setCookieSync("a=b", "http://example.com/index.html");
-            return false;
-          } catch (e) {
-            return e;
-          }
-        },
-        fails: function(err) {
-          assert.instanceOf(err, Error);
-          assert.equal(
-            err.message,
-            "CookieJar store is not synchronous; use async API instead."
-          );
-        }
-      },
-      getCookiesSync: {
-        topic: function(store) {
-          const jar = new CookieJar(store);
-          try {
-            jar.getCookiesSync("http://example.com/index.html");
-            return false;
-          } catch (e) {
-            return e;
-          }
-        },
-        fails: function(err) {
-          assert.instanceOf(err, Error);
-          assert.equal(
-            err.message,
-            "CookieJar store is not synchronous; use async API instead."
-          );
-        }
-      },
-      getCookieStringSync: {
-        topic: function(store) {
-          const jar = new CookieJar(store);
-          try {
-            jar.getCookieStringSync("http://example.com/index.html");
-            return false;
-          } catch (e) {
-            return e;
-          }
-        },
-        fails: function(err) {
-          assert.instanceOf(err, Error);
-          assert.equal(
-            err.message,
-            "CookieJar store is not synchronous; use async API instead."
-          );
-        }
-      },
-      getSetCookieStringsSync: {
-        topic: function(store) {
-          const jar = new CookieJar(store);
-          try {
-            jar.getSetCookieStringsSync("http://example.com/index.html");
-            return false;
-          } catch (e) {
-            return e;
-          }
-        },
-        fails: function(err) {
-          assert.instanceOf(err, Error);
-          assert.equal(
-            err.message,
-            "CookieJar store is not synchronous; use async API instead."
-          );
-        }
-      },
-      removeAllCookies: {
-        topic: function(store) {
-          const jar = new CookieJar(store);
-          try {
-            jar.removeAllCookiesSync();
-            return false;
-          } catch (e) {
-            return e;
-          }
-        },
-        fails: function(err) {
-          assert.instanceOf(err, Error);
-          assert.equal(
-            err.message,
-            "CookieJar store is not synchronous; use async API instead."
-          );
-        }
-      }
-    }
-  })
-  .addBatch({
-    "loose option": {
-      "cookie jar with loose": {
-        topic: function() {
-          const jar = new CookieJar();
-          const url = "http://example.com/index.html";
-          return jar.setCookieSync("=b", url, { loose: true });
-        },
-        succeeds: function(err, c) {
-          assert.equal(err, null);
-          assert(c);
-          assert.equal(c.value, "b");
-        }
-      },
-      "cookie jar without loose": {
-        topic: function() {
-          const jar = new CookieJar();
-          const url = "http://example.com/index.html";
-          return jar.setCookieSync("=b", url);
-        },
-        fails: function(err, c) {
-          assert.instanceOf(err, Error);
-          assert.equal(err.message, "Cookie failed to parse");
-        }
-      },
-      "map doesn't default to loose": {
-        topic: function() {
-          const some = [
-            "=a;domain=example.com", // index 0, falsey
-            "=b;domain=example.com", // index 1, truthy
-            "c=d;domain=example.com" // index 2, truthy
-          ];
-          return some.map(Cookie.parse);
-        },
-        parses: function(err, val) {
-          assert.equal(err, null);
-          assert.isArray(val);
-          assert.lengthOf(val, 3);
-        },
-        "doesn't parse first cookie loose": function(val) {
-          assert.isUndefined(val[0]);
-        },
-        "doesn't parse second cookie loose": function(val) {
-          assert.isUndefined(val[1]);
-        },
-        "parses third cookie normally": function(val) {
-          assert.instanceOf(val[2], Cookie);
-          assert.equal(val[2].key, "c");
-          assert.equal(val[2].value, "d");
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/cookie_jar_test.js b/test/cookie_jar_test.js
deleted file mode 100644
index 9a5d382..0000000
--- a/test/cookie_jar_test.js
+++ /dev/null
@@ -1,672 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const async = require("async");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-
-const atNow = Date.now();
-
-function at(offset) {
-  return { now: new Date(atNow + offset) };
-}
-
-vows
-  .describe("CookieJar")
-  .addBatch({
-    "Setting a basic cookie": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=example.com; Path=/");
-        assert.strictEqual(c.hostOnly, null);
-        assert.instanceOf(c.creation, Date);
-        assert.strictEqual(c.lastAccessed, null);
-        c.creation = new Date(Date.now() - 10000);
-        cj.setCookie(c, "http://example.com/index.html", this.callback);
-      },
-      works: function(c) {
-        assert.instanceOf(c, Cookie);
-      }, // C is for Cookie, good enough for me
-      "gets timestamped": function(c) {
-        assert.ok(c.creation);
-        assert.ok(Date.now() - c.creation.getTime() < 5000); // recently stamped
-        assert.ok(c.lastAccessed);
-        assert.equal(c.creation, c.lastAccessed);
-        assert.equal(c.TTL(), Infinity);
-        assert.ok(!c.isPersistent());
-      }
-    },
-    "Setting a no-path cookie": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=example.com");
-        assert.strictEqual(c.hostOnly, null);
-        assert.instanceOf(c.creation, Date);
-        assert.strictEqual(c.lastAccessed, null);
-        c.creation = new Date(Date.now() - 10000);
-        cj.setCookie(c, "http://example.com/index.html", this.callback);
-      },
-      domain: function(c) {
-        assert.equal(c.domain, "example.com");
-      },
-      "path is /": function(c) {
-        assert.equal(c.path, "/");
-      },
-      "path was derived": function(c) {
-        assert.strictEqual(c.pathIsDefault, true);
-      }
-    },
-    "Setting a cookie already marked as host-only": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=example.com");
-        assert.strictEqual(c.hostOnly, null);
-        assert.instanceOf(c.creation, Date);
-        assert.strictEqual(c.lastAccessed, null);
-        c.creation = new Date(Date.now() - 10000);
-        c.hostOnly = true;
-        cj.setCookie(c, "http://example.com/index.html", this.callback);
-      },
-      domain: function(c) {
-        assert.equal(c.domain, "example.com");
-      },
-      "still hostOnly": function(c) {
-        assert.strictEqual(c.hostOnly, true);
-      }
-    },
-    "Setting a session cookie": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b");
-        assert.strictEqual(c.path, null);
-        cj.setCookie(c, "http://www.example.com/dir/index.html", this.callback);
-      },
-      works: function(c) {
-        assert.instanceOf(c, Cookie);
-      },
-      "gets the domain": function(c) {
-        assert.equal(c.domain, "www.example.com");
-      },
-      "gets the default path": function(c) {
-        assert.equal(c.path, "/dir");
-      },
-      "is 'hostOnly'": function(c) {
-        assert.ok(c.hostOnly);
-      }
-    },
-    "Setting wrong domain cookie": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=fooxample.com; Path=/");
-        cj.setCookie(c, "http://example.com/index.html", this.callback);
-      },
-      fails: function(err, c) {
-        assert.ok(err.message.match(/domain/i));
-        assert.ok(!c);
-      }
-    },
-    "Setting sub-domain cookie": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=www.example.com; Path=/");
-        cj.setCookie(c, "http://example.com/index.html", this.callback);
-      },
-      fails: function(err, c) {
-        assert.ok(err.message.match(/domain/i));
-        assert.ok(!c);
-      }
-    },
-    "Setting super-domain cookie": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=example.com; Path=/");
-        cj.setCookie(c, "http://www.app.example.com/index.html", this.callback);
-      },
-      success: function(err, c) {
-        assert.ok(!err);
-        assert.equal(c.domain, "example.com");
-      }
-    },
-    "Setting a sub-path cookie on a super-domain": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=example.com; Path=/subpath");
-        assert.strictEqual(c.hostOnly, null);
-        assert.instanceOf(c.creation, Date);
-        assert.strictEqual(c.lastAccessed, null);
-        c.creation = new Date(Date.now() - 10000);
-        cj.setCookie(c, "http://www.example.com/index.html", this.callback);
-      },
-      "domain is super-domain": function(c) {
-        assert.equal(c.domain, "example.com");
-      },
-      "path is /subpath": function(c) {
-        assert.equal(c.path, "/subpath");
-      },
-      "path was NOT derived": function(c) {
-        assert.strictEqual(c.pathIsDefault, null);
-      }
-    },
-    "Setting HttpOnly cookie over non-HTTP API": {
-      topic: function() {
-        const cj = new CookieJar();
-        const c = Cookie.parse("a=b; Domain=example.com; Path=/; HttpOnly");
-        cj.setCookie(
-          c,
-          "http://example.com/index.html",
-          { http: false },
-          this.callback
-        );
-      },
-      fails: function(err, c) {
-        assert.match(err.message, /HttpOnly/i);
-        assert.ok(!c);
-      }
-    }
-  })
-  .addBatch({
-    "Store eight cookies": {
-      topic: function() {
-        const cj = new CookieJar();
-        const ex = "http://example.com/index.html";
-        const tasks = [];
-        tasks.push(next => {
-          cj.setCookie("a=1; Domain=example.com; Path=/", ex, at(0), next);
-        });
-        tasks.push(next => {
-          cj.setCookie(
-            "b=2; Domain=example.com; Path=/; HttpOnly",
-            ex,
-            at(1000),
-            next
-          );
-        });
-        tasks.push(next => {
-          cj.setCookie(
-            "c=3; Domain=example.com; Path=/; Secure",
-            ex,
-            at(2000),
-            next
-          );
-        });
-        tasks.push(next => {
-          // path
-          cj.setCookie(
-            "d=4; Domain=example.com; Path=/foo",
-            ex,
-            at(3000),
-            next
-          );
-        });
-        tasks.push(next => {
-          // host only
-          cj.setCookie("e=5", ex, at(4000), next);
-        });
-        tasks.push(next => {
-          // other domain
-          cj.setCookie(
-            "f=6; Domain=nodejs.org; Path=/",
-            "http://nodejs.org",
-            at(5000),
-            next
-          );
-        });
-        tasks.push(next => {
-          // expired
-          cj.setCookie(
-            "g=7; Domain=example.com; Path=/; Expires=Tue, 18 Oct 2011 00:00:00 GMT",
-            ex,
-            at(6000),
-            next
-          );
-        });
-        tasks.push(next => {
-          // expired via Max-Age
-          cj.setCookie("h=8; Domain=example.com; Path=/; Max-Age=1", ex, next);
-        });
-        const cb = this.callback;
-        async.parallel(tasks, (err, results) => {
-          setTimeout(() => {
-            cb(err, cj, results);
-          }, 2000); // so that 'h=8' expires
-        });
-      },
-      "setup ok": function(err, cj, results) {
-        assert.ok(!err);
-        assert.ok(cj);
-        assert.ok(results);
-      },
-      "then retrieving for http://nodejs.org": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("http://nodejs.org", this.callback);
-        },
-        "get a nodejs cookie": function(cookies) {
-          assert.lengthOf(cookies, 1);
-          const cookie = cookies[0];
-          assert.equal(cookie.domain, "nodejs.org");
-        }
-      },
-      "then retrieving for https://example.com": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("https://example.com", { secure: true }, this.callback);
-        },
-        "get a secure example cookie with others": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["a", "b", "c", "e"]);
-        }
-      },
-      "then retrieving for https://example.com (missing options)": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("https://example.com", this.callback);
-        },
-        "get a secure example cookie with others": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["a", "b", "c", "e"]);
-        }
-      },
-      "then retrieving for http://example.com": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("http://example.com", this.callback);
-        },
-        "get a bunch of cookies": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["a", "b", "e"]);
-        }
-      },
-      "then retrieving for http://EXAMPlE.com": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("http://EXAMPlE.com", this.callback);
-        },
-        "get a bunch of cookies": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["a", "b", "e"]);
-        }
-      },
-      "then retrieving for http://example.com, non-HTTP": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("http://example.com", { http: false }, this.callback);
-        },
-        "get a bunch of cookies": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["a", "e"]);
-        }
-      },
-      "then retrieving for http://example.com/foo/bar": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("http://example.com/foo/bar", this.callback);
-        },
-        "get a bunch of cookies": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["d", "a", "b", "e"]);
-        }
-      },
-      "then retrieving for http://example.com as a string": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookieString("http://example.com", this.callback);
-        },
-        "get a single string": function(cookieHeader) {
-          assert.equal(cookieHeader, "a=1; b=2; e=5");
-        }
-      },
-      "then retrieving for http://example.com as a set-cookie header": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getSetCookieStrings("http://example.com", this.callback);
-        },
-        "get a single string": function(cookieHeaders) {
-          assert.lengthOf(cookieHeaders, 3);
-          assert.equal(cookieHeaders[0], "a=1; Domain=example.com; Path=/");
-          assert.equal(
-            cookieHeaders[1],
-            "b=2; Domain=example.com; Path=/; HttpOnly"
-          );
-          assert.equal(cookieHeaders[2], "e=5; Path=/");
-        }
-      },
-      "then retrieving for http://www.example.com/": {
-        topic: function(cj, oldResults) {
-          assert.ok(oldResults);
-          cj.getCookies("http://www.example.com/foo/bar", this.callback);
-        },
-        "get a bunch of cookies": function(cookies) {
-          const names = cookies.map(c => {
-            return c.key;
-          });
-          assert.deepEqual(names, ["d", "a", "b"]); // note lack of 'e'
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Repeated names": {
-      topic: function() {
-        const cb = this.callback;
-        const cj = new CookieJar();
-        const ex = "http://www.example.com/";
-        const sc = cj.setCookie;
-        const tasks = [];
-        const now = Date.now();
-        tasks.push(sc.bind(cj, "aaaa=xxxx", ex, at(0)));
-        tasks.push(
-          sc.bind(cj, "aaaa=1111; Domain=www.example.com", ex, at(1000))
-        );
-        tasks.push(sc.bind(cj, "aaaa=2222; Domain=example.com", ex, at(2000)));
-        tasks.push(
-          sc.bind(
-            cj,
-            "aaaa=3333; Domain=www.example.com; Path=/pathA",
-            ex,
-            at(3000)
-          )
-        );
-        async.series(tasks, (err, results) => {
-          results = results.filter(e => {
-            return e !== undefined;
-          });
-          cb(err, { cj: cj, cookies: results, now: now });
-        });
-      },
-      "all got set": function(err, t) {
-        assert.lengthOf(t.cookies, 4);
-      },
-      "then getting 'em back": {
-        topic: function(t) {
-          const cj = t.cj;
-          cj.getCookies("http://www.example.com/pathA", this.callback);
-        },
-        "there's just three": function(err, cookies) {
-          const vals = cookies.map(c => {
-            return c.value;
-          });
-          // may break with sorting; sorting should put 3333 first due to longest path:
-          assert.deepEqual(vals, ["3333", "1111", "2222"]);
-        }
-      }
-    }
-  })
-  .addBatch({
-    "CookieJar setCookie errors": {
-      "public-suffix domain": {
-        topic: function() {
-          const cj = new CookieJar();
-          cj.setCookie(
-            "i=9; Domain=kyoto.jp; Path=/",
-            "kyoto.jp",
-            this.callback
-          );
-        },
-        errors: function(err, cookie) {
-          assert.ok(err);
-          assert.ok(!cookie);
-          assert.match(err.message, /public suffix/i);
-        }
-      },
-      "wrong domain": {
-        topic: function() {
-          const cj = new CookieJar();
-          cj.setCookie(
-            "j=10; Domain=google.com; Path=/",
-            "http://google.ca",
-            this.callback
-          );
-        },
-        errors: function(err, cookie) {
-          assert.ok(err);
-          assert.ok(!cookie);
-          assert.match(err.message, /not in this host's domain/i);
-        }
-      },
-      "old cookie is HttpOnly": {
-        topic: function() {
-          const cb = this.callback;
-          const next = function(err, c) {
-            c = null;
-            return cb(err, cj);
-          };
-          const cj = new CookieJar();
-          cj.setCookie(
-            "k=11; Domain=example.ca; Path=/; HttpOnly",
-            "http://example.ca",
-            { http: true },
-            next
-          );
-        },
-        "initial cookie is set": function(err, cj) {
-          assert.ok(!err);
-          assert.ok(cj);
-        },
-        "but when trying to overwrite": {
-          topic: function(cj) {
-            const cb = this.callback;
-            const next = function(err, c) {
-              c = null;
-              cb(null, err);
-            };
-            cj.setCookie(
-              "k=12; Domain=example.ca; Path=/",
-              "http://example.ca",
-              { http: false },
-              next
-            );
-          },
-          "it's an error": function(err) {
-            assert.ok(err);
-          },
-          "then, checking the original": {
-            topic: function(ignored, cj) {
-              assert.ok(cj instanceof CookieJar);
-              cj.getCookies("http://example.ca", { http: true }, this.callback);
-            },
-            "cookie has original value": function(err, cookies) {
-              assert.equal(err, null);
-              assert.lengthOf(cookies, 1);
-              assert.equal(cookies[0].value, 11);
-            }
-          }
-        }
-      },
-      "similar to public suffix": {
-        topic: function() {
-          const cj = new CookieJar();
-          const url = "http://www.foonet.net";
-          assert.isTrue(cj.rejectPublicSuffixes);
-          cj.setCookie("l=13; Domain=foonet.net; Path=/", url, this.callback);
-        },
-        "doesn't error": function(err, cookie) {
-          assert.ok(!err);
-          assert.ok(cookie);
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Loose Mode": {
-      topic: function() {
-        const cj = new CookieJar(null, { looseMode: true });
-        cj.setCookieSync("FooBar", "http://www.foonet.net", {});
-        return cj;
-      },
-      "parses loose cookies": function(cj) {
-        const cookies = cj.getCookiesSync("http://www.foonet.net");
-        assert.strictEqual(cookies.length, 1);
-        assert.strictEqual(cookies[0].key, "");
-        assert.strictEqual(cookies[0].value, "FooBar");
-      }
-    }
-  })
-  .addBatch({
-    "Remove all cookies": {
-      topic: function() {
-        const jar = new CookieJar();
-        const cookie1 = Cookie.parse("a=b; Domain=example.com; Path=/");
-        const cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
-        const cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
-        jar.setCookie(cookie1, "http://example.com/index.html", () => {});
-        jar.setCookie(cookie2, "http://foo.com/index.html", () => {});
-        jar.setCookie(cookie3, "http://foo.com/index.html", () => {});
-
-        const cb = this.callback;
-        jar.removeAllCookies(err => {
-          cb(err, jar);
-        });
-      },
-      "no errors": function(err, jar) {
-        assert(err == null);
-      },
-      "load cookies from the jar": {
-        topic: function(jar) {
-          jar.store.getAllCookies(this.callback);
-        },
-        "no cookies in the jar": function(err, cookies) {
-          assert(err == null);
-          assert(cookies != null);
-          assert(cookies.length === 0, "cookies were not removed");
-        }
-      }
-    },
-    "Remove all cookies (the underlying store does not support removeAllCookies)": {
-      topic: function() {
-        const jar = new CookieJar();
-        jar.store.removeAllCookies = undefined;
-        const cookie1 = Cookie.parse("a=b; Domain=example.com; Path=/");
-        const cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
-        const cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
-        jar.setCookie(cookie1, "http://example.com/index.html", () => {});
-        jar.setCookie(cookie2, "http://foo.com/index.html", () => {});
-        jar.setCookie(cookie3, "http://foo.com/index.html", () => {});
-
-        const cb = this.callback;
-        jar.removeAllCookies(err => {
-          cb(err, jar);
-        });
-      },
-      "no errors": function(err, jar) {
-        assert(err == null);
-      },
-      "load cookies from the jar": {
-        topic: function(jar) {
-          jar.store.getAllCookies(this.callback);
-        },
-        "no cookies in the jar": function(err, cookies) {
-          assert(err == null);
-          assert(cookies != null);
-          assert(cookies.length === 0, "cookies were not removed");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Issue 132 - setCookie": {
-      "with foreign object": {
-        topic: function() {
-          const jar = new CookieJar();
-          jar.setCookie(
-            { key: "x", value: "y" },
-            "http://example.com/",
-            this.callback
-          );
-        },
-        "results in an error": function(err, cookie) {
-          assert(err != null);
-          assert(!cookie);
-          assert.equal(
-            err.message,
-            "First argument to setCookie must be a Cookie object or string"
-          );
-        }
-      },
-      "with String instance": {
-        topic: function() {
-          const jar = new CookieJar();
-          jar.setCookie(
-            new String("x=y; Domain=example.com; Path=/"),
-            "http://example.com/",
-            this.callback
-          );
-        },
-        "is fine": function(err, cookie) {
-          assert(!err);
-          assert(!!cookie);
-          assert.instanceOf(cookie, Cookie);
-          assert.equal(cookie.key, "x");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Issue #144 - secure": {
-      "of undefined": {
-        topic: function() {
-          const jar = new tough.CookieJar();
-          const cookieString = `AWSELB=69b2c0038b16e8e27056d1178e0d556c; 
-          Path=/, jses_WS41=5f8dc2f6-ea37-49de-8dfa-b58336c2d9ce; path=/; 
-          Secure; HttpOnly, AuthToken=EFKFFFCH@K@GHIHEJCJMMGJM>CDHDEK>CFGK?MHJ
-          >>JI@B??@CAEHBJH@H@A@GCFDLIMLJEEJEIFGALA?BIM?@G@DEDI@JE?I?HKJBIDDHJMEFEFM
-          >G@J?I??B@C>>LAH?GCGJ@FMEGHBGAF; expires=Sun, 31-Jan-9021 02:39:04 GMT; 
-          path=/; Secure; HttpOnly, FirstReferrer=; expires=Fri, 31-Jan-9020 20:50:44 
-          GMT; path=/`;
-
-          jar.setCookieSync(cookieString, "https://google.com");
-          jar.getCookies("https://google.com", this.callback)
-        },
-        "results in a 1-length array with a valid cookie": function(err, cookies) {
-          assert(!err, err);
-          assert(cookies.length == 1);
-          assert.instanceOf(cookies[0], Cookie);
-          assert.isTrue(cookies[0].secure);
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/cookie_prefixes_test.js b/test/cookie_prefixes_test.js
deleted file mode 100644
index 5a21be3..0000000
--- a/test/cookie_prefixes_test.js
+++ /dev/null
@@ -1,249 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const CookieJar = tough.CookieJar;
-const PrefixSecurityEnum = tough.PrefixSecurityEnum;
-
-vows
-  .describe("Cookie Prefixes")
-  .addBatch({
-    "Prefix Security Mode": {
-      "with prefixSecurity = silent": {
-        "for __Secure prefix": {
-          topic: function() {
-            return new CookieJar(null, { prefixSecurity: "silent" });
-          },
-          "with no Secure attribute, should fail silently": function(cj) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Secure-SID=12345; Domain=example.com",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("http://www.example.com");
-            assert.isEmpty(cookies); // no cookies set
-          },
-          "with Secure attribute and over https, should work": function(cj) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Secure-SID=12345; Domain=example.com; Secure",
-              "https://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("https://www.example.com");
-            assert.strictEqual(cookies.length, 1);
-            assert.strictEqual(cookies[0].key, "__Secure-SID");
-            assert.strictEqual(cookies[0].value, "12345");
-          },
-          "with Secure attribute but not over https, should fail silently": function(
-            cj
-          ) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Secure-SID=12345; Domain=example.com; Secure",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("http://www.example.com");
-            assert.isEmpty(cookies); // no cookies set
-          }
-        },
-        "for __Host prefix": {
-          topic: function() {
-            return new CookieJar(null, { prefixSecurity: "silent" });
-          },
-          "with no Secure attribute or Domain or Path, should fail silently": function(
-            cj
-          ) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync("__Host-SID=12345", "http://www.example.com", {});
-            const cookies = cj.getCookiesSync("http://www.example.com");
-            assert.isEmpty(cookies); // no cookies set
-          },
-          "with no Domain or Path, should fail silently": function(cj) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Host-SID=12345; Secure",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("http://www.example.com");
-            assert.isEmpty(cookies); // no cookies set
-          },
-          "with no Path, should fail silently": function(cj) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Host-SID=12345; Secure; Domain=example.com",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("http://www.example.com");
-            assert.isEmpty(cookies); // no cookies set
-          },
-          "with Domain, should fail silently": function(cj) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Host-SID=12345; Secure; Domain=example.com; Path=/",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("http://www.example.com");
-            assert.isEmpty(cookies); // no cookies set
-          },
-          "with Secure and Path but no Domain over https, should work": function(
-            cj
-          ) {
-            assert.equal(PrefixSecurityEnum.SILENT, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Host-SID=12345; Secure; Path=/",
-              "https://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("https://www.example.com");
-            assert.strictEqual(cookies.length, 1);
-            assert.strictEqual(cookies[0].key, "__Host-SID");
-            assert.strictEqual(cookies[0].value, "12345");
-          }
-        }
-      },
-      "with prefixSecurity = strict": {
-        "for __Secure prefix": {
-          "for valid cookie": {
-            topic: function() {
-              return new CookieJar(null, { prefixSecurity: "strict" });
-            },
-            passes: function(cj) {
-              assert.equal(PrefixSecurityEnum.STRICT, cj.prefixSecurity);
-              cj.setCookieSync(
-                "__Secure-SID=12345; Secure; Domain=example.com",
-                "https://www.example.com",
-                {}
-              );
-              const cookies = cj.getCookiesSync("https://www.example.com");
-              assert.strictEqual(cookies.length, 1);
-              assert.strictEqual(cookies[0].key, "__Secure-SID");
-              assert.strictEqual(cookies[0].value, "12345");
-            }
-          },
-          "for invalid cookie": {
-            topic: function() {
-              const cj = new CookieJar(null, { prefixSecurity: "strict" });
-              assert.equal(PrefixSecurityEnum.STRICT, cj.prefixSecurity);
-              cj.setCookieSync(
-                "__Secure-SID=12345; Domain=example.com",
-                "http://www.example.com",
-                {}
-              );
-            },
-            "fails shrilly": function(err, cookie) {
-              assert.isNotNull(err);
-              assert.isUndefined(cookie);
-            }
-          }
-        },
-        "for __Host prefix": {
-          "for invalid cookie": {
-            topic: function() {
-              const cj = new CookieJar(null, { prefixSecurity: "strict" });
-              assert.equal(PrefixSecurityEnum.STRICT, cj.prefixSecurity);
-              cj.setCookieSync(
-                "__Host-SID=12345; Secure; Domain=example.com",
-                "https://www.example.com",
-                {}
-              );
-            },
-            "fails shrilly": function(err, cookie) {
-              assert.isNotNull(err);
-              assert.isUndefined(cookie);
-            }
-          },
-          "for valid cookie": {
-            topic: function() {
-              return new CookieJar(null, { prefixSecurity: "strict" });
-            },
-            passes: function(cj) {
-              assert.equal(PrefixSecurityEnum.STRICT, cj.prefixSecurity);
-              cj.setCookieSync(
-                "__Host-SID=12345; Secure; Path=/",
-                "https://www.foo.com",
-                {}
-              );
-              const cookies = cj.getCookiesSync("https://www.foo.com");
-              assert.strictEqual(cookies.length, 1);
-              assert.strictEqual(cookies[0].key, "__Host-SID");
-              assert.strictEqual(cookies[0].value, "12345");
-            }
-          }
-        }
-      },
-      "with prefixSecurity = disabled": {
-        "for __Secure prefix": {
-          topic: function() {
-            return new CookieJar(null, { prefixSecurity: "unsafe-disabled" });
-          },
-          "does not fail": function(cj) {
-            assert.equal(PrefixSecurityEnum.DISABLED, cj.prefixSecurity);
-            cj.setCookieSync(
-              "__Secure-SID=12345; Domain=example.com",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("https://www.example.com");
-            assert.strictEqual(cookies.length, 1);
-            assert.strictEqual(cookies[0].key, "__Secure-SID");
-            assert.strictEqual(cookies[0].value, "12345");
-          }
-        },
-        "for __Host prefix": {
-          topic: function() {
-            return new CookieJar(null, { prefixSecurity: "unsafe-disabled" });
-          },
-          "does not fail": function(cj) {
-            assert.equal(PrefixSecurityEnum.DISABLED, cj.prefixSecurity);
-            /* Failure case because Domain defined */
-            cj.setCookieSync(
-              "__Host-SID=12345; Domain=example.com",
-              "http://www.example.com",
-              {}
-            );
-            const cookies = cj.getCookiesSync("https://www.example.com");
-            assert.strictEqual(cookies.length, 1);
-            assert.strictEqual(cookies[0].key, "__Host-SID");
-            assert.strictEqual(cookies[0].value, "12345");
-          }
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/cookie_sorting_test.js b/test/cookie_sorting_test.js
deleted file mode 100644
index 23ddeee..0000000
--- a/test/cookie_sorting_test.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-
-function toKeyArray(cookies) {
-  return cookies.map(c => {
-    return c.key;
-  });
-}
-
-vows
-  .describe("Cookie sorting")
-  .addBatch({
-    "Assumptions:": {
-      ".creationIndex is set during construction": function() {
-        const now = new Date();
-        const c1 = new Cookie();
-        const c2 = new Cookie();
-        assert.isNumber(c1.creationIndex);
-        assert.isNumber(c2.creationIndex);
-        assert(
-          c1.creationIndex < c2.creationIndex,
-          "creationIndex should increase with each construction"
-        );
-      },
-
-      ".creationIndex is set during construction (forced ctime)": function() {
-        const now = new Date();
-        const c1 = new Cookie({ creation: now });
-        const c2 = new Cookie({ creation: now });
-        assert.strictEqual(c1.creation, c2.creation);
-        assert.isNumber(c1.creationIndex);
-        assert.isNumber(c2.creationIndex);
-        assert(
-          c1.creationIndex < c2.creationIndex,
-          "creationIndex should increase with each construction"
-        );
-      },
-
-      ".creationIndex is left alone during new setCookie": function() {
-        const jar = new CookieJar();
-        const c = new Cookie({ key: "k", value: "v", domain: "example.com" });
-        const now = new Date();
-        const beforeDate = c.creation;
-        assert.instanceOf(beforeDate, Date);
-        assert.notStrictEqual(now, beforeDate);
-        const beforeIndex = c.creationIndex;
-        assert.isNumber(c.creationIndex);
-
-        jar.setCookieSync(c, "http://example.com/", { now: now });
-
-        assert.strictEqual(c.creation, now);
-        assert.strictEqual(c.creationIndex, beforeIndex);
-      },
-
-      ".creationIndex is preserved during update setCookie": function() {
-        const jar = new CookieJar();
-
-        const thisMs = Date.now();
-        const t1 = new Date(thisMs);
-        const t2 = new Date(thisMs);
-        assert.notStrictEqual(t1, t2); // Date objects are distinct
-
-        let c = new Cookie({ key: "k", value: "v1", domain: "example.com" });
-        jar.setCookieSync(c, "http://example.com/", { now: t1 });
-        const originalIndex = c.creationIndex;
-
-        assert.strictEqual(c.creation, t1);
-        assert.strictEqual(c.lastAccessed, t1);
-
-        c = new Cookie({ key: "k", value: "v2", domain: "example.com" });
-        assert.notStrictEqual(c.creation, t1); // new timestamp assigned
-
-        jar.setCookieSync(c, "http://example.com/", { now: t2 });
-
-        assert.strictEqual(c.creation, t1); // retained
-        assert.strictEqual(c.lastAccessed, t2); // updated
-        assert.strictEqual(c.creationIndex, originalIndex); // retained
-      }
-    }
-  })
-  .addBatch({
-    "Cookie Sorting": {
-      topic: function() {
-        let cookies = [];
-        cookies.push(Cookie.parse("a=0; Domain=example.com"));
-        cookies.push(Cookie.parse("b=1; Domain=www.example.com"));
-        cookies.push(Cookie.parse("c=2; Domain=example.com; Path=/pathA"));
-        cookies.push(Cookie.parse("d=3; Domain=www.example.com; Path=/pathA"));
-        cookies.push(
-          Cookie.parse("e=4; Domain=example.com; Path=/pathA/pathB")
-        );
-        cookies.push(
-          Cookie.parse("f=5; Domain=www.example.com; Path=/pathA/pathB")
-        );
-
-        // weak shuffle:
-        cookies = cookies.sort(() => {
-          return Math.random() - 0.5;
-        });
-
-        cookies = cookies.sort(tough.cookieCompare);
-        return cookies;
-      },
-      got: function(cookies) {
-        assert.lengthOf(cookies, 6);
-        assert.deepEqual(toKeyArray(cookies), ["e", "f", "c", "d", "a", "b"]);
-      }
-    }
-  })
-  .addBatch({
-    "Changing creation date affects sorting": {
-      topic: function() {
-        const cookies = [];
-        const now = Date.now();
-        cookies.push(Cookie.parse("a=0;"));
-        cookies.push(Cookie.parse("b=1;"));
-        cookies.push(Cookie.parse("c=2;"));
-
-        cookies.forEach((cookie, idx) => {
-          cookie.creation = new Date(now - 100 * idx);
-        });
-
-        return cookies.sort(tough.cookieCompare);
-      },
-      got: function(cookies) {
-        assert.deepEqual(toKeyArray(cookies), ["c", "b", "a"]);
-      }
-    }
-  })
-  .export(module);
diff --git a/test/cookie_to_json_test.js b/test/cookie_to_json_test.js
deleted file mode 100644
index 5becedb..0000000
--- a/test/cookie_to_json_test.js
+++ /dev/null
@@ -1,189 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-
-vows
-  .describe("Cookie.toJSON()")
-  .addBatch({
-    JSON: {
-      serialization: {
-        topic: function() {
-          const c = Cookie.parse(
-            "alpha=beta; Domain=example.com; Path=/foo; Expires=Tue, 19 Jan 2038 03:14:07 GMT; HttpOnly"
-          );
-          return JSON.stringify(c);
-        },
-        "gives a string": function(str) {
-          assert.equal(typeof str, "string");
-        },
-        "date is in ISO format": function(str) {
-          assert.match(
-            str,
-            /"expires":"2038-01-19T03:14:07\.000Z"/,
-            "expires is in ISO format"
-          );
-        }
-      },
-      deserialization: {
-        topic() {
-          return Cookie.fromJSON(
-            '{"key":"alpha","value":"beta","domain":"example.com","path":"/foo","expires":"2038-01-19T03:14:07.000Z","httpOnly":true,"lastAccessed":2000000000123}'
-          );
-        },
-        works: c => assert.ok(c),
-        key: c => assert.equal(c.key, "alpha"),
-        value: c => assert.equal(c.value, "beta"),
-        domain: c => assert.equal(c.domain, "example.com"),
-        path: c => assert.equal(c.path, "/foo"),
-        httpOnly: c => assert.strictEqual(c.httpOnly, true),
-        secure: c => assert.strictEqual(c.secure, false),
-        hostOnly: c => assert.strictEqual(c.hostOnly, null),
-        "expires is a date object": c =>
-          assert.equal(c.expires.getTime(), 2147483647000),
-        "lastAccessed is a date object": c =>
-          assert.equal(c.lastAccessed.getTime(), 2000000000123),
-        "creation defaulted": c => assert.ok(c.creation.getTime())
-      },
-      "null deserialization": {
-        topic: function() {
-          return Cookie.fromJSON(null);
-        },
-        "is null": function(cookie) {
-          assert.equal(cookie, null);
-        }
-      }
-    },
-    "expiry deserialization": {
-      Infinity: {
-        topic: Cookie.fromJSON.bind(null, '{"expires":"Infinity"}'),
-        "is infinite": function(c) {
-          assert.strictEqual(c.expires, "Infinity");
-          assert.equal(c.expires, Infinity);
-        }
-      }
-    },
-    "maxAge serialization": {
-      topic: function() {
-        return function(toSet) {
-          const c = new Cookie();
-          c.key = "foo";
-          c.value = "bar";
-          c.setMaxAge(toSet);
-          return JSON.stringify(c);
-        };
-      },
-      zero: {
-        topic: function(f) {
-          return f(0);
-        },
-        "looks good": function(str) {
-          assert.match(str, /"maxAge":0/);
-        }
-      },
-      Infinity: {
-        topic: function(f) {
-          return f(Infinity);
-        },
-        "looks good": function(str) {
-          assert.match(str, /"maxAge":"Infinity"/);
-        }
-      },
-      "-Infinity": {
-        topic: function(f) {
-          return f(-Infinity);
-        },
-        "looks good": function(str) {
-          assert.match(str, /"maxAge":"-Infinity"/);
-        }
-      },
-      null: {
-        topic: function(f) {
-          return f(null);
-        },
-        absent: function(str) {
-          assert.match(str, /(?!"maxAge":null)/); // NB: negative RegExp
-        }
-      }
-    },
-    "maxAge deserialization": {
-      number: {
-        topic: Cookie.fromJSON.bind(
-          null,
-          '{"key":"foo","value":"bar","maxAge":123}'
-        ),
-        "is the number": function(c) {
-          assert.strictEqual(c.maxAge, 123);
-        }
-      },
-      null: {
-        topic: Cookie.fromJSON.bind(
-          null,
-          '{"key":"foo","value":"bar","maxAge":null}'
-        ),
-        "is null": function(c) {
-          assert.strictEqual(c.maxAge, null);
-        }
-      },
-      "less than zero": {
-        topic: Cookie.fromJSON.bind(
-          null,
-          '{"key":"foo","value":"bar","maxAge":-123}'
-        ),
-        "is -123": function(c) {
-          assert.strictEqual(c.maxAge, -123);
-        }
-      },
-      Infinity: {
-        topic: Cookie.fromJSON.bind(
-          null,
-          '{"key":"foo","value":"bar","maxAge":"Infinity"}'
-        ),
-        "is inf-as-string": function(c) {
-          assert.strictEqual(c.maxAge, "Infinity");
-        }
-      },
-      "-Infinity": {
-        topic: Cookie.fromJSON.bind(
-          null,
-          '{"key":"foo","value":"bar","maxAge":"-Infinity"}'
-        ),
-        "is inf-as-string": function(c) {
-          assert.strictEqual(c.maxAge, "-Infinity");
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/cookie_to_string_test.js b/test/cookie_to_string_test.js
deleted file mode 100644
index b531646..0000000
--- a/test/cookie_to_string_test.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-
-vows
-  .describe("Cookie.toString()")
-  .addBatch({
-    "a simple cookie": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.value = "b";
-        return c;
-      },
-      validates: function(c) {
-        assert.ok(c.validate());
-      },
-      "to string": function(c) {
-        assert.equal(c.toString(), "a=b");
-      }
-    },
-    "a cookie with spaces in the value": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.value = "beta gamma";
-        return c;
-      },
-      "doesn't validate": function(c) {
-        assert.ok(!c.validate());
-      },
-      "'garbage in, garbage out'": function(c) {
-        assert.equal(c.toString(), "a=beta gamma");
-      }
-    },
-    "with an empty value and HttpOnly": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.httpOnly = true;
-        return c;
-      },
-      "to string": function(c) {
-        assert.equal(c.toString(), "a=; HttpOnly");
-      }
-    },
-    "with an expiry": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.value = "b";
-        c.setExpires("Oct 18 2011 07:05:03 GMT");
-        return c;
-      },
-      validates: function(c) {
-        assert.ok(c.validate());
-      },
-      "to string": function(c) {
-        assert.equal(
-          c.toString(),
-          "a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT"
-        );
-      },
-      "to short string": function(c) {
-        assert.equal(c.cookieString(), "a=b");
-      }
-    },
-    "with a max-age": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.value = "b";
-        c.setExpires("Oct 18 2011 07:05:03 GMT");
-        c.maxAge = 12345;
-        return c;
-      },
-      validates: function(c) {
-        assert.ok(c.validate()); // mabe this one *shouldn't*?
-      },
-      "to string": function(c) {
-        assert.equal(
-          c.toString(),
-          "a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345"
-        );
-      }
-    },
-    "with a bunch of things": function() {
-      const c = new Cookie();
-      c.key = "a";
-      c.value = "b";
-      c.setExpires("Oct 18 2011 07:05:03 GMT");
-      c.maxAge = 12345;
-      c.domain = "example.com";
-      c.path = "/foo";
-      c.secure = true;
-      c.httpOnly = true;
-      c.extensions = ["MyExtension"];
-      assert.equal(
-        c.toString(),
-        "a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345; Domain=example.com; Path=/foo; Secure; HttpOnly; MyExtension"
-      );
-    },
-    "a host-only cookie": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.value = "b";
-        c.hostOnly = true;
-        c.domain = "shouldnt-stringify.example.com";
-        c.path = "/should-stringify";
-        return c;
-      },
-      validates: function(c) {
-        assert.ok(c.validate());
-      },
-      "to string": function(c) {
-        assert.equal(c.toString(), "a=b; Path=/should-stringify");
-      }
-    },
-    "minutes are '10'": {
-      topic: function() {
-        const c = new Cookie();
-        c.key = "a";
-        c.value = "b";
-        c.expires = new Date(1284113410000);
-        return c;
-      },
-      validates: function(c) {
-        assert.ok(c.validate());
-      },
-      "to string": function(c) {
-        const str = c.toString();
-        assert.notEqual(str, "a=b; Expires=Fri, 010 Sep 2010 010:010:010 GMT");
-        assert.equal(str, "a=b; Expires=Fri, 10 Sep 2010 10:10:10 GMT");
-      }
-    }
-  })
-  .export(module);
diff --git a/test/date_test.js b/test/date_test.js
deleted file mode 100644
index 2965ac1..0000000
--- a/test/date_test.js
+++ /dev/null
@@ -1,203 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-
-function dateVows(table) {
-  const theVows = {};
-  Object.keys(table).forEach(date => {
-    const expect = table[date];
-    theVows[date] = function() {
-      const got = tough.parseDate(date) ? true : false;
-      if (expect && !got) {
-        assert.ok(false, "expected valid date but was invalid");
-      } else if (!expect && got) {
-        assert.ok(false, "expected invalid date but was valid");
-      } else {
-        assert.ok(true);
-      }
-    };
-  });
-  return { "date parsing": theVows };
-}
-
-function equivalenceVows(table) {
-  const theVows = {};
-  Object.keys(table).forEach(thisDate => {
-    const sameAs = table[thisDate];
-    const label = `'${thisDate}' parses the same as '${sameAs}'`;
-    theVows[label] = function() {
-      const expected = tough.parseDate(sameAs);
-      const actual = tough.parseDate(thisDate);
-      if (!expected && !actual) {
-        assert.ok(false, "both dates failed to parse!");
-      }
-      assert.equal(actual.toString(), expected.toString());
-    };
-  });
-  return { "equivalence parsing": theVows };
-}
-
-const TOO_MANY_XS = String("x").repeat(65535);
-
-vows
-  .describe("Date")
-  .addBatch(
-    dateVows({
-      "Wed, 09 Jun 2021 10:18:14 GMT": true,
-      "Wed, 09 JUN 2021 10:18:14 GMT": true,
-      "Wed, 09 Jun 2021 22:18:14 GMT": true,
-      "Tue, 18 Oct 2011 07:42:42.123 GMT": true,
-      "18 Oct 2011 07:42:42 GMT": true,
-      "8 Oct 2011 7:42:42 GMT": true,
-      "8 Oct 2011 7:2:42 GMT": true,
-      "8 Oct 2011 7:2:2 GMT": true,
-      "Oct 18 2011 07:42:42 GMT": true,
-      "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)": true,
-      "09 Jun 2021 10:18:14 GMT": true,
-      "99 Jix 3038 48:86:72 ZMT": false,
-      "01 Jan 1970 00:00:00 GMT": true,
-      "01 Jan 1600 00:00:00 GMT": false, // before 1601
-      "01 Jan 1601 00:00:00 GMT": true,
-      "10 Feb 81 13:00:00 GMT": true, // implicit year
-      "Thu, 17-Apr-2014 02:12:29 GMT": true, // dashes
-      "Thu, 17-Apr-2014 02:12:29 UTC": true, // dashes and UTC
-
-      // garbage after parts:
-      "Wedxxx, 09 Jun 2021 10:18:14 GMT": true, // day of week doesn't matter
-      "Wed, 09e9 Jun 2021 10:18:14 GMT": true, // garbage after day ignored
-      "Wed, 09 Junxxx 2021 10:18:14 GMT": true, // prefix match on month
-      "Wed, 09 Jun 2021e9 10:18:14 GMT": true, // garbage after year OK
-      "Wed, 09 Jun 2021 10e9:18:14 GMT": false, // can't have garbage after HH
-      "Wed, 09 Jun 2021 10:18e9:14 GMT": false, // can't have garbage after MM
-      "Wed, 09 Jun 2021 10:18:14e9 GMT": true, // garbage after SS ignored
-
-      // extra digit in time parts:
-      "Thu, 01 Jan 1970 000:00:01 GMT": false,
-      "Thu, 01 Jan 1970 00:000:01 GMT": false,
-      "Thu, 01 Jan 1970 00:00:010 GMT": false,
-
-      // hex in time
-      "Wed, 09 Jun 2021 1a:33:44 GMT": false,
-      "Wed, 09 Jun 2021 a1:33:44 GMT": false,
-      "Wed, 09 Jun 2021 11:f3:44 GMT": false,
-      "Wed, 09 Jun 2021 11:3f:44 GMT": false,
-      "Wed, 09 Jun 2021 11:33:e4 GMT": false,
-      "Wed, 09 Jun 2021 11:33:4e GMT": true, // garbage after seconds is OK
-
-      // negatives in time
-      "Wed, 09 Jun 2021 -1:33:44 GMT": true, // parses as 1:33; - is a delimiter
-      "Wed, 09 Jun 2021 11:-3:44 GMT": false,
-      "Wed, 09 Jun 2021 11:33:-4 GMT": false,
-
-      "": false
-    })
-  )
-  .addBatch({
-    "reDos hr": {
-      topic: function() {
-        const str = `Wed, 09 Jun 2021 10${TOO_MANY_XS}:18:14 GMT`;
-        return tough.parseDate(str, true) ? true : false;
-      },
-      invalid: function(date) {
-        assert.equal(date, false);
-      }
-    },
-    "reDos min": {
-      topic: function() {
-        const str = `Wed, 09 Jun 2021 10:18${TOO_MANY_XS}:14 GMT`;
-        return tough.parseDate(str, true) ? true : false;
-      },
-      invalid: function(date) {
-        assert.equal(date, false);
-      }
-    },
-    "reDos sec": {
-      topic: function() {
-        const str = `Wed, 09 Jun 2021 10:18:14${TOO_MANY_XS} GMT`;
-        return tough.parseDate(str, true) ? true : false;
-      },
-      valid: function(date) {
-        assert.equal(date, true);
-      }
-    }
-  })
-  .addBatch(
-    equivalenceVows({
-      // milliseconds ignored
-      "Tue, 18 Oct 2011 07:42:42.123 GMT": "Tue, 18 Oct 2011 07:42:42 GMT",
-
-      // shorter HH:MM:SS works how you'd expect:
-      "8 Oct 2011 7:32:42 GMT": "8 Oct 2011 07:32:42 GMT",
-      "8 Oct 2011 7:2:42 GMT": "8 Oct 2011 07:02:42 GMT",
-      "8 Oct 2011 7:2:2 GMT": "8 Oct 2011 07:02:02 GMT",
-
-      // MDY versus DMY:
-      "Oct 18 2011 07:42:42 GMT": "18 Oct 2011 07:42:42 GMT",
-
-      // some other messy auto format
-      "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)":
-        "Tue, 18 Oct 2011 07:05:03 GMT",
-
-      // short year
-      "10 Feb 81 13:00:00 GMT": "10 Feb 1981 13:00:00 GMT",
-      "10 Feb 17 13:00:00 GMT": "10 Feb 2017 13:00:00 GMT",
-
-      // dashes
-      "Thu, 17-Apr-2014 02:12:29 GMT": "Thu, 17 Apr 2014 02:12:29 GMT",
-      // dashes and "UTC" (timezone is always ignored)
-      "Thu, 17-Apr-2014 02:12:29 UTC": "Thu, 17 Apr 2014 02:12:29 GMT",
-
-      // no weekday
-      "09 Jun 2021 10:18:14 GMT": "Wed, 09 Jun 2021 10:18:14 GMT",
-
-      // garbage after seconds is OK
-      "Wed, 09 Jun 2021 11:33:4e GMT": "Wed, 09 Jun 2021 11:33:04 GMT",
-
-      // - is delimiter in this position
-      "Wed, 09 Jun 2021 -1:33:44 GMT": "Wed, 09 Jun 2021 01:33:44 GMT",
-
-      // prefix match on month
-      "Wed, 09 Junxxx 2021 10:18:14 GMT": "Wed, 09 Jun 2021 10:18:14 GMT",
-      "09 November 2021 10:18:14 GMT": "09 Nov 2021 10:18:14 GMT",
-
-      // case of Month
-      "Wed, 09 JUN 2021 10:18:14 GMT": "Wed, 09 Jun 2021 10:18:14 GMT",
-      "Wed, 09 jUN 2021 10:18:14 GMT": "Wed, 09 Jun 2021 10:18:14 GMT",
-
-      // test the framework :wink:
-      "Wed, 09 Jun 2021 10:18:14 GMT": "Wed, 09 Jun 2021 10:18:14 GMT"
-    })
-  )
-  .export(module);
diff --git a/test/domain_and_path_test.js b/test/domain_and_path_test.js
deleted file mode 100644
index 4e2ce09..0000000
--- a/test/domain_and_path_test.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-
-function matchVows(func, table) {
-  const theVows = {};
-  table.forEach(item => {
-    const str = item[0];
-    const dom = item[1];
-    const expect = item[2];
-    const label = str + (expect ? " matches " : " doesn't match ") + dom;
-    theVows[label] = function() {
-      assert.equal(func(str, dom), expect);
-    };
-  });
-  return theVows;
-}
-
-function transformVows(fn, table) {
-  var theVows = {};
-  table.forEach(function (item) {
-    var str = item[0];
-    var expect = item[1];
-    var label = str + " gives " + expect;
-    if (item.length >= 3) {
-      label += " (" + item[2] + ")";
-    }
-    theVows[label] = function () {
-      assert.equal(fn(str), expect);
-    };
-  });
-  return theVows;
-}
-
-vows
-  .describe("Domain and Path")
-  .addBatch({
-    "domain normalization": transformVows(tough.canonicalDomain, [
-      ["example.com", "example.com", "already canonical"],
-      ["EXAMPLE.com", "example.com", "simple"],
-      [".EXAMPLE.com", "example.com", "leading dot stripped"],
-      ["EXAMPLE.com.", "example.com.", "trailing dot"],
-      [".EXAMPLE.com.", "example.com.", "leading and trailing dot"],
-      [".EXAMPLE...com.", "example...com.", "internal dots"],
-      ["δοκιμή.δοκιμή","xn--jxalpdlp.xn--jxalpdlp", "IDN: test.test in greek"],
-    ])
-  })
-  .addBatch({
-    "Domain Match": matchVows(tough.domainMatch, [
-      // str,          dom,          expect
-      ["example.com", "example.com", true], // identical
-      ["eXaMpLe.cOm", "ExAmPlE.CoM", true], // both canonicalized
-      ["no.ca", "yes.ca", false],
-      ["wwwexample.com", "example.com", false],
-      ["www.subdom.example.com", "example.com", true],
-      ["www.subdom.example.com", "subdom.example.com", true],
-      ["example.com", "example.com.", false], // RFC6265 S4.1.2.3
-
-      // nulls and undefineds
-      [null, "example.com", null],
-      ["example.com", null, null],
-      [null, null, null],
-      [undefined, undefined, null],
-
-      // suffix matching:
-      ["www.example.com", "example.com", true], // substr AND suffix
-      ["www.example.com.org", "example.com", false], // substr but not suffix
-      ["example.com", "www.example.com.org", false], // neither
-      ["example.com", "www.example.com", false], // super-str
-      ["aaa.com", "aaaa.com", false], // str can't be suffix of domain
-      ["aaaa.com", "aaa.com", false], // dom is suffix, but has to match on "." boundary!
-      ["www.aaaa.com", "aaa.com", false],
-      ["www.aaa.com", "aaa.com", true],
-      ["www.aexample.com", "example.com", false], // has to match on "." boundary
-
-      // S5.1.3 "The string is a host name (i.e., not an IP address)"
-      ["192.168.0.1", "168.0.1", false], // because str is an IP (v4)
-      ["100.192.168.0.1", "168.0.1", true], // WEIRD: because str is not a valid IPv4
-      ["100.192.168.0.1", "192.168.0.1", true], // WEIRD: because str is not a valid IPv4
-      ["::ffff:192.168.0.1", "168.0.1", false], // because str is an IP (v6)
-      ["::ffff:192.168.0.1", "192.168.0.1", false], // because str is an IP (v6)
-      ["::FFFF:192.168.0.1", "192.168.0.1", false], // because str is an IP (v6)
-      ["::192.168.0.1", "192.168.0.1", false], // because str is an IP (yes, v6!)
-      [":192.168.0.1", "168.0.1", true], // WEIRD: because str is not valid IPv6
-      [":ffff:100.192.168.0.1", "192.168.0.1", true], // WEIRD: because str is not valid IPv6
-      [":ffff:192.168.0.1", "192.168.0.1", false],
-      [":ffff:192.168.0.1", "168.0.1", true], // WEIRD: because str is not valid IPv6
-      ["::Fxxx:192.168.0.1", "168.0.1", true], // WEIRD: because str isnt IPv6
-      ["192.168.0.1", "68.0.1", false],
-      ["192.168.0.1", "2.68.0.1", false],
-      ["192.168.0.1", "92.68.0.1", false],
-      ["10.1.2.3", "210.1.2.3", false],
-      ["2008::1", "::1", false],
-      ["::1", "2008::1", false],
-      ["::1", "::1", true], // "are identical" rule, despite IPv6
-      ["::3xam:1e", "2008::3xam:1e", false], // malformed IPv6
-      ["::3Xam:1e", "::3xaM:1e", true], // identical, even though malformed
-      ["3xam::1e", "3xam::1e", true], // identical
-      ["::3xam::1e", "3xam::1e", false],
-      ["3xam::1e", "::3xam:1e", false],
-      ["::f00f:10.0.0.1", "10.0.0.1", false],
-      ["10.0.0.1", "::f00f:10.0.0.1", false],
-
-      // "IP like" hostnames:
-      ["1.example.com", "example.com", true],
-      ["11.example.com", "example.com", true],
-      ["192.168.0.1.example.com", "example.com", true],
-
-      // exact length "TLD" tests:
-      ["com", "net", false], // same len, non-match
-      ["com", "com", true], // "are identical" rule
-      ["NOTATLD", "notaTLD", true], // "are identical" rule (after canonicalization)
-    ])
-  })
-
-  .addBatch({
-    "default-path": transformVows(tough.defaultPath,[
-      [null, "/"],
-      ["/", "/"],
-      ["/file", "/"],
-      ["/dir/file", "/dir"],
-      ["noslash", "/"]
-    ])
-  })
-  .addBatch({
-    "Path-Match": matchVows(tough.pathMatch, [
-      // request, cookie, match
-      ["/", "/", true],
-      ["/dir", "/", true],
-      ["/", "/dir", false],
-      ["/dir/", "/dir/", true],
-      ["/dir/file", "/dir/", true],
-      ["/dir/file", "/dir", true],
-      ["/directory", "/dir", false]
-    ])
-  })
-  .addBatch({
-    permuteDomain: {
-      "base case": {
-        topic: tough.permuteDomain.bind(null, "example.com"),
-        "got the domain": function(list) {
-          assert.deepEqual(list, ["example.com"]);
-        }
-      },
-      "two levels": {
-        topic: tough.permuteDomain.bind(null, "foo.bar.example.com"),
-        "got three things": function(list) {
-          assert.deepEqual(list, [
-            "example.com",
-            "bar.example.com",
-            "foo.bar.example.com"
-          ]);
-        }
-      },
-      "local domain": {
-        topic: tough.permuteDomain.bind(null, "foo.bar.example.localduhmain"),
-        "got three things": function(list) {
-          assert.deepEqual(list, [
-            "example.localduhmain",
-            "bar.example.localduhmain",
-            "foo.bar.example.localduhmain"
-          ]);
-        }
-      }
-    },
-    permutePath: {
-      "base case": {
-        topic: tough.permutePath.bind(null, "/"),
-        "just slash": function(list) {
-          assert.deepEqual(list, ["/"]);
-        }
-      },
-      "single case": {
-        topic: tough.permutePath.bind(null, "/foo"),
-        "two things": function(list) {
-          assert.deepEqual(list, ["/foo", "/"]);
-        },
-        "path matching": function(list) {
-          list.forEach(e => {
-            assert.ok(tough.pathMatch("/foo", e));
-          });
-        }
-      },
-      "double case": {
-        topic: tough.permutePath.bind(null, "/foo/bar"),
-        "four things": function(list) {
-          assert.deepEqual(list, ["/foo/bar", "/foo", "/"]);
-        },
-        "path matching": function(list) {
-          list.forEach(e => {
-            assert.ok(tough.pathMatch("/foo/bar", e));
-          });
-        }
-      },
-      "trailing slash": {
-        topic: tough.permutePath.bind(null, "/foo/bar/"),
-        "three things": function(list) {
-          assert.deepEqual(list, ["/foo/bar/", "/foo/bar", "/foo", "/"]);
-        },
-        "path matching": function(list) {
-          list.forEach(e => {
-            assert.ok(tough.pathMatch("/foo/bar/", e));
-          });
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/ietf_data/dates/bsd-examples.json b/test/ietf_data/dates/bsd-examples.json
deleted file mode 100644
index bc43160..0000000
--- a/test/ietf_data/dates/bsd-examples.json
+++ /dev/null
@@ -1,168 +0,0 @@
-[
-  {
-    "test": "Sat, 15-Apr-17 21:01:22 GMT",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Thu, 19-Apr-2007 16:00:00 GMT",
-    "expected": "Thu, 19 Apr 2007 16:00:00 GMT"
-  }, {
-    "test": "Wed, 25 Apr 2007 21:02:13 GMT",
-    "expected": "Wed, 25 Apr 2007 21:02:13 GMT"
-  }, {
-    "test": "Thu, 19/Apr\\2007 16:00:00 GMT",
-    "expected": "Thu, 19 Apr 2007 16:00:00 GMT"
-  }, {
-    "test": "Fri, 1 Jan 2010 01:01:50 GMT",
-    "expected": "Fri, 01 Jan 2010 01:01:50 GMT"
-  }, {
-    "test": "Wednesday, 1-Jan-2003 00:00:00 GMT",
-    "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
-  }, {
-    "test": ", 1-Jan-2003 00:00:00 GMT",
-    "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
-  }, {
-    "test": " 1-Jan-2003 00:00:00 GMT",
-    "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
-  }, {
-    "test": "1-Jan-2003 00:00:00 GMT",
-    "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
-  }, {
-    "test": "Wed,18-Apr-07 22:50:12 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "WillyWonka  , 18-Apr-07 22:50:12 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "WillyWonka  , 18-Apr-07 22:50:12",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "WillyWonka  ,  18-apr-07   22:50:12",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Mon, 18-Apr-1977 22:50:13 GMT",
-    "expected": "Mon, 18 Apr 1977 22:50:13 GMT"
-  }, {
-    "test": "Mon, 18-Apr-77 22:50:13 GMT",
-    "expected": "Mon, 18 Apr 1977 22:50:13 GMT"
-  }, {
-    "test": "\"Sat, 15-Apr-17\\\"21:01:22\\\"GMT\"",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Partyday, 18- April-07 22:50:12",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Partyday, 18 - Apri-07 22:50:12",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Wednes, 1-Januar-2003 00:00:00 GMT",
-    "expected": "Wed, 01 Jan 2003 00:00:00 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 GMT-2",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 GMT BLAH",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 GMT-0400",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 GMT-0400 (EDT)",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 DST",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 -0400",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 (hello there)",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 11:22:33",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 ::00 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 boink:z 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 91:22:33 21:01:22",
-    "expected": null
-  }, {
-    "test": "Thu Apr 18 22:50:12 2007 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "22:50:12 Thu Apr 18 2007 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Thu 22:50:12 Apr 18 2007 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Thu Apr 22:50:12 18 2007 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Thu Apr 18 22:50:12 2007 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Thu Apr 18 2007 22:50:12 GMT",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Thu Apr 18 2007 GMT 22:50:12",
-    "expected": "Wed, 18 Apr 2007 22:50:12 GMT"
-  }, {
-    "test": "Sat, 15-Apr-17 21:01:22 GMT",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "15-Sat, Apr-17 21:01:22 GMT",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "15-Sat, Apr 21:01:22 GMT 17",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "15-Sat, Apr 21:01:22 GMT 2017",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "15 Apr 21:01:22 2017",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "15 17 Apr 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Apr 15 17 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "Apr 15 21:01:22 17",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "2017 April 15 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "15 April 2017 21:01:22",
-    "expected": "Sat, 15 Apr 2017 21:01:22 GMT"
-  }, {
-    "test": "98 April 17 21:01:22",
-    "expected": null
-  }, {
-    "test": "Thu, 012-Aug-2008 20:49:07 GMT",
-    "expected": null
-  }, {
-    "test": "Thu, 12-Aug-31841 20:49:07 GMT",
-    "expected": null
-  }, {
-    "test": "Thu, 12-Aug-9999999999 20:49:07 GMT",
-    "expected": null
-  }, {
-    "test": "Thu, 999999999999-Aug-2007 20:49:07 GMT",
-    "expected": null
-  }, {
-    "test": "Thu, 12-Aug-2007 20:61:99999999999 GMT",
-    "expected": null
-  }, {
-    "test": "IAintNoDateFool",
-    "expected": null
-  }
-]
diff --git a/test/ietf_data/dates/examples.json b/test/ietf_data/dates/examples.json
deleted file mode 100644
index 61e674d..0000000
--- a/test/ietf_data/dates/examples.json
+++ /dev/null
@@ -1,48 +0,0 @@
-[
-  {
-    "test": "Mon, 10-Dec-2007 17:02:24 GMT",
-    "expected": "Mon, 10 Dec 2007 17:02:24 GMT"
-  }, {
-    "test": "Wed, 09 Dec 2009 16:27:23 GMT",
-    "expected": "Wed, 09 Dec 2009 16:27:23 GMT"
-  }, {
-    "test": "Thursday, 01-Jan-1970 00:00:00 GMT",
-    "expected": "Thu, 01 Jan 1970 00:00:00 GMT"
-  }, {
-    "test": "Mon Dec 10 16:32:30 2007 GMT",
-    "expected": "Mon, 10 Dec 2007 16:32:30 GMT"
-  }, {
-    "test": "Wednesday, 01-Jan-10 00:00:00 GMT",
-    "expected": "Fri, 01 Jan 2010 00:00:00 GMT"
-  }, {
-    "test": "Mon, 10-Dec-07 20:35:03 GMT",
-    "expected": "Mon, 10 Dec 2007 20:35:03 GMT"
-  }, {
-    "test": "Wed, 1 Jan 2020 00:00:00 GMT",
-    "expected": "Wed, 01 Jan 2020 00:00:00 GMT"
-  }, {
-    "test": "Saturday, 8-Dec-2012 21:24:09 GMT",
-    "expected": "Sat, 08 Dec 2012 21:24:09 GMT"
-  }, {
-    "test": "Thu, 31 Dec 23:55:55 2037 GMT",
-    "expected": "Thu, 31 Dec 2037 23:55:55 GMT"
-  }, {
-    "test": "Sun,  9 Dec 2012 13:42:05 GMT",
-    "expected": "Sun, 09 Dec 2012 13:42:05 GMT"
-  }, {
-    "test": "Wed Dec 12 2007 08:44:07 GMT-0500 (EST)",
-    "expected": "Wed, 12 Dec 2007 08:44:07 GMT"
-  }, {
-    "test": "Mon, 01-Jan-2011 00: 00:00 GMT",
-    "expected": null
-  }, {
-    "test": "Sun, 1-Jan-1995 00:00:00 GMT",
-    "expected": "Sun, 01 Jan 1995 00:00:00 GMT"
-  }, {
-    "test": "Wednesday, 01-Jan-10 0:0:00 GMT",
-    "expected": "Fri, 01 Jan 2010 00:00:00 GMT"
-  }, {
-    "test": "Thu, 10 Dec 2009 13:57:2 GMT",
-    "expected": "Thu, 10 Dec 2009 13:57:02 GMT"
-  }
-]
diff --git a/test/ietf_data/parser.json b/test/ietf_data/parser.json
deleted file mode 100644
index 166de9f..0000000
--- a/test/ietf_data/parser.json
+++ /dev/null
@@ -1,1959 +0,0 @@
-[
-  {
-    "test": "0001",
-    "received": [
-      "foo=bar"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0002",
-    "received": [
-      "foo=bar; Expires=Fri, 07 Aug 9999 08:04:19 GMT"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0003",
-    "received": [
-      "foo=bar; Expires=Fri, 07 Aug 2007 08:04:19 GMT",
-      "foo2=bar2; Expires=Fri, 07 Aug 9999 08:04:19 GMT"
-    ],
-    "sent": [
-      { "name": "foo2", "value": "bar2" }
-    ]
-  },
-  {
-    "test": "0004",
-    "received": [
-      "foo"
-    ],
-    "sent": []
-  },
-  {
-    "test": "0005",
-    "received": [
-      "foo=bar; max-age=10000;"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0006",
-    "received": [
-      "foo=bar; max-age=0;"
-    ],
-    "sent": []
-  },
-  {
-    "test": "0007",
-    "received": [
-      "foo=bar; version=1;"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0008",
-    "received": [
-      "foo=bar; version=1000;"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0009",
-    "received": [
-      "foo=bar; customvalue=1000;"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0010",
-    "received": [
-      "foo=bar; secure;"
-    ],
-    "sent": []
-  },
-  {
-    "test": "0011",
-    "received": [
-      "foo=bar; customvalue=\"1000 or more\";"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0012",
-    "received": [
-      "foo=bar; customvalue=\"no trailing semicolon\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "0013",
-    "received": [
-      "foo=bar",
-      "foo=qux"
-    ],
-    "sent": [
-      { "name": "foo", "value": "qux" }
-    ]
-  },
-  {
-    "test": "0014",
-    "received": [
-      "foo1=bar",
-      "foo2=qux"
-    ],
-    "sent": [
-      { "name": "foo1", "value": "bar" },
-      { "name": "foo2", "value": "qux" }
-    ]
-  },
-  {
-    "test": "0015",
-    "received": [
-      "a=b",
-      "z=y"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" },
-      { "name": "z", "value": "y" }
-    ]
-  },
-  {
-    "test": "0016",
-    "received": [
-      "z=y",
-      "a=b"
-    ],
-    "sent": [
-      { "name": "z", "value": "y" },
-      { "name": "a", "value": "b" }
-    ]
-  },
-  {
-    "test": "0017",
-    "received": [
-      "z=y, a=b"
-    ],
-    "sent": [
-      { "name": "z", "value": "y, a=b" }
-    ]
-  },
-  {
-    "test": "0018",
-    "received": [
-      "z=y; foo=bar, a=b"
-    ],
-    "sent": [
-      { "name": "z", "value": "y" }
-    ]
-  },
-  {
-    "test": "0019",
-    "received": [
-      "foo=b;max-age=3600, c=d;path=/"
-    ],
-    "sent": [
-      { "name": "foo", "value": "b" }
-    ]
-  },
-  {
-    "test": "0020",
-    "received": [
-      "a=b",
-      "=",
-      "c=d"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" },
-      { "name": "c", "value": "d" }
-    ]
-  },
-  {
-    "test": "0021",
-    "received": [
-      "a=b",
-      "=x",
-      "c=d"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" },
-      { "name": "c", "value": "d" }
-    ]
-  },
-  {
-    "test": "0022",
-    "received": [
-      "a=b",
-      "x=",
-      "c=d"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" },
-      { "name": "x", "value": "" },
-      { "name": "c", "value": "d" }
-    ]
-  },
-  {
-    "test": "0023",
-    "received": [
-      "foo",
-      ""
-    ],
-    "sent": []
-  },
-  {
-    "test": "0024",
-    "received": [
-      "foo",
-      "="
-    ],
-    "sent": []
-  },
-  {
-    "test": "0025",
-    "received": [
-      "foo",
-      "; bar"
-    ],
-    "sent": []
-  },
-  {
-    "test": "0026",
-    "received": [
-      "foo",
-      "   "
-    ],
-    "sent": []
-  },
-  {
-    "test": "0027",
-    "received": [
-      "foo",
-      "bar"
-    ],
-    "sent": []
-  },
-  {
-    "test": "0028",
-    "received": [
-      "foo",
-      "\t"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0001",
-    "received": [
-      "foo=bar; Secure"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0002",
-    "received": [
-      "foo=bar; seCURe"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0003",
-    "received": [
-      "foo=bar; \"Secure\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0004",
-    "received": [
-      "foo=bar; Secure="
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0005",
-    "received": [
-      "foo=bar; Secure=aaaa"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0006",
-    "received": [
-      "foo=bar; Secure qux"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0007",
-    "received": [
-      "foo=bar; Secure =aaaaa"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0008",
-    "received": [
-      "foo=bar; Secure= aaaaa"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0009",
-    "received": [
-      "foo=bar; Secure; qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0010",
-    "received": [
-      "foo=bar; Secure;qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0011",
-    "received": [
-      "foo=bar; Secure    ; qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0012",
-    "received": [
-      "foo=bar;                Secure"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0013",
-    "received": [
-      "foo=bar;       Secure     ;"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0014",
-    "received": [
-      "foo=bar; Path"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0015",
-    "received": [
-      "foo=bar; Path="
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0016",
-    "received": [
-      "foo=bar; Path=/"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0017",
-    "received": [
-      "foo=bar; Path=/qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0018",
-    "received": [
-      "foo=bar; Path    =/qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0019",
-    "received": [
-      "foo=bar; Path=    /qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0020",
-    "received": [
-      "foo=bar; Path=/qux      ; taz"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0021",
-    "received": [
-      "foo=bar; Path=/qux; Path=/"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0022",
-    "received": [
-      "foo=bar; Path=/; Path=/qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0023",
-    "received": [
-      "foo=bar; Path=/qux; Path=/cookie-parser-result"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "ATTRIBUTE0024",
-    "received": [
-      "foo=bar; Path=/cookie-parser-result; Path=/qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0025",
-    "received": [
-      "foo=bar; qux; Secure"
-    ],
-    "sent": []
-  },
-  {
-    "test": "ATTRIBUTE0026",
-    "received": [
-      "foo=bar; qux=\"aaa;bbb\"; Secure"
-    ],
-    "sent": []
-  },
-  {
-    "test": "CHARSET0001",
-    "received": [
-      "foo=\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c"
-    ],
-    "sent": [
-      { "name": "foo", "value": "\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" }
-    ]
-  },
-  {
-    "test": "CHARSET0002",
-    "received": [
-      "\u6625\u8282\u56de=\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c"
-    ],
-    "sent": [
-      { "name": "\u6625\u8282\u56de", "value": "\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" }
-    ]
-  },
-  {
-    "test": "CHARSET0003",
-    "received": [
-      "\u6625\u8282\u56de=\u5bb6\u8def\u00b7\u6625\u8fd0; \u5b8c\u5168\u624b\u518c"
-    ],
-    "sent": [
-      { "name": "\u6625\u8282\u56de", "value": "\u5bb6\u8def\u00b7\u6625\u8fd0" }
-    ]
-  },
-  {
-    "test": "CHARSET0004",
-    "received": [
-      "foo=\"\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c\"" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0001",
-    "received": [
-      "a=b"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0002",
-    "received": [
-      "aBc=\"zzz \"   ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "\"zzz \"" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0003",
-    "received": [
-      "aBc=\"zzz \" ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "\"zzz \"" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0004",
-    "received": [
-      "aBc=\"zz;pp\" ; ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "\"zz" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0005",
-    "received": [
-      "aBc=\"zz ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "\"zz" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0006",
-    "received": [
-      "aBc=\"zzz \"   \"ppp\"  ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "\"zzz \"   \"ppp\"" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0007",
-    "received": [
-      "aBc=\"zzz \"   \"ppp\" ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "\"zzz \"   \"ppp\"" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0008",
-    "received": [
-      "aBc=A\"B ;"
-    ],
-    "sent": [
-      { "name": "aBc", "value": "A\"B" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0009",
-    "received": [
-      "BLAHHH; path=/;"
-    ],
-    "sent": []
-  },
-  {
-    "test": "CHROMIUM0010",
-    "received": [
-      "\"BLA\\\"HHH\"; path=/;"
-    ],
-    "sent": []
-  },
-  {
-    "test": "CHROMIUM0011",
-    "received": [
-      "a=\"B"
-    ],
-    "sent": [
-      { "name": "a", "value": "\"B" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0012",
-    "received": [
-      "=ABC"
-    ],
-    "sent": []
-  },
-  {
-    "test": "CHROMIUM0013",
-    "received": [
-      "ABC=;  path = /"
-    ],
-    "sent": [
-      { "name": "ABC", "value": "" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0014",
-    "received": [
-      "  A  = BC  ;foo;;;   bar"
-    ],
-    "sent": [
-      { "name": "A", "value": "BC" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0015",
-    "received": [
-      "  A=== BC  ;foo;;;   bar"
-    ],
-    "sent": [
-      { "name": "A", "value": "== BC" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0016",
-    "received": [
-      "foo=\"zohNumRKgI0oxyhSsV3Z7D\"  ; expires=Sun, 18-Apr-2027 21:06:29 GMT ; path=/  ;  "
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"zohNumRKgI0oxyhSsV3Z7D\"" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0017",
-    "received": [
-      "foo=zohNumRKgI0oxyhSsV3Z7D  ; expires=Sun, 18-Apr-2027 21:06:29 GMT ; path=/  ;  "
-    ],
-    "sent": [
-      { "name": "foo", "value": "zohNumRKgI0oxyhSsV3Z7D" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0018",
-    "received": [
-      "    "
-    ],
-    "sent": []
-  },
-  {
-    "test": "CHROMIUM0019",
-    "received": [
-      "a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-    ],
-    "sent": [
-      { "name": "a", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }
-    ]
-  },
-  {
-    "test": "CHROMIUM0021",
-    "received": [
-      ""
-    ],
-    "sent": []
-  },
-  {
-    "test": "COMMA0001",
-    "received": [
-      "foo=bar, baz=qux"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar, baz=qux" }
-    ]
-  },
-  {
-    "test": "COMMA0002",
-    "received": [
-      "foo=\"bar, baz=qux\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"bar, baz=qux\"" }
-    ]
-  },
-  {
-    "test": "COMMA0003",
-    "received": [
-      "foo=bar; b,az=qux"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "COMMA0004",
-    "received": [
-      "foo=bar; baz=q,ux"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "COMMA0005",
-    "received": [
-      "foo=bar; Max-Age=50,399"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "COMMA0006",
-    "received": [
-      "foo=bar; Expires=Fri, 07 Aug 9999 08:04:19 GMT"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "COMMA0007",
-    "received": [
-      "foo=bar; Expires=Fri 07 Aug 9999 08:04:19 GMT, baz=qux"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DISABLED_CHROMIUM0020",
-    "received": [
-      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-    ],
-    "sent": []
-  },
-  {
-    "test": "DISABLED_CHROMIUM0022",
-    "received": [
-      "AAA=BB\u0000ZYX"
-    ],
-    "sent": [
-      { "name": "AAA", "value": "BB" }
-    ]
-  },
-  {
-    "test": "DISABLED_CHROMIUM0023",
-    "received": [
-      "AAA=BB\rZYX"
-    ],
-    "sent": [
-      { "name": "AAA", "value": "BB" }
-    ]
-  },
-  {
-    "test": "DISABLED_PATH0029",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/bar"
-    ],
-    "sent-to": "/cookie-parser-result/f%6Fo/bar?disabled-path0029",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0001",
-    "received": [
-      "foo=bar; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0001",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0002",
-    "received": [
-      "foo=bar; domain=home.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0002",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0003",
-    "received": [
-      "foo=bar; domain=.home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0003",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0004",
-    "received": [
-      "foo=bar; domain=home.example.org"
-    ],
-    "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0004",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0005",
-    "received": [
-      "foo=bar; domain=.home.example.org"
-    ],
-    "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0005",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0006",
-    "received": [
-      "foo=bar; domain=.home.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0006",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0007",
-    "received": [
-      "foo=bar; domain=sibling.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0007",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0008",
-    "received": [
-      "foo=bar; domain=.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0008",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0009",
-    "received": [
-      "foo=bar; domain=example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0009",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0010",
-    "received": [
-      "foo=bar; domain=..home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0010",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0011",
-    "received": [
-      "foo=bar; domain=home..example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0011",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0012",
-    "received": [
-      "foo=bar; domain=  .home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0012",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0013",
-    "received": [
-      "foo=bar; domain=  .  home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0013",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0014",
-    "received": [
-      "foo=bar; domain=home.example.org."
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0014",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0015",
-    "received": [
-      "foo=bar; domain=home.example.org.."
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0015",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0016",
-    "received": [
-      "foo=bar; domain=home.example.org ."
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0016",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0017",
-    "received": [
-      "foo=bar; domain=.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0017",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0018",
-    "received": [
-      "foo=bar; domain=.org."
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0018",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0019",
-    "received": [
-      "foo=bar; domain=home.example.org",
-      "foo2=bar2; domain=.home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0019",
-    "sent": [
-      { "name": "foo", "value": "bar" },
-      { "name": "foo2", "value": "bar2" }
-    ]
-  },
-  {
-    "test": "DOMAIN0020",
-    "received": [
-      "foo2=bar2; domain=.home.example.org",
-      "foo=bar; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0020",
-    "sent": [
-      { "name": "foo2", "value": "bar2" },
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0021",
-    "received": [
-      "foo=bar; domain=\"home.example.org\""
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0021",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0022",
-    "received": [
-      "foo=bar; domain=home.example.org",
-      "foo2=bar2; domain=.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0022",
-    "sent": [
-      { "name": "foo", "value": "bar" },
-      { "name": "foo2", "value": "bar2" }
-    ]
-  },
-  {
-    "test": "DOMAIN0023",
-    "received": [
-      "foo2=bar2; domain=.example.org",
-      "foo=bar; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0023",
-    "sent": [
-      { "name": "foo2", "value": "bar2" },
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0024",
-    "received": [
-      "foo=bar; domain=.example.org; domain=home.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0024",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0025",
-    "received": [
-      "foo=bar; domain=home.example.org; domain=.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0025",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0026",
-    "received": [
-      "foo=bar; domain=home.eXaMpLe.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0026",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0027",
-    "received": [
-      "foo=bar; domain=home.example.org:8888"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0027",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0028",
-    "received": [
-      "foo=bar; domain=subdomain.home.example.org"
-    ],
-    "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0028",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0029",
-    "received": [
-      "foo=bar"
-    ],
-    "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0029",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0031",
-    "received": [
-      "foo=bar; domain=home.example.org; domain=.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0031",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0033",
-    "received": [
-      "foo=bar; domain=home.example.org"
-    ],
-    "sent-to": "http://hoMe.eXaMplE.org:8888/cookie-parser-result?domain0033",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0034",
-    "received": [
-      "foo=bar; domain=home.example.org; domain=home.example.com"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0034",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0035",
-    "received": [
-      "foo=bar; domain=home.example.com; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0035",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0036",
-    "received": [
-      "foo=bar; domain=home.example.org; domain=home.example.com; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0036",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0037",
-    "received": [
-      "foo=bar; domain=home.example.com; domain=home.example.org; domain=home.example.com"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0037",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0038",
-    "received": [
-      "foo=bar; domain=home.example.org; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0038",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0039",
-    "received": [
-      "foo=bar; domain=home.example.org; domain=example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0039",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0040",
-    "received": [
-      "foo=bar; domain=example.org; domain=home.example.org"
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0040",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "DOMAIN0041",
-    "received": [
-      "foo=bar; domain=.sibling.example.org"
-    ],
-    "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0041",
-    "sent": []
-  },
-  {
-    "test": "DOMAIN0042",
-    "received": [
-      "foo=bar; domain=.sibling.home.example.org"
-    ],
-    "sent-to": "http://sibling.home.example.org:8888/cookie-parser-result?domain0042",
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0001",
-    "received": [
-      "foo=bar; max-age=-1"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0002",
-    "received": [
-      "foo=bar; max-age=0"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0003",
-    "received": [
-      "foo=bar; expires=Thu, 10 Apr 1980 16:33:12 GMT"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0004",
-    "received": [
-      "foo=bar; max-age=60"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "MOZILLA0005",
-    "received": [
-      "foo=bar; max-age=-20"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0006",
-    "received": [
-      "foo=bar; max-age=60"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "MOZILLA0007",
-    "received": [
-      "foo=bar; expires=Thu, 10 Apr 1980 16:33:12 GMT"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0008",
-    "received": [
-      "foo=bar; max-age=60",
-      "foo1=bar; max-age=60"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" },
-      { "name": "foo1", "value": "bar" }
-    ]
-  },
-  {
-    "test": "MOZILLA0009",
-    "received": [
-      "foo=bar; max-age=60",
-      "foo1=bar; max-age=60",
-      "foo=differentvalue; max-age=0"
-    ],
-    "sent": [
-      { "name": "foo1", "value": "bar" }
-    ]
-  },
-  {
-    "test": "MOZILLA0010",
-    "received": [
-      "foo=bar; max-age=60",
-      "foo1=bar; max-age=60",
-      "foo=differentvalue; max-age=0",
-      "foo2=evendifferentvalue; max-age=0"
-    ],
-    "sent": [
-      { "name": "foo1", "value": "bar" }
-    ]
-  },
-  {
-    "test": "MOZILLA0011",
-    "received": [
-      "test=parser; domain=.parser.test; ;; ;=; ,,, ===,abc,=; abracadabra! max-age=20;=;;"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0012",
-    "received": [
-      "test=\"fubar! = foo;bar\\\";\" parser; max-age=6",
-      "five; max-age=2.63,"
-    ],
-    "sent": [
-      { "name": "test", "value": "\"fubar! = foo" }
-    ]
-  },
-  {
-    "test": "MOZILLA0013",
-    "received": [
-      "test=kill; max-age=0",
-      "five; max-age=0"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0014",
-    "received": [
-      "six"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0015",
-    "received": [
-      "six",
-      "seven"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0016",
-    "received": [
-      "six",
-      "seven",
-      " =eight"
-    ],
-    "sent": []
-  },
-  {
-    "test": "MOZILLA0017",
-    "received": [
-      "six",
-      "seven",
-      " =eight",
-      "test=six"
-    ],
-    "sent": [
-      { "name": "test", "value": "six" }
-    ]
-  },
-  {
-    "test": "NAME0001",
-    "received": [
-      "a=bar"
-    ],
-    "sent": [
-      { "name": "a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0002",
-    "received": [
-      "1=bar"
-    ],
-    "sent": [
-      { "name": "1", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0003",
-    "received": [
-      "$=bar"
-    ],
-    "sent": [
-      { "name": "$", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0004",
-    "received": [
-      "!a=bar"
-    ],
-    "sent": [
-      { "name": "!a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0005",
-    "received": [
-      "@a=bar"
-    ],
-    "sent": [
-      { "name": "@a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0006",
-    "received": [
-      "#a=bar"
-    ],
-    "sent": [
-      { "name": "#a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0007",
-    "received": [
-      "$a=bar"
-    ],
-    "sent": [
-      { "name": "$a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0008",
-    "received": [
-      "%a=bar"
-    ],
-    "sent": [
-      { "name": "%a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0009",
-    "received": [
-      "^a=bar"
-    ],
-    "sent": [
-      { "name": "^a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0010",
-    "received": [
-      "&a=bar"
-    ],
-    "sent": [
-      { "name": "&a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0011",
-    "received": [
-      "*a=bar"
-    ],
-    "sent": [
-      { "name": "*a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0012",
-    "received": [
-      "(a=bar"
-    ],
-    "sent": [
-      { "name": "(a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0013",
-    "received": [
-      ")a=bar"
-    ],
-    "sent": [
-      { "name": ")a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0014",
-    "received": [
-      "-a=bar"
-    ],
-    "sent": [
-      { "name": "-a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0015",
-    "received": [
-      "_a=bar"
-    ],
-    "sent": [
-      { "name": "_a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0016",
-    "received": [
-      "+=bar"
-    ],
-    "sent": [
-      { "name": "+", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0017",
-    "received": [
-      "=a=bar"
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0018",
-    "received": [
-      "a =bar"
-    ],
-    "sent": [
-      { "name": "a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0019",
-    "received": [
-      "\"a=bar"
-    ],
-    "sent": [
-      { "name": "\"a", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0020",
-    "received": [
-      "\"a=b\"=bar"
-    ],
-    "sent": [
-      { "name": "\"a", "value": "b\"=bar" }
-    ]
-  },
-  {
-    "test": "NAME0021",
-    "received": [
-      "\"a=b\"=bar",
-      "\"a=qux"
-    ],
-    "sent": [
-      { "name": "\"a", "value": "qux" }
-    ]
-  },
-  {
-    "test": "NAME0022",
-    "received": [
-      "   foo=bar"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0023",
-    "received": [
-      "foo;bar=baz"
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0024",
-    "received": [
-      "$Version=1; foo=bar"
-    ],
-    "sent": [
-      { "name": "$Version", "value": "1" }
-    ]
-  },
-  {
-    "test": "NAME0025",
-    "received": [
-      "===a=bar"
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0026",
-    "received": [
-      "foo=bar    "
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0027",
-    "received": [
-      "foo=bar    ;"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "NAME0028",
-    "received": [
-      "=a"
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0029",
-    "received": [
-      "="
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0030",
-    "received": [
-      "foo bar=baz"
-    ],
-    "sent": [
-      { "name": "foo bar", "value": "baz" }
-    ]
-  },
-  {
-    "test": "NAME0031",
-    "received": [
-      "\"foo;bar\"=baz"
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0032",
-    "received": [
-      "\"foo\\\"bar;baz\"=qux"
-    ],
-    "sent": []
-  },
-  {
-    "test": "NAME0033",
-    "received": [
-      "=foo=bar",
-      "aaa"
-    ],
-    "sent": []
-  },
-  {
-    "test": "OPTIONAL_DOMAIN0030",
-    "received": [
-      "foo=bar; domain="
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0030",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "OPTIONAL_DOMAIN0041",
-    "received": [
-      "foo=bar; domain=example.org; domain="
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0041",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "OPTIONAL_DOMAIN0042",
-    "received": [
-      "foo=bar; domain=foo.example.org; domain="
-    ],
-    "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0042",
-    "sent": []
-  },
-  {
-    "test": "OPTIONAL_DOMAIN0043",
-    "received": [
-      "foo=bar; domain=foo.example.org; domain="
-    ],
-    "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?optional-domain0043",
-    "sent": []
-  },
-  {
-    "test": "ORDERING0001",
-    "received": [
-      "key=val0;",
-      "key=val1; path=/cookie-parser-result",
-      "key=val2; path=/",
-      "key=val3; path=/bar",
-      "key=val4; domain=.example.org",
-      "key=val5; domain=.example.org; path=/cookie-parser-result/foo"
-    ],
-    "sent-to": "/cookie-parser-result/foo/baz?ordering0001",
-    "sent": [
-      { "name": "key", "value": "val5" },
-      { "name": "key", "value": "val1" },
-      { "name": "key", "value": "val2" },
-      { "name": "key", "value": "val4" }
-    ]
-  },
-  {
-    "test": "PATH0001",
-    "received": [
-      "a=b; path=/",
-      "x=y; path=/cookie-parser-result"
-    ],
-    "sent": [
-      { "name": "x", "value": "y" },
-      { "name": "a", "value": "b" }
-    ]
-  },
-  {
-    "test": "PATH0002",
-    "received": [
-      "a=b; path=/cookie-parser-result",
-      "x=y; path=/"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" },
-      { "name": "x", "value": "y" }
-    ]
-  },
-  {
-    "test": "PATH0003",
-    "received": [
-      "x=y; path=/",
-      "a=b; path=/cookie-parser-result"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" },
-      { "name": "x", "value": "y" }
-    ]
-  },
-  {
-    "test": "PATH0004",
-    "received": [
-      "x=y; path=/cookie-parser-result",
-      "a=b; path=/"
-    ],
-    "sent": [
-      { "name": "x", "value": "y" },
-      { "name": "a", "value": "b" }
-    ]
-  },
-  {
-    "test": "PATH0005",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo"
-    ],
-    "sent": []
-  },
-  {
-    "test": "PATH0006",
-    "received": [
-      "foo=bar",
-      "foo=qux; path=/cookie-parser-result/foo"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0007",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo"
-    ],
-    "sent-to": "/cookie-parser-result/foo?path0007",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0008",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo"
-    ],
-    "sent-to": "/cookie-parser-result/bar?path0008",
-    "sent": []
-  },
-  {
-    "test": "PATH0009",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux"
-    ],
-    "sent-to": "/cookie-parser-result/foo?path0009",
-    "sent": []
-  },
-  {
-    "test": "PATH0010",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0010",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0011",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux"
-    ],
-    "sent-to": "/cookie-parser-result/bar/qux?path0011",
-    "sent": []
-  },
-  {
-    "test": "PATH0012",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux"
-    ],
-    "sent-to": "/cookie-parser-result/foo/baz?path0012",
-    "sent": []
-  },
-  {
-    "test": "PATH0013",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux/"
-    ],
-    "sent-to": "/cookie-parser-result/foo/baz?path0013",
-    "sent": []
-  },
-  {
-    "test": "PATH0014",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux/"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0014",
-    "sent": []
-  },
-  {
-    "test": "PATH0015",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux/"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux/?path0015",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0016",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0016",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0017",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/"
-    ],
-    "sent-to": "/cookie-parser-result/foo//qux?path0017",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0018",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/"
-    ],
-    "sent-to": "/cookie-parser-result/fooqux?path0018",
-    "sent": []
-  },
-  {
-    "test": "PATH0019",
-    "received": [
-      "foo=bar; path"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0020",
-    "received": [
-      "foo=bar; path="
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0021",
-    "received": [
-      "foo=bar; path=/"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0022",
-    "received": [
-      "foo=bar; path= /"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0023",
-    "received": [
-      "foo=bar; Path=/cookie-PARSER-result"
-    ],
-    "sent": []
-  },
-  {
-    "test": "PATH0024",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux?"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0024",
-    "sent": []
-  },
-  {
-    "test": "PATH0025",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux#"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0025",
-    "sent": []
-  },
-  {
-    "test": "PATH0026",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/foo/qux;"
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0026",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0027",
-    "received": [
-      "foo=bar; path=\"/cookie-parser-result/foo/qux;\""
-    ],
-    "sent-to": "/cookie-parser-result/foo/qux?path0027",
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0028",
-    "received": [
-      "foo=bar; path=/cookie-parser-result/f%6Fo/bar"
-    ],
-    "sent-to": "/cookie-parser-result/foo/bar?path0028",
-    "sent": []
-  },
-  {
-    "test": "PATH0029",
-    "received": [
-      "a=b; \tpath\t=\t/cookie-parser-result\t",
-      "x=y; \tpath\t=\t/book\t"
-    ],
-    "sent": [
-      { "name": "a", "value": "b" }
-    ]
-  },
-  {
-    "test": "PATH0030",
-    "received": [
-      "foo=bar; path=/dog; path="
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "PATH0031",
-    "received": [
-      "foo=bar; path=; path=/dog"
-    ],
-    "sent": []
-  },
-  {
-    "test": "PATH0032",
-    "received": [
-      "foo=bar; path=/cookie-parser-result",
-      "foo=qux; path=/cookie-parser-result/"
-    ],
-    "sent-to": "/cookie-parser-result/dog?path0032",
-    "sent": [
-      { "name": "foo", "value": "qux" },
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "VALUE0001",
-    "received": [
-      "foo=  bar"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  },
-  {
-    "test": "VALUE0002",
-    "received": [
-      "foo=\"bar\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"bar\"" }
-    ]
-  },
-  {
-    "test": "VALUE0003",
-    "received": [
-      "foo=\"  bar \""
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"  bar \"" }
-    ]
-  },
-  {
-    "test": "VALUE0004",
-    "received": [
-      "foo=\"bar;baz\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"bar" }
-    ]
-  },
-  {
-    "test": "VALUE0005",
-    "received": [
-      "foo=\"bar=baz\""
-    ],
-    "sent": [
-      { "name": "foo", "value": "\"bar=baz\"" }
-    ]
-  },
-  {
-    "test": "VALUE0006",
-    "received": [
-      "\tfoo\t=\tbar\t \t;\tttt"
-    ],
-    "sent": [
-      { "name": "foo", "value": "bar" }
-    ]
-  }
-]
diff --git a/test/ietf_test.js b/test/ietf_test.js
deleted file mode 100644
index 1529ea0..0000000
--- a/test/ietf_test.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const fs = require("fs");
-const path = require("path");
-const url = require("url");
-const tough = require("../lib/cookie");
-const CookieJar = tough.CookieJar;
-
-function readJson(filePath) {
-  filePath = path.join(__dirname, filePath);
-  return JSON.parse(fs.readFileSync(filePath).toString());
-}
-
-function setGetCookieVows() {
-  const theVows = {};
-  const data = readJson("./ietf_data/parser.json");
-
-  data.forEach(testCase => {
-    theVows[testCase.test] = function() {
-      const jar = new CookieJar();
-      const expected = testCase["sent"];
-      const sentFrom = `http://home.example.org/cookie-parser?${testCase.test}`;
-      const sentTo = testCase["sent-to"]
-        ? url.resolve("http://home.example.org", testCase["sent-to"])
-        : `http://home.example.org/cookie-parser-result?${testCase.test}`;
-
-      testCase["received"].forEach(cookieStr => {
-        jar.setCookieSync(cookieStr, sentFrom, { ignoreError: true });
-      });
-
-      const actual = jar.getCookiesSync(sentTo, { sort: true });
-
-      assert.strictEqual(actual.length, expected.length);
-
-      actual.forEach((actualCookie, idx) => {
-        const expectedCookie = expected[idx];
-        assert.strictEqual(actualCookie.key, expectedCookie.name);
-        assert.strictEqual(actualCookie.value, expectedCookie.value);
-      });
-    };
-  });
-
-  return { "Set/get cookie tests": theVows };
-}
-
-function dateVows() {
-  const theVows = {};
-
-  [
-    "./ietf_data/dates/bsd-examples.json",
-    "./ietf_data/dates/examples.json"
-  ].forEach(filePath => {
-    const data = readJson(filePath);
-    const fileName = path.basename(filePath);
-
-    data.forEach(testCase => {
-      theVows[`${fileName} : ${testCase.test}`] = function() {
-        let actual = tough.parseDate(testCase.test);
-        actual = actual ? actual.toUTCString() : null;
-        assert.strictEqual(actual, testCase.expected);
-      };
-    });
-  });
-
-  return { Date: theVows };
-}
-
-vows
-  .describe("IETF http state tests")
-  .addBatch(setGetCookieVows())
-  .addBatch(dateVows())
-  .export(module);
diff --git a/test/jar_serialization_test.js b/test/jar_serialization_test.js
deleted file mode 100644
index dfa2fb3..0000000
--- a/test/jar_serialization_test.js
+++ /dev/null
@@ -1,436 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-const Store = tough.Store;
-const MemoryCookieStore = tough.MemoryCookieStore;
-
-const domains = ["example.com", "www.example.com", "example.net"];
-const paths = ["/", "/foo", "/foo/bar"];
-
-const isInteger =
-  Number.isInteger ||
-  function(value) {
-    // Node 0.10 (still supported) doesn't have Number.isInteger
-    // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
-    return (
-      typeof value === "number" &&
-      isFinite(value) &&
-      Math.floor(value) === value
-    );
-  };
-
-function setUp(context) {
-  context.now = new Date();
-  context.nowISO = context.now.toISOString();
-  context.expires = new Date(context.now.getTime() + 86400000);
-
-  let c, domain;
-  context.jar = new CookieJar();
-
-  context.totalCookies = 0;
-
-  // Do paths first since the MemoryCookieStore index is domain at the top
-  // level. This should cause the preservation of creation order in
-  // getAllCookies to be exercised.
-  for (let i = 0; i < paths.length; i++) {
-    const path = paths[i];
-    for (let j = 0; j < domains.length; j++) {
-      domain = domains[j];
-      c = new Cookie({
-        expires: context.expires,
-        domain: domain,
-        path: path,
-        key: "key",
-        value: `value${j}${i}`
-      });
-      context.jar.setCookieSync(c, `http://${domain}/`, {
-        now: context.now
-      });
-      context.totalCookies++;
-    }
-  }
-
-  // corner cases
-  const cornerCases = [
-    { expires: "Infinity", key: "infExp", value: "infExp" },
-    { maxAge: 3600, key: "max", value: "max" },
-    {
-      expires: context.expires,
-      key: "flags",
-      value: "flags",
-      secure: true,
-      httpOnly: true
-    },
-    {
-      expires: context.expires,
-      key: "honly",
-      value: "honly",
-      hostOnly: true,
-      domain: "www.example.org"
-    }
-  ];
-
-  for (let i = 0; i < cornerCases.length; i++) {
-    cornerCases[i].domain = cornerCases[i].domain || "example.org";
-    cornerCases[i].path = "/";
-    c = new Cookie(cornerCases[i]);
-    context.jar.setCookieSync(c, "https://www.example.org/", {
-      now: context.now
-    });
-    context.totalCookies++;
-  }
-}
-
-function checkMetadata(serialized) {
-  assert.notEqual(serialized, null);
-  assert.isObject(serialized);
-  assert.equal(serialized.version, `tough-cookie@${tough.version}`);
-  assert.equal(serialized.storeType, "MemoryCookieStore");
-  assert.typeOf(serialized.rejectPublicSuffixes, "boolean");
-  assert.isArray(serialized.cookies);
-}
-
-const serializedCookiePropTypes = {
-  key: "string",
-  value: "string",
-  expires: "isoDate", // if "Infinity" it's supposed to be missing
-  maxAge: "intOrInf",
-  domain: "string",
-  path: "string",
-  secure: "boolean",
-  httpOnly: "boolean",
-  extensions: "array", // of strings, technically
-  hostOnly: "boolean",
-  pathIsDefault: "boolean",
-  creation: "isoDate",
-  lastAccessed: "isoDate",
-  sameSite: "string"
-};
-
-function validateSerializedCookie(cookie) {
-  assert.isObject(cookie);
-  assert.isFalse(cookie instanceof Cookie);
-
-  Object.keys(cookie).forEach(prop => {
-    const type = serializedCookiePropTypes[prop];
-    switch (type) {
-      case "string":
-      case "boolean":
-      case "array":
-      case "number":
-        assert.typeOf(cookie[prop], type);
-        break;
-
-      case "intOrInf":
-        if (cookie[prop] === "Infinity" || cookie[prop] === "-Infinity") {
-          assert(true);
-        } else {
-          assert(
-            isInteger(cookie[prop]),
-            `serialized property isn't integer: ${prop}`
-          );
-        }
-        break;
-
-      case "isoDate":
-        // rather than a regexp, assert it's parsable and equal
-        const parsed = Date.parse(cookie[prop]);
-        assert(parsed, "could not parse serialized date property");
-        // assert.equals(cookie[prop], parsed.toISOString());
-        break;
-
-      default:
-        assert.fail(`unexpected serialized property: ${prop}`);
-    }
-  });
-}
-
-vows
-  .describe("CookieJar serialization")
-  .addBatch({
-    "Assumptions:": {
-      "serializableProperties all accounted for": function() {
-        const actualKeys = Cookie.serializableProperties.concat([]); // copy
-        actualKeys.sort();
-        const expectedKeys = Object.keys(serializedCookiePropTypes);
-        expectedKeys.sort();
-        assert.deepEqual(actualKeys, expectedKeys);
-      }
-    }
-  })
-  .addBatch({
-    "For Stores without getAllCookies": {
-      topic: function() {
-        const store = new Store();
-        store.synchronous = true;
-        const jar = new CookieJar(store);
-        return jar;
-      },
-      "Cannot call toJSON": function(jar) {
-        assert.throws(() => {
-          jar.toJSON();
-        }, /^Error: getAllCookies is not implemented \(therefore jar cannot be serialized\)$/);
-      }
-    }
-  })
-  .addBatch({
-    "For async stores": {
-      topic: function() {
-        const store = new MemoryCookieStore();
-        store.synchronous = false; // pretend it's async
-        const jar = new CookieJar(store);
-        return jar;
-      },
-      "Cannot call toJSON": function(jar) {
-        assert.throws(() => {
-          jar.toJSON();
-        }, /^Error: CookieJar store is not synchronous; use async API instead\.$/);
-      }
-    }
-  })
-  .addBatch({
-    "With a small store": {
-      topic: function() {
-        const now = (this.now = new Date());
-        this.jar = new CookieJar();
-        // domain cookie with custom extension
-        let cookie = Cookie.parse("sid=one; domain=example.com; path=/; fubar");
-        this.jar.setCookieSync(cookie, "http://example.com/", {
-          now: this.now
-        });
-
-        cookie = Cookie.parse("sid=two; domain=example.net; path=/; fubar");
-        this.jar.setCookieSync(cookie, "http://example.net/", {
-          now: this.now
-        });
-
-        return this.jar;
-      },
-
-      "serialize synchronously": {
-        topic: function(jar) {
-          return jar.serializeSync();
-        },
-        "it gives a serialization with the two cookies": function(data) {
-          checkMetadata(data);
-          assert.equal(data.cookies.length, 2);
-          data.cookies.forEach(cookie => {
-            validateSerializedCookie(cookie);
-          });
-        },
-        "then deserialize": {
-          topic: function(data) {
-            return CookieJar.deserializeSync(data);
-          },
-          "memstores are identical": function(newJar) {
-            assert.deepEqual(newJar.store, this.jar.store);
-          }
-        },
-        "then deserialize again": {
-          topic: function(data) {
-            return CookieJar.deserializeSync(data);
-          },
-          "memstores are still identical": function(newJar) {
-            assert.deepEqual(newJar.store, this.jar.store);
-          }
-        }
-      },
-
-      "serialize asynchronously": {
-        topic: function(jar) {
-          jar.serialize(this.callback);
-        },
-        "it gives a serialization with the two cookies": function(data) {
-          checkMetadata(data);
-          assert.equal(data.cookies.length, 2);
-          data.cookies.forEach(cookie => {
-            validateSerializedCookie(cookie);
-          });
-        },
-        "then deserialize": {
-          topic: function(data) {
-            CookieJar.deserialize(data, this.callback);
-          },
-          "memstores are identical": function(newJar) {
-            assert.deepEqual(this.jar.store, newJar.store);
-          }
-        }
-      }
-    }
-  })
-  .addBatch({
-    "With a small store for cloning": {
-      topic: function() {
-        this.jar = new CookieJar();
-        // domain cookie with custom extension
-        let cookie = Cookie.parse(
-          "sid=three; domain=example.com; path=/; cloner"
-        );
-        this.jar.setCookieSync(cookie, "http://example.com/", {
-          now: this.now
-        });
-
-        cookie = Cookie.parse("sid=four; domain=example.net; path=/; cloner");
-        this.jar.setCookieSync(cookie, "http://example.net/", {
-          now: this.now
-        });
-
-        return this.jar;
-      },
-
-      "when cloned asynchronously": {
-        topic: function(jar) {
-          this.newStore = new MemoryCookieStore();
-          jar.clone(this.newStore, this.callback);
-        },
-
-        "memstore is same": function(newJar) {
-          assert.deepEqual(this.jar.store, newJar.store);
-          assert.equal(this.newStore, newJar.store); // same object
-        }
-      },
-
-      "when cloned synchronously": {
-        topic: function(jar) {
-          this.newStore = new MemoryCookieStore();
-          return jar.cloneSync(this.newStore);
-        },
-
-        "cloned memstore is same": function(newJar) {
-          assert.deepEqual(this.jar.store, newJar.store);
-          assert.equal(this.newStore, newJar.store); // same object
-        }
-      },
-
-      "when attempting to synchornously clone to an async store": {
-        topic: function(jar) {
-          const newStore = new MemoryCookieStore();
-          newStore.synchronous = false;
-          return newStore;
-        },
-        "throws an error": function(newStore) {
-          const jar = this.jar;
-          assert.throws(() => {
-            jar.cloneSync(newStore);
-          }, /^Error: CookieJar clone destination store is not synchronous; use async API instead\.$/);
-        }
-      }
-    }
-  })
-  .addBatch({
-    "With a moderately-sized store": {
-      topic: function() {
-        setUp(this);
-        this.jar.serialize(this.callback);
-      },
-      "has expected metadata": function(err, jsonObj) {
-        assert.isNull(err);
-        assert.equal(jsonObj.version, `tough-cookie@${tough.version}`);
-        assert.isTrue(jsonObj.rejectPublicSuffixes);
-        assert.equal(jsonObj.storeType, "MemoryCookieStore");
-      },
-      "has a bunch of objects as 'raw' cookies": function(jsonObj) {
-        assert.isArray(jsonObj.cookies);
-        assert.equal(jsonObj.cookies.length, this.totalCookies);
-
-        jsonObj.cookies.forEach(function(cookie) {
-          validateSerializedCookie(cookie);
-
-          if (cookie.key === "key") {
-            assert.match(cookie.value, /^value\d\d/);
-          }
-
-          if (cookie.key === "infExp" || cookie.key === "max") {
-            assert.isUndefined(cookie.expires);
-          } else {
-            assert.strictEqual(cookie.expires, this.expires.toISOString());
-          }
-
-          if (cookie.key === "max") {
-            assert.strictEqual(cookie.maxAge, 3600);
-          } else {
-            assert.isUndefined(cookie.maxAge);
-          }
-
-          assert.equal(cookie.hostOnly, cookie.key === "honly");
-
-          if (cookie.key === "flags") {
-            assert.isTrue(cookie.secure);
-            assert.isTrue(cookie.httpOnly);
-          } else {
-            assert.isUndefined(cookie.secure);
-            assert.isUndefined(cookie.httpOnly);
-          }
-
-          assert.strictEqual(cookie.creation, this.nowISO);
-          assert.strictEqual(cookie.lastAccessed, this.nowISO);
-        }, this);
-      },
-
-      "then taking it for a round-trip": {
-        topic: function(jsonObj) {
-          CookieJar.deserialize(jsonObj, this.callback);
-        },
-        "memstore index is identical": function(err, newJar) {
-          assert.deepEqual(newJar.store.idx, this.jar.store.idx);
-        },
-        "then spot-check retrieval": {
-          topic: function(newJar) {
-            newJar.getCookies("http://example.org/", this.callback);
-          },
-          "gets expected cookies": function(results) {
-            assert.isArray(results);
-            assert.equal(results.length, 2);
-
-            results.forEach(cookie => {
-              assert.instanceOf(cookie, Cookie);
-
-              if (cookie.key === "infExp") {
-                assert.strictEqual(cookie.expires, "Infinity");
-                assert.strictEqual(cookie.TTL(this.now), Infinity);
-              } else if (cookie.key === "max") {
-                assert.strictEqual(cookie.TTL(this.now), 3600 * 1000);
-              } else {
-                assert.fail(`Unexpected cookie key: ${cookie.key}`);
-              }
-            });
-          }
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/lifetime_test.js b/test/lifetime_test.js
deleted file mode 100644
index 0954d6a..0000000
--- a/test/lifetime_test.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-
-vows
-  .describe("Lifetime")
-  .addBatch({
-    "TTL with max-age": function() {
-      const c = new Cookie();
-      c.maxAge = 123;
-      assert.equal(c.TTL(), 123000);
-      assert.equal(c.expiryTime(new Date(9000000)), 9123000);
-    },
-    "TTL with zero max-age": function() {
-      const c = new Cookie();
-      c.key = "a";
-      c.value = "b";
-      c.maxAge = 0; // should be treated as "earliest representable"
-      assert.equal(c.TTL(), 0);
-      assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
-      assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
-    },
-    "TTL with negative max-age": function() {
-      const c = new Cookie();
-      c.key = "a";
-      c.value = "b";
-      c.maxAge = -1; // should be treated as "earliest representable"
-      assert.equal(c.TTL(), 0);
-      assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
-      assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
-    },
-    "TTL with max-age and expires": function() {
-      const c = new Cookie();
-      c.maxAge = 123;
-      c.expires = new Date(Date.now() + 9000);
-      assert.equal(c.TTL(), 123000);
-      assert.ok(c.isPersistent());
-    },
-    "TTL with expires": function() {
-      const c = new Cookie();
-      const now = Date.now();
-      c.expires = new Date(now + 9000);
-      assert.equal(c.TTL(now), 9000);
-      assert.equal(c.expiryTime(), c.expires.getTime());
-    },
-    "TTL with old expires": function() {
-      const c = new Cookie();
-      c.setExpires("17 Oct 2010 00:00:00 GMT");
-      assert.ok(c.TTL() < 0);
-      assert.ok(c.isPersistent());
-    },
-    "default TTL": {
-      topic: function() {
-        return new Cookie();
-      },
-      "is Infinite-future": function(c) {
-        assert.equal(c.TTL(), Infinity);
-      },
-      "is a 'session' cookie": function(c) {
-        assert.ok(!c.isPersistent());
-      }
-    }
-  })
-  .export(module);
diff --git a/test/parsing_test.js b/test/parsing_test.js
deleted file mode 100644
index 09cff69..0000000
--- a/test/parsing_test.js
+++ /dev/null
@@ -1,696 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-
-const LOTS_OF_SEMICOLONS = ";".repeat(65535);
-const LOTS_OF_SPACES = " ".repeat(65535);
-
-vows
-  .describe("Parsing")
-  .addBatch({
-    simple: {
-      topic: function() {
-        return Cookie.parse("a=bcd") || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "a");
-      },
-      value: function(c) {
-        assert.equal(c.value, "bcd");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "with expiry": {
-      topic: function() {
-        return (
-          Cookie.parse("a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT") || null
-        );
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "a");
-      },
-      value: function(c) {
-        assert.equal(c.value, "bcd");
-      },
-      "has expires": function(c) {
-        assert.ok(
-          c.expires !== Infinity,
-          "expiry is infinite when it shouldn't be"
-        );
-        assert.equal(c.expires.getTime(), 1318921503000);
-      }
-    },
-    "with expiry and path": {
-      topic: function() {
-        return (
-          Cookie.parse(
-            'abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc'
-          ) || null
-        );
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "abc");
-      },
-      value: function(c) {
-        assert.equal(c.value, '"xyzzy!"');
-      },
-      "has expires": function(c) {
-        assert.ok(
-          c.expires !== Infinity,
-          "expiry is infinite when it shouldn't be"
-        );
-        assert.equal(c.expires.getTime(), 1318921503000);
-      },
-      "has path": function(c) {
-        assert.equal(c.path, "/aBc");
-      },
-      "no httponly or secure": function(c) {
-        assert.ok(!c.httpOnly);
-        assert.ok(!c.secure);
-      }
-    },
-    "with most things": {
-      topic: function() {
-        return (
-          Cookie.parse(
-            'abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc; Domain=example.com; Secure; HTTPOnly; Max-Age=1234; Foo=Bar; Baz'
-          ) || null
-        );
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "abc");
-      },
-      value: function(c) {
-        assert.equal(c.value, '"xyzzy!"');
-      },
-      "has expires": function(c) {
-        assert.ok(
-          c.expires !== Infinity,
-          "expiry is infinite when it shouldn't be"
-        );
-        assert.equal(c.expires.getTime(), 1318921503000);
-      },
-      "has path": function(c) {
-        assert.equal(c.path, "/aBc");
-      },
-      "has domain": function(c) {
-        assert.equal(c.domain, "example.com");
-      },
-      "has httponly": function(c) {
-        assert.equal(c.httpOnly, true);
-      },
-      "has secure": function(c) {
-        assert.equal(c.secure, true);
-      },
-      "has max-age": function(c) {
-        assert.equal(c.maxAge, 1234);
-      },
-      "has same-site 'none'": function(c) {
-        assert.equal(c.sameSite, "none");
-      },
-      "has extensions": function(c) {
-        assert.ok(c.extensions);
-        assert.equal(c.extensions[0], "Foo=Bar");
-        assert.equal(c.extensions[1], "Baz");
-      }
-    },
-    "invalid expires": function() {
-      const c = Cookie.parse("a=b; Expires=xyzzy");
-      assert.ok(c);
-      assert.equal(c.expires, Infinity);
-    },
-    "zero max-age": function() {
-      const c = Cookie.parse("a=b; Max-Age=0");
-      assert.ok(c);
-      assert.equal(c.maxAge, 0);
-    },
-    "negative max-age": function() {
-      const c = Cookie.parse("a=b; Max-Age=-1");
-      assert.ok(c);
-      assert.equal(c.maxAge, -1);
-    },
-    "empty domain": function() {
-      const c = Cookie.parse("a=b; domain=");
-      assert.ok(c);
-      assert.equal(c.domain, null);
-    },
-    "dot domain": function() {
-      const c = Cookie.parse("a=b; domain=.");
-      assert.ok(c);
-      assert.equal(c.domain, null);
-    },
-    "uppercase domain": function() {
-      const c = Cookie.parse("a=b; domain=EXAMPLE.COM");
-      assert.ok(c);
-      assert.equal(c.domain, "example.com");
-    },
-    "trailing dot in domain": {
-      topic: function() {
-        return Cookie.parse("a=b; Domain=example.com.", true) || null;
-      },
-      "has the domain": function(c) {
-        assert.equal(c.domain, "example.com.");
-      },
-      "but doesn't validate": function(c) {
-        assert.equal(c.validate(), false);
-      }
-    },
-    "empty path": function() {
-      const c = Cookie.parse("a=b; path=");
-      assert.ok(c);
-      assert.equal(c.path, null);
-    },
-    "no-slash path": function() {
-      const c = Cookie.parse("a=b; path=xyzzy");
-      assert.ok(c);
-      assert.equal(c.path, null);
-    },
-    "trailing semi-colons after path": {
-      topic: function() {
-        return ["a=b; path=/;", "c=d;;;;"];
-      },
-      "strips semi-colons": function(t) {
-        const c1 = Cookie.parse(t[0]);
-        const c2 = Cookie.parse(t[1]);
-        assert.ok(c1);
-        assert.ok(c2);
-        assert.equal(c1.path, "/");
-      }
-    },
-    "secure-with-value": function() {
-      const c = Cookie.parse("a=b; Secure=xyzzy");
-      assert.ok(c);
-      assert.equal(c.secure, true);
-    },
-    "httponly-with-value": function() {
-      const c = Cookie.parse("a=b; HttpOnly=xyzzy");
-      assert.ok(c);
-      assert.equal(c.httpOnly, true);
-    },
-    garbage: {
-      topic: function() {
-        return Cookie.parse("\x08", true) || null;
-      },
-      "doesn't parse": function(c) {
-        assert.equal(c, null);
-      }
-    },
-    "public suffix domain": {
-      topic: function() {
-        return Cookie.parse("a=b; domain=kyoto.jp", true) || null;
-      },
-      "parses fine": function(c) {
-        assert.ok(c);
-        assert.equal(c.domain, "kyoto.jp");
-      },
-      "but fails validation": function(c) {
-        assert.ok(c);
-        assert.ok(!c.validate());
-      }
-    },
-    "public suffix foonet.net": {
-      "top level": {
-        topic: function() {
-          return Cookie.parse("a=b; domain=foonet.net") || null;
-        },
-        "parses and is valid": function(c) {
-          assert.ok(c);
-          assert.equal(c.domain, "foonet.net");
-          assert.ok(c.validate());
-        }
-      },
-      www: {
-        topic: function() {
-          return Cookie.parse("a=b; domain=www.foonet.net") || null;
-        },
-        "parses and is valid": function(c) {
-          assert.ok(c);
-          assert.equal(c.domain, "www.foonet.net");
-          assert.ok(c.validate());
-        }
-      },
-      "with a dot": {
-        topic: function() {
-          return Cookie.parse("a=b; domain=.foonet.net") || null;
-        },
-        "parses and is valid": function(c) {
-          assert.ok(c);
-          assert.equal(c.domain, "foonet.net");
-          assert.ok(c.validate());
-        }
-      }
-    },
-    "Ironically, Google 'GAPS' cookie has very little whitespace": {
-      topic: function() {
-        return Cookie.parse(
-          "GAPS=1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-;Path=/;Expires=Thu, 17-Apr-2014 02:12:29 GMT;Secure;HttpOnly"
-        );
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "GAPS");
-      },
-      value: function(c) {
-        assert.equal(
-          c.value,
-          "1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-"
-        );
-      },
-      path: function(c) {
-        assert.notEqual(c.path, "/;Expires"); // BUG
-        assert.equal(c.path, "/");
-      },
-      expires: function(c) {
-        assert.notEqual(c.expires, Infinity);
-        assert.equal(c.expires.getTime(), 1397700749000);
-      },
-      secure: function(c) {
-        assert.ok(c.secure);
-      },
-      httponly: function(c) {
-        assert.ok(c.httpOnly);
-      }
-    },
-    "lots of equal signs": {
-      topic: function() {
-        return Cookie.parse(
-          "queryPref=b=c&d=e; Path=/f=g; Expires=Thu, 17 Apr 2014 02:12:29 GMT; HttpOnly"
-        );
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "queryPref");
-      },
-      value: function(c) {
-        assert.equal(c.value, "b=c&d=e");
-      },
-      path: function(c) {
-        assert.equal(c.path, "/f=g");
-      },
-      expires: function(c) {
-        assert.notEqual(c.expires, Infinity);
-        assert.equal(c.expires.getTime(), 1397700749000);
-      },
-      httponly: function(c) {
-        assert.ok(c.httpOnly);
-      }
-    },
-    "spaces in value": {
-      topic: function() {
-        return Cookie.parse("a=one two three", false) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "a");
-      },
-      value: function(c) {
-        assert.equal(c.value, "one two three");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "quoted spaces in value": {
-      topic: function() {
-        return Cookie.parse('a="one two three"', false) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "a");
-      },
-      value: function(c) {
-        assert.equal(c.value, '"one two three"');
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "non-ASCII in value": {
-      topic: function() {
-        return Cookie.parse("farbe=weiß", false) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "farbe");
-      },
-      value: function(c) {
-        assert.equal(c.value, "weiß");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "empty key": {
-      topic: function() {
-        return Cookie.parse("=abc", { loose: true }) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "");
-      },
-      value: function(c) {
-        assert.equal(c.value, "abc");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "non-existent key": {
-      topic: function() {
-        return Cookie.parse("abc", { loose: true }) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "");
-      },
-      value: function(c) {
-        assert.equal(c.value, "abc");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "weird format": {
-      topic: function() {
-        return Cookie.parse("=foo=bar", { loose: true }) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "foo");
-      },
-      value: function(c) {
-        assert.equal(c.value, "bar");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, null);
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "way too many semicolons followed by non-semicolon": {
-      topic: function() {
-        // takes abnormally long due to semi-catastrophic regexp backtracking
-        const str = `foo=bar${LOTS_OF_SEMICOLONS} domain=example.com`;
-        return Cookie.parse(str) || null;
-      },
-      parsed: function(c) {
-        assert.ok(c);
-      },
-      key: function(c) {
-        assert.equal(c.key, "foo");
-      },
-      value: function(c) {
-        assert.equal(c.value, "bar");
-      },
-      "no path": function(c) {
-        assert.equal(c.path, null);
-      },
-      "no domain": function(c) {
-        assert.equal(c.domain, "example.com");
-      },
-      "no extensions": function(c) {
-        assert.ok(!c.extensions);
-      }
-    },
-    "way too many spaces": {
-      topic: function() {
-        // takes abnormally long due to semi-catastrophic regexp backtracking
-        const str1 = `x${LOTS_OF_SPACES}x`;
-        const str2 = "x x";
-        const t0 = Date.now();
-        const cookie1 = Cookie.parse(str1) || null;
-        const t1 = Date.now();
-        const cookie2 = Cookie.parse(str2) || null;
-        const t2 = Date.now();
-        return {
-          cookie1: cookie1,
-          cookie2: cookie2,
-          dt1: t1 - t0,
-          dt2: t2 - t1
-        };
-      },
-      "large one doesn't parse": function(c) {
-        assert.equal(c.cookie1, null);
-      },
-      "small one doesn't parse": function(c) {
-        assert.equal(c.cookie2, null);
-      },
-      "takes about the same time for each": function(c) {
-        const long1 = c.dt1 + 1; // avoid 0ms
-        const short2 = c.dt2 + 1; // avoid 0ms
-        const ratio = Math.abs(long1 / short2);
-        assert.lesser(ratio, 250); // if broken, goes 2000-4000x
-      }
-    },
-    "way too many spaces with value": {
-      topic: function() {
-        // takes abnormally long due to semi-catastrophic regexp backtracking
-        const str1 = `x${LOTS_OF_SPACES}=x`;
-        const str2 = "x =x";
-        const t0 = Date.now();
-        const cookie1 = Cookie.parse(str1) || null;
-        const t1 = Date.now();
-        const cookie2 = Cookie.parse(str2) || null;
-        const t2 = Date.now();
-        return {
-          cookie1: cookie1,
-          cookie2: cookie2,
-          dt1: t1 - t0,
-          dt2: t2 - t1
-        };
-      },
-      "large one parses": function(c) {
-        assert.ok(c.cookie1);
-        assert.equal(c.cookie1.key, "x");
-        assert.equal(c.cookie1.value, "x");
-      },
-      "small one parses": function(c) {
-        assert.ok(c.cookie2);
-        assert.equal(c.cookie2.key, "x");
-        assert.equal(c.cookie2.value, "x");
-      },
-      "takes about the same time for each": function(c) {
-        const long1 = c.dt1 + 1; // avoid 0ms
-        const short2 = c.dt2 + 1; // avoid 0ms
-        const ratio = Math.abs(long1 / short2);
-        assert.lesser(ratio, 250); // if broken, goes 2000-4000x
-      }
-    },
-    "way too many spaces in loose mode": {
-      topic: function() {
-        // takes abnormally long due to semi-catastrophic regexp backtracking
-        const str1 = `x${LOTS_OF_SPACES}x`;
-        const str2 = "x x";
-        const t0 = Date.now();
-        const cookie1 = Cookie.parse(str1, { loose: true }) || null;
-        const t1 = Date.now();
-        const cookie2 = Cookie.parse(str2, { loose: true }) || null;
-        const t2 = Date.now();
-        return {
-          cookie1: cookie1,
-          cookie2: cookie2,
-          dt1: t1 - t0,
-          dt2: t2 - t1
-        };
-      },
-      "large one parses": function(c) {
-        assert.ok(c.cookie1);
-        assert.equal(c.cookie1.key, "");
-        assert.equal(c.cookie1.value, `x${LOTS_OF_SPACES}x`);
-      },
-      "small one parses": function(c) {
-        assert.ok(c.cookie2);
-        assert.equal(c.cookie2.key, "");
-        assert.equal(c.cookie2.value, "x x");
-      },
-      "takes about the same time for each": function(c) {
-        const long1 = c.dt1 + 1; // avoid 0ms
-        const short2 = c.dt2 + 1; // avoid 0ms
-        const ratio = Math.abs(long1 / short2);
-        assert.lesser(ratio, 250); // if broken, goes 2000-4000x
-      }
-    },
-    "way too many spaces with value in loose mode": {
-      topic: function() {
-        // takes abnormally long due to semi-catastrophic regexp backtracking
-        const str1 = `x${LOTS_OF_SPACES}=x`;
-        const str2 = "x =x";
-        const t0 = Date.now();
-        const cookie1 = Cookie.parse(str1, { loose: true }) || null;
-        const t1 = Date.now();
-        const cookie2 = Cookie.parse(str2, { loose: true }) || null;
-        const t2 = Date.now();
-        return {
-          cookie1: cookie1,
-          cookie2: cookie2,
-          dt1: t1 - t0,
-          dt2: t2 - t1
-        };
-      },
-      "large one parses": function(c) {
-        assert.ok(c.cookie1);
-        assert.equal(c.cookie1.key, "x");
-        assert.equal(c.cookie1.value, "x");
-      },
-      "small one parses": function(c) {
-        assert.ok(c.cookie2);
-        assert.equal(c.cookie2.key, "x");
-        assert.equal(c.cookie2.value, "x");
-      },
-      "takes about the same time for each": function(c) {
-        const long1 = c.dt1 + 1; // avoid 0ms
-        const short2 = c.dt2 + 1; // avoid 0ms
-        const ratio = Math.abs(long1 / short2);
-        assert.lesser(ratio, 250); // if broken, goes 2000-4000x
-      }
-    },
-
-    "same-site": {
-      lax: {
-        topic: function() {
-          return Cookie.parse("abc=xyzzy; SameSite=Lax") || null;
-        },
-        parsed: function(c) {
-          assert.ok(c);
-        },
-        "is lax (lowercased)": function(c) {
-          assert.equal(c.sameSite, "lax");
-        },
-        "no extensions": function(c) {
-          assert.equal(c.extensions, null);
-        }
-      },
-      strict: {
-        topic: function() {
-          return Cookie.parse("abc=xyzzy; SameSite=StRiCt") || null;
-        },
-        parsed: function(c) {
-          assert.ok(c);
-        },
-        "is strict (lowercased)": function(c) {
-          assert.equal(c.sameSite, "strict");
-        },
-        "no extensions": function(c) {
-          assert.equal(c.extensions, null);
-        }
-      },
-      absent: {
-        topic: function() {
-          return Cookie.parse("abc=xyzzy; SameSite=example.com") || null;
-        },
-        parsed: function(c) {
-          assert.ok(c);
-        },
-        "is set to 'none' (by prototype)": function(c) {
-          assert.equal(c.sameSite, "none");
-        },
-        "no extensions": function(c) {
-          assert.equal(c.extensions, null);
-        }
-      }
-    }
-  })
-  .export(module);
diff --git a/test/regression_test.js b/test/regression_test.js
deleted file mode 100644
index 6bb4839..0000000
--- a/test/regression_test.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const async = require("async");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-
-const atNow = Date.now();
-
-function at(offset) {
-  return { now: new Date(atNow + offset) };
-}
-
-vows
-  .describe("Regression tests")
-  .addBatch({
-    "Issue 1": {
-      topic: function() {
-        const cj = new CookieJar();
-        cj.setCookie(
-          "hello=world; path=/some/path/",
-          "http://domain/some/path/file",
-          (err, cookie) => {
-            this.callback(err, { cj: cj, cookie: cookie });
-          }
-        );
-      },
-      "stored a cookie": function(t) {
-        assert.ok(t.cookie);
-      },
-      "getting it back": {
-        topic: function(t) {
-          t.cj.getCookies("http://domain/some/path/file", (err, cookies) => {
-            this.callback(err, { cj: t.cj, cookies: cookies || [] });
-          });
-        },
-        "got one cookie": function(t) {
-          assert.lengthOf(t.cookies, 1);
-        },
-        "it's the right one": function(t) {
-          const c = t.cookies[0];
-          assert.equal(c.key, "hello");
-          assert.equal(c.value, "world");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "trailing semi-colon set into cj": {
-      topic: function() {
-        const cb = this.callback;
-        const cj = new CookieJar();
-        const ex = "http://www.example.com";
-        const tasks = [];
-        tasks.push(next => {
-          cj.setCookie("broken_path=testme; path=/;", ex, at(-1), next);
-        });
-        tasks.push(next => {
-          cj.setCookie("b=2; Path=/;;;;", ex, at(-1), next);
-        });
-        async.parallel(tasks, (err, cookies) => {
-          cb(null, {
-            cj: cj,
-            cookies: cookies
-          });
-        });
-      },
-      "check number of cookies": function(t) {
-        assert.lengthOf(t.cookies, 2, "didn't set");
-      },
-      "check *broken_path* was set properly": function(t) {
-        assert.equal(t.cookies[0].key, "broken_path");
-        assert.equal(t.cookies[0].value, "testme");
-        assert.equal(t.cookies[0].path, "/");
-      },
-      "check *b* was set properly": function(t) {
-        assert.equal(t.cookies[1].key, "b");
-        assert.equal(t.cookies[1].value, "2");
-        assert.equal(t.cookies[1].path, "/");
-      },
-      "retrieve the cookie": {
-        topic: function(t) {
-          const cb = this.callback;
-          t.cj.getCookies("http://www.example.com", {}, (err, cookies) => {
-            t.cookies = cookies;
-            cb(err, t);
-          });
-        },
-        "get the cookie": function(t) {
-          assert.lengthOf(t.cookies, 2);
-          assert.equal(t.cookies[0].key, "broken_path");
-          assert.equal(t.cookies[0].value, "testme");
-          assert.equal(t.cookies[1].key, "b");
-          assert.equal(t.cookies[1].value, "2");
-          assert.equal(t.cookies[1].path, "/");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "tough-cookie throws exception on malformed URI (GH-32)": {
-      topic: function() {
-        const url = "http://www.example.com/?test=100%";
-        const cj = new CookieJar();
-
-        cj.setCookieSync("Test=Test", url);
-
-        return cj.getCookieStringSync(url);
-      },
-      "cookies are set": function(cookieStr) {
-        assert.strictEqual(cookieStr, "Test=Test");
-      }
-    }
-  })
-  .addBatch({
-    "setCookie (without options) callback works even if it's not instanceof Function (GH-158/GH-175)": {
-      topic: function() {
-        const cj = new CookieJar();
-
-        const thisCallback = this.callback;
-        const cb = function(err, cookie) {
-          thisCallback(err, cookie);
-        };
-        Object.setPrototypeOf(cb, null);
-        assert(
-          !(cb instanceof Function),
-          "clearing callback prototype chain failed"
-        );
-
-        cj.setCookie("a=b", "http://example.com/index.html", cb);
-      },
-      works: function(c) {
-        assert.instanceOf(c, Cookie);
-      }
-    },
-    "getCookies (without options) callback works even if it's not instanceof Function (GH-175)": {
-      topic: function() {
-        const cj = new CookieJar();
-        const url = "http://example.com/index.html";
-        cj.setCookieSync("a=b", url);
-
-        const thisCallback = this.callback;
-        const cb = function(err, cookies) {
-          thisCallback(err, cookies);
-        };
-        Object.setPrototypeOf(cb, null);
-        assert(
-          !(cb instanceof Function),
-          "clearing callback prototype chain failed"
-        );
-
-        cj.getCookies(url, cb);
-      },
-      works: function(cookies) {
-        assert.lengthOf(cookies, 1);
-      }
-    }
-  })
-  .export(module);
diff --git a/test/remove_all_test.js b/test/remove_all_test.js
deleted file mode 100644
index fa19f50..0000000
--- a/test/remove_all_test.js
+++ /dev/null
@@ -1,207 +0,0 @@
-/*!
- * Copyright (c) 2018, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-const util = require("util");
-const vows = require("vows");
-const assert = require("assert");
-const async = require("async");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-const Store = tough.Store;
-const MemoryCookieStore = tough.MemoryCookieStore;
-
-class StoreWithoutRemoveAll extends Store {
-  constructor() {
-    super();
-    this.synchronous = true;
-    this.stats = { put: 0, getAll: 0, remove: 0 };
-    this.cookies = [];
-  }
-  findCookie(domain, path, key, cb) {
-    return cb(null, null);
-  }
-  findCookies(domain, path, cb) {
-    return cb(null, []);
-  }
-  putCookie(cookie, cb) {
-    this.stats.put++;
-    this.cookies.push(cookie);
-    return cb(null);
-  }
-  getAllCookies(cb) {
-    this.stats.getAll++;
-    return cb(null, this.cookies.slice());
-  }
-  removeCookie(domain, path, key, cb) {
-    this.stats.remove++;
-    return cb(null, null);
-  }
-}
-
-class MemoryStoreExtension extends MemoryCookieStore {
-  constructor() {
-    super();
-    this.stats = { getAll: 0, remove: 0, removeAll: 0 };
-  }
-
-  getAllCookies(cb) {
-    this.stats.getAll++;
-    MemoryCookieStore.prototype.getAllCookies.call(this, cb);
-  }
-
-  removeCookie(domain, path, key, cb) {
-    this.stats.remove++;
-    super.removeCookie(domain, path, key, cb);
-  }
-
-  removeAllCookies(cb) {
-    this.stats.removeAll++;
-    super.removeAllCookies(cb);
-  }
-}
-
-vows
-  .describe("Store removeAllCookies API")
-  .addBatch({
-    "With a store that doesn't implement removeAllCookies": {
-      "under normal conditions": {
-        topic: function() {
-          const store = new StoreWithoutRemoveAll();
-          const jar = new CookieJar(store);
-          jar.setCookieSync("a=b", "http://example.com/index.html");
-          jar.setCookieSync("c=d", "http://example.org/index.html");
-          const cb = this.callback;
-          jar.removeAllCookies(err => {
-            return cb(err, store.stats);
-          });
-        },
-        "Cookies are removed one-by-one": function(err, stats) {
-          assert.equal(err, null);
-          assert.equal(stats.put, 2);
-          assert.equal(stats.getAll, 1);
-          assert.equal(stats.remove, 2);
-        }
-      },
-      "when one of the removeCookie calls fail": {
-        topic: function() {
-          const store = new StoreWithoutRemoveAll();
-          const jar = new CookieJar(store);
-          jar.setCookieSync("a=b", "http://example.com/index.html");
-          jar.setCookieSync("c=d", "http://example.org/index.html");
-          jar.setCookieSync("e=f", "http://example.net/index.html");
-          jar.setCookieSync("g=h", "http://example.edu/index.html");
-
-          let callNumber = 0;
-          store.removeCookie = function(domain, path, key, cb) {
-            callNumber++;
-            if (callNumber == 4) {
-              return cb(new Error(`something happened ${callNumber}`));
-            }
-            StoreWithoutRemoveAll.prototype.removeCookie.call(
-              this,
-              domain,
-              path,
-              key,
-              cb
-            );
-          };
-
-          const cb = this.callback;
-          jar.removeAllCookies(err => {
-            return cb(err, store.stats);
-          });
-        },
-        "The one error gets returned": function(err, stats) {
-          assert(err != null);
-          assert.equal(err.message, "something happened 4");
-          assert.equal(stats.put, 4);
-          assert.equal(stats.getAll, 1);
-          assert.equal(stats.remove, 3);
-        }
-      },
-      "when several of the removeCookie calls fail": {
-        topic: function() {
-          const store = new StoreWithoutRemoveAll();
-          const jar = new CookieJar(store);
-          jar.setCookieSync("a=b", "http://example.com/index.html");
-          jar.setCookieSync("c=d", "http://example.org/index.html");
-          jar.setCookieSync("e=f", "http://example.net/index.html");
-          jar.setCookieSync("g=h", "http://example.edu/index.html");
-
-          let callNumber = 0;
-          const origRemove = store.removeCookie;
-          store.removeCookie = function(domain, path, key, cb) {
-            callNumber++;
-            if (callNumber % 2 === 1) {
-              // odd calls; 1st, 3rd, etc.
-              return cb(new Error(`something happened ${callNumber}`));
-            }
-            origRemove.call(this, domain, path, key, cb);
-          };
-
-          const cb = this.callback;
-          jar.removeAllCookies(err => {
-            return cb(err, store.stats);
-          });
-        },
-        "all cookies are attemped": function(err, stats) {
-          assert.equal(stats.remove, 2); // two are prevented by test harness
-        },
-        "only the first error is returned": function(err, stats) {
-          assert.equal(err.message, "something happened 1");
-        }
-      }
-    }
-  })
-  .addBatch({
-    "With a store that does implement removeAllCookies": {
-      topic: function() {
-        const store = new MemoryStoreExtension();
-        const jar = new CookieJar(store);
-        jar.setCookieSync("a=b", "http://example.com/index.html");
-        jar.setCookieSync("c=d", "http://example.org/index.html");
-        const cb = this.callback;
-        this.jar = jar;
-        jar.removeAllCookies(err => {
-          return cb(err, store.stats);
-        });
-      },
-      "Cookies are removed as batch": function(err, stats) {
-        assert.equal(err, null);
-        assert.equal(stats.getAll, 0);
-        assert.equal(stats.remove, 0);
-        assert.equal(stats.removeAll, 1);
-        assert.deepEqual(this.jar.store.idx, {});
-      }
-    }
-  })
-  .export(module);
diff --git a/test/same_site_test.js b/test/same_site_test.js
deleted file mode 100644
index c43b3f4..0000000
--- a/test/same_site_test.js
+++ /dev/null
@@ -1,264 +0,0 @@
-/*!
- * Copyright (c) 2018, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-"use strict";
-const vows = require("vows");
-const assert = require("assert");
-const tough = require("../lib/cookie");
-const Cookie = tough.Cookie;
-const CookieJar = tough.CookieJar;
-
-vows
-  .describe("Same-Site Cookies")
-  .addBatch({
-    "Testing retrieval from a three-cookie jar": {
-      topic: function() {
-        const jar = new CookieJar();
-        const url = (this.url = "http://example.com/index.html");
-        const options = {};
-
-        [
-          "strict=authorized; SameSite=strict",
-          "lax=okay; SameSite=lax",
-          "normal=whatever" // none
-        ].forEach(str => {
-          jar.setCookieSync(Cookie.parse(str), url, options);
-        });
-        return jar;
-      },
-      "when making a same-site request": {
-        topic: function(jar) {
-          jar.getCookies(
-            this.url,
-            { sameSiteContext: "strict" },
-            this.callback
-          );
-        },
-        "all three cookies are returned": function(cookies) {
-          assert.equal(cookies.length, 3);
-        }
-      },
-      "when making a lax request": {
-        topic: function(jar) {
-          jar.getCookies(this.url, { sameSiteContext: "lax" }, this.callback);
-        },
-        "only two cookies are returned": function(cookies) {
-          assert.equal(cookies.length, 2);
-        },
-        "the strict one is omitted": function(cookies) {
-          cookies.forEach(c => {
-            assert.notEqual(c.key, "strict");
-          });
-        }
-      },
-      "when making a cross-origin request": {
-        topic: function(jar) {
-          jar.getCookies(this.url, { sameSiteContext: "none" }, this.callback);
-        },
-        "only one cookie is returned": function(cookies) {
-          assert.equal(cookies.length, 1);
-        },
-        "and it's the one without same-site": function(cookies) {
-          assert.equal(cookies[0].key, "normal");
-        }
-      },
-      "when making an unqualified request": {
-        topic: function(jar) {
-          jar.getCookies(this.url, {}, this.callback);
-        },
-        "all three cookies are returned": function(cookies) {
-          assert.equal(cookies.length, 3);
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Testing setting cookies": {
-      topic: function() {
-        const url = "http://example.com/index.html";
-        const cookies = {
-          garbage: Cookie.parse("garbageIn=treatedAsNone; SameSite=garbage"),
-          strict: Cookie.parse("strict=authorized; SameSite=sTrIcT"),
-          lax: Cookie.parse("lax=okay; SameSite=lax"),
-          normal: Cookie.parse("normal=whatever") // none
-        };
-        const jar = new CookieJar();
-        this.callSetCookie = function(which, options, cb) {
-          return jar.setCookie(cookies[which], url, options, cb);
-        };
-        return null;
-      },
-      "from same-site context": {
-        topic: function() {
-          return { sameSiteContext: "strict" };
-        },
-        "for garbage cookie": {
-          topic: function(options) {
-            this.callSetCookie("garbage", options, this.callback);
-          },
-          "treated as 'none'": function(err, cookie) {
-            assert.isNull(err);
-            assert.equal(cookie.sameSite, "none");
-          }
-        },
-        "for strict cookie": {
-          topic: function(options) {
-            this.callSetCookie("strict", options, this.callback);
-          },
-          "has strict property": function(err, cookie) {
-            assert.isNull(err);
-            assert.equal(cookie.sameSite, "strict");
-          }
-        },
-        "for lax cookie": {
-          topic: function(options) {
-            this.callSetCookie("lax", options, this.callback);
-          },
-          "has lax property": function(err, cookie) {
-            assert.isNull(err);
-            assert.equal(cookie.sameSite, "lax");
-          }
-        },
-        "for normal cookie": {
-          topic: function(options) {
-            this.callSetCookie("normal", options, this.callback);
-          },
-          "treated as 'none'": function(err, cookie) {
-            assert.isNull(err);
-            assert.equal(cookie.sameSite, "none");
-          }
-        }
-      },
-
-      "from cross-origin context": {
-        topic: function() {
-          return { sameSiteContext: "none" };
-        },
-        "for strict cookie": {
-          topic: function(options) {
-            this.callSetCookie("strict", options, this.callback);
-          },
-          "is not allowed": function(err, ignored) {
-            ignored = null;
-            assert.ok(err instanceof Error);
-            assert.equal(
-              err.message,
-              "Cookie is SameSite but this is a cross-origin request"
-            );
-          }
-        },
-        "for lax cookie": {
-          topic: function(options) {
-            this.callSetCookie("lax", options, this.callback);
-          },
-          "is not allowed": function(err, ignored) {
-            ignored = null;
-            assert.ok(err instanceof Error);
-            assert.equal(
-              err.message,
-              "Cookie is SameSite but this is a cross-origin request"
-            );
-          }
-        },
-        "for normal cookie": {
-          topic: function(options) {
-            this.callSetCookie("normal", options, this.callback);
-          },
-          "is fine": function(err, ignored) {
-            ignored = null;
-            assert.isNull(err);
-          }
-        }
-      },
-
-      "from undefined context": {
-        topic: function() {
-          return {};
-        },
-        "for strict cookie": {
-          topic: function(options) {
-            this.callSetCookie("strict", options, this.callback);
-          },
-          "is fine": function(err, ignored) {
-            ignored = null;
-            assert.isNull(err);
-          }
-        },
-        "for lax cookie": {
-          topic: function(options) {
-            this.callSetCookie("lax", options, this.callback);
-          },
-          "is fine": function(err, ignored) {
-            ignored = null;
-            assert.isNull(err);
-          }
-        },
-        "for normal cookie": {
-          topic: function(options) {
-            this.callSetCookie("normal", options, this.callback);
-          },
-          "is fine": function(err, ignored) {
-            ignored = null;
-            assert.isNull(err);
-          }
-        }
-      }
-    }
-  })
-  .addBatch({
-    "Canonicalized strings": {
-      topic: function() {
-        const url = "http://example.com/index.html";
-        const garbage = Cookie.parse("garbage=1");
-        garbage.sameSite = "GaRbAGe";
-        const cookies = {
-          garbage: garbage,
-          strict: Cookie.parse("strict=1; SameSite=STRict"),
-          lax: Cookie.parse("lax=1; SameSite=LAx"),
-          normal: Cookie.parse("normal=1") // none
-        };
-        return cookies;
-      },
-      "garbage in, garbage out": function(cookies) {
-        assert.equal(cookies.garbage.toString(), "garbage=1; SameSite=GaRbAGe");
-      },
-      "strict is 'Strict'": function(cookies) {
-        assert.equal(cookies.strict.toString(), "strict=1; SameSite=Strict");
-      },
-      "lax is 'Lax'": function(cookies) {
-        assert.equal(cookies.lax.toString(), "lax=1; SameSite=Lax");
-      },
-      "normal is omitted": function(cookies) {
-        assert.equal(cookies.normal.toString(), "normal=1");
-      }
-    }
-  })
-  .export(module);
diff --git a/typestough-cookie/LICENSE b/typestough-cookie/LICENSE
deleted file mode 100644
index 4b1ad51..0000000
--- a/typestough-cookie/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-    MIT License
-
-    Copyright (c) Microsoft Corporation. All rights reserved.
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in all
-    copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE
diff --git a/typestough-cookie/README.md b/typestough-cookie/README.md
deleted file mode 100644
index c512af8..0000000
--- a/typestough-cookie/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Installation
-> `npm install --save @types/tough-cookie`
-
-# Summary
-This package contains type definitions for tough-cookie (https://github.com/salesforce/tough-cookie).
-
-# Details
-Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/tough-cookie.
-
-### Additional Details
- * Last updated: Tue, 31 Mar 2020 23:35:07 GMT
- * Dependencies: none
- * Global values: none
-
-# Credits
-These definitions were written by [Leonard Thieu](https://github.com/leonard-thieu), [LiJinyao](https://github.com/LiJinyao), and [Michael Wei](https://github.com/no2chem).
diff --git a/typestough-cookie/index.d.ts b/typestough-cookie/index.d.ts
deleted file mode 100644
index d7bed2f..0000000
--- a/typestough-cookie/index.d.ts
+++ /dev/null
@@ -1,265 +0,0 @@
-// Type definitions for tough-cookie 4.0
-// Project: https://github.com/salesforce/tough-cookie
-// Definitions by: Leonard Thieu <https://github.com/leonard-thieu>
-//                 LiJinyao <https://github.com/LiJinyao>
-//                 Michael Wei <https://github.com/no2chem>
-// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-// TypeScript Version: 2.2
-
-export const version: string;
-
-export const PrefixSecurityEnum: Readonly<{
-    DISABLED: string;
-    SILENT: string;
-    STRICT: string;
-}>;
-
-/**
- * Parse a cookie date string into a Date.
- * Parses according to RFC6265 Section 5.1.1, not Date.parse().
- */
-export function parseDate(string: string): Date;
-
-/**
- * Format a Date into a RFC1123 string (the RFC6265-recommended format).
- */
-export function formatDate(date: Date): string;
-
-/**
- * Transforms a domain-name into a canonical domain-name.
- * The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot
- * and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265).
- * For the most part, this function is idempotent (can be run again on its output without ill effects).
- */
-export function canonicalDomain(str: string): string;
-
-/**
- * Answers "does this real domain match the domain in a cookie?".
- * The str is the "current" domain-name and the domStr is the "cookie" domain-name.
- * Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match".
- *
- * The canonicalize parameter will run the other two parameters through canonicalDomain or not.
- */
-export function domainMatch(str: string, domStr: string, canonicalize?: boolean): boolean;
-
-/**
- * Given a current request/response path, gives the Path apropriate for storing in a cookie.
- * This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC.
- *
- * The path parameter MUST be only the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.).
- * This is the .pathname property of node's uri.parse() output.
- */
-export function defaultPath(path: string): string;
-
-/**
- * Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4.
- * Returns a boolean.
- *
- * This is essentially a prefix-match where cookiePath is a prefix of reqPath.
- */
-export function pathMatch(reqPath: string, cookiePath: string): boolean;
-
-/**
- * alias for Cookie.parse(cookieString[, options])
- */
-export function parse(cookieString: string, options?: Cookie.ParseOptions): Cookie | undefined;
-
-/**
- * alias for Cookie.fromJSON(string)
- */
-export function fromJSON(string: string): Cookie;
-
-export function getPublicSuffix(hostname: string): string | null;
-
-export function cookieCompare(a: Cookie, b: Cookie): number;
-
-export function permuteDomain(domain: string, allowSpecialUseDomain?: boolean): string[];
-
-export function permutePath(path: string): string[];
-
-export class Cookie {
-    static parse(cookieString: string, options?: Cookie.ParseOptions): Cookie | undefined;
-
-    static fromJSON(strOrObj: string | object): Cookie | null;
-
-    constructor(properties?: Cookie.Properties);
-
-    key: string;
-    value: string;
-    expires: Date | 'Infinity';
-    maxAge: number | 'Infinity' | '-Infinity';
-    domain: string | null;
-    path: string | null;
-    secure: boolean;
-    httpOnly: boolean;
-    extensions: string[] | null;
-    creation: Date | null;
-    creationIndex: number;
-
-    hostOnly: boolean | null;
-    pathIsDefault: boolean | null;
-    lastAccessed: Date | null;
-    sameSite: string;
-
-    toString(): string;
-
-    cookieString(): string;
-
-    setExpires(exp: Date | string): void;
-
-    setMaxAge(number: number): void;
-
-    expiryTime(now?: number): number;
-
-    expiryDate(now?: number): Date;
-
-    TTL(now?: Date): number | typeof Infinity;
-
-    isPersistent(): boolean;
-
-    canonicalizedDomain(): string | null;
-
-    cdomain(): string | null;
-
-    inspect(): string;
-
-    toJSON(): { [key: string]: any; };
-
-    clone(): Cookie;
-
-    validate(): boolean | string;
-}
-
-export namespace Cookie {
-    interface ParseOptions {
-        loose?: boolean;
-    }
-
-    interface Properties {
-        key?: string;
-        value?: string;
-        expires?: Date;
-        maxAge?: number | 'Infinity' | '-Infinity';
-        domain?: string;
-        path?: string;
-        secure?: boolean;
-        httpOnly?: boolean;
-        extensions?: string[];
-        creation?: Date;
-        creationIndex?: number;
-
-        hostOnly?: boolean;
-        pathIsDefault?: boolean;
-        lastAccessed?: Date;
-        sameSite?: string;
-    }
-
-    interface Serialized {
-        [key: string]: any;
-    }
-}
-
-export class CookieJar {
-    static deserialize(serialized: CookieJar.Serialized | string, store?: Store): Promise<CookieJar>;
-    static deserialize(serialized: CookieJar.Serialized | string, store: Store, cb: (err: Error | null, object: CookieJar) => void): void;
-    static deserialize(serialized: CookieJar.Serialized | string, cb: (err: Error | null, object: CookieJar) => void): void;
-
-    static deserializeSync(serialized: CookieJar.Serialized | string, store?: Store): CookieJar;
-
-    static fromJSON(string: string): CookieJar;
-
-    constructor(store?: Store, options?: CookieJar.Options);
-
-    setCookie(cookieOrString: Cookie | string, currentUrl: string, options?: CookieJar.SetCookieOptions): Promise<Cookie>;
-    setCookie(cookieOrString: Cookie | string, currentUrl: string, options: CookieJar.SetCookieOptions, cb: (err: Error | null, cookie: Cookie) => void): void;
-    setCookie(cookieOrString: Cookie | string, currentUrl: string, cb: (err: Error | null, cookie: Cookie) => void): void;
-
-    setCookieSync(cookieOrString: Cookie | string, currentUrl: string, options?: CookieJar.SetCookieOptions): Cookie;
-
-    getCookies(currentUrl: string, options?: CookieJar.GetCookiesOptions): Promise<Cookie[]>;
-    getCookies(currentUrl: string, options: CookieJar.GetCookiesOptions, cb: (err: Error | null, cookies: Cookie[]) => void): void;
-    getCookies(currentUrl: string, cb: (err: Error | null, cookies: Cookie[]) => void): void;
-
-    getCookiesSync(currentUrl: string, options?: CookieJar.GetCookiesOptions): Cookie[];
-
-    getCookieString(currentUrl: string, options?: CookieJar.GetCookiesOptions): Promise<string>;
-    getCookieString(currentUrl: string, options: CookieJar.GetCookiesOptions, cb: (err: Error | null, cookies: string) => void): void;
-    getCookieString(currentUrl: string, cb: (err: Error | null, cookies: string) => void): void;
-
-    getCookieStringSync(currentUrl: string, options?: CookieJar.GetCookiesOptions): string;
-
-    getSetCookieStrings(currentUrl: string, options?: CookieJar.GetCookiesOptions): Promise<string[]>;
-    getSetCookieStrings(currentUrl: string, options: CookieJar.GetCookiesOptions, cb: (err: Error | null, cookies: string[]) => void): void;
-    getSetCookieStrings(currentUrl: string, cb: (err: Error | null, cookies: string[]) => void): void;
-
-    getSetCookieStringsSync(currentUrl: string, options?: CookieJar.GetCookiesOptions): string[];
-
-    serialize(): Promise<CookieJar.Serialized>;
-    serialize(cb: (err: Error | null, serializedObject: CookieJar.Serialized) => void): void;
-
-    serializeSync(): CookieJar.Serialized;
-
-    toJSON(): CookieJar.Serialized;
-
-    clone(store?: Store): Promise<CookieJar>;
-    clone(store: Store, cb: (err: Error | null, newJar: CookieJar) => void): void;
-    clone(cb: (err: Error | null, newJar: CookieJar) => void): void;
-
-    cloneSync(store?: Store): CookieJar;
-
-    removeAllCookies(): Promise<void>;
-    removeAllCookies(cb: (err: Error | null) => void): void;
-
-    removeAllCookiesSync(): void;
-}
-
-export namespace CookieJar {
-    interface Options {
-        allowSpecialUseDomain?: boolean;
-        looseMode?: boolean;
-        rejectPublicSuffixes?: boolean;
-        prefixSecurity?: string;
-    }
-
-    interface SetCookieOptions {
-        http?: boolean;
-        secure?: boolean;
-        now?: Date;
-        ignoreError?: boolean;
-    }
-
-    interface GetCookiesOptions {
-        http?: boolean;
-        secure?: boolean;
-        now?: Date;
-        expire?: boolean;
-        allPaths?: boolean;
-    }
-
-    interface Serialized {
-        version: string;
-        storeType: string;
-        rejectPublicSuffixes: boolean;
-        cookies: Cookie.Serialized[];
-    }
-}
-
-export abstract class Store {
-    synchronous: boolean;
-
-    findCookie(domain: string, path: string, key: string, cb: (err: Error | null, cookie: Cookie | null) => void): void;
-
-    findCookies(domain: string, path: string, allowSpecialUseDomain: boolean, cb: (err: Error | null, cookie: Cookie[]) => void): void;
-
-    putCookie(cookie: Cookie, cb: (err: Error | null) => void): void;
-
-    updateCookie(oldCookie: Cookie, newCookie: Cookie, cb: (err: Error | null) => void): void;
-
-    removeCookie(domain: string, path: string, key: string, cb: (err: Error | null) => void): void;
-
-    removeCookies(domain: string, path: string, cb: (err: Error | null) => void): void;
-
-    getAllCookies(cb: (err: Error | null, cookie: Cookie[]) => void): void;
-}
-
-export class MemoryCookieStore extends Store { }
diff --git a/typestough-cookie/package.json b/typestough-cookie/package.json
deleted file mode 100644
index d06939b..0000000
--- a/typestough-cookie/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-    "name": "@types/tough-cookie",
-    "version": "4.0.0",
-    "description": "TypeScript definitions for tough-cookie",
-    "license": "MIT",
-    "contributors": [
-        {
-            "name": "Leonard Thieu",
-            "url": "https://github.com/leonard-thieu",
-            "githubUsername": "leonard-thieu"
-        },
-        {
-            "name": "LiJinyao",
-            "url": "https://github.com/LiJinyao",
-            "githubUsername": "LiJinyao"
-        },
-        {
-            "name": "Michael Wei",
-            "url": "https://github.com/no2chem",
-            "githubUsername": "no2chem"
-        }
-    ],
-    "main": "",
-    "types": "index.d.ts",
-    "repository": {
-        "type": "git",
-        "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
-        "directory": "types/tough-cookie"
-    },
-    "scripts": {},
-    "dependencies": {},
-    "typesPublisherContentHash": "ca0d31f2e9fc2a883ed38f569a7c21cb47c3ad66089c59faa840a59b14c0daf5",
-    "typeScriptVersion": "2.8"
-}
\ No newline at end of file