Skip to content

Commit

Permalink
Merge pull request #30 from tsbxmw/dev-2.1.0
Browse files Browse the repository at this point in the history
Dev 2.1.0 fix lock support #16
  • Loading branch information
tsbxmw authored Dec 3, 2018
2 parents 3fb8b02 + 9ac7ec6 commit be23029
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 67 deletions.
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ install:
- pip install coupling
- pip install pyaml
- pip install deepdiff
- pip install setuptools
script:
- # or py.test for Python versions 3.5 and below
- python -m haf run -rc=1 -case=./testcases/test.xlsx,./testcases/test2.json,./testcases/test3.yml -rh=True -rod=./testcases/report.html -ld=./testcases
- python -m haf run -rc=1 -case=./testcases/test2.json -rh=True -rod=./testcases/report.html -ld=./testcases
- python -m haf run -rc=1 -case=./testcases/test3.yml -rh=True -rod=./testcases/report.html -ld=./testcases
- python -m haf run -rc=2 -case=./testcases/test3.yml -rh=True -rod=./testcases/report.html -ld=./testcases
- python -m haf run -rc=1 -case=./testcases/test.xlsx,./testcases/test2.json,./testcases/test3.yml -rh=True -rod=./testcases/report.html -ld=./testcases
- python -m haf run -rc=2 -case=./testcases/test.xlsx,./testcases/test2.json,./testcases/test3.yml -rh=True -rod=./testcases/report1.html -ld=./testcases
- python -m haf run -rc=3 -case=./testcases/test.xlsx,./testcases/test2.json,./testcases/test3.yml -rh=True -rod=./testcases/report1.html -ld=./testcases
- cat ./testcases/report.html
- cat ./testcases/report1.html
6 changes: 3 additions & 3 deletions _config.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
theme: jekyll-theme-leap-day
theme: jekyll-theme-leap-day

title: "AutoTest Framework"
description: "make autotest easy and better"
title: "HAF"
description: "haf, make autotest easy and better"

show_downloads: true
google_analytics:
16 changes: 14 additions & 2 deletions haf/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,18 @@

MAIN_VERSION = 2
SUB_VERSION = 0
FIX_VERSION = 0
FIX_VERSION = 2
VERSION_TYPE = "dev"
PLATFORM_VERSION = f"{VERSION_TYPE}-{MAIN_VERSION}.{SUB_VERSION}.{FIX_VERSION}"
PLATFORM_VERSION = f"{VERSION_TYPE}-{MAIN_VERSION}.{SUB_VERSION}.{FIX_VERSION}"

BANNER_STRS ="""
***************************************
* H H A FFFFFFFF *
* H H A A F *
* H H A A F *
* HHHHHHHH AAAAAAA FFFFFFFF *
* H H A A F *
* H H A A F *
* H HA AF v2.0.2 *
***************************************
"""
1 change: 1 addition & 0 deletions haf/ext/jinjia2report/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def write_report_to_file(info, report_path: str):
try:
stream = TemplateStream(info)
stream.dump(report_path)

except Exception as e:
logger.error(e)

Expand Down
14 changes: 8 additions & 6 deletions haf/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from haf.common.log import Log
from haf.config import *
from haf.suite import HttpApiSuite
from haf.utils import Utils
from haf.utils import Utils, locker

logger = Log.getLogger(__name__)

Expand Down Expand Up @@ -84,10 +84,10 @@ def run(self):
case.error = CASE_ERROR
case.error_msg = str(e)
self.add_case(case)
self.put_case(case)
self.put_web_message()
self.put_case("case", case)
self.put_web_message("web")

self.put_web_message()
self.put_web_message("web")
time.sleep(0.1)
except Exception:
raise FailLoaderException
Expand All @@ -107,13 +107,15 @@ def add_case(self, case):
self.loader["error"] += 1
self.loader["error_info"][f"{case.ids.id}.{case.ids.subid}.{case.ids.name}"] = case.error_msg

def put_web_message(self):
@locker
def put_web_message(self, key:str):
web_queue = self.bus_client.get_publish_loader()
if web_queue.full():
web_queue.get()
web_queue.put(self.loader)

def put_case(self, case):
@locker
def put_case(self, key:str, case):
logger.info(f"{self.key} -- put case {case.ids.id}.{case.ids.subid}.{case.ids.name}")
case_queue = self.bus_client.get_case()
case_queue.put(case)
Expand Down
8 changes: 7 additions & 1 deletion haf/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,17 @@
import os

from haf.program import Program

from haf.config import BANNER_STRS
import argparse

def init():
print(BANNER_STRS)


def main():

init()

arg_program = argparse.ArgumentParser(prog="python -m haf", add_help=True)

sub_all_arg_program = arg_program.add_subparsers(dest="all")
Expand Down
73 changes: 21 additions & 52 deletions haf/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from haf.result import HttpApiResult
from haf.common.log import Log
from haf.config import *
from haf.utils import Utils
from haf.utils import Utils, locker
from haf.asserthelper import AssertHelper
from haf.case import HttpApiCase, BaseCase
import traceback
Expand Down Expand Up @@ -49,44 +49,24 @@ def get_bench(self, case:BaseCase):
self.benchs[case.bench_name] = bench
return bench

