@@ -372,3 +372,45 @@ fn define_encode_set_scopes() {
372
372
373
373
m:: test ( ) ;
374
374
}
375
+
376
+ #[ test]
377
+ /// https://github.com/servo/rust-url/issues/302
378
+ fn test_origin_hash ( ) {
379
+ use std:: hash:: { Hash , Hasher } ;
380
+ use std:: collections:: hash_map:: DefaultHasher ;
381
+
382
+ fn hash < T : Hash > ( value : & T ) -> u64 {
383
+ let mut hasher = DefaultHasher :: new ( ) ;
384
+ value. hash ( & mut hasher) ;
385
+ hasher. finish ( )
386
+ }
387
+
388
+ let origin = & Url :: parse ( "http://example.net/" ) . unwrap ( ) . origin ( ) ;
389
+
390
+ let origins_to_compare = [
391
+ Url :: parse ( "http://example.net:80/" ) . unwrap ( ) . origin ( ) ,
392
+ Url :: parse ( "http://example.net:81/" ) . unwrap ( ) . origin ( ) ,
393
+ Url :: parse ( "http://example.net" ) . unwrap ( ) . origin ( ) ,
394
+ Url :: parse ( "http://example.net/hello" ) . unwrap ( ) . origin ( ) ,
395
+ Url :: parse ( "https://example.net" ) . unwrap ( ) . origin ( ) ,
396
+ Url :: parse ( "ftp://example.net" ) . unwrap ( ) . origin ( ) ,
397
+ Url :: parse ( "file://example.net" ) . unwrap ( ) . origin ( ) ,
398
+ Url :: parse ( "http://user@example.net/" ) . unwrap ( ) . origin ( ) ,
399
+ Url :: parse ( "http://user:pass@example.net/" ) . unwrap ( ) . origin ( ) ,
400
+ ] ;
401
+
402
+ for origin_to_compare in & origins_to_compare {
403
+ if origin == origin_to_compare {
404
+ assert_eq ! ( hash( origin) , hash( origin_to_compare) ) ;
405
+ } else {
406
+ assert_ne ! ( hash( origin) , hash( origin_to_compare) ) ;
407
+ }
408
+ }
409
+
410
+ let opaque_origin = Url :: parse ( "file://example.net" ) . unwrap ( ) . origin ( ) ;
411
+ let same_opaque_origin = Url :: parse ( "file://example.net" ) . unwrap ( ) . origin ( ) ;
412
+ let other_opaque_origin = Url :: parse ( "file://other" ) . unwrap ( ) . origin ( ) ;
413
+
414
+ assert_ne ! ( hash( & opaque_origin) , hash( & same_opaque_origin) ) ;
415
+ assert_ne ! ( hash( & opaque_origin) , hash( & other_opaque_origin) ) ;
416
+ }
0 commit comments