kaistshadow / blockchain-sim

Scalable blockchain simulator/emulator running on shadow simulator
MIT License
9 stars 1 forks source link

기존의rel 0.1.0 단일 노드 테스팅 기능들을 rel 0.2.0 멀티노드에 맞게 수정 #261

Closed tkdlqm2 closed 3 years ago

tkdlqm2 commented 3 years ago

rel 0.1.0 의 9개의 reg test에 multi node test를 위해 수정을 완료함. test 함수들의 구현은 blockchain-sim/testlibs/test_modules.py 에서 구현했음. 대표적으로 기존의 단일노드를 위한 test의 wallet address test 와 수정된 wallet address test를 비교를 해보면,

Before:

def test_walletAddress(simulation_output_file):
    the_wallet_address = ""
    f = open(simulation_output_file[1], "r")
    while True:
        line = f.readline()
        if not line: break
        result = line.find("isvalid")
        if result != -1:
            the_wallet_validation = line.split(",")[0].split('"')[4].split(":")[1]
            if the_wallet_validation == "true":
                print("Success wallet validation test ... ")
                break
            else:
                print("Fail wallet validation test ... ")
                sys.exit(1)

After

def test_walletAddress(simulation_output_file, node_count):
    condition_count = 0
    for z in range(0,node_count):
        f = open(simulation_output_file[z+node_count], "r")
        while True:
            line = f.readline()
            if not line: break
            result = line.find("isvalid")
            if result != -1:
                the_wallet_validation = line.split(",")[0].split('"')[4].split(":")[1]
                if the_wallet_validation == "true":
                    condition_count += 1
                    continue

    test_result(condition_count, node_count, "test_walletAddress ")

parameter로 노드 개수를 가져와서, 노드 개수만큼 테스트를 진행하는 식임. 즉 5개 노드가 시뮬레이션이 진행되면, 5개 노드 전부에 대해 wallet address test가 수행이 됨. 모든 test가 이런식으로 수정이 됨.

def test_result(condition_count, node_count, test_name):
    if condition_count == node_count:
        print("Success %s ... " %test_name)
        print("test result : %d/%d " %(condition_count,node_count))
    else:
        print("Fail %s ..." %test_name)
        print("test result : %d/%d " %(condition_count,node_count))
        sys.exit(1)

마지막에 test_result함수는 최종 결과를 보여주는 함수로서, test_modules.py에 구현이 됨.

이슈와 관련없는 기능이지만, shadow plugin error가 발생했을 시, user에게 print해주는 기능을 추가함. 기존의 test_file_existence 함수는 stdout 파일만 필터링을 하였는데, 이 함수에 stderr 파일 또한 필터링 하는 기능을 추가를 해줌.

def test_file_existence(node_id_list, plugin_list):
    if len(node_id_list) != len(plugin_list):
        sys.exit(1)
    path = os.path.abspath(".")
    target_folder_list = []
    target_error_list = []
    error_list = []
    for i in range(0,len(node_id_list)):
        target_path = path + "/shadow.data/hosts/" + node_id_list[i] + "/stdout-" + node_id_list[i] + "." + plugin_list[i] + ".1000.log"
        target_folder_list.append(target_path)
        target_path = path + "/shadow.data/hosts/" + node_id_list[i] + "/stderr-" + node_id_list[i] + "." + plugin_list[i] + ".1000.log"
        target_error_list.append(target_path)
    for i in range(0,len(target_folder_list)):
        if os.path.isfile(target_folder_list[i]) == False:
            print("Fail not existence shadow plugin output file - %s" %(target_folder_list[i]))
            sys.exit(1)
        if os.path.isfile(target_error_list[i]) == True:
            error_list.append(target_error_list[i])

    if len(error_list) != 0:
        print("Fail shadow plugin running ...")
        print("-------------- shadow plugin error contents --------------")
        for i in range(0,len(error_list)):
            f = open(error_list[i], "r")
            while True:
                line = f.readline().strip()
                print(line)
                if not line: break
            f.close()
        sys.exit(1)

    print("Success blockchain test output file existence ...")
    return target_folder_list

수정된 소스코드는 다음과 같고, 예를들어 4개의 노드를 셋팅하고 실행했을 시, 노드 개수만큼 4개의 data dir 가 셋팅이 되어야하는데, 그렇지 못할 경우 datadir의 부재 관련한 stderr 파일이 생길 것임. image 위에 사진처럼 user에게 stderr 내용을 프린트하고 sys.exit(1) - 에러 종료가 됨.