| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fidl/fuchsia.hardware.usb.hcitest/cpp/wire.h> |
| #include <lib/component/incoming/cpp/protocol.h> |
| #include <lib/zx/channel.h> |
| #include <lib/zx/result.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| |
| #include <filesystem> |
| #include <memory> |
| |
| #include <fbl/unique_fd.h> |
| #include <zxtest/zxtest.h> |
| |
| static fuchsia_hardware_usb_hcitest::wire::DeviceRunResponse response; |
| |
| static constexpr double BytesToGigabits(double bytes) { return (bytes / 1000 / 1000 / 1000) * 8; } |
| |
| constexpr double kTestRuntimeInSeconds = 15; |
| |
| TEST(UsbHciTests, BulkTests) { |
| double bytes_received = static_cast<double>(response.results.received_bulk_packets) * |
| static_cast<double>(response.results.bulk_packet_size); |
| |
| ASSERT_GE(BytesToGigabits(bytes_received) / kTestRuntimeInSeconds, EXPECTED_BITRATE); |
| } |
| |
| TEST(UsbHciTests, IsochronousTests) { |
| // We should be receiving 120000 packets in 15 seconds (with period of 125 microseconds) |
| // but in practice we aren't meeting this with our current driver today. |
| // TODO(bbosak): Update this test when the xHCI rewrite gets in. |
| // TODO(https://fxbug.dev/42122293): Add metrics when infra supports this. |
| ASSERT_GE(static_cast<double>(response.results.received_isoch_packets), EXPECTED_ISOCH_PACKETS); |
| } |
| |
| TEST(UsbHciTests, ShortPacketTests) { |
| // Asserts that we receive the correct number of bytes when a short packet occurs |
| ASSERT_TRUE(response.results.got_correct_number_of_bytes_in_short_transfers); |
| } |
| |
| int main(int argc, char** argv) { |
| std::vector<std::string> paths; |
| for (auto const& entry : std::filesystem::directory_iterator{"/dev/class/usb-hci-test"}) { |
| paths.push_back(entry.path()); |
| } |
| if (paths.empty()) { |
| printf("failed to find usb-hci-test device\n"); |
| return -1; |
| } |
| if (paths.size() > 1) { |
| printf("found %zu usb-hci-test devices\n", paths.size()); |
| return -1; |
| } |
| std::string_view path = paths.front(); |
| zx::result client_end = component::Connect<fuchsia_hardware_usb_hcitest::Device>(path); |
| if (!client_end.is_ok()) { |
| printf("failed to connect to service due to error %s\n", client_end.status_string()); |
| return -1; |
| } |
| const fidl::WireResult wire_result = fidl::WireCall(client_end.value())->Run(); |
| if (!wire_result.ok()) { |
| printf("test failed: %s\n", wire_result.FormatDescription().c_str()); |
| return -1; |
| } |
| const fit::result wire_response = wire_result.value(); |
| if (wire_response.is_error()) { |
| printf("test failed: %s\n", zx_status_get_string(wire_response.error_value())); |
| return -1; |
| } |
| response = *wire_response.value(); |
| zxtest::RunAllTests(argc, argv); |
| return 0; |
| } |