blob: 068d395b301d399c5b6bc24431101373db71b065 [file] [log] [blame]
// Copyright 2019 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 "src/developer/debug/zxdb/client/filter.h"
#include "gtest/gtest.h"
#include "src/developer/debug/shared/platform_message_loop.h"
#include "src/developer/debug/zxdb/client/remote_api_test.h"
#include "src/developer/debug/zxdb/client/session.h"
namespace zxdb {
namespace {
using debug_ipc::MessageLoop;
class FilterSink : public RemoteAPI {
public:
void JobFilter(
const debug_ipc::JobFilterRequest& request,
std::function<void(const Err&, debug_ipc::JobFilterReply)> cb) override {
filters[request.job_koid] = request.filters;
MessageLoop::Current()->PostTask(FROM_HERE, [cb]() {
cb(Err(), debug_ipc::JobFilterReply());
MessageLoop::Current()->QuitNow();
});
}
void Attach(
const debug_ipc::AttachRequest& request,
std::function<void(const Err&, debug_ipc::AttachReply)> cb) override {
debug_ipc::AttachReply reply;
reply.koid = request.koid;
reply.name = "test";
MessageLoop::Current()->PostTask(FROM_HERE,
[cb, reply]() { cb(Err(), reply); });
}
std::map<uint64_t, std::vector<std::string>> filters;
};
class FilterTest : public RemoteAPITest {
public:
FilterTest() = default;
~FilterTest() override = default;
FilterSink& sink() { return *sink_; }
protected:
std::unique_ptr<RemoteAPI> GetRemoteAPIImpl() override {
auto sink = std::make_unique<FilterSink>();
sink_ = sink.get();
return std::move(sink);
}
private:
FilterSink* sink_; // Owned by the session.
};
} // namespace
TEST_F(FilterTest, SetFilters) {
Filter* filter = session().system().CreateNewFilter();
auto contexts = session().system().GetJobContexts();
ASSERT_EQ(1u, contexts.size());
auto context = contexts[0];
bool job_context_alive;
Err ctx_err;
context->Attach(1234, [&job_context_alive, &ctx_err](
fxl::WeakPtr<JobContext> ctx, const Err& err) {
ctx_err = err;
job_context_alive = !!ctx;
MessageLoop::Current()->QuitNow();
});
MessageLoop::Current()->Run();
EXPECT_FALSE(ctx_err.has_error());
EXPECT_TRUE(job_context_alive);
filter->SetPattern("foo");
MessageLoop::Current()->Run();
ASSERT_EQ(1u, sink().filters[1234u].size());
EXPECT_EQ("foo", sink().filters[1234u][0]);
}
TEST_F(FilterTest, SetSpecificFilters) {
Filter* filter = session().system().CreateNewFilter();
auto contexts = session().system().GetJobContexts();
ASSERT_EQ(1u, contexts.size());
auto context_a = contexts[0];
auto context_b = session().system().CreateNewJobContext(context_a);
bool job_context_alive;
Err ctx_err;
context_a->Attach(1234, [&job_context_alive, &ctx_err](
fxl::WeakPtr<JobContext> ctx, const Err& err) {
ctx_err = err;
job_context_alive = !!ctx;
MessageLoop::Current()->QuitNow();
});
MessageLoop::Current()->Run();
EXPECT_FALSE(ctx_err.has_error());
EXPECT_TRUE(job_context_alive);
context_b->Attach(5678, [&job_context_alive, &ctx_err](
fxl::WeakPtr<JobContext> ctx, const Err& err) {
ctx_err = err;
job_context_alive = !!ctx;
MessageLoop::Current()->QuitNow();
});
MessageLoop::Current()->Run();
EXPECT_FALSE(ctx_err.has_error());
EXPECT_TRUE(job_context_alive);
filter->SetPattern("foo");
filter->SetJob(context_a);
MessageLoop::Current()->Run();
ASSERT_EQ(1u, sink().filters[1234u].size());
EXPECT_EQ("foo", sink().filters[1234u][0]);
ASSERT_EQ(0u, sink().filters[5678u].size());
}
TEST_F(FilterTest, SetBroadFilters) {
Filter* filter = session().system().CreateNewFilter();
auto contexts = session().system().GetJobContexts();
ASSERT_EQ(1u, contexts.size());
auto context_a = contexts[0];
auto context_b = session().system().CreateNewJobContext(context_a);
bool job_context_alive;
Err ctx_err;
context_a->Attach(1234, [&job_context_alive, &ctx_err](
fxl::WeakPtr<JobContext> ctx, const Err& err) {
ctx_err = err;
job_context_alive = !!ctx;
MessageLoop::Current()->QuitNow();
});
MessageLoop::Current()->Run();
EXPECT_FALSE(ctx_err.has_error());
EXPECT_TRUE(job_context_alive);
context_b->Attach(5678, [&job_context_alive, &ctx_err](
fxl::WeakPtr<JobContext> ctx, const Err& err) {
ctx_err = err;
job_context_alive = !!ctx;
MessageLoop::Current()->QuitNow();
});
MessageLoop::Current()->Run();
EXPECT_FALSE(ctx_err.has_error());
EXPECT_TRUE(job_context_alive);
filter->SetPattern("foo");
MessageLoop::Current()->Run();
ASSERT_EQ(1u, sink().filters[1234u].size());
EXPECT_EQ("foo", sink().filters[1234u][0]);
ASSERT_EQ(1u, sink().filters[5678u].size());
EXPECT_EQ("foo", sink().filters[5678u][0]);
}
TEST_F(FilterTest, SetExAnteFilters) {
Filter* filter = session().system().CreateNewFilter();
filter->SetPattern("foo");
auto contexts = session().system().GetJobContexts();
ASSERT_EQ(1u, contexts.size());
auto context = contexts[0];
bool job_context_alive;
Err ctx_err;
context->Attach(1234, [&job_context_alive, &ctx_err](
fxl::WeakPtr<JobContext> ctx, const Err& err) {
ctx_err = err;
job_context_alive = !!ctx;
MessageLoop::Current()->QuitNow();
});
MessageLoop::Current()->Run();
EXPECT_FALSE(ctx_err.has_error());
EXPECT_TRUE(job_context_alive);
ASSERT_EQ(1u, sink().filters[1234u].size());
EXPECT_EQ("foo", sink().filters[1234u][0]);
}
} // namespace zxdb