Example #1
0
    def test_simple_list(self):
        """
        SubProcess for listing files

        """
        # Set up our threaded process
        sp = SubProcess(['ls', '-1', '/tmp'])
        # Now run our process
        sp.start()
        # Wait for it to complete
        sp.join()

        assert sp.is_complete() is True
        assert sp.response_code() is 0
        assert sp.successful() is True
        assert sp.elapsed() > 0.0
        assert isinstance(sp.stdout(), list)
        assert isinstance(sp.stderr(), list)
        assert isinstance(sp.stdout(as_list=False), basestring)
        assert isinstance(sp.stderr(as_list=False), basestring)

        # Because under the hood stdout and stderr are stored into
        # Stream objects, we need to be able to check that multple
        # calls to the same object still return the same results
        assert len(sp.stdout()) > 1
        assert len(sp.stdout()) > 1
        assert len(sp.stderr()) > 0
        assert len(sp.stderr()) > 0
Example #2
0
    def test_simple_list(self):
        """
        SubProcess for listing files

        """
        # Set up our threaded process
        sp = SubProcess(['ls', '-1', '/tmp'])
        # Now run our process
        sp.start()
        # Wait for it to complete
        sp.join()

        assert sp.is_complete() is True
        assert sp.response_code() is 0
        assert sp.successful() is True
        assert sp.elapsed() > 0.0
        assert isinstance(sp.stdout(), list)
        assert isinstance(sp.stderr(), list)
        assert isinstance(sp.stdout(as_list=False), basestring)
        assert isinstance(sp.stderr(as_list=False), basestring)

        # Because under the hood stdout and stderr are stored into
        # Stream objects, we need to be able to check that multple
        # calls to the same object still return the same results
        assert len(sp.stdout()) > 1
        assert len(sp.stdout()) > 1
        assert len(sp.stderr()) > 0
        assert len(sp.stderr()) > 0
Example #3
0
    def test_process_dies_with_object(self):
        """
        SubProcess for a process that will never stop

        """
        # Set up our threaded process to sleep for 1 day
        sp = SubProcess(['sleep', '1d'])
        # Now run our process
        sp.start()

        # Wait half a second (give thread time to start and run)
        sp.join(timeout=0.5)

        # We'll get the pid number of our process
        assert sp.pid() is not None
        pid = sp.pid()

        # Test that the process is indeed running
        assert self.pid_exists(pid) is True

        # now we'll flat out destroy the object (always abort it first)
        sp.abort()
        del sp

        # Test that the process is now dead as a result of the previous action
        assert self.pid_exists(pid) is False
Example #4
0
    def test_process_dies_with_object(self):
        """
        SubProcess for a process that will never stop

        """
        # Set up our threaded process to sleep for 1 day
        sp = SubProcess(['sleep', '1d'])
        # Now run our process
        sp.start()

        # Wait half a second (give thread time to start and run)
        sp.join(timeout=0.5)

        # We'll get the pid number of our process
        assert sp.pid() is not None
        pid = sp.pid()

        # Test that the process is indeed running
        assert self.pid_exists(pid) is True

        # now we'll flat out destroy the object (always abort it first)
        sp.abort()
        del sp

        # Test that the process is now dead as a result of the previous action
        assert self.pid_exists(pid) is False
