@@ -396,6 +396,115 @@ func TestReceiverStdoutWithInvalidSecret(t *testing.T) {
396396 log .Debugf ("Expected error occurred: %v" , err )
397397}
398398
399+ func TestCrocTimestampPreservation (t * testing.T ) {
400+ log .SetLevel ("trace" )
401+ testFileName := "timestamp_test.txt"
402+ defer os .Remove (testFileName )
403+ time .Sleep (300 * time .Millisecond )
404+
405+ // Create a test file with specific content and timestamp
406+ content := []byte ("test content for timestamp preservation" )
407+ err := os .WriteFile (testFileName , content , 0o644 )
408+ if err != nil {
409+ t .Fatalf ("failed to create test file: %v" , err )
410+ }
411+
412+ // Set a specific modification time (January 15, 2023 12:30:00)
413+ testTime := time .Date (2023 , 1 , 15 , 12 , 30 , 0 , 0 , time .UTC )
414+ err = os .Chtimes (testFileName , time .Now (), testTime )
415+ if err != nil {
416+ t .Fatalf ("failed to set test file timestamp: %v" , err )
417+ }
418+
419+ // Verify the timestamp was set correctly
420+ fileInfo , err := os .Stat (testFileName )
421+ if err != nil {
422+ t .Fatalf ("failed to stat test file: %v" , err )
423+ }
424+ originalModTime := fileInfo .ModTime ()
425+ log .Debugf ("Original file modification time: %v" , originalModTime )
426+
427+ log .Debug ("setting up sender" )
428+ sender , err := New (Options {
429+ IsSender : true ,
430+ SharedSecret : "8125-timestamp-test" ,
431+ Debug : true ,
432+ RelayAddress : "127.0.0.1:8281" ,
433+ RelayPorts : []string {"8281" },
434+ RelayPassword : "pass123" ,
435+ Stdout : false ,
436+ NoPrompt : true ,
437+ DisableLocal : true ,
438+ Curve : "siec" ,
439+ Overwrite : true ,
440+ GitIgnore : false ,
441+ })
442+ if err != nil {
443+ panic (err )
444+ }
445+
446+ log .Debug ("setting up receiver" )
447+ receiver , err := New (Options {
448+ IsSender : false ,
449+ SharedSecret : "8125-timestamp-test" ,
450+ Debug : true ,
451+ RelayAddress : "127.0.0.1:8281" ,
452+ RelayPassword : "pass123" ,
453+ Stdout : false ,
454+ NoPrompt : true ,
455+ DisableLocal : true ,
456+ Curve : "siec" ,
457+ Overwrite : true ,
458+ })
459+ if err != nil {
460+ panic (err )
461+ }
462+
463+ var wg sync.WaitGroup
464+ wg .Add (2 )
465+ go func () {
466+ filesInfo , emptyFolders , totalNumberFolders , errGet := GetFilesInfo ([]string {testFileName }, false , false , []string {})
467+ if errGet != nil {
468+ t .Errorf ("failed to get file info: %v" , errGet )
469+ }
470+ err := sender .Send (filesInfo , emptyFolders , totalNumberFolders )
471+ if err != nil {
472+ t .Errorf ("send failed: %v" , err )
473+ }
474+ wg .Done ()
475+ }()
476+ time .Sleep (100 * time .Millisecond )
477+ go func () {
478+ err := receiver .Receive ()
479+ if err != nil {
480+ t .Errorf ("receive failed: %v" , err )
481+ }
482+ wg .Done ()
483+ }()
484+
485+ wg .Wait ()
486+
487+ // Verify the received file has the same timestamp
488+ receivedFileInfo , err := os .Stat (testFileName )
489+ if err != nil {
490+ t .Fatalf ("failed to stat received file: %v" , err )
491+ }
492+ receivedModTime := receivedFileInfo .ModTime ()
493+ log .Debugf ("Received file modification time: %v" , receivedModTime )
494+
495+ // Allow for small time differences due to filesystem precision (up to 2 seconds)
496+ timeDiff := receivedModTime .Sub (originalModTime )
497+ if timeDiff < 0 {
498+ timeDiff = - timeDiff
499+ }
500+ if timeDiff > 2 * time .Second {
501+ t .Errorf ("timestamp not preserved: original=%v, received=%v, diff=%v" ,
502+ originalModTime , receivedModTime , timeDiff )
503+ } else {
504+ log .Debugf ("Timestamp preserved successfully (diff=%v)" , timeDiff )
505+ }
506+ }
507+
399508func TestCleanUp (t * testing.T ) {
400509 // windows allows files to be deleted only if they
401510 // are not open by another program so the remove actions
0 commit comments