fido_ble_frames_unittest.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/fido/cable/fido_ble_frames.h"
  5. #include <algorithm>
  6. #include <vector>
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace {
  9. std::vector<uint8_t> GetSomeData(size_t size) {
  10. std::vector<uint8_t> data(size);
  11. for (size_t i = 0; i < size; ++i)
  12. data[i] = static_cast<uint8_t>((i * i) & 0xFF);
  13. return data;
  14. }
  15. } // namespace
  16. namespace device {
  17. TEST(FidoBleFramesTest, InitializationFragment) {
  18. const std::vector<uint8_t> data = GetSomeData(25);
  19. constexpr uint16_t kDataLength = 21123;
  20. FidoBleFrameInitializationFragment fragment(
  21. FidoBleDeviceCommand::kMsg, kDataLength, base::make_span(data));
  22. std::vector<uint8_t> buffer;
  23. const size_t binary_size = fragment.Serialize(&buffer);
  24. EXPECT_EQ(buffer.size(), binary_size);
  25. EXPECT_EQ(data.size() + 3, binary_size);
  26. FidoBleFrameInitializationFragment parsed_fragment;
  27. ASSERT_TRUE(
  28. FidoBleFrameInitializationFragment::Parse(buffer, &parsed_fragment));
  29. EXPECT_EQ(kDataLength, parsed_fragment.data_length());
  30. EXPECT_TRUE(std::equal(data.begin(), data.end(),
  31. parsed_fragment.fragment().begin(),
  32. parsed_fragment.fragment().end()));
  33. EXPECT_EQ(FidoBleDeviceCommand::kMsg, parsed_fragment.command());
  34. }
  35. TEST(FidoBleFramesTest, ContinuationFragment) {
  36. const auto data = GetSomeData(25);
  37. constexpr uint8_t kSequence = 61;
  38. FidoBleFrameContinuationFragment fragment(base::make_span(data), kSequence);
  39. std::vector<uint8_t> buffer;
  40. const size_t binary_size = fragment.Serialize(&buffer);
  41. EXPECT_EQ(buffer.size(), binary_size);
  42. EXPECT_EQ(data.size() + 1, binary_size);
  43. FidoBleFrameContinuationFragment parsed_fragment;
  44. ASSERT_TRUE(
  45. FidoBleFrameContinuationFragment::Parse(buffer, &parsed_fragment));
  46. EXPECT_TRUE(std::equal(data.begin(), data.end(),
  47. parsed_fragment.fragment().begin(),
  48. parsed_fragment.fragment().end()));
  49. EXPECT_EQ(kSequence, parsed_fragment.sequence());
  50. }
  51. TEST(FidoBleFramesTest, SplitAndAssemble) {
  52. for (size_t size : {0, 1, 16, 17, 18, 20, 21, 22, 35, 36,
  53. 37, 39, 40, 41, 54, 55, 56, 60, 100, 65535}) {
  54. SCOPED_TRACE(size);
  55. FidoBleFrame frame(FidoBleDeviceCommand::kPing, GetSomeData(size));
  56. auto fragments = frame.ToFragments(20);
  57. EXPECT_EQ(frame.command(), fragments.first.command());
  58. EXPECT_EQ(frame.data().size(),
  59. static_cast<size_t>(fragments.first.data_length()));
  60. FidoBleFrameAssembler assembler(fragments.first);
  61. while (!fragments.second.empty()) {
  62. ASSERT_TRUE(assembler.AddFragment(fragments.second.front()));
  63. fragments.second.pop();
  64. }
  65. EXPECT_TRUE(assembler.IsDone());
  66. ASSERT_TRUE(assembler.GetFrame());
  67. auto result_frame = std::move(*assembler.GetFrame());
  68. EXPECT_EQ(frame.command(), result_frame.command());
  69. EXPECT_EQ(frame.data(), result_frame.data());
  70. }
  71. }
  72. TEST(FidoBleFramesTest, FrameAssemblerError) {
  73. FidoBleFrame frame(FidoBleDeviceCommand::kPing, GetSomeData(30));
  74. auto fragments = frame.ToFragments(20);
  75. ASSERT_EQ(1u, fragments.second.size());
  76. fragments.second.front() =
  77. FidoBleFrameContinuationFragment(fragments.second.front().fragment(), 51);
  78. FidoBleFrameAssembler assembler(fragments.first);
  79. EXPECT_FALSE(assembler.IsDone());
  80. EXPECT_FALSE(assembler.GetFrame());
  81. EXPECT_FALSE(assembler.AddFragment(fragments.second.front()));
  82. EXPECT_FALSE(assembler.IsDone());
  83. EXPECT_FALSE(assembler.GetFrame());
  84. }
  85. TEST(FidoBleFramesTest, FrameGettersAndValidity) {
  86. {
  87. FidoBleFrame frame(FidoBleDeviceCommand::kKeepAlive,
  88. std::vector<uint8_t>(2));
  89. EXPECT_FALSE(frame.IsValid());
  90. }
  91. {
  92. FidoBleFrame frame(FidoBleDeviceCommand::kError, {});
  93. EXPECT_FALSE(frame.IsValid());
  94. }
  95. for (auto code : {FidoBleFrame::KeepaliveCode::TUP_NEEDED,
  96. FidoBleFrame::KeepaliveCode::PROCESSING}) {
  97. FidoBleFrame frame(FidoBleDeviceCommand::kKeepAlive,
  98. std::vector<uint8_t>(1, static_cast<uint8_t>(code)));
  99. EXPECT_TRUE(frame.IsValid());
  100. EXPECT_EQ(code, frame.GetKeepaliveCode());
  101. }
  102. for (auto code : {
  103. FidoBleFrame::ErrorCode::INVALID_CMD,
  104. FidoBleFrame::ErrorCode::INVALID_PAR,
  105. FidoBleFrame::ErrorCode::INVALID_SEQ,
  106. FidoBleFrame::ErrorCode::INVALID_LEN,
  107. FidoBleFrame::ErrorCode::REQ_TIMEOUT,
  108. FidoBleFrame::ErrorCode::NA_1,
  109. FidoBleFrame::ErrorCode::NA_2,
  110. FidoBleFrame::ErrorCode::NA_3,
  111. }) {
  112. FidoBleFrame frame(FidoBleDeviceCommand::kError,
  113. {static_cast<uint8_t>(code)});
  114. EXPECT_TRUE(frame.IsValid());
  115. EXPECT_EQ(code, frame.GetErrorCode());
  116. }
  117. }
  118. } // namespace device