Beispiel #1
0
def check_telnet_hooks(scpi_obj):
    _print_header("Telnet hooks")
    try:
        ipv4 = Telnet("127.0.0.1", 5025)
        ipv6 = Telnet("::1", 5025)
        cmd = "*IDN?"

        def hook(who, what):
            _print_info("\t\thook call, received: ({0!r}, {1!r})"
                        "".format(who, what))
        scpi_obj.addConnectionHook(hook)
        _print_info("\tipv4 send {0}".format(cmd))
        ipv4.write(cmd)
        _print_info("\tipv4 answer {0!r}".format(ipv4.read_until('\n')))
        _print_info("\tipv6 send {0}".format(cmd))
        ipv6.write(cmd)
        _print_info("\tipv6 answer {0!r}".format(ipv6.read_until('\n')))
        scpi_obj.removeConnectionHook(hook)
        ipv4.close()
        ipv6.close()
        result = True, "Telnet hooks test PASSED"
    except Exception as exc:
        print("\tUnexpected kind of exception! {0}".format(exc))
        print_exc()
        result = False, "Telnet hooks test FAILED"
    _print_footer(result[1])
    return result
Beispiel #2
0
def multithreading_take(lock_obj):
    def send_event(event_lst, who):
        event_lst[who].set()
        while event_lst[who].isSet():  # wait to the thread to work
            _sleep(1)

    test_name = "Lock take test"
    _print_header("{} for {}".format(test_name, lock_obj))
    joiner_event = _Event()
    joiner_event.clear()
    user_threads = []
    request_events = []
    access_events = []
    release_events = []
    print_lock = _Lock()
    for i in range(2):
        request_event = _Event()
        access_event = _Event()
        release_event = _Event()
        user_thread = _Thread(target=thread_function,
                              args=(lock_obj, joiner_event, request_event,
                                    access_event, release_event, print_lock),
                              name='{:d}'.format(i))
        request_events.append(request_event)
        access_events.append(access_event)
        release_events.append(release_event)
        user_threads.append(user_thread)
        user_thread.start()
    # here is where the test starts ---
    try:
        _print_info("Initial state {!r}\n".format(lock_obj),
                    level=1,
                    lock=print_lock)
        if lock_obj.isLock():
            return False, "{} FAILED".format(test_name)

        _print_info("Tell the threads to access",
                    level=1,
                    lock=print_lock,
                    top=True)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("both should have had access",
                    level=1,
                    lock=print_lock,
                    bottom=True)

        _print_info("Thread 0 take the lock",
                    level=1,
                    lock=print_lock,
                    top=True)
        send_event(request_events, 0)
        if not lock_obj.isLock() or lock_obj.owner != '0':
            raise Exception("It shall be lock by 0")
        _print_info("Tell the threads to access", level=1, lock=print_lock)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("0 should, but 1 don't",
                    level=1,
                    lock=print_lock,
                    bottom=True)

        _print_info("Try to lock when it is already",
                    level=1,
                    lock=print_lock,
                    top=True)
        send_event(request_events, 1)
        if not lock_obj.isLock() or lock_obj.owner != '0':
            raise Exception("It shall be lock by user 0")
        _print_info("Tell the threads to access", level=1, lock=print_lock)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("0 should, but 1 don't",
                    level=1,
                    lock=print_lock,
                    bottom=True)

        _print_info("Try to release by a NON-owner",
                    level=1,
                    lock=print_lock,
                    top=True)
        send_event(release_events, 1)
        if not lock_obj.isLock() or lock_obj.owner != '0':
            raise Exception("It shall be lock by user 0")
        _print_info("Tell the threads to access", level=1, lock=print_lock)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("0 should, but 1 don't",
                    level=1,
                    lock=print_lock,
                    bottom=True)

        _print_info("release the lock", level=1, lock=print_lock, top=True)
        send_event(release_events, 0)
        if lock_obj.isLock():
            raise Exception("It shall be released")
        _print_info("Tell the threads to access", level=1, lock=print_lock)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("both should have had to",
                    level=1,
                    lock=print_lock,
                    bottom=True)

        # TODO: timeout
        _print_info("Thread 1 take the lock and expire it",
                    level=1,
                    lock=print_lock,
                    top=True)
        send_event(request_events, 1)
        if not lock_obj.isLock() or lock_obj.owner != '1':
            raise Exception("It shall be lock by 1")
        _print_info("Tell the threads to access", level=1, lock=print_lock)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("1 should, but 0 don't", level=1, lock=print_lock)
        _print_info("Sleep {:d} seconds to expire the lock".format(
            TEST_EXPIRATION_TIME),
                    level=1,
                    lock=print_lock)
        _sleep(TEST_EXPIRATION_TIME)
        _print_info("Tell the threads to access", level=1, lock=print_lock)
        send_event(access_events, 0)
        send_event(access_events, 1)
        _print_info("both should have had to",
                    level=1,
                    lock=print_lock,
                    bottom=True)

        answer = True, "{} PASSED".format(test_name)
    except Exception as e:
        print(e)
        print_exc()
        answer = False, "{} FAILED".format(test_name)
    joiner_event.set()
    while len(user_threads) > 0:
        user_thread = user_threads.pop()
        user_thread.join(1)
        if user_thread.is_alive():
            user_threads.append(user_thread)
    print("All threads has finished")
    return answer
Beispiel #3
0
def lock_take(lock_obj):
    test_name = "Initial state test"
    _print_header("Test the initial state of the {} object".format(lock_obj))
    _print_info("{!r}".format(lock_obj), 1)

    _print_info("Check if it is lock", level=1, top=True)
    if lock_obj.isLock():
        return False, "{} FAILED".format(test_name)
    _print_info("{} is not lock".format(lock_obj), level=1, bottom=True)

    _print_info("Check if it lock can be requested", level=1, top=True)
    if not lock_obj.request():
        return False, "{} FAILED".format(test_name)
    _print_info("{!r} is now lock".format(lock_obj), level=1, bottom=True)

    _print_info("Check if it lock can be released", level=1, top=True)
    if not lock_obj.release():
        return False, "{} FAILED".format(test_name)
    _print_info("{!r} is now released".format(lock_obj), level=1, bottom=True)

    return True, "{} PASSED".format(test_name)
Beispiel #4
0
def thread_function(lock_obj, joined_event, request, access, release,
                    print_lock):
    _print_info("started", level=1, lock=print_lock)
    while not joined_event.isSet():
        # _print_info("loop", level=1, lock=print_lock)
        if request.isSet():
            take = lock_obj.request(TEST_EXPIRATION_TIME)
            request.clear()
            _print_info("request {}".format(take), level=2, lock=print_lock)
        if access.isSet():
            if lock_obj.access():
                _print_info("access allowed", level=2, lock=print_lock)
            else:
                _print_info("rejected to access", level=2, lock=print_lock)
            access.clear()
        if release.isSet():
            free = lock_obj.release()
            release.clear()
            _print_info("release {}".format(free), level=2, lock=print_lock)
        _sleep(1)
    _print_info("exit", level=1, lock=print_lock)
Beispiel #5
0
 def hook(who, what):
     _print_info("\t\thook call, received: ({0!r}, {1!r})"
                 "".format(who, what))
Beispiel #6
0
 def _print(self, msg, level=1, top=False, bottom=False):
     _print_info(msg, level=level, lock=self._print_lock, top=top,
                 bottom=bottom)