Example #5
0
    def test_program_that_will_not_die(self):
        """
        SubProcess for a process that will never stop

        """
        # Set up our threaded process to sleep for 1 day
        sp = SubProcess(['sleep', '1d'])
        # Now run our process
        sp.start()

        # Wait half a second (give thread time to start and run)
        sp.join(timeout=0.5)

        # PID is always None unless the process is still running
        assert sp.pid() is not None
        assert isinstance(sp.pid(), int)

        # The process is still running
        assert sp.is_complete() is False
        # The process is not successful, but we shouldn't be relying on this
        # value anyway because it's not even complete.
        assert sp.successful() is False
        # time should be elapsing
        assert sp.elapsed() > 0.0

        # No output to report at this time because one of the downsides of
        # using subprocess is you can't retrieve the pipes content until the
        # end.  Thus these functions will simply return nothing.
        assert len(sp.stdout()) > 0
        assert len(sp.stderr()) > 0

        # Currently the response code is still unknown
        assert sp.response_code() is ReturnCode.Unknown

        # We'll abort the process now
        sp.abort()

        # Wait for it to complete (because it will complete now)
        sp.join()

        # PID is always None when process is stopped
        assert sp.pid() is None

        # The response code should have change to Aborted
        assert sp.response_code() is ReturnCode.Aborted

        # The process is now complete
        assert sp.is_complete() is True

        # But we should not be successful at this point
        assert sp.successful() is False
Example #6
0
    def test_program_that_will_not_die(self):
        """
        SubProcess for a process that will never stop

        """
        # Set up our threaded process to sleep for 1 day
        sp = SubProcess(['sleep', '1d'])
        # Now run our process
        sp.start()

        # Wait half a second (give thread time to start and run)
        sp.join(timeout=0.5)

        # PID is always None unless the process is still running
        assert sp.pid() is not None
        assert isinstance(sp.pid(), int)

        # The process is still running
        assert sp.is_complete() is False
        # The process is not successful, but we shouldn't be relying on this
        # value anyway because it's not even complete.
        assert sp.successful() is False
        # time should be elapsing
        assert sp.elapsed() > 0.0

        # No output to report at this time because one of the downsides of
        # using subprocess is you can't retrieve the pipes content until the
        # end.  Thus these functions will simply return nothing.
        assert len(sp.stdout()) > 0
        assert len(sp.stderr()) > 0

        # Currently the response code is still unknown
        assert sp.response_code() is ReturnCode.Unknown

        # We'll abort the process now
        sp.abort()

        # Wait for it to complete (because it will complete now)
        sp.join()

        # PID is always None when process is stopped
        assert sp.pid() is None

        # The response code should have change to Aborted
        assert sp.response_code() is ReturnCode.Aborted

        # The process is now complete
        assert sp.is_complete() is True

        # But we should not be successful at this point
        assert sp.successful() is False
Example #7
0
    def test_bad_execution(self):
        """
        SubProcess for listing files with bad arguments

        """
        # Set up our threaded process
        sp = SubProcess(['ls', '-wtf', '-not-a-valid-argument'])
        # Now run our process
        sp.start()
        # Wait for it to complete
        sp.join()

        assert sp.is_complete() is True
        assert sp.response_code() is not 0
        assert sp.successful() is False
        assert sp.elapsed() > 0.0

        # Because under the hood stdout and stderr are stored into
        # Stream objects, we need to be able to check that multple
        # calls to the same object still return the same results
        assert len(sp.stdout()) > 0
        assert len(sp.stdout()) > 0
        assert len(sp.stderr()) > 1
        assert len(sp.stderr()) > 1
Example #8
0
    def test_bad_execution(self):
        """
        SubProcess for listing files with bad arguments

        """
        # Set up our threaded process
        sp = SubProcess(['ls', '-wtf', '-not-a-valid-argument'])
        # Now run our process
        sp.start()
        # Wait for it to complete
        sp.join()

        assert sp.is_complete() is True
        assert sp.response_code() is not 0
        assert sp.successful() is False
        assert sp.elapsed() > 0.0

        # Because under the hood stdout and stderr are stored into
        # Stream objects, we need to be able to check that multple
        # calls to the same object still return the same results
        assert len(sp.stdout()) > 0
        assert len(sp.stdout()) > 0
        assert len(sp.stderr()) > 1
        assert len(sp.stderr()) > 1
