Backed out changeset 99c66f2c4097 (bug 1790508) for causing wpt failures. CLOSED TREE

This commit is contained in:
Butkovits Atila 2022-09-15 06:20:33 +03:00
Родитель f81a096eb8
Коммит 8ef8248f4a
7 изменённых файлов: 86 добавлений и 246 удалений

Просмотреть файл

@ -301,33 +301,16 @@ struct ParamTraits<mozilla::dom::RTCInboundRtpStreamStats> {
WriteParam(aWriter, aParam.mFrameWidth);
WriteParam(aWriter, aParam.mFrameHeight);
WriteParam(aWriter, aParam.mFramesPerSecond);
WriteParam(aWriter, aParam.mQpSum);
WriteParam(aWriter, aParam.mTotalDecodeTime);
WriteParam(aWriter, aParam.mTotalInterFrameDelay);
WriteParam(aWriter, aParam.mTotalSquaredInterFrameDelay);
WriteParam(aWriter, aParam.mLastPacketReceivedTimestamp);
WriteParam(aWriter, aParam.mHeaderBytesReceived);
WriteParam(aWriter, aParam.mFecPacketsReceived);
WriteParam(aWriter, aParam.mFecPacketsDiscarded);
WriteParam(aWriter, aParam.mBytesReceived);
WriteParam(aWriter, aParam.mNackCount);
WriteParam(aWriter, aParam.mFirCount);
WriteParam(aWriter, aParam.mPliCount);
WriteParam(aWriter, aParam.mTotalProcessingDelay);
// Always missing from libwebrtc stats
// WriteParam(aWriter, aParam.mEstimatedPlayoutTimestamp);
WriteParam(aWriter, aParam.mFramesReceived);
WriteParam(aWriter, aParam.mJitterBufferDelay);
WriteParam(aWriter, aParam.mJitterBufferEmittedCount);
WriteParam(aWriter, aParam.mTotalSamplesReceived);
WriteParam(aWriter, aParam.mConcealedSamples);
WriteParam(aWriter, aParam.mSilentConcealedSamples);
WriteParam(aWriter, aParam.mConcealmentEvents);
WriteParam(aWriter, aParam.mInsertedSamplesForDeceleration);
WriteParam(aWriter, aParam.mRemovedSamplesForAcceleration);
WriteParam(aWriter, aParam.mAudioLevel);
WriteParam(aWriter, aParam.mTotalAudioEnergy);
WriteParam(aWriter, aParam.mTotalSamplesDuration);
WriteRTCReceivedRtpStreamStats(aWriter, aParam);
}
@ -337,33 +320,16 @@ struct ParamTraits<mozilla::dom::RTCInboundRtpStreamStats> {
ReadParam(aReader, &(aResult->mFrameWidth)) &&
ReadParam(aReader, &(aResult->mFrameHeight)) &&
ReadParam(aReader, &(aResult->mFramesPerSecond)) &&
ReadParam(aReader, &(aResult->mQpSum)) &&
ReadParam(aReader, &(aResult->mTotalDecodeTime)) &&
ReadParam(aReader, &(aResult->mTotalInterFrameDelay)) &&
ReadParam(aReader, &(aResult->mTotalSquaredInterFrameDelay)) &&
ReadParam(aReader, &(aResult->mLastPacketReceivedTimestamp)) &&
ReadParam(aReader, &(aResult->mHeaderBytesReceived)) &&
ReadParam(aReader, &(aResult->mFecPacketsReceived)) &&
ReadParam(aReader, &(aResult->mFecPacketsDiscarded)) &&
ReadParam(aReader, &(aResult->mBytesReceived)) &&
ReadParam(aReader, &(aResult->mNackCount)) &&
ReadParam(aReader, &(aResult->mFirCount)) &&
ReadParam(aReader, &(aResult->mPliCount)) &&
ReadParam(aReader, &(aResult->mTotalProcessingDelay)) &&
// Always missing from libwebrtc
// ReadParam(aReader, &(aResult->mEstimatedPlayoutTimestamp)) &&
ReadParam(aReader, &(aResult->mFramesReceived)) &&
ReadParam(aReader, &(aResult->mJitterBufferDelay)) &&
ReadParam(aReader, &(aResult->mJitterBufferEmittedCount)) &&
ReadParam(aReader, &(aResult->mTotalSamplesReceived)) &&
ReadParam(aReader, &(aResult->mConcealedSamples)) &&
ReadParam(aReader, &(aResult->mSilentConcealedSamples)) &&
ReadParam(aReader, &(aResult->mConcealmentEvents)) &&
ReadParam(aReader, &(aResult->mInsertedSamplesForDeceleration)) &&
ReadParam(aReader, &(aResult->mRemovedSamplesForAcceleration)) &&
ReadParam(aReader, &(aResult->mAudioLevel)) &&
ReadParam(aReader, &(aResult->mTotalAudioEnergy)) &&
ReadParam(aReader, &(aResult->mTotalSamplesDuration)) &&
ReadRTCReceivedRtpStreamStats(aReader, aResult);
}
};
@ -432,18 +398,12 @@ struct ParamTraits<mozilla::dom::RTCRemoteInboundRtpStreamStats> {
static void Write(MessageWriter* aWriter, const paramType& aParam) {
WriteParam(aWriter, aParam.mLocalId);
WriteParam(aWriter, aParam.mRoundTripTime);
WriteParam(aWriter, aParam.mTotalRoundTripTime);
WriteParam(aWriter, aParam.mFractionLost);
WriteParam(aWriter, aParam.mRoundTripTimeMeasurements);
WriteRTCReceivedRtpStreamStats(aWriter, aParam);
}
static bool Read(MessageReader* aReader, paramType* aResult) {
return ReadParam(aReader, &(aResult->mLocalId)) &&
ReadParam(aReader, &(aResult->mRoundTripTime)) &&
ReadParam(aReader, &(aResult->mTotalRoundTripTime)) &&
ReadParam(aReader, &(aResult->mFractionLost)) &&
ReadParam(aReader, &(aResult->mRoundTripTimeMeasurements)) &&
ReadRTCReceivedRtpStreamStats(aReader, aResult);
}
};

