Просмотр исходного кода

Merge pull request #206 from hathach/develop

Added a couple of unit testing with Ceedling/Cmock/Unity
hathach 6 лет назад
Родитель
Сommit
4d329d46cc

+ 40 - 9
src/device/dcd.h

@@ -79,7 +79,7 @@ typedef struct TU_ATTR_ALIGNED(4)
   };
 } dcd_event_t;
 
-TU_VERIFY_STATIC(sizeof(dcd_event_t) <= 12, "size is not correct");
+//TU_VERIFY_STATIC(sizeof(dcd_event_t) <= 12, "size is not correct");
 
 /*------------------------------------------------------------------*/
 /* Device API
@@ -119,20 +119,51 @@ void dcd_edpt_stall       (uint8_t rhport, uint8_t ep_addr);
 // clear stall, data toggle is also reset to DATA0
 void dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr);
 
-/*------------------------------------------------------------------*/
-/* Event Function
- * Called by DCD to notify device stack
- *------------------------------------------------------------------*/
-void dcd_event_handler(dcd_event_t const * event, bool in_isr);
+//--------------------------------------------------------------------+
+// Event API
+//--------------------------------------------------------------------+
+
+// Called by DCD to notify device stack
+extern void dcd_event_handler(dcd_event_t const * event, bool in_isr);
 
 // helper to send bus signal event
-void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr);
+static inline void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr);
 
 // helper to send setup received
-void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr);
+static inline void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr);
 
 // helper to send transfer complete event
-void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr);
+static inline void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr);
+
+
+//--------------------------------------------------------------------+
+// Inline helper
+//--------------------------------------------------------------------+
+
+static inline void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr)
+{
+  dcd_event_t event = { .rhport = rhport, .event_id = eid, };
+  dcd_event_handler(&event, in_isr);
+}
+
+static inline void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr)
+{
+  dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SETUP_RECEIVED };
+  memcpy(&event.setup_received, setup, 8);
+
+  dcd_event_handler(&event, in_isr);
+}
+
+static inline void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
+{
+  dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_XFER_COMPLETE };
+
+  event.xfer_complete.ep_addr = ep_addr;
+  event.xfer_complete.len     = xferred_bytes;
+  event.xfer_complete.result  = result;
+
+  dcd_event_handler(&event, in_isr);
+}
 
 #ifdef __cplusplus
  }

+ 1 - 29
src/device/usbd.c

@@ -290,7 +290,7 @@ bool tud_remote_wakeup(void)
 //--------------------------------------------------------------------+
 // USBD Task
 //--------------------------------------------------------------------+
-bool usbd_init (void)
+bool tud_init (void)
 {
   TU_LOG2("USBD init\r\n");
 
@@ -884,34 +884,6 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr)
   }
 }
 
-// helper to send bus signal event
-void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr)
-{
-  dcd_event_t event = { .rhport = rhport, .event_id = eid, };
-  dcd_event_handler(&event, in_isr);
-}
-
-// helper to send setup received
-void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr)
-{
-  dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SETUP_RECEIVED };
-  memcpy(&event.setup_received, setup, 8);
-
-  dcd_event_handler(&event, in_isr);
-}
-
-// helper to send transfer complete event
-void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
-{
-  dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_XFER_COMPLETE };
-
-  event.xfer_complete.ep_addr = ep_addr;
-  event.xfer_complete.len     = xferred_bytes;
-  event.xfer_complete.result  = result;
-
-  dcd_event_handler(&event, in_isr);
-}
-
 //--------------------------------------------------------------------+
 // Helper
 //--------------------------------------------------------------------+

+ 3 - 0
src/device/usbd.h

@@ -41,6 +41,9 @@
 // Application API
 //--------------------------------------------------------------------+
 
+// Init device stack
+bool tud_init (void);
+
 // Task function should be called in main/rtos loop
 void tud_task (void);
 

+ 0 - 2
src/device/usbd_pvt.h

