forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
| import sys
 | |
| import os
 | |
| import socket
 | |
| import stat
 | |
| 
 | |
| # Ensure that this is being run on a specific platform
 | |
| assert sys.platform.startswith('linux') or sys.platform.startswith('darwin') \
 | |
|     or sys.platform.startswith('cygwin') or sys.platform.startswith('freebsd') \
 | |
|     or sys.platform.startswith('netbsd')
 | |
| 
 | |
| def env_path():
 | |
|     ep = os.environ.get('LIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT')
 | |
|     assert ep is not None
 | |
|     ep = os.path.realpath(ep)
 | |
|     assert os.path.isdir(ep)
 | |
|     return ep
 | |
| 
 | |
| env_path_global = env_path()
 | |
| 
 | |
| # Make sure we don't try and write outside of env_path.
 | |
| # All paths used should be sanitized
 | |
| def sanitize(p):
 | |
|     p = os.path.realpath(p)
 | |
|     if os.path.commonprefix([env_path_global, p]):
 | |
|         return p
 | |
|     assert False
 | |
| 
 | |
| """
 | |
| Some of the tests restrict permissions to induce failures.
 | |
| Before we delete the test environment, we have to walk it and re-raise the
 | |
| permissions.
 | |
| """
 | |
| def clean_recursive(root_p):
 | |
|     if not os.path.islink(root_p):
 | |
|         os.chmod(root_p, 0o777)
 | |
|     for ent in os.listdir(root_p):
 | |
|         p = os.path.join(root_p, ent)
 | |
|         if os.path.islink(p) or not os.path.isdir(p):
 | |
|             os.remove(p)
 | |
|         else:
 | |
|             assert os.path.isdir(p)
 | |
|             clean_recursive(p)
 | |
|             os.rmdir(p)
 | |
| 
 | |
| 
 | |
| def init_test_directory(root_p):
 | |
|     root_p = sanitize(root_p)
 | |
|     assert not os.path.exists(root_p)
 | |
|     os.makedirs(root_p)
 | |
| 
 | |
| 
 | |
| def destroy_test_directory(root_p):
 | |
|     root_p = sanitize(root_p)
 | |
|     clean_recursive(root_p)
 | |
|     os.rmdir(root_p)
 | |
| 
 | |
| 
 | |
| def create_file(fname, size):
 | |
|     with open(sanitize(fname), 'w') as f:
 | |
|         f.write('c' * size)
 | |
| 
 | |
| 
 | |
| def create_dir(dname):
 | |
|     os.mkdir(sanitize(dname))
 | |
| 
 | |
| 
 | |
| def create_symlink(source, link):
 | |
|     os.symlink(sanitize(source), sanitize(link))
 | |
| 
 | |
| 
 | |
| def create_hardlink(source, link):
 | |
|     os.link(sanitize(source), sanitize(link))
 | |
| 
 | |
| 
 | |
| def create_fifo(source):
 | |
|     os.mkfifo(sanitize(source))
 | |
| 
 | |
| 
 | |
| def create_socket(source):
 | |
|     sock = socket.socket(socket.AF_UNIX)
 | |
|     sanitized_source = sanitize(source)
 | |
|     # AF_UNIX sockets may have very limited path length, so split it
 | |
|     # into chdir call (with technically unlimited length) followed
 | |
|     # by bind() relative to the directory
 | |
|     os.chdir(os.path.dirname(sanitized_source))
 | |
|     sock.bind(os.path.basename(sanitized_source))
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     command = " ".join(sys.argv[1:])
 | |
|     eval(command)
 | |
|     sys.exit(0)
 |