Beispiel #1
0
def make_requirement(sr: Sequence[SubmissionRequirements],
                     descriptors: Sequence[InputDescriptors]) -> Requirement:
    if not sr:
        sr = []
    if not descriptors:
        descriptors = []
    if len(sr) == 0:
        requirement = Requirement(
            count=len(descriptors),
            input_descriptors=descriptors,
        )
        return requirement
    requirement = Requirement(
        count=len(sr),
        nested_req=[],
    )
    for tmp_sub_req in sr:
        try:
            requirement.nested_req.append(
                to_requirement(tmp_sub_req, descriptors))
        except Exception as err:
            print(
                f"Error creating requirement inside to_requirement function, {err}"
            )

    return requirement
    def test_job_transmission(self):
        self.awake_single()
        # campaignをセット
        campaign = Campaign(author="cxxx0",
                            requirement=Requirement(values=["zero", "random"],
                                                    trigger={"timer": 1}),
                            trigger={"timer": 5},
                            place="All",
                            purpose="test_purpose",
                            destination="mongodb://localhost:27017/")
        clients["cxxx0"].post('/commander/campaigns',
                              data=json.dumps(campaign.to_dict()),
                              content_type='application/json')
        time.sleep(1.5)  # heartbeatを待つ; 0.7 + 0.4 + alpha

        # missionを確認
        mission = Mission(author="lxxx0",
                          requirement=Requirement(values=["zero", "random"],
                                                  trigger={"timer": 1}),
                          trigger={"timer": 5},
                          place="All",
                          purpose=campaign.get_id())
        self.assertIn(mission, self.models["lxxx0"].missions.values())

        # orderを確認
        order = Order(author="sxxx0",
                      values=["zero", "random"],
                      trigger={"timer": 1},
                      purpose=mission.get_id())
        self.assertIn(order, self.models["sxxx0"].orders.values())
    def test_get_campaigns_single(self):
        # add a campaigns
        campaign = Campaign(author='cxxx0',
                            destination='mongoserv',
                            place='S101',
                            purpose='A great app',
                            requirement=Requirement(values=["zero", "random"],
                                                    trigger={"timer": 10}),
                            trigger={"timer": 30})
        self.app.post('/commander/campaigns',
                      data=json.dumps(campaign.to_dict()),
                      content_type='application/json')

        # get subordinates
        response = self.app.get('/commander/campaigns')
        self.assertEqual(response.status_code, 200)
        actual = json.loads(response.data.decode("utf-8"))

        # assert
        expected = {
            "_status": {
                'success': True,
                'msg': "status is ok"
            },
            'campaigns': [campaign.to_dict()]
        }
        self.assertEqual(actual, expected)
    def test_add_campaign(self):
        # 各種パラメータの詳細が決まっていないため、暫定値を採用。
        # 最終的には、API自体に無効な入力パラメータをハネる機能を搭載したうえで
        # TODO: 無効値を確認する用のテストを作成すべき
        campaign = Campaign(author='cxxx0',
                            destination='mongoserv',
                            place='S101',
                            purpose='A great app',
                            requirement=Requirement(values=["zero", "random"],
                                                    trigger={"timer": 10}),
                            trigger={"timer": 30})
        response = self.app.post('/commander/campaigns',
                                 data=json.dumps(campaign.to_dict()),
                                 content_type='application/json')
        self.assertEqual(response.status_code, 200)
        actual = json.loads(response.data.decode("utf-8"))

        expected = {
            "_status": {
                'success': True,
                'msg': "status is ok"
            },
            "accepted": campaign.to_dict()
        }
        self.assertEqual(actual, expected)
Beispiel #5
0
def create_requirement(type):
	"""Create and return requirement"""
	requirement = Requirement(type=type)
	db.session.add(requirement)
	db.session.commit()

	return requirement 