@@ -33,8 +33,6 @@
  extern "C" {
 #endif
 
-bool usbd_init (void);
-
 //--------------------------------------------------------------------+
 // USBD Endpoint API
 //--------------------------------------------------------------------+

+ 1 - 1
src/tusb.c

@@ -47,7 +47,7 @@ bool tusb_init(void)
 #endif
 
 #if TUSB_OPT_DEVICE_ENABLED
-  TU_ASSERT ( usbd_init() ); // init device stack
+  TU_ASSERT ( tud_init() ); // init device stack
 #endif
 
   _initialized = true;

+ 4 - 2
test/project.yml

@@ -9,6 +9,7 @@
   :use_exceptions: TRUE
   :use_test_preprocessor: TRUE
   :use_auxiliary_dependencies: TRUE
+  :use_deep_dependencies: TRUE
   :build_root: _build
 #  :release_build: TRUE
   :test_file_prefix: test_
@@ -41,10 +42,10 @@
   :commmon: &common_defines []
   :test:
     - *common_defines
-    - TEST
+    - _TEST_
   :test_preprocess:
     - *common_defines
-    - TEST
+    - _TEST_
 
 :cmock:
   :mock_prefix: mock_
@@ -53,6 +54,7 @@
   :plugins:
     - :ignore
     - :callback
+    - :array
   :treat_as:
     uint8:    HEX8
     uint16:   HEX16

+ 138 - 0
test/test/device/usbd/test_usbd.c

@@ -0,0 +1,138 @@
+/* 
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 hathach for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "unity.h"
+
+// Files to test
+#include "tusb_fifo.h"
+#include "tusb.h"
+#include "usbd.h"
+TEST_FILE("usbd_control.c")
+//TEST_FILE("usb_descriptors.c")
+
+// Mock File
+#include "mock_dcd.h"
+
+//--------------------------------------------------------------------+
+// MACRO TYPEDEF CONSTANT ENUM DECLARATION
+//--------------------------------------------------------------------+
+
+uint8_t const rhport = 0;
+
+tusb_desc_device_t const desc_device =
+{
+    .bLength            = sizeof(tusb_desc_device_t),
+    .bDescriptorType    = TUSB_DESC_DEVICE,
+    .bcdUSB             = 0x0200,
+
+    // Use Interface Association Descriptor (IAD) for CDC
+    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)
+    .bDeviceClass       = TUSB_CLASS_MISC,
+    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,
+    .bDeviceProtocol    = MISC_PROTOCOL_IAD,
+
+    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,
+
+    .idVendor           = 0xCafe,
+    .idProduct          = 0xCafe,
+    .bcdDevice          = 0x0100,
+
+    .iManufacturer      = 0x01,
+    .iProduct           = 0x02,
+    .iSerialNumber      = 0x03,
+
+    .bNumConfigurations = 0x01
+};
+
+tusb_control_request_t const req_get_desc_device =
+{
+  .bmRequestType = 0x80,
+  .bRequest = TUSB_REQ_GET_DESCRIPTOR,
+  .wValue = (TUSB_DESC_DEVICE << 8),
+  .wIndex = 0x0000,
+  .wLength = 64
+};
+
+//--------------------------------------------------------------------+
+//
+//--------------------------------------------------------------------+
+uint8_t const * ptr_desc_device;
+
+uint8_t const * tud_descriptor_device_cb(void)
+{
+  return ptr_desc_device;
+}
+
+uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
+{
+  TEST_FAIL();
+  return NULL;
+}
+
+uint16_t const* tud_descriptor_string_cb(uint8_t index)
+{
+  return NULL;
+}
+
+void setUp(void)
+{
+  dcd_int_disable_Ignore();
+  dcd_int_enable_Ignore();
+
+  if ( !tusb_inited() )
+  {
+    dcd_init_Expect(rhport);
+    tusb_init();
+  }
+
+  ptr_desc_device = (uint8_t const *) &desc_device;
+}
+
+void tearDown(void)
+{
+}
+
+//--------------------------------------------------------------------+
+//
+//--------------------------------------------------------------------+
+void test_usbd_get_device_descriptor(void)
+{
+  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false);
+
+  dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), true);
+
+  tud_task();
+}
+
+void test_usbd_get_device_descriptor_null(void)
+{
+  ptr_desc_device = NULL;
+
+  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false);
+
+  dcd_edpt_stall_Expect(rhport, 0);
+  dcd_edpt_stall_Expect(rhport, 0x80);
+
+  tud_task();
+}

+ 5 - 6
test/test/support/tusb_config.h

@@ -73,12 +73,11 @@
 #define CFG_TUD_ENDOINT0_SIZE    64
 
 //------------- CLASS -------------//
-#define CFG_TUD_CDC              1
-#define CFG_TUD_MSC              1
-#define CFG_TUD_HID              1
-
-#define CFG_TUD_MIDI             1
-#define CFG_TUD_VENDOR           1
+#define CFG_TUD_CDC              0
+#define CFG_TUD_MSC              0
+#define CFG_TUD_HID              0
+#define CFG_TUD_MIDI             0
+#define CFG_TUD_VENDOR           0
 
 //------------- CDC -------------//