def test_submit_work(self): # add soldier soldier = SoldierInfo(id='sxxx0', name='sol_http', place="left", weapons=[], orders=[]) self.app.post('/leader/subordinates', data=dumps(soldier.to_dict()), content_type='application/json') # submit a work work = Work(purpose="some app", time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), values="some values") response = self.app.post('/leader/subordinates/sxxx0/work', data=dumps(work.to_dict()), content_type='application/json') self.assertEqual(response.status_code, 200) actual = loads(response.data.decode("utf-8")) # assert expected = { "_status": {'success': True, 'msg': "status is ok"}, "accepted": work.to_dict() } self.assertEqual(actual, expected)
def test_submit_work(self): # add soldier soldier = SoldierInfo(id='sxxx0', name='sol_http', place="left", weapons=[], orders=[]) self.app.post('/leader/subordinates', data=dumps(soldier.to_dict()), content_type='application/json') # submit a work work = Work(purpose="some app", time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), values="some values") response = self.app.post('/leader/subordinates/sxxx0/work', data=dumps(work.to_dict()), content_type='application/json') self.assertEqual(response.status_code, 200) actual = loads(response.data.decode("utf-8")) # assert expected = { "_status": { 'success': True, 'msg': "status is ok" }, "accepted": work.to_dict() } self.assertEqual(actual, expected)
def run(self): if 'timer' in self.order.trigger.keys(): interval = self.order.trigger['timer'] while not self.lock.wait(timeout=interval): raw = self.soldier.tag.get_values(self.order.values) for k, v in raw.items(): if v == (None, None): os._exit(1) # 通信失敗していたらプロセスをkill # やり方が酷いし、leaderのacceptに工夫が居る values = [{ "type": type, "value": v[0], "unit": v[1] } for type, v in raw.items()] time = datetime.datetime.now(datetime.timezone.utc).isoformat() work = Work(time, self.order.purpose, values) url = "{0}subordinates/{1}/work".format( self.soldier.superior_ep, self.soldier.id) res, err = rest.post(url, json=work.to_dict()) if err is not None: self.soldier.shutdown() logger.fatal('in WorkingThread, failed to post work: {0}', err) return else: pass
def run(self): if 'timer' in self.order.trigger.keys(): interval = self.order.trigger['timer'] while not self.lock.wait(timeout=interval): raw = self.soldier.tag.get_values(self.order.values) for k, v in raw.items(): if v == (None, None): os._exit(1) # 通信失敗していたらプロセスをkill # やり方が酷いし、leaderのacceptに工夫が居る values = [{"type": type, "value": v[0], "unit": v[1]} for type, v in raw.items()] time = datetime.datetime.now(datetime.timezone.utc).isoformat() work = Work(time, self.order.purpose, values) url = "{0}subordinates/{1}/work".format( self.soldier.superior_ep, self.soldier.id) res, err = rest.post(url, json=work.to_dict()) if err is not None: self.soldier.shutdown() logger.fatal('in WorkingThread, failed to post work: {0}', err) return else: pass
def test_missoin_do(self): def post_report(url, data=None, json=None, etag=None, **kwargs): res = requests.Response() res.status_code = 200 res_dict = { "_status": {"msg": "ok", "success": True}, "accepted": json } res._content = dumps(res_dict).encode() return res, None self.leader_obj.superior_ep = "test://cxxx0/commander/" soldier = SoldierInfo(id="sxxx0", name="sol-test", place="left", weapons=[], orders=[]) self.leader_obj.accept_subordinate(soldier) mission = Mission(author="sxxx0", requirement=Requirement( values=["zero", "random"], trigger={"timer": 0.4} ), trigger={"timer": 0.7}, place="All", purpose="some purpose hash") work_1 = Work(time=datetime.utcnow().isoformat(), purpose=mission.get_id(), values=[0, 0.584249]) work_2 = Work(time=datetime.utcnow().isoformat(), purpose=mission.get_id(), values=[0, 0.238491]) work_3 = Work(time=datetime.utcnow().isoformat(), purpose="0" + mission.get_id()[:-1], # 上2つとずらす values=[0, 0.045066]) self.leader_obj.accept_work("sxxx0", work_1) self.leader_obj.accept_work("sxxx0", work_2) self.leader_obj.accept_work("sxxx0", work_3) with patch("utils.rest.post", side_effect=post_report) as m: self.leader_obj.accept_mission(mission) time.sleep(1) self.assertEqual(m.call_count, 1) self.assertEqual(m.call_args[0][0], "test://cxxx0/commander/subordinates/lxxx0/report") # reportのチェック actual = m.call_args[1]["json"] self.assertEqual(set(actual.keys()), {"time", "place", "purpose", "values"}) self.assertEqual(actual["purpose"], "some purpose hash") self.assertEqual(len(actual["values"]), 2) # report.valuesのチェック work_in_1 = work_1.to_dict() del work_in_1["purpose"] work_in_1["place"] = "left" work_in_2 = work_2.to_dict() del work_in_2["purpose"] work_in_2["place"] = "left" self.assertIn(work_in_1, actual["values"]) self.assertIn(work_in_2, actual["values"]) self.leader_obj.superior_ep = "" # shutdownでDELETEを送信するのを阻止
def test_missoin_do(self): def post_report(url, data=None, json=None, etag=None, **kwargs): res = requests.Response() res.status_code = 200 res_dict = { "_status": { "msg": "ok", "success": True }, "accepted": json } res._content = dumps(res_dict).encode() return res, None self.leader_obj.superior_ep = "test://cxxx0/commander/" soldier = SoldierInfo(id="sxxx0", name="sol-test", place="left", weapons=[], orders=[]) self.leader_obj.accept_subordinate(soldier) mission = Mission(author="sxxx0", requirement=Requirement(values=["zero", "random"], trigger={"timer": 0.4}), trigger={"timer": 0.7}, place="All", purpose="some purpose hash") work_1 = Work(time=datetime.utcnow().isoformat(), purpose=mission.get_id(), values=[0, 0.584249]) work_2 = Work(time=datetime.utcnow().isoformat(), purpose=mission.get_id(), values=[0, 0.238491]) work_3 = Work( time=datetime.utcnow().isoformat(), purpose="0" + mission.get_id()[:-1], # 上2つとずらす values=[0, 0.045066]) self.leader_obj.accept_work("sxxx0", work_1) self.leader_obj.accept_work("sxxx0", work_2) self.leader_obj.accept_work("sxxx0", work_3) with patch("utils.rest.post", side_effect=post_report) as m: self.leader_obj.accept_mission(mission) time.sleep(1) self.assertEqual(m.call_count, 1) self.assertEqual( m.call_args[0][0], "test://cxxx0/commander/subordinates/lxxx0/report") # reportのチェック actual = m.call_args[1]["json"] self.assertEqual(set(actual.keys()), {"time", "place", "purpose", "values"}) self.assertEqual(actual["purpose"], "some purpose hash") self.assertEqual(len(actual["values"]), 2) # report.valuesのチェック work_in_1 = work_1.to_dict() del work_in_1["purpose"] work_in_1["place"] = "left" work_in_2 = work_2.to_dict() del work_in_2["purpose"] work_in_2["place"] = "left" self.assertIn(work_in_1, actual["values"]) self.assertIn(work_in_2, actual["values"]) self.leader_obj.superior_ep = "" # shutdownでDELETEを送信するのを阻止