Beispiel #6
0
    def test_get_missions_multi(self):
        # add some missions
        mission_base = Mission(author='lxxx0',
                               place='on desk',
                               purpose='A great app',
                               requirement=Requirement(
                                   values=["zero", "random"],
                                   trigger={"timer": 10}),
                               trigger={"timer": 30})
        mission_list = []
        for purpose in ['on chair', 'front of door', 'on desk', 'living room']:
            m = copy.deepcopy(mission_base)
            m.purpose = purpose
            mission_list.append(m)

        for m in mission_list:
            self.leader_obj.accept_mission(m)

        # get missions
        response = self.app.get('/leader/missions')
        self.assertEqual(response.status_code, 200)
        actual = loads(response.data.decode("utf-8"))
        actual_list = actual['missions']

        # assert status
        expected_status = {'success': True, 'msg': "status is ok"}
        self.assertEqual(actual['_status'], expected_status)

        # assert items
        expected_list = [c.to_dict() for c in mission_list]
        self.assertEqual(len(actual_list), len(expected_list))
        for exp in expected_list:
            if exp not in actual_list:
                self.fail('{0} is not found.'.format(exp))
        pass
Beispiel #7
0
def to_requirement(sr: SubmissionRequirements,
                   descriptors: Sequence[InputDescriptors]) -> Requirement:
    input_descriptors = []
    nested = []
    total_count = 0

    if sr._from:
        if sr._from != "":
            for tmp_descriptor in descriptors:
                if contains(tmp_descriptor.groups, sr._from):
                    input_descriptors.append(tmp_descriptor)
            total_count = len(input_descriptors)
            if total_count == 0:
                raise Exception(f"No descriptors for from: {sr._from}")
    else:
        for tmp_sub_req in sr.from_nested:
            try:
                # recursion logic
                tmp_req = to_requirement(tmp_sub_req, descriptors)
                nested.append(tmp_req)
            except Exception as err:
                print(
                    f"Error creating requirement from nested submission_requirements, {err}"
                )
        total_count = len(nested)
    count = sr.count
    if sr.rule == "all":
        count = total_count

    requirement = Requirement(count=count,
                              maximum=sr.maximum,
                              minimum=sr.minimum,
                              input_descriptors=input_descriptors,
                              nested_req=nested)
    return requirement
    def test_get_campaigns_multi(self):
        # add some campaigns
        campaign_base = Campaign(author='cxxx0',
                                 destination='mongoserv',
                                 place='S101',
                                 purpose='A great app',
                                 requirement=Requirement(
                                     values=["zero", "random"],
                                     trigger={"timer": 10}),
                                 trigger={"timer": 30})
        campaign_list = []
        for place in ['S101', 'S102', 'S103', 'S104']:
            c = copy.deepcopy(campaign_base)
            c.place = place
            campaign_list.append(c)
        for c in campaign_list:
            self.app.post('/commander/campaigns',
                          data=json.dumps(c.to_dict()),
                          content_type='application/json')

        # get campaigns
        response = self.app.get('/commander/campaigns')
        self.assertEqual(response.status_code, 200)
        actual = json.loads(response.data.decode("utf-8"))
        actual_list = actual['campaigns']

        # assert status
        expected_status = {'success': True, 'msg': "status is ok"}
        self.assertEqual(actual['_status'], expected_status)

        # assert items
        expected_list = [c.to_dict() for c in campaign_list]
        self.assertEqual(len(actual_list), len(expected_list))
        for exp in expected_list:
            if exp not in actual_list:
                self.fail('{0} is not found.'.format(exp))
        pass
Beispiel #9
0
    def test_get_missions_single(self):
        # add a mission
        mission = Mission(author='lxxx0',
                          place='on desk',
                          purpose='A great app',
                          requirement=Requirement(values=["zero", "random"],
                                                  trigger={"timer": 10}),
                          trigger={"timer": 30})
        self.leader_obj.accept_mission(mission)

        # get subordinates
        response = self.app.get('/leader/missions')
        self.assertEqual(response.status_code, 200)
        actual = loads(response.data.decode("utf-8"))

        # assert
        expected = {
            "_status": {
                'success': True,
                'msg': "status is ok"
            },
            'missions': [mission.to_dict()]
        }
        self.assertEqual(actual, expected)
Beispiel #10
0
    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を送信するのを阻止