def rmttest_neg_point_to_self(self): "'Solved by' points to same requirement" mstderr = StringIO() init_logger(mstderr) config = TestConfig() reqset = RequirementSet(config) req1 = Requirement('''Name: A Type: master requirement''', 'A', None, None, None) reqset.add_requirement(req1) req2 = Requirement('''Name: B Type: requirement Solved by: B''', 'B', None, None, None) reqset.add_requirement(req2) config.set_solved_by() rdep = RDepSolvedBy(config) status = rdep.rewrite(reqset) self.assertFalse(status) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" \ "__resolve_solved_by_one_req_deps;===LINENO===; " \ "75:B:'Solved by' points to the requirement itself\n" self.assertEquals(result_expected, lstderr)
def rmttest_json_init_add_new_cmd_line_params(self): '''Init Cfg with JSON and adds parameters with command line options''' mstderr = StringIO() init_logger(mstderr) # Create two JSON files. tmpdir = create_tmp_dir() jsonfile1 = os.path.join(tmpdir, "config1.json") with open(jsonfile1, "w") as jsonfd1: jsonfd1.write(json.dumps({'k': 2, 'm': {'n': 5}, 'o': 7})) jsonfile2 = os.path.join(tmpdir, "config2.json") with open(jsonfile2, "w") as jsonfd2: jsonfd2.write(json.dumps({'k': 3, 'm': {'w': 11}, 'p': 9})) config = Cfg.new_by_json_str('{"k": 1, "l": [2, 3], "m": {"n": 4}}') config.merge_cmd_line_params(['-j', '{"m": {"p": 99}}', '-j', 'file://' + jsonfile1, '-j', '{"m": {"q": 100}}', '-j', 'file://' + jsonfile2]) assert 1 == config.get_value("k"), "k is not 1" config.evaluate() assert 3 == config.get_value("k"), "k is not 3" assert 11 == config.get_value("m.w") lstderr = hide_volatile(mstderr.getvalue()) shutil.rmtree(tmpdir) tear_down_log_handler() assert lstderr == ""
def rmttest_neg_05(self): "TestRecordTxt2: long long line - check for lineno" mstderr = StringIO() init_logger(mstderr) cfg = Cfg.new_by_json_str('{"max_input_line_length": 7}') tioconfig = TxtIOConfig(cfg) txt_doc = TxtRecord.from_string( """# com ok: yes no # cs # dds good: but too long # dds """, "TooLong", tioconfig) self.assertEqual(txt_doc.is_usable(), False) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;TxtRecord;" \ "check_line_length;===LINENO===; 80:TooLong:6:line too long: " \ "is [18], max allowed [7]\n" self.assertEquals(result_expected, lstderr)
def rmttest_positive_01(self): """Requirement contains a tag where no handler exists""" mstderr = StringIO() init_logger(mstderr) test_config = TestConfig() test_config.set_solved_by() mods = InputModules(test_config) reqs = RequirementSet(None) req = Requirement("Hubbel: bubbel", "hubbel", reqs, mods, test_config) reqs.add_requirement(req) reqs._handle_modules(mods) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = ["===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" "__all_tags_handled;===LINENO===; 57:hubbel:No tag handler " "found for " "tag(s) '[\"Hubbel\"]' - Hint: typo in tag(s)?", "===DATETIMESTAMP===;rmtoo;ERROR;" "RequirementSet;_handle_modules;" "===LINENO===; 56:There were errors encountered during parsing " "and checking - can't continue."] lstderr_last_two_lines = lstderr.split("\n")[-3:-1] assert result_expected == lstderr_last_two_lines
def rmttest_neg_solved_by_to_nonex_req(self): "'Solved by' points to a non existing requirement" mstderr = StringIO() init_logger(mstderr) config = TestConfig() reqset = RequirementSet(config) req1 = Requirement('''Name: A Type: master requirement''', 'A', None, None, None) reqset.add_requirement(req1) req2 = Requirement('''Name: B Type: requirement Solved by: C''', 'B', None, None, None) reqset.add_requirement(req2) config.set_solved_by() rdep = RDepSolvedBy(config) status = rdep.rewrite(reqset) assert not status lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" \ "__resolve_solved_by_one_req_deps;===LINENO===; " \ "74:B:'Solved by' points to a non-existing requirement 'C'\n" assert result_expected == lstderr
def rmttest_neg_point_to_self(self): "'Solved by' points to same requirement" mstderr = StringIO() init_logger(mstderr) config = TestConfig() reqset = RequirementSet(config) req1 = Requirement('''Name: A Type: master requirement''', 'A', None, None, None) reqset.add_requirement(req1) req2 = Requirement('''Name: B Type: requirement Solved by: B''', 'B', None, None, None) reqset.add_requirement(req2) config.set_solved_by() rdep = RDepSolvedBy(config) status = rdep.rewrite(reqset) assert not status lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" \ "__resolve_solved_by_one_req_deps;===LINENO===; " \ "75:B:'Solved by' points to the requirement itself\n" assert result_expected == lstderr
def rmttest_json_init_add_new_cmd_line_params(self): '''Init Cfg with JSON and adds parameters with command line options''' mstderr = StringIO() init_logger(mstderr) # Create two JSON files. tmpdir = create_tmp_dir() jsonfile1 = os.path.join(tmpdir, "config1.json") with open(jsonfile1, "w") as jsonfd1: jsonfd1.write(json.dumps({'k': 2, 'm': {'n': 5}, 'o': 7})) jsonfile2 = os.path.join(tmpdir, "config2.json") with open(jsonfile2, "w") as jsonfd2: jsonfd2.write(json.dumps({'k': 3, 'm': {'w': 11}, 'p': 9})) config = Cfg.new_by_json_str('{"k": 1, "l": [2, 3], "m": {"n": 4}}') config.merge_cmd_line_params([ '-j', '{"m": {"p": 99}}', '-j', 'file://' + jsonfile1, '-j', '{"m": {"q": 100}}', '-j', 'file://' + jsonfile2 ]) assert 1 == config.get_value("k"), "k is not 1" config.evaluate() assert 3 == config.get_value("k"), "k is not 3" assert 11 == config.get_value("m.w") lstderr = hide_volatile(mstderr.getvalue()) shutil.rmtree(tmpdir) tear_down_log_handler() assert lstderr == ""
def rmttest_neg_empty_solved_by(self): "Normal requirement has empty 'Solved by'" mstderr = StringIO() init_logger(mstderr) config = TestConfig() reqset = RequirementSet(config) req1 = Requirement('''Name: A Type: master requirement''', 'A', None, None, None) reqset.add_requirement(req1) req2 = Requirement('''Name: B Type: requirement Solved by:''', 'B', None, None, None) reqset.add_requirement(req2) config.set_solved_by() rdep = RDepSolvedBy(config) status = rdep.rewrite(reqset) assert not status lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" \ "__resolve_solved_by_one_req_deps;===LINENO===; " \ "77:B:'Solved by' field has length 0\n" assert result_expected == lstderr
def prepare_stderr(): '''Some lines of the stderr contain a date / timestamp. This must be unified in order to be able to compare them.''' with open(os.path.join(os.environ["rmtoo_test_dir"], "stderr")) as ms: lines = ms.readlines() with open(os.path.join( os.environ["rmtoo_test_dir"], "stderr"), "w") as new_stderr: for line in lines: new_stderr.write("%s" % hide_volatile(line))
def prepare_stderr(): '''Some lines of the stderr contain a date / timestamp. This must be unified in order to be able to compare them.''' with open(os.path.join(os.environ["rmtoo_test_dir"], "stderr")) as ms: lines = ms.readlines() with open(os.path.join(os.environ["rmtoo_test_dir"], "stderr"), "w") as new_stderr: for line in lines: new_stderr.write("%s" % hide_volatile(line))
def rmttest_neg_01(self): "BaseRMObject: check for module which has wrong type" mstderr = StringIO() init_logger(mstderr) TBRMObj() result = hide_volatile(mstderr.getvalue()) tear_down_log_handler() assert expected_result == result
def rmttest_neg_01(self): "TestRecordTxt2: rubbish in input" mstderr = StringIO() init_logger(mstderr) txt_doc = TxtRecord.from_string("rubbish", "Rubbish", TxtIOConfig()) self.assertEqual(txt_doc.is_usable(), False) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;TxtParser;" \ "split_entries;===LINENO===; 79:Rubbish:1:Expected tag line " \ "not found\n" self.assertEquals(result_expected, lstderr)
def rmttest_neg_08(self): "TestRecordTxt2: only intro content line" mstderr = StringIO() init_logger(mstderr) tioconfig = TxtIOConfig() txt_doc = TxtRecord.from_string("#1 com", "OnlyEntryComment", tioconfig) self.assertEqual(txt_doc.is_usable(), True) self.assertEqual(txt_doc.get_comment(), "1 com\n") lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() self.assertEquals("", lstderr)
def rmttest_neg_02(self): "TestRecordTxt2: only ':'" mstderr = StringIO() init_logger(mstderr) txt_doc = TxtRecord.from_string(":", "Rubbish", TxtIOConfig()) assert txt_doc.is_usable() is False lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;TxtParser;" \ "split_entries;===LINENO===; 79:Rubbish:1:Expected tag line " \ "not found\n" assert result_expected == lstderr
def rmttest_neg_06(self): "TestRecordTxt2: long long line - check for multiple errors" mstderr = StringIO() init_logger(mstderr) cfg = Cfg.new_by_json_str('{"max_input_line_length": 7}') tioconfig = TxtIOConfig(cfg) txt_doc = TxtRecord.from_string( """#1 com ok: yes no #4 cs #5 dds good: but too long #7 dds #8 hi also good: but too long #10 gsst dhd #12 dhdh d: #14 """, "TooLong", tioconfig) self.assertEqual(txt_doc.is_usable(), False) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;TxtRecord;" \ "check_line_length;===LINENO===; 80:TooLong:6:line too long: " \ "is [18], max allowed [7]\n" \ "===DATETIMESTAMP===;rmtoo;ERROR;TxtRecord;check_line_length;" \ "===LINENO===; 80:" \ "TooLong:9:line too long: is [23], max allowed [7]\n" \ "===DATETIMESTAMP===;rmtoo;ERROR;TxtRecord;check_line_length;" \ "===LINENO===; 80:" \ "TooLong:10:line too long: is [8], max allowed [7]\n" \ "===DATETIMESTAMP===;rmtoo;ERROR;TxtRecord;check_line_length;" \ "===LINENO===; 80:" \ "TooLong:12:line too long: is [8], max allowed [7]\n" \ "===DATETIMESTAMP===;rmtoo;INFO;TxtParser;split_next_record;" \ "===LINENO===; 80:" \ "TooLong:11:Compatibility info: Comments will be reordered when " \ "they are re-written with rmtoo-tools. Please consult " \ "rmtoo-req-format(5) or rmtoo-topic-format(5)\n" self.assertEquals(result_expected, lstderr)
def rmttest_neg_04(self): "TestRecordTxt2: long long line" mstderr = StringIO() init_logger(mstderr) cfg = Cfg.new_by_json_str('{"max_input_line_length": 7}') tioconfig = TxtIOConfig(cfg) txt_doc = TxtRecord.from_string("good: but too long", "TooLong", tioconfig) assert txt_doc.is_usable() is False lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = "===DATETIMESTAMP===;rmtoo;ERROR;TxtRecord;" \ "check_line_length;===LINENO===; 80:TooLong:1:line too long: " \ "is [18], max allowed [7]\n" assert result_expected == lstderr
def rmttest_positive_02(self): "Requirement contains a tag where no handler exists - multiple tags" mstderr = StringIO() init_logger(mstderr) tc = TestConfig() tc.set_solved_by() mods = InputModules(tc) reqs = RequirementSet(None) req = Requirement("Hubbel: bubbel\nSiebel: do", "InvalidTagReq", reqs, mods, tc) reqs.add_requirement(req) reqs._handle_modules(mods) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() lstderr_last_two_lines = lstderr.split("\n")[-3:-1] result0 \ = re.match( r"^===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" r"__all_tags_handled;===LINENO===; 57:InvalidTagReq:" r"No tag handler found " r"for tag\(s\) '\[.*\]' - Hint: typo in tag\(s\)\?$", lstderr_last_two_lines[0]) result1 \ = re.match( r"^===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" "_handle_modules;" "===LINENO===; 56:There were errors encountered " "during parsing " "and checking - can't continue.$", lstderr_last_two_lines[1]) assert result0 assert result1
def rmttest_positive_02(self): "Requirement contains a tag where no handler exists - multiple tags" mstderr = StringIO() init_logger(mstderr) tc = TestConfig() tc.set_solved_by() mods = InputModules(tc) reqs = RequirementSet(None) req = Requirement("Hubbel: bubbel\nSiebel: do", "InvalidTagReq", reqs, mods, tc) reqs.add_requirement(req) reqs._handle_modules(mods) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() lstderr_last_two_lines = lstderr.split("\n")[-3:-1] result0 \ = re.match( "^===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" "__all_tags_handled;===LINENO===; 57:InvalidTagReq:" "No tag handler found " "for tag\(s\) '\[.*\]' - Hint: typo in tag\(s\)\?$", lstderr_last_two_lines[0]) result1 \ = re.match( "^===DATETIMESTAMP===;rmtoo;ERROR;RequirementSet;" "_handle_modules;" "===LINENO===; 56:There were errors encountered " "during parsing " "and checking - can't continue.$", lstderr_last_two_lines[1]) assert result0 assert result1
def rmttest_neg_07(self): "TestRecordTxt2: test comments between content lines" mstderr = StringIO() init_logger(mstderr) tioconfig = TxtIOConfig() txt_doc = TxtRecord.from_string( """#1 com t1: uuuu #3 Comment not allowed here. #4 Should emitt a warning vvvv t2: uuuu vvvv #8 Here a comment is also not allowed wwww t3: uuuu #11 Same as t1 but with additional #12 comment at the end of the requirement vvvv #14 End comment for t3 t4: uuuu vvvv #17 Same as t2 but with additional #18 comment at the end of the requirement wwww #20 End comment for t4 """, "CommentsEverywhere", tioconfig) self.assertEqual(txt_doc.is_usable(), True) lstderr = hide_volatile(mstderr.getvalue()) tear_down_log_handler() result_expected \ = comment_line % 5 + comment_line % 9 + \ comment_line % 13 + comment_line % 19 self.assertEquals(result_expected, lstderr)