kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'sanei-usb-record-replay-descriptor' into 'master'
sanei_usb: Add support for record/replay of get descriptor calls See merge request sane-project/backends!381merge-requests/213/head^2
commit
2fe8e63597
|
@ -588,9 +588,8 @@ static void sanei_xml_print_seq_if_any(xmlNode* node, const char* parent_fun)
|
||||||
xmlFree(attr);
|
xmlFree(attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks whether transaction should be ignored. We ignore get_descriptor and
|
// Checks whether transaction should be ignored. We ignore set_configuration
|
||||||
// set_configuration transactions. The latter is ignored because
|
// transactions, because set_configuration is called in sanei_usb_open outside test path.
|
||||||
// set_configuration is called in sanei_usb_open outside test path.
|
|
||||||
static int sanei_xml_is_transaction_ignored(xmlNode* node)
|
static int sanei_xml_is_transaction_ignored(xmlNode* node)
|
||||||
{
|
{
|
||||||
if (xmlStrcmp(node->name, (const xmlChar*)"control_tx") != 0)
|
if (xmlStrcmp(node->name, (const xmlChar*)"control_tx") != 0)
|
||||||
|
@ -628,7 +627,8 @@ static int sanei_xml_is_transaction_ignored(xmlNode* node)
|
||||||
static xmlNode* sanei_xml_skip_non_tx_nodes(xmlNode* node)
|
static xmlNode* sanei_xml_skip_non_tx_nodes(xmlNode* node)
|
||||||
{
|
{
|
||||||
const char* known_node_names[] = {
|
const char* known_node_names[] = {
|
||||||
"control_tx", "bulk_tx", "interrupt_tx", "debug", "known_commands_end"
|
"control_tx", "bulk_tx", "interrupt_tx",
|
||||||
|
"get_descriptor", "debug", "known_commands_end"
|
||||||
};
|
};
|
||||||
|
|
||||||
while (node != NULL)
|
while (node != NULL)
|
||||||
|
@ -661,13 +661,11 @@ static int sanei_xml_is_known_commands_end(xmlNode* node)
|
||||||
return xmlStrcmp(node->name, (const xmlChar*)"known_commands_end") == 0;
|
return xmlStrcmp(node->name, (const xmlChar*)"known_commands_end") == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns next transaction node that is not get_descriptor
|
|
||||||
static xmlNode* sanei_xml_peek_next_tx_node()
|
static xmlNode* sanei_xml_peek_next_tx_node()
|
||||||
{
|
{
|
||||||
return testing_xml_next_tx_node;
|
return testing_xml_next_tx_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns next transaction node that is not get_descriptor
|
|
||||||
static xmlNode* sanei_xml_get_next_tx_node()
|
static xmlNode* sanei_xml_get_next_tx_node()
|
||||||
{
|
{
|
||||||
xmlNode* next = testing_xml_next_tx_node;
|
xmlNode* next = testing_xml_next_tx_node;
|
||||||
|
@ -3893,7 +3891,7 @@ sanei_usb_replay_control_msg(SANE_Int dn, SANE_Int rtype, SANE_Int req,
|
||||||
(void) dn;
|
(void) dn;
|
||||||
|
|
||||||
if (testing_known_commands_input_failed)
|
if (testing_known_commands_input_failed)
|
||||||
return -1;
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
|
||||||
xmlNode* node = sanei_xml_get_next_tx_node();
|
xmlNode* node = sanei_xml_get_next_tx_node();
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
|
@ -4765,14 +4763,66 @@ sanei_usb_set_altinterface (SANE_Int dn, SANE_Int alternate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WITH_USB_RECORD_REPLAY
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
sanei_usb_replay_get_descriptor(SANE_Int dn,
|
sanei_usb_replay_get_descriptor(SANE_Int dn,
|
||||||
struct sanei_usb_dev_descriptor *desc)
|
struct sanei_usb_dev_descriptor *desc)
|
||||||
{
|
{
|
||||||
(void) dn;
|
(void) dn;
|
||||||
(void) desc;
|
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
if (testing_known_commands_input_failed)
|
||||||
// ZZTODO
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
|
||||||
|
xmlNode* node = sanei_xml_get_next_tx_node();
|
||||||
|
if (node == NULL)
|
||||||
|
{
|
||||||
|
FAIL_TEST(__func__, "no more transactions\n");
|
||||||
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sanei_xml_is_known_commands_end(node))
|
||||||
|
{
|
||||||
|
testing_known_commands_input_failed = 1;
|
||||||
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
sanei_xml_record_seq(node);
|
||||||
|
sanei_xml_break_if_needed(node);
|
||||||
|
|
||||||
|
if (xmlStrcmp(node->name, (const xmlChar*)"get_descriptor") != 0)
|
||||||
|
{
|
||||||
|
FAIL_TEST_TX(__func__, node, "unexpected transaction type %s\n",
|
||||||
|
(const char*) node->name);
|
||||||
|
testing_known_commands_input_failed = 1;
|
||||||
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
int desc_type = sanei_xml_get_prop_uint(node, "descriptor_type");
|
||||||
|
int bcd_usb = sanei_xml_get_prop_uint(node, "bcd_usb");
|
||||||
|
int bcd_dev = sanei_xml_get_prop_uint(node, "bcd_device");
|
||||||
|
int dev_class = sanei_xml_get_prop_uint(node, "device_class");
|
||||||
|
int dev_sub_class = sanei_xml_get_prop_uint(node, "device_sub_class");
|
||||||
|
int dev_protocol = sanei_xml_get_prop_uint(node, "device_protocol");
|
||||||
|
int max_packet_size = sanei_xml_get_prop_uint(node, "max_packet_size");
|
||||||
|
|
||||||
|
if (desc_type < 0 || bcd_usb < 0 || bcd_dev < 0 || dev_class < 0 ||
|
||||||
|
dev_sub_class < 0 || dev_protocol < 0 || max_packet_size < 0)
|
||||||
|
{
|
||||||
|
FAIL_TEST_TX(__func__, node, "get_descriptor recorded block is missing attributes\n");
|
||||||
|
testing_known_commands_input_failed = 1;
|
||||||
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc->desc_type = desc_type;
|
||||||
|
desc->bcd_usb = bcd_usb;
|
||||||
|
desc->bcd_dev = bcd_dev;
|
||||||
|
desc->dev_class = dev_class;
|
||||||
|
desc->dev_sub_class = dev_sub_class;
|
||||||
|
desc->dev_protocol = dev_protocol;
|
||||||
|
desc->max_packet_size = max_packet_size;
|
||||||
|
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -4780,10 +4830,28 @@ sanei_usb_record_get_descriptor(SANE_Int dn,
|
||||||
struct sanei_usb_dev_descriptor *desc)
|
struct sanei_usb_dev_descriptor *desc)
|
||||||
{
|
{
|
||||||
(void) dn;
|
(void) dn;
|
||||||
(void) desc;
|
|
||||||
// ZZTODO
|
xmlNode* node = testing_append_commands_node;
|
||||||
|
|
||||||
|
xmlNode* e_tx = xmlNewNode(NULL, (const xmlChar*)"get_descriptor");
|
||||||
|
|
||||||
|
xmlNewProp(e_tx, (const xmlChar*)"time_usec", (const xmlChar*)"0");
|
||||||
|
sanei_xml_set_uint_attr(node, "seq", ++testing_last_known_seq);
|
||||||
|
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "descriptor_type", desc->desc_type);
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "bcd_usb", desc->bcd_usb);
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "bcd_device", desc->bcd_dev);
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "device_class", desc->dev_class);
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "device_sub_class", desc->dev_sub_class);
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "device_protocol", desc->dev_protocol);
|
||||||
|
sanei_xml_set_hex_attr(e_tx, "max_packet_size", desc->max_packet_size);
|
||||||
|
|
||||||
|
node = sanei_xml_append_command(node, 1, e_tx);
|
||||||
|
testing_append_commands_node = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // WITH_USB_RECORD_REPLAY
|
||||||
|
|
||||||
extern SANE_Status
|
extern SANE_Status
|
||||||
sanei_usb_get_descriptor( SANE_Int dn,
|
sanei_usb_get_descriptor( SANE_Int dn,
|
||||||
struct sanei_usb_dev_descriptor __sane_unused__
|
struct sanei_usb_dev_descriptor __sane_unused__
|
||||||
|
@ -4799,7 +4867,12 @@ sanei_usb_get_descriptor( SANE_Int dn,
|
||||||
|
|
||||||
if (testing_mode == sanei_usb_testing_mode_replay)
|
if (testing_mode == sanei_usb_testing_mode_replay)
|
||||||
{
|
{
|
||||||
|
#if WITH_USB_RECORD_REPLAY
|
||||||
return sanei_usb_replay_get_descriptor(dn, desc);
|
return sanei_usb_replay_get_descriptor(dn, desc);
|
||||||
|
#else
|
||||||
|
DBG (1, "USB record-replay mode support is missing\n");
|
||||||
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG (5, "sanei_usb_get_descriptor\n");
|
DBG (5, "sanei_usb_get_descriptor\n");
|
||||||
|
@ -4850,7 +4923,12 @@ sanei_usb_get_descriptor( SANE_Int dn,
|
||||||
|
|
||||||
if (testing_mode == sanei_usb_testing_mode_record)
|
if (testing_mode == sanei_usb_testing_mode_record)
|
||||||
{
|
{
|
||||||
|
#if WITH_USB_RECORD_REPLAY
|
||||||
sanei_usb_record_get_descriptor(dn, desc);
|
sanei_usb_record_get_descriptor(dn, desc);
|
||||||
|
#else
|
||||||
|
DBG (1, "USB record-replay mode support is missing\n");
|
||||||
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
|
Ładowanie…
Reference in New Issue