Skip to content

Commit

Permalink
Compare long names dump to reference.
Browse files Browse the repository at this point in the history
  • Loading branch information
eerimoq committed Jan 5, 2020
1 parent d4a1e73 commit f22c8b4
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 87 deletions.
98 changes: 98 additions & 0 deletions tests/files/dbc/long_names_multiple_relations_dumped.dbc
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
VERSION ""


NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_

BS_:

BU_: Sender_2_aaaaaaaaaaaaaaaaaaaaaaa Receiver_2_zzzzzzzzzzzzzzzzzzzzz Receiver_1 Node_6789_123456789_123456789_12
VAL_TABLE_ Value_Table_short 1 "Very long, long, long description for the value '0x1'" 0 "Very long, long, long description for the value '0x0'" ;
VAL_TABLE_ Value_Table_cdefghi_ABCDEFGHI_AB 3 "Description for the value '0x3'" 2 "Description for the value '0x2'" 1 "Description for the value '0x1'" 0 "Description for the value '0x0'" ;


BO_ 6 TX_twice: 2 Node_6789_123456789_123456789_12
SG_ rx_twice_long_yyyyyyyyyyyyyyyyyy : 8|8@1- (1,0) [0|0] "" Receiver_1,Receiver_2_zzzzzzzzzzzzzzzzzzzzz
SG_ rx_twice_short : 0|8@1- (1,0) [0|0] "" Receiver_2_zzzzzzzzzzzzzzzzzzzzz,Receiver_1

BO_ 5 RX_TX_1: 8 Node_6789_123456789_123456789_12

BO_ 4 MSG_CASE_TEST: 8 Vector__XXX

BO_ 3 msg_case_test: 8 Vector__XXX

BO_ 2 Msg_with_value_table_sigs: 3 Vector__XXX
SG_ Sig_with_short_val_table : 16|8@1- (1,0) [0|0] "" Vector__XXX
SG_ Sig_with_long_val_table_2 : 8|8@1- (1,0) [0|0] "" Vector__XXX
SG_ Sig_with_long_val_table_1 : 0|8@1- (1,0) [0|0] "" Vector__XXX

BO_ 1 Msg_Long_Name_56789_1234567_0001: 1 Vector__XXX
SG_ Sig_used_twice_efgh_abcdefghi_ab : 0|8@1- (1,0) [0|0] "" Vector__XXX

BO_ 0 Msg_Long_Name_56789_1234567_0000: 1 Vector__XXX
SG_ Sig_used_twice_efgh_abcdefghi_ab : 0|8@1- (1,0) [0|0] "" Vector__XXX

BO_TX_BU_ 6 : Node_6789_123456789_123456789_12,Sender_2_aaaaaaaaaaaaaaaaaaaaaaa;



BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";
BA_DEF_ SG_ "GenSigInactiveValue" INT 0 0;
BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","not_used","not_used","not_used","not_used","Cyclic","not_used","IfActive","NoMsgSendType";
BA_DEF_ BU_ "NmStationAddress" HEX 0 0;
BA_DEF_ "DBName" STRING ;
BA_DEF_ "BusType" STRING ;
BA_DEF_ SG_ "SystemSignalLongSymbol" STRING ;
BA_DEF_ BO_ "SystemMessageLongSymbol" STRING ;
BA_DEF_ BU_ "SystemNodeLongSymbol" STRING ;
BA_DEF_DEF_ "GenSigSendType" "Cyclic";
BA_DEF_DEF_ "GenSigInactiveValue" 0;
BA_DEF_DEF_ "GenMsgCycleTime" 0;
BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
BA_DEF_DEF_ "NmStationAddress" 0;
BA_DEF_DEF_ "DBName" "";
BA_DEF_DEF_ "BusType" "CAN";
BA_DEF_DEF_ "SystemSignalLongSymbol" "";
BA_DEF_DEF_ "SystemMessageLongSymbol" "";
BA_DEF_DEF_ "SystemNodeLongSymbol" "";
BA_ "DBName" "long_names_multiple_relations";
BA_ "SystemNodeLongSymbol" BU_ Sender_2_aaaaaaaaaaaaaaaaaaaaaaa "Sender_2_aaaaaaaaaaaaaaaaaaaaaaaAAAAAA";
BA_ "SystemNodeLongSymbol" BU_ Receiver_2_zzzzzzzzzzzzzzzzzzzzz "Receiver_2_zzzzzzzzzzzzzzzzzzzzzZZZ";
BA_ "SystemNodeLongSymbol" BU_ Node_6789_123456789_123456789_12 "Node_6789_123456789_123456789_123456789";
BA_ "SystemSignalLongSymbol" SG_ 6 rx_twice_long_yyyyyyyyyyyyyyyyyy "rx_twice_long_yyyyyyyyyyyyyyyyyyYYY";
BA_ "SystemMessageLongSymbol" BO_ 1 "Msg_Long_Name_56789_123456789_123456789_Copy_1";
BA_ "SystemSignalLongSymbol" SG_ 1 Sig_used_twice_efgh_abcdefghi_ab "Sig_used_twice_efgh_abcdefghi_abcdefghi_abcdefghi";
BA_ "SystemMessageLongSymbol" BO_ 0 "Msg_Long_Name_56789_123456789_123456789";
BA_ "SystemSignalLongSymbol" SG_ 0 Sig_used_twice_efgh_abcdefghi_ab "Sig_used_twice_efgh_abcdefghi_abcdefghi_abcdefghi";
VAL_ 2 Sig_with_short_val_table 1 "Very long, long, long description for the value '0x1'" 0 "Very long, long, long description for the value '0x0'" ;
VAL_ 2 Sig_with_long_val_table_2 13 "value '0xD'" 12 "Dvalue '0xC'" 11 "value '0xB'" 10 "value '0xA'" 9 "value '0x9'" 8 "value '0x8'" 7 "value '0x7'" 6 "value '0x6'" 5 "value '0x5'" 4 "value '0x4'" 3 "value '0x3'" 2 "value '0x2'" 1 "value '0x1'" 0 "value '0x0'" ;
VAL_ 2 Sig_with_long_val_table_1 3 "Description for the value '0x3'" 2 "Description for the value '0x2'" 1 "Description for the value '0x1'" 0 "Description for the value '0x0'" ;

