2016-04-12 14:12:44 +02:00
define ([
2017-04-18 12:14:32 +02:00
'jquery' ,
2016-06-20 18:38:56 +02:00
'/bower_components/hyperjson/hyperjson.js' ,
2016-04-21 15:05:41 +02:00
'json.sortify' ,
2017-06-08 18:14:31 +02:00
'/drive/tests.js' ,
2017-09-05 11:24:30 +02:00
'/common/test.js' ,
2017-11-13 16:32:40 +01:00
'/common/common-hash.js' ,
2017-12-04 13:58:33 +01:00
'/common/common-util.js' ,
2017-09-05 11:24:30 +02:00
'/common/common-thumbnail.js' ,
2017-12-04 11:10:25 +01:00
'/common/wire.js' ,
2017-10-27 11:01:22 +02:00
'/common/flat-dom.js' ,
2018-06-07 14:29:09 +02:00
'/common/media-tag.js' ,
2018-06-22 15:34:50 +02:00
'/common/outer/login-block.js' ,
2018-06-20 14:27:44 +02:00
'/bower_components/tweetnacl/nacl-fast.min.js' ,
2019-06-25 11:25:44 +02:00
], function ( $ , Hyperjson , Sortify , Drive , Test , Hash , Util , Thumb , Wire , Flat , MediaTag , Block ) {
2016-04-12 14:12:44 +02:00
window . Hyperjson = Hyperjson ;
2016-04-21 15:05:41 +02:00
window . Sortify = Sortify ;
2018-06-20 14:27:44 +02:00
var Nacl = window . nacl ;
2016-04-12 14:12:44 +02:00
var assertions = 0 ;
2016-04-13 16:10:38 +02:00
var failed = false ;
var failedOn ;
2016-04-14 12:16:10 +02:00
var failMessages = [];
var ASSERTS = [];
2017-05-10 11:54:21 +02:00
var runASSERTS = function ( cb ) {
var count = ASSERTS . length ;
var successes = 0 ;
2017-05-10 15:36:34 +02:00
var done = function ( err ) {
2017-05-10 11:54:21 +02:00
count -- ;
if ( err ) { failMessages . push ( err ); }
else { successes ++ ; }
if ( count === 0 ) { cb (); }
};
2016-04-14 12:16:10 +02:00
ASSERTS . forEach ( function ( f , index ) {
2017-05-10 11:54:21 +02:00
f ( function ( err ) {
2017-12-04 11:10:25 +01:00
//console.log("test " + index);
2017-05-10 11:54:21 +02:00
done ( err , index );
}, index );
2016-04-14 12:16:10 +02:00
});
};
2016-04-12 14:12:44 +02:00
var assert = function ( test , msg ) {
2017-05-10 11:54:21 +02:00
ASSERTS . push ( function ( cb , i ) {
test ( function ( result ) {
if ( result === true ) {
assertions ++ ;
cb ();
} else {
failed = true ;
failedOn = assertions ;
cb ({
test : i ,
message : msg ,
output : result ,
});
}
});
2016-04-14 12:16:10 +02:00
});
2016-04-12 14:12:44 +02:00
};
2016-04-21 15:05:41 +02:00
var HJSON_list = [
2016-06-20 18:38:56 +02:00
'["DIV",{"id":"target"},[["P",{"class":" alice bob charlie has.dot","id":"bang"},["pewpewpew"]]]]' ,
2016-04-21 15:05:41 +02:00
2016-06-20 18:38:56 +02:00
'["DIV",{"id":"quot"},[["P",{},["\\"pewpewpew\\""]]]]' ,
2016-04-21 15:05:41 +02:00
2016-06-20 18:38:56 +02:00
'["DIV",{"id":"widget"},[["DIV",{"class":"cke_widget_wrapper cke_widget_block","contenteditable":"false","data-cke-display-name":"macro:velocity","data-cke-filter":"off","data-cke-widget-id":"0","data-cke-widget-wrapper":"1","tabindex":"-1"},[["DIV",{"class":"macro cke_widget_element","data-cke-widget-data":"%7B%22classes%22%3A%7B%22macro%22%3A1%7D%7D","data-cke-widget-keep-attr":"0","data-cke-widget-upcasted":"1","data-macro":"startmacro:velocity|-||-|Here is a macro","data-widget":"xwiki-macro"},[["P",{},["Here is a macro"]]]],["SPAN",{"class":"cke_reset cke_widget_drag_handler_container","style":"background: rgba(220, 220, 220, 0.5) url(\\"/customize/cryptofist_small.png\\") repeat scroll 0% 0%; top: -15px; left: 0px; display: block;"},[["IMG",{"class":"cke_reset cke_widget_drag_handler","data-cke-widget-drag-handler":"1","height":"15","src":"data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==","title":"Click and drag to move","width":"15"},[]]]]]]]]' ,
2016-04-21 15:05:41 +02:00
];
var elementFilter = function () {
// pass everything
return true ;
};
var attributeFilter = function ( h ) {
// don't filter anything
return h ;
};
var HJSON_equal = function ( shjson ) {
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2016-04-21 15:05:41 +02:00
// parse your stringified Hyperjson
var hjson ;
try {
hjson = JSON . parse ( shjson );
} catch ( e ) {
console . log ( e );
return false ;
}
// turn it into a DOM
2016-06-20 18:38:56 +02:00
var DOM = Hyperjson . toDOM ( hjson );
2016-04-21 15:05:41 +02:00
// turn it back into stringified Hyperjson, but apply filters
var shjson2 = Sortify ( Hyperjson . fromDOM ( DOM , elementFilter , attributeFilter ));
2017-11-27 13:45:40 +01:00
return cb ( shjson === shjson2 );
2016-04-21 15:05:41 +02:00
}, "expected hyperjson equality" );
};
HJSON_list . map ( HJSON_equal );
var roundTrip = function ( sel ) {
var target = $ ( sel )[ 0 ];
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2016-04-12 14:12:44 +02:00
var hjson = Hyperjson . fromDOM ( target );
2016-06-20 18:38:56 +02:00
var cloned = Hyperjson . toDOM ( hjson );
2016-04-12 14:12:44 +02:00
2017-11-27 13:45:40 +01:00
return cb ( cloned . outerHTML === target . outerHTML );
2016-04-12 14:12:44 +02:00
}, "Round trip serialization introduced artifacts." );
};
2016-04-21 15:05:41 +02:00
var HTML_list = [
'#target' ,
2016-06-20 18:38:56 +02:00
'#widget' ,
2016-04-20 10:10:26 +02:00
'#quot' ,
2016-04-21 15:05:41 +02:00
];
HTML_list . forEach ( roundTrip );
2016-04-12 14:12:44 +02:00
2016-04-13 16:10:38 +02:00
var strungJSON = function ( orig ) {
var result ;
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2016-04-13 16:10:38 +02:00
result = JSON . stringify ( JSON . parse ( orig ));
2017-05-10 11:54:21 +02:00
return cb ( result === orig );
2016-04-13 16:10:38 +02:00
}, "expected result (" + result + ") to equal original (" + orig + ")" );
};
[ '{"border":"1","style":{"width":"500px"}}' ,
2016-04-21 15:05:41 +02:00
'{"style":"width: 500px;","border":"1"}' ,
2016-04-13 16:10:38 +02:00
]. forEach ( function ( orig ) {
strungJSON ( orig );
});
2018-05-17 10:35:48 +02:00
HTML_list . forEach ( function ( sel ) {
var el = $ ( sel )[ 0 ];
var pred = function ( el ) {
if ( el . nodeName === 'DIV' ) {
return true ;
}
};
var filter = function ( x ) {
console . log ( x );
if ( x [ 1 ][ 'class' ]) {
x [ 1 ][ 'class' ] = x [ 1 ][ 'class' ]. replace ( /cke/g , '' );
}
return x ;
};
assert ( function ( cb ) {
// FlatDOM output
var map = Flat . fromDOM ( el , pred , filter );
// Hyperjson output
var hj = Hyperjson . fromDOM ( el , pred , filter );
var x = Flat . toDOM ( map );
var y = Hyperjson . toDOM ( hj );
console . error ( x . outerHTML );
console . error ( y . outerHTML );
cb ( x . outerHTML === y . outerHTML );
}, "Test equality of FlatDOM and HyperJSON" );
});
2017-04-25 16:11:19 +02:00
// check that old hashes parse correctly
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2018-01-10 11:42:48 +01:00
//if (1) { return cb(true); } // TODO(cjd): This is a test failure which is a known bug
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#67b8385b07352be53e40746d2be6ccd7XAYSuJYYqa9NfmInyHci7LNy' );
2017-05-15 11:11:12 +02:00
return cb ( secret . hashData . channel === "67b8385b07352be53e40746d2be6ccd7" &&
secret . hashData . key === "XAYSuJYYqa9NfmInyHci7LNy" &&
2017-12-12 13:43:55 +01:00
secret . hashData . version === 0 &&
2018-01-10 11:42:48 +01:00
typeof ( secret . getUrl ) === 'function' );
2017-04-25 16:11:19 +02:00
}, "Old hash failed to parse" );
// make sure version 1 hashes parse correctly
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI' );
2017-05-15 11:11:12 +02:00
return cb ( secret . hashData . version === 1 &&
secret . hashData . mode === "edit" &&
secret . hashData . channel === "3Ujt4F2Sjnjbis6CoYWpoQ" &&
secret . hashData . key === "usn4+9CqVja8Q7RZOGTfRgqI" &&
! secret . hashData . present );
}, "version 1 hash (without present mode) failed to parse" );
2017-04-25 16:11:19 +02:00
// test support for present mode in hashes
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit/CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/present' );
2017-05-15 11:11:12 +02:00
return cb ( secret . hashData . version === 1
&& secret . hashData . mode === "edit"
&& secret . hashData . channel === "CmN5+YJkrHFS3NSBg-P7Sg"
&& secret . hashData . key === "DNZ2wcG683GscU4fyOyqA87G"
&& secret . hashData . present );
2017-04-25 16:11:19 +02:00
}, "version 1 hash failed to parse" );
2017-05-10 11:54:21 +02:00
// test support for present mode in hashes
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G//present' );
2017-05-15 11:11:12 +02:00
return cb ( secret . hashData . version === 1
&& secret . hashData . mode === "edit"
&& secret . hashData . channel === "CmN5+YJkrHFS3NSBg-P7Sg"
&& secret . hashData . key === "DNZ2wcG683GscU4fyOyqA87G"
&& secret . hashData . present );
2017-05-10 11:54:21 +02:00
}, "Couldn't handle multiple successive slashes" );
2017-09-05 18:38:51 +02:00
// test support for present & embed mode in hashes
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/embed/present/' );
2017-09-05 18:38:51 +02:00
return cb ( secret . hashData . version === 1
&& secret . hashData . mode === "edit"
&& secret . hashData . channel === "CmN5+YJkrHFS3NSBg-P7Sg"
&& secret . hashData . key === "DNZ2wcG683GscU4fyOyqA87G"
&& secret . hashData . present
&& secret . hashData . embed );
}, "Couldn't handle multiple successive slashes" );
// test support for present & embed mode in hashes
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/present/embed' );
2017-09-05 18:38:51 +02:00
return cb ( secret . hashData . version === 1
&& secret . hashData . mode === "edit"
&& secret . hashData . channel === "CmN5+YJkrHFS3NSBg-P7Sg"
&& secret . hashData . key === "DNZ2wcG683GscU4fyOyqA87G"
&& secret . hashData . present
&& secret . hashData . embed );
}, "Couldn't handle multiple successive slashes" );
// test support for embed mode in hashes
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G///embed//' );
2017-09-05 18:38:51 +02:00
return cb ( secret . hashData . version === 1
&& secret . hashData . mode === "edit"
&& secret . hashData . channel === "CmN5+YJkrHFS3NSBg-P7Sg"
&& secret . hashData . key === "DNZ2wcG683GscU4fyOyqA87G"
&& ! secret . hashData . present
&& secret . hashData . embed );
}, "Couldn't handle multiple successive slashes" );
2017-04-25 16:11:19 +02:00
// test support for trailing slash
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2017-11-13 16:32:40 +01:00
var secret = Hash . parsePadUrl ( '/pad/#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI/' );
2017-05-15 11:11:12 +02:00
return cb ( secret . hashData . version === 1 &&
secret . hashData . mode === "edit" &&
secret . hashData . channel === "3Ujt4F2Sjnjbis6CoYWpoQ" &&
secret . hashData . key === "usn4+9CqVja8Q7RZOGTfRgqI" &&
! secret . hashData . present );
2017-04-25 16:11:19 +02:00
}, "test support for trailing slashes in version 1 hash failed to parse" );
2020-01-09 11:20:35 +01:00
// test support for ownerKey
assert ( function ( cb ) {
var secret = Hash . parsePadUrl ( '/pad/#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI/present/uPmJDtDJ9okhdIyQ-8zphYlpaAonJDOC6MAcYY6iBwWBQr+XmrQ9uGY9WkApJTfEfAu5QcqaDCw1Ul+JXKcYkA/embed' );
return cb ( secret . hashData . version === 1 &&
secret . hashData . mode === "edit" &&
secret . hashData . channel === "3Ujt4F2Sjnjbis6CoYWpoQ" &&
secret . hashData . key === "usn4+9CqVja8Q7RZOGTfRgqI" &&
secret . hashData . ownerKey === "uPmJDtDJ9okhdIyQ-8zphYlpaAonJDOC6MAcYY6iBwWBQr+XmrQ9uGY9WkApJTfEfAu5QcqaDCw1Ul+JXKcYkA" &&
secret . hashData . embed &&
secret . hashData . present );
}, "test support for owner key in version 1 hash failed to parse" );
assert ( function ( cb ) {
var parsed = Hash . parsePadUrl ( '/pad/#/2/pad/edit/oRE0oLCtEXusRDyin7GyLGcS/p/uPmJDtDJ9okhdIyQ-8zphYlpaAonJDOC6MAcYY6iBwWBQr+XmrQ9uGY9WkApJTfEfAu5QcqaDCw1Ul+JXKcYkA/embed' );
var secret = Hash . getSecrets ( 'pad' , parsed . hash );
return cb ( parsed . hashData . version === 2 &&
parsed . hashData . mode === "edit" &&
parsed . hashData . type === "pad" &&
parsed . hashData . key === "oRE0oLCtEXusRDyin7GyLGcS" &&
secret . channel === "d8d51b4aea863f3f050f47f8ad261753" &&
window . nacl . util . encodeBase64 ( secret . keys . cryptKey ) === "0Ts1M6VVEozErV2Nx/LTv6Im5SCD7io2LlhasyyBPQo=" &&
secret . keys . validateKey === "f5A1FM9Gp55tnOcM75RyHD1oxBG9ZPh9WDA7qe2Fvps=" &&
parsed . hashData . ownerKey === "uPmJDtDJ9okhdIyQ-8zphYlpaAonJDOC6MAcYY6iBwWBQr+XmrQ9uGY9WkApJTfEfAu5QcqaDCw1Ul+JXKcYkA" &&
parsed . hashData . embed &&
parsed . hashData . password );
}, "test support for owner key in version 2 hash failed to parse" );
2020-01-09 15:16:07 +01:00
assert ( function ( cb ) {
var secret = Hash . parsePadUrl ( '/file/#/1/TRplGM-WsVkXR+LkJ0tD3D45A1YFZ-Cy/eO4RJwh8yHEEDhl1aHfuwQ2IzosPBZx-HDaWc1lW+hY=/uPmJDtDJ9okhdIyQ-8zphYlpaAonJDOC6MAcYY6iBwWBQr+XmrQ9uGY9WkApJTfEfAu5QcqaDCw1Ul+JXKcYkA/' );
return cb ( secret . hashData . version === 1 &&
secret . hashData . channel === "TRplGM/WsVkXR+LkJ0tD3D45A1YFZ/Cy" &&
secret . hashData . key === "eO4RJwh8yHEEDhl1aHfuwQ2IzosPBZx/HDaWc1lW+hY=" &&
secret . hashData . ownerKey === "uPmJDtDJ9okhdIyQ-8zphYlpaAonJDOC6MAcYY6iBwWBQr+XmrQ9uGY9WkApJTfEfAu5QcqaDCw1Ul+JXKcYkA" &&
! secret . hashData . present );
}, "test support for owner key in version 1 file hash failed to parse" );
2020-01-09 11:20:35 +01:00
2017-05-10 11:54:21 +02:00
assert ( function ( cb ) {
2020-01-09 10:59:20 +01:00
var secret = Hash . parsePadUrl ( '/invite/#/2/invite/edit/oRE0oLCtEXusRDyin7GyLGcS/p/' );
2017-10-30 14:40:43 +01:00
var hd = secret . hashData ;
2020-01-09 10:59:20 +01:00
cb ( hd . key === "oRE0oLCtEXusRDyin7GyLGcS" &&
hd . password &&
hd . app === 'invite' );
2017-10-30 14:40:43 +01:00
}, "test support for invite urls" );
2018-04-24 17:22:33 +02:00
// test support for V2
assert ( function ( cb ) {
2018-04-27 17:23:23 +02:00
var parsed = Hash . parsePadUrl ( '/pad/#/2/pad/edit/oRE0oLCtEXusRDyin7GyLGcS/' );
var secret = Hash . getSecrets ( 'pad' , '/2/pad/edit/oRE0oLCtEXusRDyin7GyLGcS/' );
return cb ( parsed . hashData . version === 2 &&
parsed . hashData . mode === "edit" &&
parsed . hashData . type === "pad" &&
parsed . hashData . key === "oRE0oLCtEXusRDyin7GyLGcS" &&
secret . channel === "d8d51b4aea863f3f050f47f8ad261753" &&
window . nacl . util . encodeBase64 ( secret . keys . cryptKey ) === "0Ts1M6VVEozErV2Nx/LTv6Im5SCD7io2LlhasyyBPQo=" &&
secret . keys . validateKey === "f5A1FM9Gp55tnOcM75RyHD1oxBG9ZPh9WDA7qe2Fvps=" &&
! parsed . hashData . present );
2018-04-24 17:22:33 +02:00
}, "test support for version 2 hash failed to parse" );
assert ( function ( cb ) {
2018-04-27 17:23:23 +02:00
var parsed = Hash . parsePadUrl ( '/pad/#/2/pad/edit/HGu0tK2od-2BBnwAz2ZNS-t4/p/embed' );
var secret = Hash . getSecrets ( 'pad' , '/2/pad/edit/HGu0tK2od-2BBnwAz2ZNS-t4/p/embed' , 'pewpew' );
return cb ( parsed . hashData . version === 2 &&
parsed . hashData . mode === "edit" &&
parsed . hashData . type === "pad" &&
parsed . hashData . key === "HGu0tK2od-2BBnwAz2ZNS-t4" &&
secret . channel === "3fb6dc93807d903aff390b5f798c92c9" &&
window . nacl . util . encodeBase64 ( secret . keys . cryptKey ) === "EeCkGJra8eJgVu7v4Yl2Hc3yUjrgpKpxr0Lcc3bSWVs=" &&
secret . keys . validateKey === "WGkBczJf2V6vQZfAScz8V1KY6jKdoxUCckrD+E75gGE=" &&
parsed . hashData . embed &&
parsed . hashData . password );
2018-04-24 17:22:33 +02:00
}, "test support for password in version 2 hash failed to parse" );
2017-10-30 14:40:43 +01:00
assert ( function ( cb ) {
2017-11-20 12:09:17 +01:00
var url = '/pad/?utm_campaign=new_comment&utm_medium=email&utm_source=thread_mailer#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI/' ;
2017-11-20 12:22:26 +01:00
var secret = Hash . parsePadUrl ( url );
2017-11-20 12:09:17 +01:00
return cb ( secret . hashData . version === 1 &&
secret . hashData . mode === "edit" &&
secret . hashData . channel === "3Ujt4F2Sjnjbis6CoYWpoQ" &&
secret . hashData . key === "usn4+9CqVja8Q7RZOGTfRgqI" &&
! secret . hashData . present );
}, "test support for ugly tracking query paramaters in url" );
2018-06-20 14:27:44 +02:00
assert ( function ( cb ) {
2018-06-22 15:34:50 +02:00
var keys = Block . genkeys ( Nacl . randomBytes ( 64 ));
var hash = Block . getBlockHash ( keys );
var parsed = Block . parseBlockHash ( hash );
2018-06-20 14:27:44 +02:00
2018-06-22 15:34:50 +02:00
cb ( parsed &&
parsed . keys . symmetric . length === keys . symmetric . length );
2018-06-20 14:27:44 +02:00
}, 'parse a block hash' );
2019-02-12 11:19:45 +01:00
assert ( function ( cb ) {
var v1 = Hash . isValidHref ( 'https://cryptpad.fr/pad' );
var v2 = Hash . isValidHref ( 'https://cryptpad.fr/pad/' );
var v3 = Hash . isValidHref ( '/pad' );
var v4 = Hash . isValidHref ( '/pad/' );
var res = v1 && v2 && v3 && v4 ;
cb ( res );
if ( ! res ) {
console . log ( v1 , v2 , v3 , v4 );
}
}, 'test isValidHref no hash' );
assert ( function ( cb ) {
var v1 = ! Hash . isValidHref ( 'https://cryptpad.fr/pad#' ); // Invalid
var v2 = Hash . isValidHref ( 'https://cryptpad.fr/pad/#' );
var v3 = Hash . isValidHref ( '/pad#' ); // Invalid
var v4 = Hash . isValidHref ( '/pad/#' );
var res = v1 && v2 && v3 && v4 ;
cb ( res );
if ( ! res ) {
console . log ( v1 , v2 , v3 , v4 );
}
}, 'test isValidHref empty hash' );
assert ( function ( cb ) {
var v1 = Hash . isValidHref ( 'https://cryptpad.fr/pad/#/2/pad/edit/HGu0tK2od-2BBnwAz2ZNS-t4/p/embed' );
var v2 = Hash . isValidHref ( 'https://cryptpad.fr/pad/#/1/edit/CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/present/embed' );
var v3 = Hash . isValidHref ( 'https://cryptpad.fr/pad/#67b8385b07352be53e40746d2be6ccd7XAYSuJYYqa9NfmInyHci7LNy' );
var v4 = Hash . isValidHref ( '/pad/#/2/pad/edit/HGu0tK2od-2BBnwAz2ZNS-t4/p/embed' );
var res = v1 && v2 && v3 && v4 ;
cb ( res );
if ( ! res ) {
console . log ( v1 , v2 , v3 , v4 );
}
}, 'test isValidHref hash' );
2018-06-07 14:29:09 +02:00
assert ( function ( cb ) {
try {
MediaTag ( void 0 ). on ( 'progress' ). on ( 'decryption' );
return void cb ( true );
} catch ( e ) {
console . error ( e );
return void cb ( false );
}
}, 'check that MediaTag does the right thing when passed no value' );
assert ( function ( cb ) {
try {
MediaTag ( document . createElement ( 'div' )). on ( 'progress' ). on ( 'decryption' );
return void cb ( true );
} catch ( e ) {
console . error ( e );
return void cb ( false );
}
}, 'check that MediaTag does the right thing when passed no value' );
2017-11-20 12:09:17 +01:00
assert ( function ( cb ) {
2017-04-25 16:11:19 +02:00
// TODO
2017-05-10 11:54:21 +02:00
return cb ( true );
2017-04-25 16:11:19 +02:00
}, "version 2 hash failed to parse correctly" );
2019-06-25 11:13:03 +02:00
assert ( function ( cb ) {
var x ;
var set_x = function ( v ) {
x = v ;
};
Util . mkAsync ( set_x )( 7 );
set_x ( 5 );
Util . mkAsync ( function ( expected ) {
cb ( x === expected );
})( 7 );
}, "test mkAsync" );
2017-12-04 11:10:25 +01:00
assert ( function ( cb ) {
Wire . create ({
constructor : function ( cb ) {
var service = function ( type , data , cb ) {
switch ( type ) {
case "HEY_BUDDY" :
return cb ( void 0 , "SALUT!" );
default :
cb ( "ERROR" );
}
};
2017-12-04 13:58:33 +01:00
var evt = Util . mkEvent ();
var respond = function ( e , out ) {
evt . fire ( e , out );
};
2017-12-04 11:10:25 +01:00
cb ( void 0 , {
2017-12-04 13:58:33 +01:00
send : function ( raw /*, cb */ ) {
2017-12-04 11:10:25 +01:00
try {
var parsed = JSON . parse ( raw );
var txid = parsed . txid ;
setTimeout ( function () {
2017-12-08 11:47:07 +01:00
service ( parsed . q , parsed . content , function ( e , result ) {
2017-12-04 11:10:25 +01:00
respond ( JSON . stringify ({
txid : txid ,
error : e ,
content : result ,
}));
});
});
} catch ( e ) { console . error ( "PEWPEW" ); }
},
receive : function ( f ) {
2017-12-04 13:58:33 +01:00
evt . reg ( f );
2017-12-04 11:10:25 +01:00
},
});
},
}, function ( e , rpc ) {
if ( e ) { return cb ( false ); }
rpc . send ( 'HEY_BUDDY' , null , function ( e , out ) {
if ( e ) { return void cb ( false ); }
if ( out === 'SALUT!' ) { cb ( true ); }
});
});
}, "Test rpc factory" );
2017-09-05 11:24:30 +02:00
assert ( function ( cb ) {
2017-12-08 11:47:07 +01:00
require ([
'/assert/frame/frame.js' ,
], function ( Frame ) {
Frame . create ( document . body , '/assert/frame/frame.html' , function ( e , frame ) {
if ( e ) { return cb ( false ); }
var channel = Frame . open ( frame , [
/.*/i ,
], 5000 );
channel . send ( 'HELO' , null , function ( e , res ) {
if ( res === 'EHLO' ) { return cb ( true ); }
cb ( false );
});
2017-09-05 11:24:30 +02:00
});
});
2017-12-08 11:47:07 +01:00
}, "PEWPEW" );
( function () {
var guid = Wire . uid ();
var t = Wire . tracker ({
timeout : 1000 ,
hook : function ( txid , q , content ) {
console . info ( JSON . stringify ({
guid : guid ,
txid : txid ,
q : q ,
content : content ,
}));
},
});
assert ( function ( cb ) {
t . call ( 'SHOULD_TIMEOUT' , null , function ( e ) {
if ( e === 'TIMEOUT' ) { return cb ( true ); }
cb ( false );
});
}, 'tracker should timeout' );
assert ( function ( cb ) {
var id = t . call ( 'SHOULD_NOT_TIMEOUT' , null , function ( e , out ) {
if ( e ) { return cb ( false ); }
if ( out === 'YES' ) { return cb ( true ); }
cb ( false );
});
t . respond ( id , void 0 , 'YES' );
}, "tracker should not timeout" );
}());
2017-05-24 18:59:44 +02:00
Drive . test ( assert );
2017-10-27 11:01:22 +02:00
assert ( function ( cb ) {
// extract dom elements into a flattened JSON representation
var flat = Flat . fromDOM ( document . body );
// recreate a _mostly_ equivalent DOM
var dom = Flat . toDOM ( flat );
// assume we don't care about comments
2017-10-27 11:13:21 +02:00
var bodyText = document . body . outerHTML . replace ( /<!\-\-[\s\S]*?\-\->/g , '' );
2017-10-27 11:01:22 +02:00
// check for equality
cb ( dom . outerHTML === bodyText );
});
2016-04-13 16:10:38 +02:00
var swap = function ( str , dict ) {
return str . replace ( /\{\{(.*?)\}\}/g , function ( all , key ) {
2016-04-14 12:16:10 +02:00
return typeof dict [ key ] !== 'undefined' ? dict [ key ] : all ;
2016-04-13 16:10:38 +02:00
});
};
var multiline = function ( f ) {
var str ;
2016-04-14 12:16:10 +02:00
f . toString (). replace ( /\/\*([\s\S]*)\*\//g , function ( all , out ) {
2016-04-13 16:10:38 +02:00
str = out ;
});
2016-04-14 12:16:10 +02:00
return str || '' ;
2016-04-21 15:05:41 +02:00
};
2016-04-13 16:10:38 +02:00
2017-05-10 11:54:21 +02:00
var formatFailures = function () {
2016-04-14 12:16:10 +02:00
var template = multiline ( function () { /*
2016-04-21 15:05:41 +02:00
<p class="error">
Failed on test number {{test}} with error message:
2016-04-21 15:44:56 +02:00
"{{message}}"
2016-04-21 15:05:41 +02:00
</p>
<p>
The test returned:
{{output}}
</p>
2016-04-14 12:16:10 +02:00
<br>
*/ });
return failMessages . map ( function ( obj ) {
console . log ( obj );
return swap ( template , obj );
}). join ( "\n" );
};
2017-05-10 11:54:21 +02:00
runASSERTS ( function () {
$ ( "body" ). html ( function ( i , val ) {
var dict = {
previous : val ,
totalAssertions : ASSERTS . length ,
passedAssertions : assertions ,
plural : ( assertions === 1 ? '' : 's' ),
failMessages : formatFailures ()
};
2016-04-13 16:10:38 +02:00
var SUCCESS = swap ( multiline ( function (){ /*
2016-04-14 12:16:10 +02:00
<div class="report">{{passedAssertions}} / {{totalAssertions}} test{{plural}} passed.
{{failMessages}}
</div>
2016-04-13 16:10:38 +02:00
{{previous}}
*/ }), dict );
2017-05-10 11:54:21 +02:00
var report = SUCCESS ;
2016-04-13 16:10:38 +02:00
2017-05-10 11:54:21 +02:00
return report ;
});
2016-04-13 16:10:38 +02:00
2017-05-10 11:54:21 +02:00
var $report = $ ( '.report' );
$report . addClass ( failed ? 'failure' : 'success' );
2017-06-01 00:09:39 +02:00
if ( failed ) {
Test . failed ();
} else {
Test . passed ();
}
2017-05-10 11:54:21 +02:00
});
2016-04-14 12:16:10 +02:00
2016-04-12 14:12:44 +02:00
});