Skip to content

Commit 6c4965e

Browse files
authored
Support per-request transport for Check. (istio#87)
1 parent 0ba9b0f commit 6c4965e

File tree

4 files changed

+64
-29
lines changed

4 files changed

+64
-29
lines changed

mixerclient/include/client.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ class MixerClient {
8585
// The response data from mixer will be consumed by mixer client.
8686

8787
// A check call.
88-
virtual void Check(const Attributes& attributes, DoneFunc on_done) = 0;
88+
virtual void Check(const Attributes& attributes, TransportCheckFunc transport,
89+
DoneFunc on_done) = 0;
8990

9091
// A report call.
9192
virtual void Report(const Attributes& attributes) = 0;

mixerclient/src/client_impl.cc

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ MixerClientImpl::MixerClientImpl(const MixerClientOptions &options)
5858

5959
MixerClientImpl::~MixerClientImpl() {}
6060

61-
void MixerClientImpl::Check(const Attributes &attributes, DoneFunc on_done) {
61+
void MixerClientImpl::Check(const Attributes &attributes,
62+
TransportCheckFunc transport, DoneFunc on_done) {
6263
std::unique_ptr<CheckCache::CheckResult> check_result(
6364
new CheckCache::CheckResult);
6465
check_cache_->Check(attributes, check_result.get());
@@ -94,22 +95,24 @@ void MixerClientImpl::Check(const Attributes &attributes, DoneFunc on_done) {
9495
// Lambda capture could not pass unique_ptr, use raw pointer.
9596
CheckCache::CheckResult *raw_check_result = check_result.release();
9697
QuotaCache::CheckResult *raw_quota_result = quota_result.release();
97-
options_.check_transport(request, response,
98-
[response, raw_check_result, raw_quota_result,
99-
on_done](const Status &status) {
100-
raw_check_result->SetResponse(status, *response);
101-
raw_quota_result->SetResponse(status, *response);
102-
if (on_done) {
103-
if (!raw_check_result->status().ok()) {
104-
on_done(raw_check_result->status());
105-
} else {
106-
on_done(raw_quota_result->status());
107-
}
108-
}
109-
delete raw_check_result;
110-
delete raw_quota_result;
111-
delete response;
112-
});
98+
if (!transport) {
99+
transport = options_.check_transport;
100+
}
101+
transport(request, response, [response, raw_check_result, raw_quota_result,
102+
on_done](const Status &status) {
103+
raw_check_result->SetResponse(status, *response);
104+
raw_quota_result->SetResponse(status, *response);
105+
if (on_done) {
106+
if (!raw_check_result->status().ok()) {
107+
on_done(raw_check_result->status());
108+
} else {
109+
on_done(raw_quota_result->status());
110+
}
111+
}
112+
delete raw_check_result;
113+
delete raw_quota_result;
114+
delete response;
115+
});
113116
}
114117

115118
void MixerClientImpl::Report(const Attributes &attributes) {

mixerclient/src/client_impl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ class MixerClientImpl : public MixerClient {
3535
// Destructor
3636
virtual ~MixerClientImpl();
3737

38-
virtual void Check(const Attributes& attributes, DoneFunc on_done);
38+
virtual void Check(const Attributes& attributes, TransportCheckFunc transport,
39+
DoneFunc on_done);
3940
virtual void Report(const Attributes& attributes);
4041

4142
private:

mixerclient/src/client_impl_test.cc

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class MixerClientImplTest : public ::testing::Test {
6868
Attributes request_;
6969
std::unique_ptr<MixerClient> client_;
7070
MockCheckTransport mock_check_transport_;
71+
TransportCheckFunc empty_transport_;
7172
};
7273

7374
TEST_F(MixerClientImplTest, TestSuccessCheck) {
@@ -81,14 +82,43 @@ TEST_F(MixerClientImplTest, TestSuccessCheck) {
8182
// Remove quota, not to test quota
8283
request_.attributes.erase(Attributes::kQuotaName);
8384
Status done_status = Status::UNKNOWN;
84-
client_->Check(request_,
85+
client_->Check(request_, empty_transport_,
8586
[&done_status](Status status) { done_status = status; });
8687
EXPECT_TRUE(done_status.ok());
8788

8889
for (int i = 0; i < 10; i++) {
8990
// Other calls should ba cached.
9091
Status done_status1 = Status::UNKNOWN;
91-
client_->Check(request_,
92+
client_->Check(request_, empty_transport_,
93+
[&done_status1](Status status) { done_status1 = status; });
94+
EXPECT_TRUE(done_status1.ok());
95+
}
96+
}
97+
98+
TEST_F(MixerClientImplTest, TestPerRequestTransport) {
99+
// Global transport should not be called.
100+
EXPECT_CALL(mock_check_transport_, Check(_, _, _)).Times(0);
101+
102+
// For local pre-request transport.
103+
MockCheckTransport local_check_transport;
104+
EXPECT_CALL(local_check_transport, Check(_, _, _))
105+
.WillOnce(Invoke([](const CheckRequest& request, CheckResponse* response,
106+
DoneFunc on_done) {
107+
response->mutable_precondition()->set_valid_use_count(1000);
108+
on_done(Status::OK);
109+
}));
110+
111+
// Remove quota, not to test quota
112+
request_.attributes.erase(Attributes::kQuotaName);
113+
Status done_status = Status::UNKNOWN;
114+
client_->Check(request_, local_check_transport.GetFunc(),
115+
[&done_status](Status status) { done_status = status; });
116+
EXPECT_TRUE(done_status.ok());
117+
118+
for (int i = 0; i < 10; i++) {
119+
// Other calls should ba cached.
120+
Status done_status1 = Status::UNKNOWN;
121+
client_->Check(request_, local_check_transport.GetFunc(),
92122
[&done_status1](Status status) { done_status1 = status; });
93123
EXPECT_TRUE(done_status1.ok());
94124
}
@@ -111,14 +141,14 @@ TEST_F(MixerClientImplTest, TestNoCheckCache) {
111141
}));
112142

113143
Status done_status = Status::UNKNOWN;
114-
client_->Check(request_,
144+
client_->Check(request_, empty_transport_,
115145
[&done_status](Status status) { done_status = status; });
116146
EXPECT_TRUE(done_status.ok());
117147

118148
for (int i = 0; i < 10; i++) {
119149
// Other calls should ba cached.
120150
Status done_status1 = Status::UNKNOWN;
121-
client_->Check(request_,
151+
client_->Check(request_, empty_transport_,
122152
[&done_status1](Status status) { done_status1 = status; });
123153
EXPECT_TRUE(done_status1.ok());
124154
}
@@ -143,14 +173,14 @@ TEST_F(MixerClientImplTest, TestNoQuotaCache) {
143173
}));
144174

145175
Status done_status = Status::UNKNOWN;
146-
client_->Check(request_,
176+
client_->Check(request_, empty_transport_,
147177
[&done_status](Status status) { done_status = status; });
148178
EXPECT_TRUE(done_status.ok());
149179

150180
for (int i = 0; i < 10; i++) {
151181
// Other calls should ba cached.
152182
Status done_status1 = Status::UNKNOWN;
153-
client_->Check(request_,
183+
client_->Check(request_, empty_transport_,
154184
[&done_status1](Status status) { done_status1 = status; });
155185
EXPECT_TRUE(done_status1.ok());
156186
}
@@ -173,14 +203,14 @@ TEST_F(MixerClientImplTest, TestSuccessCheckAndQuota) {
173203
}));
174204

175205
Status done_status = Status::UNKNOWN;
176-
client_->Check(request_,
206+
client_->Check(request_, empty_transport_,
177207
[&done_status](Status status) { done_status = status; });
178208
EXPECT_TRUE(done_status.ok());
179209

180210
for (int i = 0; i < 10; i++) {
181211
// Other calls should ba cached.
182212
Status done_status1 = Status::UNKNOWN;
183-
client_->Check(request_,
213+
client_->Check(request_, empty_transport_,
184214
[&done_status1](Status status) { done_status1 = status; });
185215
EXPECT_TRUE(done_status1.ok());
186216
}
@@ -203,14 +233,14 @@ TEST_F(MixerClientImplTest, TestFailedCheckAndQuota) {
203233
}));
204234

205235
Status done_status = Status::UNKNOWN;
206-
client_->Check(request_,
236+
client_->Check(request_, empty_transport_,
207237
[&done_status](Status status) { done_status = status; });
208238
EXPECT_ERROR_CODE(Code::FAILED_PRECONDITION, done_status);
209239

210240
for (int i = 0; i < 10; i++) {
211241
// Other calls should ba cached.
212242
Status done_status1 = Status::UNKNOWN;
213-
client_->Check(request_,
243+
client_->Check(request_, empty_transport_,
214244
[&done_status1](Status status) { done_status1 = status; });
215245
EXPECT_ERROR_CODE(Code::FAILED_PRECONDITION, done_status1);
216246
}

0 commit comments

Comments
 (0)