# coding=utf8
from __future__ import unicode_literals
import threading
import time
import json
import requests
from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response
from tests.mock import pickup_port
from zerotest.utils.generator_helper import get_name_from_request
from zerotest.utils.url_helper import urljoin
class Server(object):
def __init__(self):
self.count = 0
self.host = None
self.port = None
self.thread = None
self.running = False
def dispatch_request(self, request):
handler = getattr(self, get_name_from_request(request), None)
if handler:
return handler(request)
else:
return Response("non route", status=404)
def get_count(self, request):
return Response(json.dumps(dict(count=self.count)),
content_type='application/json; charset=utf-8')
def post_echo(self, request):
return Response(request.data,
content_type=request.headers['content_type'])
def post_raw_to_json(self, request):
data = request.data
return Response(data,
content_type='application/json')
def get_chinese_hello_world(self, request):
return Response(json.dumps(dict(count=self.count, content="你好,世界")),
content_type='application/json; charset=utf-8')
def delete_shutdown_server(self, request):
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
return Response("shutdown")
def __call__(self, environ, start_response):
request = Request(environ)
self.count += 1
environ['HTTP_COUNT'] = self.count
return self.dispatch_request(request)(environ, start_response)
def start(self, host, port):
self.host = host
self.port = port
self.running = True
run_simple(host, port, self)
@property
def url(self):
return 'http://{}:{}'.format(self.host, self.port)
def start_daemon(self, host, port):
self.thread = threading.Thread(target=lambda: self.start(host, port))
self.thread.start()
def shutdown(self):
if self.running:
requests.delete(urljoin(self.url, 'shutdown_server'))
self.running = False
self.thread.join(30)
def start_mock_server(self):
port = pickup_port()
self.start_daemon('127.0.0.1', port)
test_count = 10
while test_count > 0:
try:
if self.running:
r = requests.get(urljoin(self.url, '/count'))
if r.status_code == 200:
return
print("wait server start, response", r.status_code, r.text)
except requests.exceptions.ConnectionError:
pass
time.sleep(1)
test_count -= 1
else:
self.shutdown()
raise RuntimeError("start mock server timeout")
Mocked API server
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門卵凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胜臊,你說我怎么就攤上這事氛谜。” “怎么了区端?”我有些...
- 文/不壞的土叔 我叫張陵值漫,是天一觀的道長。 經(jīng)常有香客問我织盼,道長杨何,這世上最難降的妖魔是什么酱塔? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮蕊玷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弥雹。我一直安慰自己垃帅,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布剪勿。 她就那樣靜靜地躺著贸诚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厕吉。 梳的紋絲不亂的頭發(fā)上酱固,一...
- 文/蒼蘭香墨 我猛地睜開眼脖苏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼程拭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亦歉,我...
- 序言:老撾萬榮一對(duì)情侶失蹤恤浪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肴楷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體水由,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年赛蔫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砂客。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泥张。...
- 正文 年R本政府宣布钞钙,位于F島的核電站,受9級(jí)特大地震影響声离,放射性物質(zhì)發(fā)生泄漏芒炼。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一抵恋、第九天 我趴在偏房一處隱蔽的房頂上張望焕议。 院中可真熱鬧,春花似錦弧关、人聲如沸盅安。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽别瞭。三九已至,卻和暖如春株憾,著一層夾襖步出監(jiān)牢的瞬間蝙寨,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓贝奇,卻偏偏與公主長得像虹菲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掉瞳,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- docker api Docker is running on client / server model, ea...
- 場(chǎng)景 使用webpack-dev-server驅(qū)動(dòng)前端項(xiàng)目時(shí),開發(fā)工程中由于訪問的webpack-dev-serv...
- 以往因?yàn)閖avascript的許多殘缺設(shè)計(jì)毕源,使得我轉(zhuǎn)身投靠iced-coffeescript(進(jìn)階版coffees...
- configuration has an unknown property 'colors'. These pro...
- 簡介 在寫一個(gè)藍(lán)牙的項(xiàng)目里邊,需要實(shí)現(xiàn)一個(gè)功能陕习,按外設(shè)的按鈕實(shí)現(xiàn)音樂的播放暫停等功能霎褐,以及后臺(tái)播放。搜索資料了解到...