Commit d89b4d34 authored by Mirek Klimos's avatar Mirek Klimos Committed by Facebook Github Bot 7

RequestContext::create should call onUnset callback

Summary: melaniesubbiah introduced onSet / onUnset callbacks on RequestData in D3604948; we need unset() to be called when an RC is overriden with RequestContext::create() so that things work as expected. Also, change the order of calling onSet / onUnset - from RequestData perspective, it shouldn't look like there are two contexts set at the same time

Reviewed By: palmtenor

Differential Revision: D3667017

fbshipit-source-id: b9bfb858fe65ffb11de8e6d6f13b8f4cf6266bc9
parent 156f7033
...@@ -108,12 +108,12 @@ std::shared_ptr<RequestContext> RequestContext::setContext( ...@@ -108,12 +108,12 @@ std::shared_ptr<RequestContext> RequestContext::setContext(
auto& prev = getStaticContext(); auto& prev = getStaticContext();
if (ctx != prev) { if (ctx != prev) {
using std::swap; using std::swap;
if (ctx) {
ctx->onSet();
}
if (prev) { if (prev) {
prev->onUnset(); prev->onUnset();
} }
if (ctx) {
ctx->onSet();
}
swap(ctx, prev); swap(ctx, prev);
} }
return ctx; return ctx;
......
...@@ -47,7 +47,7 @@ class RequestContext { ...@@ -47,7 +47,7 @@ class RequestContext {
// It will be passed between queues / threads (where implemented), // It will be passed between queues / threads (where implemented),
// so it should be valid for the lifetime of the request. // so it should be valid for the lifetime of the request.
static void create() { static void create() {
getStaticContext() = std::make_shared<RequestContext>(); setContext(std::make_shared<RequestContext>());
} }
// Get the current context. // Get the current context.
......
...@@ -28,6 +28,13 @@ class TestData : public RequestData { ...@@ -28,6 +28,13 @@ class TestData : public RequestData {
public: public:
explicit TestData(int data) : data_(data) {} explicit TestData(int data) : data_(data) {}
~TestData() override {} ~TestData() override {}
void onSet() override {
set_++;
}
void onUnset() override {
unset_++;
}
int set_ = 0, unset_ = 0;
int data_; int data_;
}; };
...@@ -94,6 +101,35 @@ TEST(RequestContext, setIfAbsentTest) { ...@@ -94,6 +101,35 @@ TEST(RequestContext, setIfAbsentTest) {
EXPECT_TRUE(nullptr != RequestContext::get()); EXPECT_TRUE(nullptr != RequestContext::get());
} }
TEST(RequestContext, testSetUnset) {
RequestContext::create();
auto ctx1 = RequestContext::saveContext();
ctx1->setContextData("test", std::unique_ptr<TestData>(new TestData(10)));
auto testData1 = dynamic_cast<TestData*>(ctx1->getContextData("test"));
// Override RequestContext
RequestContext::create();
auto ctx2 = RequestContext::saveContext();
ctx2->setContextData("test", std::unique_ptr<TestData>(new TestData(20)));
auto testData2 = dynamic_cast<TestData*>(ctx2->getContextData("test"));
// Check ctx1->onUnset was called
EXPECT_EQ(0, testData1->set_);
EXPECT_EQ(1, testData1->unset_);
RequestContext::setContext(ctx1);
EXPECT_EQ(1, testData1->set_);
EXPECT_EQ(1, testData1->unset_);
EXPECT_EQ(0, testData2->set_);
EXPECT_EQ(1, testData2->unset_);
RequestContext::setContext(ctx2);
EXPECT_EQ(1, testData1->set_);
EXPECT_EQ(2, testData1->unset_);
EXPECT_EQ(1, testData2->set_);
EXPECT_EQ(1, testData2->unset_);
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
google::InitGoogleLogging(argv[0]); google::InitGoogleLogging(argv[0]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment