@ -1,3 +1,5 @@ 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					#!/usr/bin/env python3  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					import  os  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					import  time  
					 
					 
					 
					import  time  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					import  threading  
					 
					 
					 
					import  threading  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					import  unittest  
					 
					 
					 
					import  unittest  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -50,66 +52,72 @@ class TestUploader(UploaderTestCase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . end_event . set ( )   
					 
					 
					 
					    self . end_event . set ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . up_thread . join ( )   
					 
					 
					 
					    self . up_thread . join ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  gen_files ( self ,  lock = False ) :   
					 
					 
					 
					  def  gen_files ( self ,  lock = False ,  boot = True ) :   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    f_paths  =  list ( )   
					 
					 
					 
					    f_paths  =  list ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  t  in  [ " bootlog.bz2 " ,  "  qlog.bz2" ,  " rlog.bz2 " ,  " dcamera.hevc " ,  " fcamera.hevc " ] :   
					 
					 
					 
					    for  t  in  [ " qlog.bz2 " ,  " rlog.bz2 " ,  " dcamera.hevc " ,  " fcamera.hevc " ] :   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      f_paths . append ( self . make_file_with_data ( self . seg_dir ,  t ,  1 ,  lock = lock ) )   
					 
					 
					 
					      f_paths . append ( self . make_file_with_data ( self . seg_dir ,  t ,  1 ,  lock = lock ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    if  boot :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      f_paths . append ( self . make_file_with_data ( " boot " ,  f " { self . seg_dir } .bz2 " ,  1 ,  lock = lock ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  f_paths   
					 
					 
					 
					    return  f_paths   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  gen_order ( self ,  seg1 ,  seg2 ) :   
					 
					 
					 
					  def  gen_order ( self ,  seg1 ,  seg2 ,  boot = True ) :   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    keys  =  [ f " { self . seg_format . format ( i ) } /qlog.bz2 "  for  i  in  seg1 ]   
					 
					 
					 
					    keys  =  [ ]   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    if  boot :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      keys  + =  [ f " boot/ { self . seg_format . format ( i ) } .bz2 "  for  i  in  seg1 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      keys  + =  [ f " boot/ { self . seg_format2 . format ( i ) } .bz2 "  for  i  in  seg2 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    keys  + =  [ f " { self . seg_format . format ( i ) } /qlog.bz2 "  for  i  in  seg1 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    keys  + =  [ f " { self . seg_format2 . format ( i ) } /qlog.bz2 "  for  i  in  seg2 ]   
					 
					 
					 
					    keys  + =  [ f " { self . seg_format2 . format ( i ) } /qlog.bz2 "  for  i  in  seg2 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  i  in  seg1 :   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      keys  + =  [ f " { self . seg_format . format ( i ) } / { f } "  for  f  in  [ ' rlog.bz2 ' ,  ' fcamera.hevc ' ,  ' dcamera.hevc ' ] ]   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  i  in  seg2 :   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      keys  + =  [ f " { self . seg_format2 . format ( i ) } / { f } "  for  f  in  [ ' rlog.bz2 ' ,  ' fcamera.hevc ' ,  ' dcamera.hevc ' ] ]   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    keys  + =  [ f " { self . seg_format . format ( i ) } /bootlog.bz2 "  for  i  in  seg1 ]   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    keys  + =  [ f " { self . seg_format2 . format ( i ) } /bootlog.bz2 "  for  i  in  seg2 ]   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  keys   
					 
					 
					 
					    return  keys   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  test_upload ( self ) :   
					 
					 
					 
					  def  test_upload ( self ) :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    f_paths  =  self . gen_files ( lock = False )   
					 
					 
					 
					    self . gen_files ( lock = False )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . start_thread ( )   
					 
					 
					 
					    self . start_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # allow enough time that files could upload twice if there is a bug in the logic   
					 
					 
					 
					    # allow enough time that files could upload twice if there is a bug in the logic   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    time . sleep ( 5 )   
					 
					 
					 
					    time . sleep ( 5 )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . join_thread ( )   
					 
					 
					 
					    self . join_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertTrue ( len ( log_handler . upload_ignored )  ==  0 ,  " Some files were ignored " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  <  len ( f_paths ) ,  " Some files failed to upload " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  >  len ( f_paths ) ,  " Some files were uploaded twice " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  f_path  in  f_paths :   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . assertTrue ( getxattr ( f_path ,  uploader . UPLOAD_ATTR_NAME ) ,  " All files not uploaded " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    exp_order  =  self . gen_order ( [ self . seg_num ] ,  [ ] )   
					 
					 
					 
					    exp_order  =  self . gen_order ( [ self . seg_num ] ,  [ ] )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . assertTrue ( len ( log_handler . upload_ignored )  ==  0 ,  " Some files were ignored " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  <  len ( exp_order ) ,  " Some files failed to upload " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  >  len ( exp_order ) ,  " Some files were uploaded twice " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    for  f_path  in  exp_order :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      self . assertTrue ( getxattr ( os . path . join ( self . root ,  f_path ) ,  uploader . UPLOAD_ATTR_NAME ) ,  " All files not uploaded " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertTrue ( log_handler . upload_order  ==  exp_order ,  " Files uploaded in wrong order " )   
					 
					 
					 
					    self . assertTrue ( log_handler . upload_order  ==  exp_order ,  " Files uploaded in wrong order " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  test_upload_ignored ( self ) :   
					 
					 
					 
					  def  test_upload_ignored ( self ) :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . set_ignore ( )   
					 
					 
					 
					    self . set_ignore ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    f_paths  =  self . gen_files ( lock = False )   
					 
					 
					 
					    self . gen_files ( lock = False )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . start_thread ( )   
					 
					 
					 
					    self . start_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # allow enough time that files could upload twice if there is a bug in the logic   
					 
					 
					 
					    # allow enough time that files could upload twice if there is a bug in the logic   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    time . sleep ( 5 )   
					 
					 
					 
					    time . sleep ( 5 )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . join_thread ( )   
					 
					 
					 
					    self . join_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertTrue ( len ( log_handler . upload_order )  ==  0 ,  " Some files were not ignored " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_ignored )  <  len ( f_paths ) ,  " Some files failed to ignore " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_ignored )  >  len ( f_paths ) ,  " Some files were ignored twice " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  f_path  in  f_paths :   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . assertTrue ( getxattr ( f_path ,  uploader . UPLOAD_ATTR_NAME ) ,  " All files not ignored " )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    exp_order  =  self . gen_order ( [ self . seg_num ] ,  [ ] )   
					 
					 
					 
					    exp_order  =  self . gen_order ( [ self . seg_num ] ,  [ ] )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . assertTrue ( len ( log_handler . upload_order )  ==  0 ,  " Some files were not ignored " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_ignored )  <  len ( exp_order ) ,  " Some files failed to ignore " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_ignored )  >  len ( exp_order ) ,  " Some files were ignored twice " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    for  f_path  in  exp_order :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      self . assertTrue ( getxattr ( os . path . join ( self . root ,  f_path ) ,  uploader . UPLOAD_ATTR_NAME ) ,  " All files not ignored " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertTrue ( log_handler . upload_ignored  ==  exp_order ,  " Files ignored in wrong order " )   
					 
					 
					 
					    self . assertTrue ( log_handler . upload_ignored  ==  exp_order ,  " Files ignored in wrong order " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  test_upload_files_in_create_order ( self ) :   
					 
					 
					 
					  def  test_upload_files_in_create_order ( self ) :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    f_paths  =  list ( )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    seg1_nums  =  [ 0 ,  1 ,  2 ,  10 ,  20 ]   
					 
					 
					 
					    seg1_nums  =  [ 0 ,  1 ,  2 ,  10 ,  20 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  i  in  seg1_nums :   
					 
					 
					 
					    for  i  in  seg1_nums :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . seg_dir  =  self . seg_format . format ( i )   
					 
					 
					 
					      self . seg_dir  =  self . seg_format . format ( i )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      f_paths  + =  self . gen_files ( )   
					 
					 
					 
					      self . gen_files ( boot = False )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    seg2_nums  =  [ 5 ,  50 ,  51 ]   
					 
					 
					 
					    seg2_nums  =  [ 5 ,  50 ,  51 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  i  in  seg2_nums :   
					 
					 
					 
					    for  i  in  seg2_nums :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . seg_dir  =  self . seg_format2 . format ( i )   
					 
					 
					 
					      self . seg_dir  =  self . seg_format2 . format ( i )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      f_paths  + =  self . gen_files ( )   
					 
					 
					 
					      self . gen_files ( boot = False )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    exp_order  =  self . gen_order ( seg1_nums ,  seg2_nums ,  boot = False )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . start_thread ( )   
					 
					 
					 
					    self . start_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # allow enough time that files could upload twice if there is a bug in the logic   
					 
					 
					 
					    # allow enough time that files could upload twice if there is a bug in the logic   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -117,15 +125,15 @@ class TestUploader(UploaderTestCase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . join_thread ( )   
					 
					 
					 
					    self . join_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertTrue ( len ( log_handler . upload_ignored )  ==  0 ,  " Some files were ignored " )   
					 
					 
					 
					    self . assertTrue ( len ( log_handler . upload_ignored )  ==  0 ,  " Some files were ignored " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  <  len ( f_paths ) ,  " Some files failed to upload " )   
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  <  len ( exp_order ) ,  " Some files failed to upload " )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  >  len ( f_paths ) ,  " Some files were uploaded twice " )   
					 
					 
					 
					    self . assertFalse ( len ( log_handler . upload_order )  >  len ( exp_order ) ,  " Some files were uploaded twice " )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  f_path  in  f_paths :   
					 
					 
					 
					    for  f_path  in  exp_order :   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . assertTrue ( getxattr ( f_path ,  uploader . UPLOAD_ATTR_NAME ) ,  " All files not uploaded " )   
					 
					 
					 
					      self . assertTrue ( getxattr ( os . path . join ( self . root ,  f_path ) ,  uploader . UPLOAD_ATTR_NAME ) ,  " All files not uploaded " )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    exp_order  =  self . gen_order ( seg1_nums ,  seg2_nums )   
					 
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    self . assertTrue ( log_handler . upload_order  ==  exp_order ,  " Files uploaded in wrong order " )   
					 
					 
					 
					    self . assertTrue ( log_handler . upload_order  ==  exp_order ,  " Files uploaded in wrong order " )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  test_no_upload_with_lock_file ( self ) :   
					 
					 
					 
					  def  test_no_upload_with_lock_file ( self ) :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    f_paths  =  self . gen_files ( lock = True )   
					 
					 
					 
					    f_paths  =  self . gen_files ( lock = True ,  boot = False )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . start_thread ( )   
					 
					 
					 
					    self . start_thread ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # allow enough time that files should have been uploaded if they would be uploaded   
					 
					 
					 
					    # allow enough time that files should have been uploaded if they would be uploaded   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -137,4 +145,4 @@ class TestUploader(UploaderTestCase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					if  __name__  ==  " __main__ " :  
					 
					 
					 
					if  __name__  ==  " __main__ " :  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  unittest . main ( )   
					 
					 
					 
					  unittest . main ( failfast = True )