Просмотреть файл

@ -324,13 +324,6 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
local.mPacketsReceived.Construct(audioStats->packets_rcvd);
local.mPacketsDiscarded.Construct(audioStats->packets_discarded);
local.mBytesReceived.Construct(audioStats->payload_bytes_rcvd);
// Always missing from libwebrtc stats
// if (audioStats->estimated_playout_ntp_timestamp_ms) {
// local.mEstimatedPlayoutTimestamp.Construct(
// aConduit->GetTimestampMaker().ConvertNtpToDomTime(
// webrtc::Timestamp::Millis(
// *audioStats->estimated_playout_ntp_timestamp_ms)));
// }
local.mJitterBufferDelay.Construct(
audioStats->jitter_buffer_delay_seconds);
local.mJitterBufferEmittedCount.Construct(
@ -340,6 +333,8 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
local.mConcealedSamples.Construct(audioStats->concealed_samples);
local.mSilentConcealedSamples.Construct(
audioStats->silent_concealed_samples);
/*
* Potential new stats that are now available upstream.
if (audioStats->last_packet_received_timestamp_ms) {
local.mLastPacketReceivedTimestamp.Construct(
aConduit->GetTimestampMaker().ConvertNtpToDomTime(
@ -353,9 +348,14 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
audioStats->fec_packets_received);
local.mFecPacketsDiscarded.Construct(
audioStats->fec_packets_discarded);
if (audioStats->estimated_playout_ntp_timestamp_ms) {
local.mEstimatedPlayoutTimestamp.Construct(
aConduit->GetTimestampMaker().ConvertNtpToDomTime(
webrtc::Timestamp::Millis(
*audioStats->estimated_playout_ntp_timestamp_ms)));
}
local.mConcealmentEvents.Construct(
audioStats->concealment_events);
local.mInsertedSamplesForDeceleration.Construct(
audioStats->inserted_samples_for_deceleration);
local.mRemovedSamplesForAcceleration.Construct(
@ -368,7 +368,7 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
audioStats->total_output_energy);
local.mTotalSamplesDuration.Construct(
audioStats->total_output_duration);
*/
if (!report->mInboundRtpStreamStats.AppendElement(
std::move(local), fallible)) {
mozalloc_handle_oom(0);
@ -449,9 +449,10 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
videoStats->jitter_buffer_delay_seconds);
local.mJitterBufferEmittedCount.Construct(
videoStats->jitter_buffer_emitted_count);
/*
* Potential new stats that are now available upstream.
if (videoStats->qp_sum) {
local.mQpSum.Construct(videoStats->qp_sum.value());
local.mQpSum.Construct(*videoStats->qp_sum.value);
}
local.mTotalDecodeTime.Construct(
double(videoStats->total_decode_time_ms) / 1000);
@ -460,7 +461,7 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
local.mTotalSquaredInterFrameDelay.Construct(
videoStats->total_squared_inter_frame_delay);
if (videoStats->rtp_stats.last_packet_received_timestamp_ms) {
local.mLastPacketReceivedTimestamp.Construct(
local.mLastPacketReceiveTimestamp.Construct(
aConduit->GetTimestampMaker().ConvertNtpToDomTime(
webrtc::Timestamp::Millis(
*videoStats->rtp_stats
@ -470,10 +471,6 @@ nsTArray<RefPtr<RTCStatsPromise>> RTCRtpReceiver::GetStatsInternal() {
local.mHeaderBytesReceived.Construct(
videoStats->rtp_stats.packet_counter.header_bytes +
videoStats->rtp_stats.packet_counter.padding_bytes);
local.mTotalProcessingDelay.Construct(
videoStats->total_processing_delay.seconds<double>());
/*
* Potential new stats that are now available upstream.
if (videoStats->estimated_playout_ntp_timestamp_ms) {
local.mEstimatedPlayoutTimestamp.Construct(
aConduit->GetTimestampMaker().ConvertNtpToDomTime(

Просмотреть файл

@ -257,11 +257,14 @@ nsTArray<RefPtr<dom::RTCStatsPromise>> RTCRtpSender::GetStatsInternal() {
remote.mRoundTripTime.Construct(
static_cast<double>(audioStats->rtt_ms) / 1000.0);
}
/*
* Potential new stats that are now available upstream.
remote.mFractionLost.Construct(audioStats->fraction_lost);
remote.mTotalRoundTripTime.Construct(
double(aReportBlockData.sum_rtt_ms()) / 1000);
remote.mRoundTripTimeMeasurements.Construct(
aReportBlockData.num_rtts());
*/
if (!report->mRemoteInboundRtpStreamStats.AppendElement(
std::move(remote), fallible)) {
mozalloc_handle_oom(0);
@ -333,14 +336,16 @@ nsTArray<RefPtr<dom::RTCStatsPromise>> RTCRtpSender::GetStatsInternal() {
static_cast<double>(rtcpReportData.last_rtt_ms()) / 1000.0);
}
constructCommonRemoteInboundRtpStats(remote, rtcpReportData);
/*
* Potential new stats that are now available upstream.
remote.mTotalRoundTripTime.Construct(
streamStats->report_block_data->sum_rtt_ms() / 1000.0);
remote.mFractionLost.Construct(
static_cast<float>(
rtcpReportData.report_block().fraction_lost) /
static_cast<float>(streamStats->rtcp_stats.fraction_lost) /
(1 << 8));
remote.mRoundTripTimeMeasurements.Construct(
streamStats->report_block_data->num_rtts());
streamStats->report_block_data.num_rtts());
*/
if (!report->mRemoteInboundRtpStreamStats.AppendElement(
std::move(remote), fallible)) {
mozalloc_handle_oom(0);

Просмотреть файл

@ -19,14 +19,10 @@ const statsExpectedByType = {
"packetsDiscarded",
"bytesReceived",
"jitter",
"lastPacketReceivedTimestamp",
"headerBytesReceived",
// Always missing from libwebrtc stats
// "estimatedPlayoutTimestamp",
"jitterBufferDelay",
"jitterBufferEmittedCount",
],
optional: ["remoteId", "nackCount", "qpSum"],
optional: ["remoteId", "nackCount"],
localVideoOnly: [
"firCount",
"pliCount",
@ -36,24 +32,11 @@ const statsExpectedByType = {
"frameWidth",
"frameHeight",
"framesReceived",
"totalDecodeTime",
"totalInterFrameDelay",
"totalProcessingDelay",
"totalSquaredInterFrameDelay",
],
localAudioOnly: [
"totalSamplesReceived",
// libwebrtc doesn't seem to do FEC for video
"fecPacketsReceived",
"fecPacketsDiscarded",
"concealedSamples",
"silentConcealedSamples",
"concealmentEvents",
"insertedSamplesForDeceleration",
"removedSamplesForAcceleration",
"audioLevel",
"totalAudioEnergy",
"totalSamplesDuration",
],
unimplemented: [
"mediaTrackId",
@ -67,6 +50,8 @@ const statsExpectedByType = {
"burstDiscardCount",
"gapDiscardRate",
"gapLossRate",
// Not yet implemented for inbound media, see bug 1519590
"qpSum",
],
deprecated: ["mozRtt", "isRemote"],
},
@ -114,9 +99,6 @@ const statsExpectedByType = {
"packetsLost",
"jitter",
"localId",
"totalRoundTripTime",
"fractionLost",
"roundTripTimeMeasurements",
],
optional: ["roundTripTime", "nackCount", "packetsReceived"],
unimplemented: [
@ -126,6 +108,7 @@ const statsExpectedByType = {
"associateStatsId",
"sliCount",
"packetsRepaired",
"fractionLost",
"burstPacketsLost",
"burstLossCount",
"burstDiscardCount",
@ -470,21 +453,6 @@ function pedanticChecks(report) {
`${stat.type}.pliCount is a sane number for a short ` +
`${stat.kind} test. value=${stat.pliCount}`
);
// qpSum
if (stat.qpSum !== undefined) {
ok(
stat.qpSum > 0,
`${stat.type}.qpSum is at least 0 ` +
`${stat.kind} test. value=${stat.qpSum}`
);
}
} else {
is(
stat.qpSum,
undefined,
`${stat.type}.qpSum does not exist when stat.kind != video`
);
}
}
@ -506,6 +474,7 @@ function pedanticChecks(report) {
`${stat.type}.packetsDiscarded is sane number for a short test. ` +
`value=${stat.packetsDiscarded}`
);
// bytesReceived
ok(
stat.bytesReceived >= 0 && stat.bytesReceived < 10 ** 9, // Not a magic number, just a guess
@ -529,26 +498,6 @@ function pedanticChecks(report) {
`local only test. value=${stat.jitter}`
);
// lastPacketReceivedTimestamp
ok(
stat.lastPacketReceivedTimestamp !== undefined,
`${stat.type}.lastPacketReceivedTimestamp has a value`
);
// headerBytesReceived
ok(
stat.headerBytesReceived >= 0 && stat.headerBytesReceived < 50000,
`${stat.type}.headerBytesReceived is sane for a short test. ` +
`value=${stat.headerBytesReceived}`
);
// Always missing from libwebrtc stats
// estimatedPlayoutTimestamp
// ok(
// stat.estimatedPlayoutTimestamp !== undefined,
// `${stat.type}.estimatedPlayoutTimestamp has a value`
// );
// jitterBufferEmittedCount
let expectedJitterBufferEmmitedCount = stat.kind == "video" ? 7 : 1000;
ok(
@ -595,19 +544,6 @@ function pedanticChecks(report) {
`${stat.kind} test. value=${stat.totalSamplesReceived}`
);
// fecPacketsReceived
ok(
stat.fecPacketsReceived >= 0 && stat.fecPacketsReceived < 10 ** 5,
`${stat.type}.fecPacketsReceived is a sane number for a short ` +
`${stat.kind} test. value=${stat.fecPacketsReceived}`
);
// fecPacketsDiscarded
ok(
stat.fecPacketsDiscarded >= 0 && stat.fecPacketsDiscarded < 100,
`${stat.type}.fecPacketsDiscarded is sane number for a short test. ` +
`value=${stat.fecPacketsDiscarded}`
);
// concealedSamples
ok(
stat.concealedSamples >= 0 &&
@ -623,51 +559,6 @@ function pedanticChecks(report) {
`${stat.type}.silentConcealedSamples is a sane number for a short ` +
`${stat.kind} test. value=${stat.silentConcealedSamples}`
);
// concealmentEvents
ok(
stat.concealmentEvents >= 0 &&
stat.concealmentEvents <= stat.packetsReceived,
`${stat.type}.concealmentEvents is a sane number for a short ` +
`${stat.kind} test. value=${stat.concealmentEvents}`
);
// insertedSamplesForDeceleration
ok(
stat.insertedSamplesForDeceleration >= 0 &&
stat.insertedSamplesForDeceleration <= stat.totalSamplesReceived,
`${stat.type}.insertedSamplesForDeceleration is a sane number for a short ` +
`${stat.kind} test. value=${stat.insertedSamplesForDeceleration}`
);
// removedSamplesForAcceleration
ok(
stat.removedSamplesForAcceleration >= 0 &&
stat.removedSamplesForAcceleration <= stat.totalSamplesReceived,
`${stat.type}.removedSamplesForAcceleration is a sane number for a short ` +
`${stat.kind} test. value=${stat.removedSamplesForAcceleration}`
);
// audioLevel
ok(
stat.audioLevel >= 0 && stat.audioLevel <= 128,
`${stat.type}.bytesReceived is a sane number for a short ` +
`${stat.kind} test. value=${stat.audioLevel}`
);
// totalAudioEnergy
ok(
stat.totalAudioEnergy >= 0 && stat.totalAudioEnergy <= 128,
`${stat.type}.totalAudioEnergy is a sane number for a short ` +
`${stat.kind} test. value=${stat.totalAudioEnergy}`
);
// totalSamplesDuration
ok(
stat.totalSamplesDuration >= 0 && stat.totalSamplesDuration <= 300,
`${stat.type}.totalSamplesDuration is a sane number for a short ` +
`${stat.kind} test. value=${stat.totalSamplesDuration}`
);
}
//
@ -700,7 +591,6 @@ function pedanticChecks(report) {
`${stat.type}.framesPerSecond is a sane number for a short ` +
`${stat.kind} test. value=${stat.framesPerSecond}`
);
// framesDecoded
ok(
stat.framesDecoded > 0 && stat.framesDecoded < 1000000,
@ -722,35 +612,6 @@ function pedanticChecks(report) {
`${stat.kind} test. value=${stat.frameHeight}`
);
// totalDecodeTime
ok(
stat.totalDecodeTime >= 0 && stat.totalDecodeTime < 300,
`${stat.type}.totalDecodeTime is sane for a short test. ` +
`value=${stat.totalDecodeTime}`
);
// totalProcessingDelay
ok(
stat.totalProcessingDelay < 10,
`${stat.type}.totalProcessingDelay is sane number for a short test ` +
`local only test. value=${stat.totalProcessingDelay}`
);
// totalInterFrameDelay
ok(
stat.totalInterFrameDelay >= 0 && stat.totalInterFrameDelay < 100,
`${stat.type}.totalInterFrameDelay is sane for a short test. ` +
`value=${stat.totalInterFrameDelay}`
);
// totalSquaredInterFrameDelay
ok(
stat.totalSquaredInterFrameDelay >= 0 &&
stat.totalSquaredInterFrameDelay < 100,
`${stat.type}.totalSquaredInterFrameDelay is sane for a short test. ` +
`value=${stat.totalSquaredInterFrameDelay}`
);
// framesReceived
ok(
stat.framesReceived >= 0 && stat.framesReceived < 100000,
@ -795,28 +656,6 @@ function pedanticChecks(report) {
`${stat.kind} test. value=${stat.packetsReceived}`
);
}
// totalRoundTripTime
ok(
stat.totalRoundTripTime < 50000,
`${stat.type}.totalRoundTripTime is a sane number for a short ` +
`${stat.kind} test. value=${stat.totalRoundTripTime}`
);
// fractionLost
ok(
stat.fractionLost < 0.2,
`${stat.type}.fractionLost is a sane number for a short ` +
`${stat.kind} test. value=${stat.fractionLost}`
);
// roundTripTimeMeasurements
ok(
stat.roundTripTimeMeasurements >= 1 &&
stat.roundTripTimeMeasurements < 500,
`${stat.type}.roundTripTimeMeasurements is a sane number for a short ` +
`${stat.kind} test. value=${stat.roundTripTimeMeasurements}`
);
} else if (stat.type == "outbound-rtp") {
//
// Required fields

Просмотреть файл

@ -68,41 +68,21 @@ dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats {
unsigned long frameWidth;
unsigned long frameHeight;
double framesPerSecond;
unsigned long long qpSum;
double totalDecodeTime;
double totalInterFrameDelay;
double totalSquaredInterFrameDelay;
DOMHighResTimeStamp lastPacketReceivedTimestamp;
unsigned long long headerBytesReceived;
unsigned long long fecPacketsReceived;
unsigned long long fecPacketsDiscarded;
unsigned long long bytesReceived;
unsigned long nackCount;
unsigned long firCount;
unsigned long pliCount;
double totalProcessingDelay;
// Always missing from libwebrtc
// DOMHighResTimeStamp estimatedPlayoutTimestamp;
double jitterBufferDelay;
unsigned long long jitterBufferEmittedCount;
unsigned long long totalSamplesReceived;
unsigned long long concealedSamples;
unsigned long long silentConcealedSamples;
unsigned long long concealmentEvents;
unsigned long long insertedSamplesForDeceleration;
unsigned long long removedSamplesForAcceleration;
double audioLevel;
double totalAudioEnergy;
double totalSamplesDuration;
unsigned long framesReceived;
};
dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats {
DOMString localId;
double roundTripTime;
double totalRoundTripTime;
double fractionLost;
unsigned long long roundTripTimeMeasurements;
};
dictionary RTCSentRtpStreamStats : RTCRtpStreamStats {

Просмотреть файл

@ -8,7 +8,49 @@
[inbound-rtp's qpSum]
expected: FAIL
[inbound-rtp's estimatedPlayoutTimestamp]
[inbound-rtp's totalDecodeTime]
expected: FAIL
[inbound-rtp's totalInterFrameDelay]
expected: FAIL
[inbound-rtp's totalSquaredInterFrameDelay]
expected: FAIL
[inbound-rtp's lastPacketReceivedTimestamp]
expected: FAIL
[inbound-rtp's headerBytesReceived]
expected: FAIL
[inbound-rtp's fecPacketsReceived]
expected: FAIL
[inbound-rtp's fecPacketsDiscarded]
expected: FAIL
[inbound-rtp's totalProcessingDelay]
expected: FAIL
[inbound-rtp's estimatedPlayoutTimestamp]
expected: FAIL
[inbound-rtp's concealmentEvents]
expected: FAIL
[inbound-rtp's insertedSamplesForDeceleration]
expected: FAIL
[inbound-rtp's removedSamplesForAcceleration]
expected: FAIL
[inbound-rtp's audioLevel]
expected: FAIL
[inbound-rtp's totalAudioEnergy]
expected: FAIL
[inbound-rtp's totalSamplesDuration]
expected: FAIL
[inbound-rtp's decoderImplementation]
@ -53,6 +95,15 @@
[outbound-rtp's transportId]
expected: FAIL
[remote-inbound-rtp's totalRoundTripTime]
expected: FAIL
[remote-inbound-rtp's fractionLost]
expected: FAIL
[remote-inbound-rtp's roundTripTimeMeasurements]
expected: FAIL
[remote-inbound-rtp's framesDropped]
expected: FAIL

Просмотреть файл

@ -59,6 +59,14 @@
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1728357
expected: FAIL
[RTCInboundRtpStreamStats's totalAudioEnergy]
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1728361
expected: FAIL
[RTCInboundRtpStreamStats's totalSamplesDuration]
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1728362
expected: FAIL
[RTCMediaSourceStats's trackIdentifier]
bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1728364
expected: FAIL