def get_lock(self, key):
if key == "result":
return self.bus_client.get_lock().get()
elif key == "web":
return self.bus_client.get_web_lock().get()
elif key == "case":
return self.bus_client.get_case_lock().get()

def release_lock(self, key):
if key == "result":
self.bus_client.get_lock().put(Lock)
elif key == "web":
self.bus_client.get_web_lock().put(Lock)
elif key == "case":
return self.bus_client.get_case_lock().put(Lock)

def put_result(self, result:HttpApiResult):
@locker
def put_result(self, key:str, result:HttpApiResult):
logger.info(f"{self.key} : runner {self.pid} put result{result.case.ids.id}.{result.case.ids.subid}.{result.case.ids.name}")
while True:
if self.get_lock("result") is None:
time.sleep(0.1)
else:
result_handler = self.bus_client.get_result()
result_handler.put(result)
self.release_lock("result")
break

def put_web_message(self):
while True:
if self.get_lock("web") is None:
time.sleep(0.1)
else:
web_queue = self.bus_client.get_publish_runner()
if web_queue.full():
web_queue.get()
web_queue.put(self.runner)
self.release_lock("web")
break
result_handler = self.bus_client.get_result()
result_handler.put(result)

@locker
def put_web_message(self, key:str):
web_queue = self.bus_client.get_publish_runner()
if web_queue.full():
web_queue.get()
web_queue.put(self.runner)

@locker
def put_case_back(self, key:str, case):
logger.info(f"{self.runner_key} : runner put case {case.ids.id}.{case.ids.subid}-{case.ids.name}")
case_handler = self.bus_client.get_case()
case_handler.put(case)

def result_handler(self, result):
if isinstance(result, HttpApiResult):
Expand All @@ -111,7 +91,7 @@ def result_handler(self, result):
}

logger.info(f"{self.key} : runner {self.pid} -- put web message {self.runner}")
self.put_web_message()
self.put_web_message("web")

def run(self):
try:
Expand All @@ -128,7 +108,7 @@ def run(self):
break
result = self.run_case(case)
if isinstance(result, HttpApiResult):
self.put_result(result)
self.put_result("result", result)
time.sleep(0.1)
except Exception as e:
logger.error(e)
Expand All @@ -147,7 +127,7 @@ def run_case(self, local_case:HttpApiCase):
result = api_runner.run(local_case)
if isinstance(result, list):
if result[0] == CASE_CAN_NOT_RUN_HERE:
self.put_case_back(local_case)
self.put_case_back("case", local_case)
return
if result[0] == CASE_SKIP:
result = result[1]
Expand All @@ -173,17 +153,6 @@ def end_handler(self):
case_handler = self.bus_client.get_case()
case_handler.put(SIGNAL_CASE_END)

def put_case_back(self, case):
logger.info(f"{self.runner_key} : runner put case {case.ids.id}.{case.ids.subid}-{case.ids.name}")
while True:
if self.get_lock("case") is None:
time.sleep(0.1)
else:
case_handler = self.bus_client.get_case()
case_handler.put(case)
self.release_lock("case")
break


class BaseRunner(object):
def __init__(self, bench:BaseBench):
Expand Down
43 changes: 43 additions & 0 deletions haf/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,57 @@
from haf.config import *
from haf.common.httprequest import HttpController
from http.client import HTTPResponse
from haf.common.lock import Lock
from datetime import datetime
from functools import wraps
import random
import platform
import yaml

logger = Log.getLogger(__name__)


class Locker:
def __init__(self, bus_client, key):
self.bus_client = bus_client
self.key = key

def get_lock(self):
if self.key == "result":
lock = self.bus_client.get_lock()
elif self.key == "web":
lock = self.bus_client.get_web_lock()
elif self.key == "case":
lock = self.bus_client.get_case_lock()
while True:
if not lock.empty():
return lock.get()
time.sleep(0.1)

def release_lock(self):
if self.key == "result":
return self.bus_client.get_lock().put(Lock)
elif self.key == "web":
return self.bus_client.get_web_lock().put(Lock)
elif self.key == "case":
return self.bus_client.get_case_lock().put(Lock)


def locker(func):
@wraps(func)
def lock(self, *args, **kwargs):
if len(args) > 0:
key = args[0]
else:
key = kwargs.get("key")
locker = Locker(self.bus_client, key)
locker.get_lock()
func(self, *args, **kwargs)
locker.release_lock()
return
return lock


class Utils(object):

@staticmethod
Expand Down
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
'jinja2',
'coupling',
'pyaml',
'deepdiff'
'deepdiff',
'setuptools'
]

with open('ReadMe.md', encoding='utf8') as f:
Expand All @@ -42,7 +43,7 @@ def package_files(directory):

setup(
name = 'haf',
version = '2.0.1',
version = '2.0.2',
author = 'wei.meng',
author_email = 'mengwei1101@hotmail.com',
long_description = long_description,
Expand Down

0 comments on commit be23029

Please sign in to comment.