Chromium Code Reviews| Index: components/copresence/copresence_state_unittest.cc |
| diff --git a/components/copresence/copresence_state_unittest.cc b/components/copresence/copresence_state_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..097a504b615bf81c3e3c196c588fd1a31bdda023 |
| --- /dev/null |
| +++ b/components/copresence/copresence_state_unittest.cc |
| @@ -0,0 +1,148 @@ |
| +// Copyright 2014 The Chromium 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 <string> |
| +#include <vector> |
| + |
| +#include "base/time/time.h" |
| +#include "components/copresence/copresence_state_impl.h" |
| +#include "components/copresence/proto/data.pb.h" |
| +#include "components/copresence/public/copresence_observer.h" |
| +#include "components/copresence/tokens.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| + |
| +using google::protobuf::MessageLite; |
| +using testing::ElementsAre; |
| +using testing::Key; |
| +using testing::SizeIs; |
| +using testing::UnorderedElementsAre; |
| + |
| +// TODO(ckehoe): Test start and end time tracking. |
| + |
| +namespace google { |
| +namespace protobuf { |
| +bool operator==(const MessageLite& A, const MessageLite& B) { |
| + std::string serializedA; |
| + CHECK(A.SerializeToString(&serializedA)); |
| + |
| + std::string serializedB; |
| + CHECK(B.SerializeToString(&serializedB)); |
| + |
| + return serializedA == serializedB; |
| +} |
| +} |
|
xiyuan
2014/12/19 04:03:02
nit: } // namespace protobuf
Charlie
2014/12/19 05:25:39
Done.
|
| +} |
|
xiyuan
2014/12/19 04:03:02
nit: } // namespace google
Charlie
2014/12/19 05:25:39
Done.
|
| + |
| +namespace copresence { |
| + |
| +namespace { |
| + |
| +const double kStartTime = 10; |
| + |
| +Directive CreateDirective(const std::string& token, bool transmit) { |
| + Directive directive; |
| + TokenInstruction* instruction = directive.mutable_token_instruction(); |
| + instruction->set_token_id(token); |
| + instruction->set_medium(AUDIO_ULTRASOUND_PASSBAND); |
| + if (transmit) |
| + instruction->set_token_instruction_type(TRANSMIT); |
| + return directive; |
| +} |
| + |
| +template<typename TokenType> |
| +TokenType CreateToken(const std::string& id) { |
| + TokenType token; |
| + token.id = id; |
| + token.medium = AUDIO_ULTRASOUND_PASSBAND; |
| + token.start_time = base::Time::FromDoubleT(kStartTime); |
| + return token; |
| +} |
| + |
| +} // namespace |
| + |
| +class CopresenceStateTest : public CopresenceObserver, |
| + public testing::Test { |
| + public: |
| + CopresenceStateTest() : directive_notifications_(0) { |
| + state_.AddObserver(this); |
| + } |
| + |
| + protected: |
| + CopresenceStateImpl state_; |
| + |
| + int directive_notifications_; |
| + std::vector<std::string> transmitted_updates_; |
| + std::vector<std::string> received_updates_; |
| + |
| + private: |
| + // CopresenceObserver implementation. |
| + void DirectivesUpdated() override { |
| + directive_notifications_++; |
|
xiyuan
2014/12/19 04:03:01
nit: ++directive_notifications_;
Charlie
2014/12/19 05:25:39
Style guide says this can be either before or afte
|
| + } |
| + void TokenTransmitted(const TransmittedToken& token) override { |
| + transmitted_updates_.push_back(token.id); |
| + } |
| + void TokenReceived(const ReceivedToken& token) override { |
| + received_updates_.push_back(token.id); |
| + } |
| +}; |
| + |
| +TEST_F(CopresenceStateTest, Directives) { |
| + std::vector<Directive> directives; |
| + directives.push_back(CreateDirective("transmit 1", true)); |
| + directives.push_back(CreateDirective("transmit 2", true)); |
| + directives.push_back(CreateDirective("receive", false)); |
| + state_.UpdateDirectives(directives); |
| + |
| + EXPECT_EQ(1, directive_notifications_); |
| + EXPECT_EQ(directives, state_.active_directives()); |
| + EXPECT_THAT(transmitted_updates_, ElementsAre("transmit 1", "transmit 2")); |
| + EXPECT_THAT(state_.transmitted_tokens(), |
| + UnorderedElementsAre(Key("transmit 1"), Key("transmit 2"))); |
| + |
| + directives.clear(); |
| + directives.push_back(CreateDirective("transmit 1", true)); |
| + state_.UpdateDirectives(directives); |
| + EXPECT_EQ(2, directive_notifications_); |
| + EXPECT_EQ(directives, state_.active_directives()); |
| + EXPECT_THAT(state_.transmitted_tokens(), SizeIs(2)); |
| +} |
| + |
| +TEST_F(CopresenceStateTest, TransmittedTokens) { |
| + state_.UpdateTransmittedToken(CreateToken<TransmittedToken>("A")); |
| + state_.UpdateTransmittedToken(CreateToken<TransmittedToken>("B")); |
| + |
| + EXPECT_THAT(transmitted_updates_, ElementsAre("A", "B")); |
| + EXPECT_THAT(state_.transmitted_tokens(), |
| + UnorderedElementsAre(Key("A"), Key("B"))); |
| + |
| + const base::Time kStopTime = base::Time::FromDoubleT(20); |
| + TransmittedToken tokenA = CreateToken<TransmittedToken>("A"); |
| + tokenA.stop_time = kStopTime; |
| + state_.UpdateTransmittedToken(tokenA); |
| + |
| + EXPECT_THAT(transmitted_updates_, ElementsAre("A", "B", "A")); |
| + EXPECT_EQ(kStopTime, state_.transmitted_tokens().find("A")->second.stop_time); |
| + |
| + state_.UpdateReceivedToken(CreateToken<ReceivedToken>("B")); |
| + EXPECT_THAT(transmitted_updates_, ElementsAre("A", "B", "A", "B")); |
| + EXPECT_TRUE(state_.transmitted_tokens().find("B") |
| + ->second.broadcast_confirmed); |
| +} |
| + |
| +TEST_F(CopresenceStateTest, ReceivedTokens) { |
| + state_.UpdateReceivedToken(CreateToken<ReceivedToken>("A")); |
| + state_.UpdateReceivedToken(CreateToken<ReceivedToken>("B")); |
| + |
| + EXPECT_THAT(received_updates_, ElementsAre("A", "B")); |
| + EXPECT_THAT(state_.received_tokens(), |
| + UnorderedElementsAre(Key("A"), Key("B"))); |
| + |
| + state_.UpdateTokenStatus("A", copresence::VALID); |
| + EXPECT_THAT(received_updates_, ElementsAre("A", "B", "A")); |
| + EXPECT_EQ(ReceivedToken::VALID, |
| + state_.received_tokens().find("A")->second.valid); |
| +} |
| + |
| +} // namespace copresence |