95 changes: 8 additions & 87 deletions tests/test_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -4659,7 +4659,6 @@ def test_multiple_senders(self):

with open(filename, 'rb') as fin:
if sys.version_info[0] > 2:
print(db.as_dbc_string())
self.assertEqual(db.as_dbc_string().encode('cp1252'),
fin.read())
else:
Expand Down Expand Up @@ -4722,100 +4721,22 @@ def test_issue_167_long_names_dict(self):
result = cantools.database.can.formats.dbc.create_one_unique_names_dict(data)
self.assertEqual(result, data)

def test_issue_167_long_names_from_scratch(self):
"""Test dbc export with mixed short and long symbol names. Create the
database by code, i. e. start with an empty database object,
add nodes, messages and signals, dump that to dbc format and
double check that by reading it back again and comparing it
with the objects that had been created.
"""

msg_name_long = "MSG456789_123456789_123456789_ABC"
msg_name_short = "MSG_short"
node_name_long = "NODE56789_abcdefghi_ABCDEFGHI_XYZ"
node_name_short = "NODE_short"
sig_name_long = "SIG456789_123456789_123456789_ABC"
sig_name_short = "SIG_short"

can = cantools.database.can
node_short = can.node.Node(node_name_short, '')
node_long = can.node.Node(node_name_long, '')
sig_short = can.signal.Signal(name=sig_name_short, start=1, length=8)
sig_long = can.signal.Signal(name=sig_name_long, start=9, length=8)

msg_long = can.message.Message(
frame_id=1,
name=msg_name_long,
length=8,
signals=[sig_long],
senders=[node_name_long])
msg_short = can.message.Message(
frame_id=2,
name=msg_name_short,
length=8,
signals=[sig_short],
senders=[node_name_short])
db = cantools.database.Database(
messages=[msg_short, msg_long],
nodes=[node_short, node_long],
version='')

db.refresh()
content = db.as_dbc_string()

# Check for correct dumping of long symbol names:
# - long names in special attribute lines only;
# - definition lines with names not longer than 32 chars:
self.assertIn("BO_ 1 {}: ".format(msg_name_long[:32]), content)
self.assertIn('BA_ "SystemMessageLongSymbol" BO_ 1 "{}";'.format(msg_name_long),
content)
all_nodes = re.search("^BU_: (.*)$", content, flags=re.M).group(1).split()
self.assertTrue(node_name_long[:32] in all_nodes)
self.assertTrue(re.search('BA_ "SystemNodeLongSymbol" BU_ {} "{}";'.
format(node_name_long[:32], node_name_long),
content))
self.assertTrue(re.search("SG_ {} :".format(sig_name_long[:32]), content))
self.assertTrue(re.search('BA_ "SystemSignalLongSymbol" SG_ 1 {} "{}";'.
format(sig_name_long[:32], sig_name_long),
content))

# - NO long name attributes for objects with short names
self.assertFalse(re.search('BA_ "SystemMessageLongSymbol" BO_ 2 ',
content))
self.assertFalse(re.search('BA_ "SystemNodeLongSymbol" {}'.
format(node_name_short), content))
self.assertFalse(re.search('BA_ "SystemSignalLongSymbol" SG_ 2 ',
content))

# double check the dumped content:
# import it again and compare the objects whit those created above.
db_readback = cantools.database.load_string(content, 'dbc')

self.assertEqual(set([msg_name_long, msg_name_short]),
set([msg.name for msg in db_readback.messages]))
self.assertEqual(set([sig_name_long, sig_name_short]),
set([sig.name for msg in db_readback.messages
for sig in msg.signals]))
self.assertEqual(set([node_name_long, node_name_short]),
set([node.name for node in db_readback.nodes]))

def test_long_names_from_file_multiple_relations(self):
"""Test if long names are resolved correctly when message has more
than 1 sender.
"""

filename = 'tests/files/dbc/long_names_multiple_relations.dbc'
filename_dumped = 'tests/files/dbc/long_names_multiple_relations_dumped.dbc'
db = cantools.database.load_file(filename)
self.assertEqual(db.get_message_by_frame_id(0).name,
'Msg_Long_Name_56789_123456789_123456789')
self.assertEqual(db.get_message_by_frame_id(1).name,
'Msg_Long_Name_56789_123456789_123456789_Copy_1')
senders = db.get_message_by_frame_id(6).senders
self.assertEqual(len(senders), 2, senders)
self.assertIn('Node_6789_123456789_123456789_123456789', senders)
self.assertIn('Sender_2_aaaaaaaaaaaaaaaaaaaaaaaAAAAAA', senders)

with open(filename_dumped, 'rb') as fin:
if sys.version_info[0] > 2:
self.assertEqual(db.as_dbc_string().encode('cp1252'),
fin.read())
else:
self.assertEqual(db.as_dbc_string(), fin.read())

def test_unknown_sender(self):
"""Test warning if message has a sender not listed in the node list.
Expand Down

0 comments on commit f22c8b4

Please sign in to comment.