Example #9
0
    def test(self, content=None, password=None):
        """
        content must be pointing to a directory containing rar files that can
        be easily sorted on. Alternatively, path can be of type NNTPContent()
        or a set/list of.

        If no password is specified, then the password configuration loaded
        into the class is used instead.

        This function just tests an archive to see if it can be properly
        extracted using the known password.
        """
        if content is not None:
            paths = self.get_paths(content)

        elif len(self.archive):
            # Get first item in archive
            paths = iter(self.archive)

        else:
            raise AttributeError("CodecRar: No rar file detected.")

        if not self.can_exe(self._unrar):
            return None

        if not password:
            password = self.password

        # Initialize our command
        execute = [
            # Our Executable RAR Application
            self._unrar,
            # Use Test Flag
            't',
            # Assume Yes
            '-y',
        ]

        # Password Protection
        if password is not None:
            execute.append('-p%s' % password)
        else:
            # Do not prompt for password
            execute.append('-p-')

        if self.keep_broken:
            # Keep Broken Flag
            execute.append('-kb')

        # Stop Switch Parsing
        execute.append('--')

        for _path in paths:
            # Create our SubProcess Instance
            sp = SubProcess(list(execute) + [_path])

            # Start our execution now
            sp.start()
            sp.join()

            # Let the caller know our status
            if not sp.successful():
                return False

        return True
Example #10
0
    def test(self, content=None, password=None):
        """
        content must be pointing to a directory containing rar files that can
        be easily sorted on. Alternatively, path can be of type NNTPContent()
        or a set/list of.

        If no password is specified, then the password configuration loaded
        into the class is used instead.

        This function just tests an archive to see if it can be properly
        extracted using the known password.
        """
        if content is not None:
            paths = self.get_paths(content)

        elif len(self.archive):
            # Get first item in archive
            paths = iter(self.archive)

        else:
            raise AttributeError("Codec7Zip: No 7-Zip file detected.")

        if not self.can_exe(self._bin):
            return None

        if not password:
            password = self.password

        # Initialize our command
        execute = [
            # Our Executable 7-Zip Application
            self._bin,
            # Use Test Flag
            't',
            # Assume Yes
            '-y',
        ]

        # Password Protection
        if password is not None:
            execute.append('-p%s' % password)
        else:
            # Do not prompt for password
            execute.append('-p-')

        # Stop Switch Parsing
        execute.append('--')

        for _path in paths:
            # Create our SubProcess Instance
            sp = SubProcess(list(execute) + [_path])

            # Start our execution now
            sp.start()
            sp.join()

            # Let the caller know our status
            if not sp.successful():
                return False

        return True
Example #11
0
    def test(self, content=None):
        """
        content must be pointing to a directory containing par files that can
        be easily sorted on. Alternatively, path can be of type NNTPContent()
        or a set/list of.

        This function just tests an archive to see if it can be properly
        prepared (it is effectively a wrapper to verify)

        If anything but True is returned then there was a problem verifying
        the results and a code identified in ParReturnCode() is returned
        instead.
        """
        if content is not None:
            paths = self.get_paths(content)

        elif len(self.archive):
            # Get first item in archive
            paths = iter(self.archive)

        else:
            raise AttributeError("CodecPar: No par file detected.")

        if not self.can_exe(self._par):
            return None

        # filter our results by indexes
        indexes = self.__filter_pars(paths, indexes=True, volumes=False)

        if not len(indexes):
            logger.warning('Archive contained no PAR files.')
            return ParReturnCode.NoParFiles

        # Initialize our command
        execute = [
            # Our Executable PAR Application
            self._par,
            # Use Test Flag
            'verify',
        ]

        if self.cpu_cores is not None and self.cpu_cores > 1:
            # to checksum concurrently - uses multiple threads
            execute.append('-t+')

        # Stop Switch Parsing
        execute.append('--')

        for _path in indexes:

            # Get the directory the par file resides in
            par_path = dirname(_path)

            with pushd(par_path):
                # Create our SubProcess Instance
                sp = SubProcess(list(execute) + [basename(_path)])

                # Start our execution now
                sp.start()
                sp.join()

                # Let the caller know our status
                if sp.response_code() is not ParReturnCode.NoRepairRequired:
                    return sp.response_code()

        return True