2012-05-20 3 views
3

(플랫폼 : 리눅스, 특히 페도라와 레드햇 엔터프라이즈 리눅스 6)가 만든 임시 디렉토리를 삭제할 수 있습니다 테스트 케이스를 보장

나는 integration test는 다음을 수행하는 파이썬으로 작성했습니다 :

  • (아파치에서 실행) rsync에 작업을 실행하는 데
  • 웹 서비스를 알려주는 임시 디렉토리를 만듭니다
  • 점검이 파일이 제대로 복사 한 디렉토리에 파일을 복사합니다 (즉, 구성이 제대로 전달 FR 옴 웹 서비스를 통해 rsync를 호출)을 통해 클라이언트는
  • () rsync를가 자신의 소유가 설정된 파일을 생성하기 때문에, 마지막 단계가 실패하는 순간에 임시 디렉토리

을 삭제하려고 아파치 사용자의 테스트 케이스에 파일을 삭제하는 데 필요한 권한이 없습니다.

Server Fault question은 통합 테스트가 설정된 상황에서 정리 단계가 현재 실패한 이유에 대한 좋은 설명을 제공합니다.

현재 수행중인 작업 : 테스트 정리에서 임시 디렉터리를 삭제하지 않기 때문에이 통합 테스트는 수동으로 /tmp에서 제거해야하는 더미 파일을 남겨 둡니다.

현재 제가 고려중인 주된 해결책은 테스트 스위트의 정리 작업을 처리하기 위해 setuid 스크립트를 특별히 추가하는 것입니다. 이것은 효과가 있지만, 다른 누군가가 좀 더 우아한 해결책을 제안 할 수 있기를 바랍니다. 특히 통합 테스트 클라이언트에서 아파치 프로세스의 uid를 신경 쓰지 않아도된다면 정말 좋겠다. 나는 여러 가지 이유로 고려했지만 거절

접근 :

  • 루트로 테스트 케이스를 실행합니다. 이것은 실제로 작동하지만 테스트 스위트를 루트로 실행해야하는 것은 다소 못 생깁니다.
  • 테스트 스위트에서 만든 디렉토리에 고정 비트를 설정하십시오. 내가 말할 수있는 것처럼 원격 서버에서 플래그를 복사하기 때문에 rsync는이를 무시합니다. 그러나 실행 비트 만 복사하도록 설정을 조정해도 도움이되지 않았으므로 여전히 작동하지 않는 이유는 확실하지 않습니다.
  • apache 그룹에 테스트 사용자 추가. rsync는 그룹 쓰기 권한없이 파일을 생성하므로이 작업은 도움이되지 않습니다.
  • 테스트 사용자로 Apache 인스턴스를 실행하고 테스트합니다. 이것은 (통합 테스트에서 아파치가 이미 실행 중일 필요가 없다는 점에서) 몇 가지 장점이 있지만 프로덕션 설정으로 사전 구성된 Apache 인스턴스에 대해 통합 테스트를 실행할 수 없다는 단점이 있습니다. 해당이 정확한지 확인하십시오. 따라서이 기능을 결국 테스트 스위트에 추가 할 가능성은 있지만 현재 문제를보다 직접적으로 해결하기 위해 대체이되지는 않습니다.

내가 정말로하고 싶지 않은 또 다른 한 가지는 테스트 스위트가 임시 디렉토리를 올바르게 정리할 수 있도록 rsync에 전달 된 설정을 변경하는 것입니다. 이것은 서비스 데몬에 대한 통합 테스트이므로 얻을 수있는 한 제품에 가까운 구성을 사용하고 싶습니다.

+0

개별 파일이 아니라 포함하는 디렉터리의 부모에게만 쓰기 권한이 있어야합니다. –

+0

테스트 목적으로 만 웹 서비스를 테스트와 동일한 사용자로 실행할 수 있습니까? 또는, 사용중인 디렉토리를 지우는 다른 서비스를 제공 할 수 있지만 나에게 덜 깨끗하다고 ​​느낄 수 있습니다. –

+0

@James : 음, 좋은 지적입니다. 시작 시간이 좋지 않아 웹 서버의 이미 실행중인 인스턴스에 대해 이러한 통합 테스트를 실행하고 있었지만 파일 권한을보다 잘 제어하기 위해서는 그만한 가치가있을 수 있습니다. – ncoghlan

답변

1

해당 서버 오류 질문에 대한 답변을 통해 setfacl을 사용하여 솔루션을 파악할 수있었습니다.

이제 통합 테스트를 위해 임시 디렉토리를 만드는 다음 (addCleanup에 그것이 unittest.TestCase 인스턴스의 일부, 따라서 참조)을 수행하는 코드 :

local_path = tempfile.mkdtemp().decode("utf-8") 
self.addCleanup(shutil.rmtree, local_path) 
acl = "d:u:{0}:rwX".format(os.geteuid()) 
subprocess.check_call(["setfacl", "-m", acl, local_path]) 

처음 두 줄은 단지 임시 디렉토리를 만듭니다 테스트가 끝나면 삭제되도록하십시오.

마지막 두 줄은 새로운 부분이며 테스트 사용자가 항상 읽기/쓰기 권한을 가지며 실행 비트가 설정된 항목에 대한 실행 권한도 갖도록 디렉토리의 기본 ACL을 설정합니다.

+0

아파치가 테스트 하니스로 만든 파일과 디렉토리를 읽는 데 필요한 몇 가지 테스트를 통과하기 위해 임시 디렉토리의 ACL 항목에'' "d : o : rX"''를 추가했습니다. – ncoghlan

1

테스트 사용자를 apache 그룹 (또는 httpd 그룹 중 파일 소유권이있는 그룹)에 추가하십시오.

+0

불행히도 rsync는 그룹 쓰기 권한없이 파일을 생성합니다. 나는 그것을 이미 시도한 것들의리스트에 추가 할 것이다. – ncoghlan

관련 문제