OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/battor_agent/battor_agent.h" | 5 #include "tools/battor_agent/battor_agent.h" |
6 | 6 |
7 #include "base/test/test_simple_task_runner.h" | 7 #include "base/test/test_simple_task_runner.h" |
8 #include "base/thread_task_runner_handle.h" | 8 #include "base/thread_task_runner_handle.h" |
9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
11 #include "tools/battor_agent/battor_protocol_types.h" | 11 #include "tools/battor_agent/battor_protocol_types.h" |
12 | 12 |
13 using namespace testing; | 13 using namespace testing; |
14 | 14 |
15 using std::vector; | 15 using std::vector; |
16 | 16 |
17 namespace battor { | 17 namespace battor { |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 BattOrControlMessageAck kInitAck{BATTOR_CONTROL_MESSAGE_TYPE_INIT, 0}; | 21 BattOrControlMessageAck kInitAck{BATTOR_CONTROL_MESSAGE_TYPE_INIT, 0}; |
22 BattOrControlMessageAck kSetGainAck{BATTOR_CONTROL_MESSAGE_TYPE_SET_GAIN, 0}; | 22 BattOrControlMessageAck kSetGainAck{BATTOR_CONTROL_MESSAGE_TYPE_SET_GAIN, 0}; |
23 BattOrControlMessageAck kStartTracingAck{ | 23 BattOrControlMessageAck kStartTracingAck{ |
24 BATTOR_CONTROL_MESSAGE_TYPE_START_SAMPLING_SD, 0}; | 24 BATTOR_CONTROL_MESSAGE_TYPE_START_SAMPLING_SD, 0}; |
25 const char kClockSyncId[] = "MY_MARKER"; | 25 const char kClockSyncId[] = "MY_MARKER"; |
26 | 26 |
27 // Creates a byte vector copy of the specified object. | 27 // Creates a byte vector copy of the specified object. |
28 template <typename T> | 28 template <typename T> |
29 scoped_ptr<std::vector<char>> ToCharVector(const T& object) { | 29 std::unique_ptr<std::vector<char>> ToCharVector(const T& object) { |
30 return scoped_ptr<std::vector<char>>(new std::vector<char>( | 30 return std::unique_ptr<std::vector<char>>(new std::vector<char>( |
31 reinterpret_cast<const char*>(&object), | 31 reinterpret_cast<const char*>(&object), |
32 reinterpret_cast<const char*>(&object) + sizeof(T))); | 32 reinterpret_cast<const char*>(&object) + sizeof(T))); |
33 } | 33 } |
34 | 34 |
35 MATCHER_P2( | 35 MATCHER_P2( |
36 BufferEq, | 36 BufferEq, |
37 expected_buffer, | 37 expected_buffer, |
38 expected_buffer_size, | 38 expected_buffer_size, |
39 "Makes sure that the argument has the same contents as the buffer.") { | 39 "Makes sure that the argument has the same contents as the buffer.") { |
40 return memcmp(reinterpret_cast<const void*>(arg), | 40 return memcmp(reinterpret_cast<const void*>(arg), |
41 reinterpret_cast<const void*>(expected_buffer), | 41 reinterpret_cast<const void*>(expected_buffer), |
42 expected_buffer_size) == 0; | 42 expected_buffer_size) == 0; |
43 } | 43 } |
44 | 44 |
45 scoped_ptr<vector<char>> CreateFrame(const BattOrFrameHeader& frame_header, | 45 std::unique_ptr<vector<char>> CreateFrame(const BattOrFrameHeader& frame_header, |
46 const RawBattOrSample* samples, | 46 const RawBattOrSample* samples, |
47 const size_t& num_samples) { | 47 const size_t& num_samples) { |
48 scoped_ptr<vector<char>> bytes(new vector<char>( | 48 std::unique_ptr<vector<char>> bytes(new vector<char>( |
49 sizeof(BattOrFrameHeader) + sizeof(RawBattOrSample) * num_samples)); | 49 sizeof(BattOrFrameHeader) + sizeof(RawBattOrSample) * num_samples)); |
50 memcpy(bytes->data(), &frame_header, sizeof(BattOrFrameHeader)); | 50 memcpy(bytes->data(), &frame_header, sizeof(BattOrFrameHeader)); |
51 memcpy(bytes->data() + sizeof(BattOrFrameHeader), samples, | 51 memcpy(bytes->data() + sizeof(BattOrFrameHeader), samples, |
52 sizeof(RawBattOrSample) * num_samples); | 52 sizeof(RawBattOrSample) * num_samples); |
53 | 53 |
54 return bytes; | 54 return bytes; |
55 } | 55 } |
56 | 56 |
57 class MockBattOrConnection : public BattOrConnection { | 57 class MockBattOrConnection : public BattOrConnection { |
58 public: | 58 public: |
(...skipping 14 matching lines...) Expand all Loading... |
73 DISALLOW_COPY_AND_ASSIGN(MockBattOrConnection); | 73 DISALLOW_COPY_AND_ASSIGN(MockBattOrConnection); |
74 }; | 74 }; |
75 | 75 |
76 } // namespace | 76 } // namespace |
77 | 77 |
78 // TestableBattOrAgent uses a fake BattOrConnection to be testable. | 78 // TestableBattOrAgent uses a fake BattOrConnection to be testable. |
79 class TestableBattOrAgent : public BattOrAgent { | 79 class TestableBattOrAgent : public BattOrAgent { |
80 public: | 80 public: |
81 TestableBattOrAgent(BattOrAgent::Listener* listener) | 81 TestableBattOrAgent(BattOrAgent::Listener* listener) |
82 : BattOrAgent("/dev/test", listener, nullptr, nullptr) { | 82 : BattOrAgent("/dev/test", listener, nullptr, nullptr) { |
83 connection_ = scoped_ptr<BattOrConnection>(new MockBattOrConnection(this)); | 83 connection_ = |
| 84 std::unique_ptr<BattOrConnection>(new MockBattOrConnection(this)); |
84 } | 85 } |
85 | 86 |
86 MockBattOrConnection* GetConnection() { | 87 MockBattOrConnection* GetConnection() { |
87 return static_cast<MockBattOrConnection*>(connection_.get()); | 88 return static_cast<MockBattOrConnection*>(connection_.get()); |
88 } | 89 } |
89 | 90 |
90 void OnActionTimeout() override {} | 91 void OnActionTimeout() override {} |
91 }; | 92 }; |
92 | 93 |
93 // BattOrAgentTest provides a BattOrAgent and captures the results of its | 94 // BattOrAgentTest provides a BattOrAgent and captures the results of its |
(...skipping 21 matching lines...) Expand all Loading... |
115 command_error_ = error; | 116 command_error_ = error; |
116 } | 117 } |
117 | 118 |
118 void OnBytesSent(bool success) { | 119 void OnBytesSent(bool success) { |
119 agent_->OnBytesSent(success); | 120 agent_->OnBytesSent(success); |
120 task_runner_->RunUntilIdle(); | 121 task_runner_->RunUntilIdle(); |
121 } | 122 } |
122 | 123 |
123 void OnMessageRead(bool success, | 124 void OnMessageRead(bool success, |
124 BattOrMessageType type, | 125 BattOrMessageType type, |
125 scoped_ptr<std::vector<char>> bytes) { | 126 std::unique_ptr<std::vector<char>> bytes) { |
126 agent_->OnMessageRead(success, type, std::move(bytes)); | 127 agent_->OnMessageRead(success, type, std::move(bytes)); |
127 task_runner_->RunUntilIdle(); | 128 task_runner_->RunUntilIdle(); |
128 } | 129 } |
129 | 130 |
130 protected: | 131 protected: |
131 void SetUp() override { | 132 void SetUp() override { |
132 agent_.reset(new TestableBattOrAgent(this)); | 133 agent_.reset(new TestableBattOrAgent(this)); |
133 task_runner_->ClearPendingTasks(); | 134 task_runner_->ClearPendingTasks(); |
134 is_command_complete_ = false; | 135 is_command_complete_ = false; |
135 command_error_ = BATTOR_ERROR_NONE; | 136 command_error_ = BATTOR_ERROR_NONE; |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 285 |
285 bool IsCommandComplete() { return is_command_complete_; } | 286 bool IsCommandComplete() { return is_command_complete_; } |
286 BattOrError GetCommandError() { return command_error_; } | 287 BattOrError GetCommandError() { return command_error_; } |
287 std::string GetTrace() { return trace_; } | 288 std::string GetTrace() { return trace_; } |
288 | 289 |
289 private: | 290 private: |
290 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 291 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
291 // Needed to support ThreadTaskRunnerHandle::Get() in code under test. | 292 // Needed to support ThreadTaskRunnerHandle::Get() in code under test. |
292 base::ThreadTaskRunnerHandle thread_task_runner_handle_; | 293 base::ThreadTaskRunnerHandle thread_task_runner_handle_; |
293 | 294 |
294 scoped_ptr<TestableBattOrAgent> agent_; | 295 std::unique_ptr<TestableBattOrAgent> agent_; |
295 bool is_command_complete_; | 296 bool is_command_complete_; |
296 BattOrError command_error_; | 297 BattOrError command_error_; |
297 std::string trace_; | 298 std::string trace_; |
298 }; | 299 }; |
299 | 300 |
300 TEST_F(BattOrAgentTest, StartTracing) { | 301 TEST_F(BattOrAgentTest, StartTracing) { |
301 testing::InSequence s; | 302 testing::InSequence s; |
302 EXPECT_CALL(*GetAgent()->GetConnection(), Open()); | 303 EXPECT_CALL(*GetAgent()->GetConnection(), Open()); |
303 | 304 |
304 BattOrControlMessage reset_msg{BATTOR_CONTROL_MESSAGE_TYPE_RESET, 0, 0}; | 305 BattOrControlMessage reset_msg{BATTOR_CONTROL_MESSAGE_TYPE_RESET, 0, 0}; |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 | 703 |
703 TEST_F(BattOrAgentTest, StopTracingFailsIfCalibrationFrameMissingByte) { | 704 TEST_F(BattOrAgentTest, StopTracingFailsIfCalibrationFrameMissingByte) { |
704 RunStopTracingTo(BattOrAgentState::SAMPLES_REQUEST_SENT); | 705 RunStopTracingTo(BattOrAgentState::SAMPLES_REQUEST_SENT); |
705 | 706 |
706 BattOrFrameHeader cal_frame_header{0, 2 * sizeof(RawBattOrSample)}; | 707 BattOrFrameHeader cal_frame_header{0, 2 * sizeof(RawBattOrSample)}; |
707 RawBattOrSample cal_frame[] = { | 708 RawBattOrSample cal_frame[] = { |
708 RawBattOrSample{1, 1}, RawBattOrSample{2, 2}, | 709 RawBattOrSample{1, 1}, RawBattOrSample{2, 2}, |
709 }; | 710 }; |
710 | 711 |
711 // Remove the last byte from the frame to make it invalid. | 712 // Remove the last byte from the frame to make it invalid. |
712 scoped_ptr<vector<char>> cal_frame_bytes = | 713 std::unique_ptr<vector<char>> cal_frame_bytes = |
713 CreateFrame(cal_frame_header, cal_frame, 2); | 714 CreateFrame(cal_frame_header, cal_frame, 2); |
714 cal_frame_bytes->pop_back(); | 715 cal_frame_bytes->pop_back(); |
715 | 716 |
716 OnMessageRead(true, BATTOR_MESSAGE_TYPE_SAMPLES, std::move(cal_frame_bytes)); | 717 OnMessageRead(true, BATTOR_MESSAGE_TYPE_SAMPLES, std::move(cal_frame_bytes)); |
717 | 718 |
718 EXPECT_TRUE(IsCommandComplete()); | 719 EXPECT_TRUE(IsCommandComplete()); |
719 EXPECT_EQ(BATTOR_ERROR_UNEXPECTED_MESSAGE, GetCommandError()); | 720 EXPECT_EQ(BATTOR_ERROR_UNEXPECTED_MESSAGE, GetCommandError()); |
720 } | 721 } |
721 | 722 |
722 TEST_F(BattOrAgentTest, StopTracingFailsIfDataFrameMissingByte) { | 723 TEST_F(BattOrAgentTest, StopTracingFailsIfDataFrameMissingByte) { |
723 RunStopTracingTo(BattOrAgentState::SAMPLES_REQUEST_SENT); | 724 RunStopTracingTo(BattOrAgentState::SAMPLES_REQUEST_SENT); |
724 | 725 |
725 BattOrFrameHeader cal_frame_header{0, 1 * sizeof(RawBattOrSample)}; | 726 BattOrFrameHeader cal_frame_header{0, 1 * sizeof(RawBattOrSample)}; |
726 RawBattOrSample cal_frame[] = { | 727 RawBattOrSample cal_frame[] = { |
727 RawBattOrSample{1, 1}, | 728 RawBattOrSample{1, 1}, |
728 }; | 729 }; |
729 OnMessageRead(true, BATTOR_MESSAGE_TYPE_SAMPLES, | 730 OnMessageRead(true, BATTOR_MESSAGE_TYPE_SAMPLES, |
730 CreateFrame(cal_frame_header, cal_frame, 1)); | 731 CreateFrame(cal_frame_header, cal_frame, 1)); |
731 | 732 |
732 BattOrFrameHeader frame_header{1, 1 * sizeof(RawBattOrSample)}; | 733 BattOrFrameHeader frame_header{1, 1 * sizeof(RawBattOrSample)}; |
733 RawBattOrSample frame[] = {RawBattOrSample{1, 1}}; | 734 RawBattOrSample frame[] = {RawBattOrSample{1, 1}}; |
734 | 735 |
735 // Remove the last byte from the frame to make it invalid. | 736 // Remove the last byte from the frame to make it invalid. |
736 scoped_ptr<vector<char>> frame_bytes = CreateFrame(frame_header, frame, 2); | 737 std::unique_ptr<vector<char>> frame_bytes = |
| 738 CreateFrame(frame_header, frame, 2); |
737 frame_bytes->pop_back(); | 739 frame_bytes->pop_back(); |
738 | 740 |
739 OnMessageRead(true, BATTOR_MESSAGE_TYPE_SAMPLES, std::move(frame_bytes)); | 741 OnMessageRead(true, BATTOR_MESSAGE_TYPE_SAMPLES, std::move(frame_bytes)); |
740 | 742 |
741 EXPECT_TRUE(IsCommandComplete()); | 743 EXPECT_TRUE(IsCommandComplete()); |
742 EXPECT_EQ(BATTOR_ERROR_UNEXPECTED_MESSAGE, GetCommandError()); | 744 EXPECT_EQ(BATTOR_ERROR_UNEXPECTED_MESSAGE, GetCommandError()); |
743 } | 745 } |
744 | 746 |
745 TEST_F(BattOrAgentTest, StopTracingFailsIfFrameArrivesOutOfOrder) { | 747 TEST_F(BattOrAgentTest, StopTracingFailsIfFrameArrivesOutOfOrder) { |
746 RunStopTracingTo(BattOrAgentState::CALIBRATION_FRAME_RECEIVED); | 748 RunStopTracingTo(BattOrAgentState::CALIBRATION_FRAME_RECEIVED); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
865 | 867 |
866 uint32_t current_sample = 1; | 868 uint32_t current_sample = 1; |
867 OnMessageRead(true, BATTOR_MESSAGE_TYPE_CONTROL, | 869 OnMessageRead(true, BATTOR_MESSAGE_TYPE_CONTROL, |
868 ToCharVector(current_sample)); | 870 ToCharVector(current_sample)); |
869 | 871 |
870 EXPECT_TRUE(IsCommandComplete()); | 872 EXPECT_TRUE(IsCommandComplete()); |
871 EXPECT_EQ(BATTOR_ERROR_UNEXPECTED_MESSAGE, GetCommandError()); | 873 EXPECT_EQ(BATTOR_ERROR_UNEXPECTED_MESSAGE, GetCommandError()); |
872 } | 874 } |
873 | 875 |
874 } // namespace battor | 876 } // namespace battor |
OLD | NEW |