2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
19 #include <gtest/gtest.h>
22 #include <folly/io/async/EventBase.h>
23 #include <folly/io/async/Request.h>
25 using namespace folly;
27 class TestData : public RequestData {
29 explicit TestData(int data) : data_(data) {}
30 ~TestData() override {}
31 void onSet() override {
34 void onUnset() override {
37 int set_ = 0, unset_ = 0;
41 TEST(RequestContext, SimpleTest) {
45 // There should always be a default context with get()
46 EXPECT_TRUE(RequestContext::get() != nullptr);
49 // but not with saveContext()
50 EXPECT_EQ(RequestContext::saveContext(), nullptr);
51 RequestContext::create();
52 EXPECT_NE(RequestContext::saveContext(), nullptr);
53 RequestContext::create();
54 EXPECT_NE(RequestContext::saveContext(), nullptr);
56 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
58 RequestContext::get()->setContextData(
60 std::unique_ptr<TestData>(new TestData(10)));
61 base.runInEventBaseThread([&](){
62 EXPECT_TRUE(RequestContext::get() != nullptr);
63 auto data = dynamic_cast<TestData*>(
64 RequestContext::get()->getContextData("test"))->data_;
66 base.terminateLoopSoon();
68 auto th = std::thread([&](){
72 EXPECT_TRUE(RequestContext::get() != nullptr);
73 auto a = dynamic_cast<TestData*>(
74 RequestContext::get()->getContextData("test"));
78 RequestContext::setContext(std::shared_ptr<RequestContext>());
79 // There should always be a default context
80 EXPECT_TRUE(nullptr != RequestContext::get());
83 TEST(RequestContext, setIfAbsentTest) {
84 EXPECT_TRUE(RequestContext::get() != nullptr);
86 RequestContext::get()->setContextData(
87 "test", std::unique_ptr<TestData>(new TestData(10)));
88 EXPECT_FALSE(RequestContext::get()->setContextDataIfAbsent(
89 "test", std::unique_ptr<TestData>(new TestData(20))));
91 dynamic_cast<TestData*>(
92 RequestContext::get()->getContextData("test"))->data_);
94 EXPECT_TRUE(RequestContext::get()->setContextDataIfAbsent(
95 "test2", std::unique_ptr<TestData>(new TestData(20))));
97 dynamic_cast<TestData*>(
98 RequestContext::get()->getContextData("test2"))->data_);
100 RequestContext::setContext(std::shared_ptr<RequestContext>());
101 EXPECT_TRUE(nullptr != RequestContext::get());
104 TEST(RequestContext, testSetUnset) {
105 RequestContext::create();
106 auto ctx1 = RequestContext::saveContext();
107 ctx1->setContextData("test", std::unique_ptr<TestData>(new TestData(10)));
108 auto testData1 = dynamic_cast<TestData*>(ctx1->getContextData("test"));
110 // Override RequestContext
111 RequestContext::create();
112 auto ctx2 = RequestContext::saveContext();
113 ctx2->setContextData("test", std::unique_ptr<TestData>(new TestData(20)));
114 auto testData2 = dynamic_cast<TestData*>(ctx2->getContextData("test"));
116 // Check ctx1->onUnset was called
117 EXPECT_EQ(0, testData1->set_);
118 EXPECT_EQ(1, testData1->unset_);
120 RequestContext::setContext(ctx1);
121 EXPECT_EQ(1, testData1->set_);
122 EXPECT_EQ(1, testData1->unset_);
123 EXPECT_EQ(0, testData2->set_);
124 EXPECT_EQ(1, testData2->unset_);
126 RequestContext::setContext(ctx2);
127 EXPECT_EQ(1, testData1->set_);
128 EXPECT_EQ(2, testData1->unset_);
129 EXPECT_EQ(1, testData2->set_);
130 EXPECT_EQ(1, testData2->unset_);
133 int main(int argc, char** argv) {
134 testing::InitGoogleTest(&argc, argv);
135 google::InitGoogleLogging(argv[0]);
136 google::ParseCommandLineFlags(&argc, &argv, true);
138 return RUN_ALL_TESTS();