Skip to content

Commit

Permalink
return received rows direct instead of copying
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenegriffin committed Sep 10, 2020
1 parent a788009 commit 04180bb
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 109 deletions.
1 change: 1 addition & 0 deletions src/Pages/unittests.html
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
<script src="/Scripts/%version%/Headers.min.js"></script>
<script src="/Scripts/%version%/Errors.min.js"></script>
<script src="/Scripts/%version%/GetHeadersEWS.min.js"></script>
<script src="/Scripts/%version%/unittests/ut-common.min.js"></script>
<script src="/Scripts/%version%/unittests/ut-2047.min.js"></script>
<script src="/Scripts/%version%/unittests/ut-antispam.min.js"></script>
<script src="/Scripts/%version%/unittests/ut-DateTime.min.js"></script>
Expand Down
25 changes: 9 additions & 16 deletions src/Scripts/Received.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,19 @@ var Received = (function () {
// - The date, if present, is always at the end, separated by a ";".
// Values not attached to a header will not be reflected in output.
var parseHeader = function (receivedHeader) {
var sourceHeader = receivedHeader;
var ReceivedField = function (label) {
var ReceivedField = function (_label, _value) {
return {
label: label,
value: ""
label: _label,
value: _value !== undefined ? _value : "",
toString: function () { return this.value; }
};
};

var receivedFields = {};
receivedFields["sourceHeader"] = ReceivedField("", receivedHeader);
receivedFields["delaySort"] = ReceivedField("", -1);
receivedFields["percent"] = ReceivedField("", 0);

receivedFields["from"] = ReceivedField(mhaStrings.mha_receivedFrom);
receivedFields["by"] = ReceivedField(mhaStrings.mha_receivedBy);
receivedFields["with"] = ReceivedField(mhaStrings.mha_receivedWith);
Expand Down Expand Up @@ -129,18 +133,7 @@ var Received = (function () {
});
}

var parsedRow = {
sourceHeader: sourceHeader,
delaySort: -1, // Force the "no previous or current time" rows to sort before the 0 second rows
percent: 0,
};

// Add parsed fields to the row before returning
for (fieldName in receivedFields) {
if (receivedFields[fieldName].value) parsedRow[fieldName] = receivedFields[fieldName].value;
}

return parsedRow;
return receivedFields;
};

function exists() { return receivedRows.length > 0; }
Expand Down
3 changes: 0 additions & 3 deletions src/Scripts/unittests/ut-DateTime.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@

QUnit.test("DateTime Tests", function (assert) {
var received = Received();
QUnit.assert.datesEqual = function (value, expected, message) {
return assert.propEqual({ date: value.date, dateNum: value.dateNum }, expected, message);
};

var h1 = "Received: test; Sat, 21 Apr 2018 03:01:32 +0000";
assert.datesEqual(received.parseHeader(h1), { "date": "4/20/2018 11:01:32 PM", "dateNum": 1524279692000 }, h1);
Expand Down
24 changes: 0 additions & 24 deletions src/Scripts/unittests/ut-ParseError.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,6 @@ function cleanStack(stack) {
});
}

QUnit.assert.errorsEqual = function (value, expectedValues, message) {
var found = expectedValues.some(function (expected) {
if (value === expected) {
this.pushResult({
result: true,
actual: value,
expected: expected,
message: message
});

return true;
}
}, this);

if (!found) {
this.pushResult({
result: false,
actual: value,
expected: expectedValues,
message: message
});
}
};

QUnit.test("Errors.parse Tests", function (assert) {

assert.expect(20); // Count of assert calls in the tests below
Expand Down
49 changes: 23 additions & 26 deletions src/Scripts/unittests/ut-Received.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,11 @@ QUnit.test("Received Tests", function (assert) {

assert.equal(received.computeDeltas(), "310 minutes 14 seconds", "Deltas");
assert.equal(received.exists(), true, "Exists");
assert.propEqual(received.receivedRows[0],
assert.shallowEqual(received.receivedRows[0],
{
"by": "vmta6.response.nfcu.org (PowerMTA(TM) v3.5r17)",
"date": "4/20/2018 5:51:19 PM",
"dateNum": 1524261079000,
"delay": "",
"delaySort": -1,
"for": "<[email protected]>",
"from": "localhost (10.0.22.21)",
Expand All @@ -42,7 +41,7 @@ QUnit.test("Received Tests", function (assert) {
"percent": 0,
"sourceHeader": header4
}, "header4");
assert.propEqual(received.receivedRows[1],
assert.shallowEqual(received.receivedRows[1],
{
"by": "BN3NAM04FT003.mail.protection.outlook.com (10.152.92.112)",
"date": "4/20/2018 11:01:32 PM",
Expand All @@ -57,7 +56,7 @@ QUnit.test("Received Tests", function (assert) {
"via": "Frontend Transport",
"with": "Microsoft SMTP Server"
}, "header3");
assert.propEqual(received.receivedRows[2],
assert.shallowEqual(received.receivedRows[2],
{
"by": "BN3NAM04HT205.eop-NAM04.prod.protection.outlook.com (10.152.93.134)",
"date": "4/20/2018 11:01:32 PM",
Expand All @@ -71,7 +70,7 @@ QUnit.test("Received Tests", function (assert) {
"sourceHeader": header2,
"with": "Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384)"
}, "header2");
assert.propEqual(received.receivedRows[3],
assert.shallowEqual(received.receivedRows[3],
{
"by": "SN1PR16MB0494.namprd16.prod.outlook.com",
"date": "4/20/2018 11:01:33 PM",
Expand Down Expand Up @@ -120,12 +119,11 @@ QUnit.test("Received Tests github headers", function (assert) {

assert.equal(received.computeDeltas(), "2 seconds", "github Deltas");
assert.equal(received.exists(), true, "github exists");
assert.propEqual(received.receivedRows[0],
assert.shallowEqual(received.receivedRows[0],
{
"by": "ismtpd0021p1iad2.sendgrid.net (SG)",
"date": "4/21/2018 10:54:16 PM",
"dateNum": 1524365656987,
"delay": "",
"delaySort": -1,
"for": "<[email protected]>",
"from": "smtp.github.com (out-3.smtp.github.com [192.30.252.194])",
Expand All @@ -135,7 +133,7 @@ QUnit.test("Received Tests github headers", function (assert) {
"sourceHeader": githubHeader5,
"with": "ESMTP"
}, "githubHeader5");
assert.propEqual(received.receivedRows[1],
assert.shallowEqual(received.receivedRows[1],
{
"by": "filter0652p1las1.sendgrid.net",
"date": "4/21/2018 10:54:17 PM",
Expand All @@ -148,7 +146,7 @@ QUnit.test("Received Tests github headers", function (assert) {
"sourceHeader": githubHeader4,
"with": "SMTP"
}, "githubHeader4");
assert.propEqual(received.receivedRows[2],
assert.shallowEqual(received.receivedRows[2],
{
"by": "CO1NAM03FT028.mail.protection.outlook.com (10.152.80.189)",
"date": "4/21/2018 10:54:17 PM",
Expand All @@ -163,7 +161,7 @@ QUnit.test("Received Tests github headers", function (assert) {
"via": "Frontend Transport",
"with": "Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384)"
}, "githubHeader3");
assert.propEqual(received.receivedRows[3],
assert.shallowEqual(received.receivedRows[3],
{
"by": "CO1NAM03HT217.eop-NAM03.prod.protection.outlook.com (10.152.81.113)",
"date": "4/21/2018 10:54:18 PM",
Expand All @@ -177,7 +175,7 @@ QUnit.test("Received Tests github headers", function (assert) {
"sourceHeader": githubHeader2,
"with": "Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384)"
}, "githubHeader2");
assert.propEqual(received.receivedRows[4],
assert.shallowEqual(received.receivedRows[4],
{
"by": "SN1PR16MB0494.namprd16.prod.outlook.com",
"date": "4/21/2018 10:54:19 PM",
Expand All @@ -197,7 +195,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {
var received = Received();
var sendGrid = "Received: by filter0383p1iad2.sendgrid.net with SMTP id filter0383p1iad2-15318-5AB8F728-C\n" +
" 2018-03-26 13:35:36.270951634 +0000 UTC";
assert.propEqual(received.parseHeader(sendGrid), {
assert.shallowEqual(received.parseHeader(sendGrid), {
"by": "filter0383p1iad2.sendgrid.net",
"date": "3/26/2018 9:35:36 AM",
"dateNum": 1522071336270,
Expand All @@ -211,7 +209,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {
var sendGrid2 = "Received: from smtp.github.com (out-8.smtp.github.com [192.30.252.199])\n" +
" by ismtpd0003p1iad2.sendgrid.net (SG) with ESMTP id gDQRSEGgSqCsi9tFtF1Vtg\n" +
" Mon, 26 Mar 2018 13:35:36.102 +0000 (UTC)";
assert.propEqual(received.parseHeader(sendGrid2), {
assert.shallowEqual(received.parseHeader(sendGrid2), {
"by": "ismtpd0003p1iad2.sendgrid.net (SG)",
"date": "3/26/2018 9:35:36 AM",
"dateNum": 1522071336102,
Expand All @@ -225,7 +223,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {

var dupe1 = "Received: by me by you with this with that with whatever\n" +
" 2018-03-26 13:35:36.270951634 +0000 UTC";
assert.propEqual(received.parseHeader(dupe1), {
assert.shallowEqual(received.parseHeader(dupe1), {
"by": "me; you",
"date": "3/26/2018 9:35:36 AM",
"dateNum": 1522071336270,
Expand All @@ -240,7 +238,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {
" (2a01:111:e400:c418::34) By SN1PR16MB0494.namprd16.prod.outlook.com With\n" +
" HTTPS Via SN1PR15CA0024.NAMPRD15.PROD.OUTLOOK.COM; Sat, 21 Apr 2018 03:01:33\n" +
" +0000";
assert.propEqual(received.parseHeader(case1),
assert.shallowEqual(received.parseHeader(case1),
{
"by": "SN1PR16MB0494.namprd16.prod.outlook.com",
"date": "4/20/2018 11:01:33 PM",
Expand All @@ -253,27 +251,26 @@ QUnit.test("Received Tests parseHeader", function (assert) {
"with": "HTTPS"
}, case1);

assert.propEqual(received.parseHeader(""), {
assert.shallowEqual(received.parseHeader(""), {
"delaySort": -1,
"percent": 0,
"sourceHeader": ""
"percent": 0
}, "empty");

assert.propEqual(received.parseHeader("Received: "), {
assert.shallowEqual(received.parseHeader("Received: "), {
"delaySort": -1,
"percent": 0,
"sourceHeader": "Received: "
}, "otherEmpty");

assert.propEqual(received.parseHeader(null), {
assert.shallowEqual(received.parseHeader(null), {
"delaySort": -1,
"percent": 0,
"sourceHeader": null
}, "null");

var postfix = "Received: by example.com (Postfix, from userid 1001)\n" +
" id 1234ABCD; Thu, 21 Aug 2014 12:12:48 +0200 (CEST)";
assert.propEqual(received.parseHeader(postfix),
assert.shallowEqual(received.parseHeader(postfix),
{
"by": "example.com (Postfix, from userid 1001)",
"date": "8/21/2014 6:12:48 AM",
Expand All @@ -285,7 +282,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {
}, postfix);

var qmail = "Received: (qmail 10876 invoked from network); 24 Aug 2014 16:13:38 -0000"
assert.propEqual(received.parseHeader(qmail),
assert.shallowEqual(received.parseHeader(qmail),
{
"by": "qmail 10876 invoked from network",
"date": "8/24/2014 12:13:38 PM",
Expand All @@ -298,7 +295,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {
var broke1 =
"Received: Sun, 22 Apr 2018 02:54:19\n" +
" +0000";
assert.propEqual(received.parseHeader(broke1), {
assert.shallowEqual(received.parseHeader(broke1), {
"date": "4/21/2018 10:54:19 PM",
"dateNum": 1524365659000,
"delaySort": -1,
Expand All @@ -308,15 +305,15 @@ QUnit.test("Received Tests parseHeader", function (assert) {

var broke2 =
"Received: 22 Apr 2018";
assert.propEqual(received.parseHeader(broke2), {
assert.shallowEqual(received.parseHeader(broke2), {
"delaySort": -1,
"percent": 0,
"sourceHeader": broke2
}, broke2);

var broke3 =
"Received: ; 22 Apr 2018";
assert.propEqual(received.parseHeader(broke3), {
assert.shallowEqual(received.parseHeader(broke3), {
"date": "4/21/2018 8:00:00 PM",
"dateNum": 1524355200000,
"delaySort": -1,
Expand All @@ -326,7 +323,7 @@ QUnit.test("Received Tests parseHeader", function (assert) {

var broke4 =
"Received: ;";
assert.propEqual(received.parseHeader(broke4), {
assert.shallowEqual(received.parseHeader(broke4), {
"delaySort": -1,
"percent": 0,
"sourceHeader": broke4
Expand Down
84 changes: 84 additions & 0 deletions src/Scripts/unittests/ut-common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/* global QUnit */

QUnit.assert.shallowEqual = function (value, expected, message) {
var field;
for (field in expected) {
if (expected[field] === value[field].value) continue;
if (expected[field] === value[field]) continue;
this.pushResult({
result: false,
actual: field + " = " + value[field],
expected: field + " = " + expected[field],
message: message
});
}

for (field in value) {
if (expected[field] === undefined) {
if (!value[field].toString()) continue;
this.pushResult({
result: false,
actual: field + " = " + value[field],
expected: field + " = " + expected[field],
message: message
});
}
}

this.pushResult({
result: true,
actual: value,
expected: expected,
message: message
});
};

QUnit.assert.arrayEqual = function (value, expected, message) {
if (value.length !== expected.length) {
this.pushResult({
result: false,
actual: "length = " + value.length,
expected: "length = " + expected.length,
message: message + " length"
});
}

for (var i = 0; i < value.length; i++) {
this.shallowEqual(value[i], expected[i], message + "[" + i + "]");
}

this.pushResult({
result: true,
actual: value,
expected: expected,
message: message
});
};

QUnit.assert.datesEqual = function (value, expected, message) {
return this.propEqual({ date: value.date.toString(), dateNum: value.dateNum.toString() }, expected, message);
};

QUnit.assert.errorsEqual = function (value, expectedValues, message) {
var found = expectedValues.some(function (expected) {
if (value === expected) {
this.pushResult({
result: true,
actual: value,
expected: expected,
message: message
});

return true;
}
}, this);

if (!found) {
this.pushResult({
result: false,
actual: value,
expected: expectedValues,
message: message
});
}
};
Loading

0 comments on commit 04180bb

Please sign in to comment.