blob: 5567916b2e03b17b32cea19f6614388f710617c7 [file] [log] [blame]
// Copyright 2017 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 "peridot/examples/counter_cpp/store.h"
#include <string>
#include "garnet/lib/gtest/test_with_message_loop.h"
#include "gtest/gtest.h"
#include "lib/fsl/tasks/message_loop.h"
#include "lib/fxl/strings/string_view.h"
#include <fuchsia/cpp/modular.h>
#include "peridot/lib/rapidjson/rapidjson.h"
#include "peridot/lib/testing/mock_base.h"
namespace modular {
namespace {
class LinkMockBase : protected Link, public testing::MockBase {
public:
LinkMockBase() = default;
~LinkMockBase() override = default;
void SetSchema(fidl::StringPtr /*json_schema*/) override {
++counts["SetSchema"];
}
void Get(fidl::VectorPtr<fidl::StringPtr> /*path*/,
GetCallback /*callback*/) override {
++counts["Get"];
}
void Set(fidl::VectorPtr<fidl::StringPtr> /*path*/,
fidl::StringPtr /*json*/) override {
++counts["Set"];
}
void UpdateObject(fidl::VectorPtr<fidl::StringPtr> /*path*/,
fidl::StringPtr /*json*/) override {
++counts["UpdateObject"];
}
void Erase(fidl::VectorPtr<fidl::StringPtr> /*path*/) override {
++counts["Erase"];
}
void GetEntity(Link::GetEntityCallback callback) override {
++counts["GetEntity"];
callback("");
}
void SetEntity(fidl::StringPtr /*entity_reference*/) override {
++counts["SetEntity"];
}
void Watch(fidl::InterfaceHandle<LinkWatcher> /*watcher_handle*/) override {
++counts["Watch"];
}
void WatchAll(fidl::InterfaceHandle<LinkWatcher> /*watcher*/) override {
++counts["WatchAll"];
}
void Sync(SyncCallback /*callback*/) override { ++counts["Sync"]; }
};
class LinkMock : public LinkMockBase {
public:
LinkMock() : binding_(this) {}
void Bind(fidl::InterfaceRequest<Link> request) {
binding_.Bind(std::move(request));
}
void Watch(fidl::InterfaceHandle<LinkWatcher> watcher_handle) override {
watcher.Bind(std::move(watcher_handle));
LinkMockBase::Watch(std::move(watcher_handle));
}
void UpdateObject(fidl::VectorPtr<fidl::StringPtr> path,
fidl::StringPtr json) override {
LinkMockBase::UpdateObject(std::move(path), json);
fsl::MessageLoop::GetCurrent()->QuitNow();
}
fidl::InterfacePtr<modular::LinkWatcher> watcher;
private:
fidl::Binding<Link> binding_;
};
const std::string module_name{"store_unittest"};
TEST(Counter, Constructor_Invalid) {
modular_example::Counter counter;
EXPECT_FALSE(counter.is_valid());
}
TEST(Counter, ToDocument_Success) {
modular_example::Counter counter;
counter.counter = 3;
EXPECT_TRUE(counter.is_valid());
rapidjson::Document doc = counter.ToDocument(module_name);
std::string json = JsonValueToString(doc);
EXPECT_EQ(
"{\"http://schema.domokit.org/counter\":3,"
"\"http://schema.org/sender\":\"store_unittest\"}",
json);
}
class StoreTest : public gtest::TestWithMessageLoop {};
TEST_F(StoreTest, Store_ModelChanged) {
LinkMock link_mock;
modular::LinkPtr link;
link_mock.Bind(link.NewRequest());
modular_example::Store store{module_name};
store.Initialize(link.Unbind());
store.counter.sender = module_name;
store.counter.counter = 3;
link_mock.ExpectNoOtherCalls();
store.MarkDirty();
store.ModelChanged();
EXPECT_FALSE(RunLoopWithTimeout());
// Initialize() calls Watch()
// and ModelChanged calls UpdateObject()
link_mock.ExpectCalledOnce("Watch");
link_mock.ExpectCalledOnce("UpdateObject");
link_mock.ExpectNoOtherCalls();
}
} // namespace
} // namespace modular