1*ec63e07aSXin Li // Copyright 2020 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include "test_utils.h" // NOLINT(build/include)
16*ec63e07aSXin Li #include "sandboxed_api/util/status_matchers.h"
17*ec63e07aSXin Li
18*ec63e07aSXin Li namespace curl::tests {
19*ec63e07aSXin Li namespace {
20*ec63e07aSXin Li
21*ec63e07aSXin Li using ::sapi::IsOk;
22*ec63e07aSXin Li using ::sapi::StatusIs;
23*ec63e07aSXin Li using ::testing::Eq;
24*ec63e07aSXin Li using ::testing::IsTrue;
25*ec63e07aSXin Li
26*ec63e07aSXin Li class CurlTest : public CurlTestUtils, public ::testing::Test {
27*ec63e07aSXin Li protected:
SetUpTestSuite()28*ec63e07aSXin Li static void SetUpTestSuite() {
29*ec63e07aSXin Li // Start mock server, get port number and check for any error
30*ec63e07aSXin Li StartMockServer();
31*ec63e07aSXin Li ASSERT_THAT(server_thread_.joinable(), IsTrue());
32*ec63e07aSXin Li }
33*ec63e07aSXin Li
TearDownTestSuite()34*ec63e07aSXin Li static void TearDownTestSuite() {
35*ec63e07aSXin Li // Detach the server thread
36*ec63e07aSXin Li server_thread_.detach();
37*ec63e07aSXin Li }
38*ec63e07aSXin Li
SetUp()39*ec63e07aSXin Li void SetUp() override { ASSERT_THAT(CurlTestSetUp(), IsOk()); }
40*ec63e07aSXin Li
TearDown()41*ec63e07aSXin Li void TearDown() override { ASSERT_THAT(CurlTestTearDown(), IsOk()); }
42*ec63e07aSXin Li };
43*ec63e07aSXin Li
TEST_F(CurlTest,EffectiveUrl)44*ec63e07aSXin Li TEST_F(CurlTest, EffectiveUrl) {
45*ec63e07aSXin Li ASSERT_THAT(PerformRequest().status(), IsOk());
46*ec63e07aSXin Li
47*ec63e07aSXin Li // Get effective URL
48*ec63e07aSXin Li sapi::v::RemotePtr effective_url_ptr(nullptr);
49*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
50*ec63e07aSXin Li int getinfo_code,
51*ec63e07aSXin Li api_->curl_easy_getinfo_ptr(curl_.get(), curl::CURLINFO_EFFECTIVE_URL,
52*ec63e07aSXin Li effective_url_ptr.PtrBoth()));
53*ec63e07aSXin Li ASSERT_THAT(getinfo_code, Eq(curl::CURLE_OK));
54*ec63e07aSXin Li
55*ec63e07aSXin Li // Store effective URL in a string
56*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string effective_url,
57*ec63e07aSXin Li sandbox_->GetCString(sapi::v::RemotePtr(
58*ec63e07aSXin Li effective_url_ptr.GetPointedVar())));
59*ec63e07aSXin Li
60*ec63e07aSXin Li // Compare effective URL with original URL
61*ec63e07aSXin Li ASSERT_THAT(effective_url, Eq(kUrl));
62*ec63e07aSXin Li }
63*ec63e07aSXin Li
TEST_F(CurlTest,EffectivePort)64*ec63e07aSXin Li TEST_F(CurlTest, EffectivePort) {
65*ec63e07aSXin Li ASSERT_THAT(PerformRequest().status(), IsOk());
66*ec63e07aSXin Li
67*ec63e07aSXin Li // Get effective port
68*ec63e07aSXin Li sapi::v::Int effective_port;
69*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
70*ec63e07aSXin Li int getinfo_code,
71*ec63e07aSXin Li api_->curl_easy_getinfo_ptr(curl_.get(), curl::CURLINFO_PRIMARY_PORT,
72*ec63e07aSXin Li effective_port.PtrBoth()));
73*ec63e07aSXin Li ASSERT_EQ(getinfo_code, curl::CURLE_OK);
74*ec63e07aSXin Li
75*ec63e07aSXin Li // Compare effective port with port set by the mock server
76*ec63e07aSXin Li ASSERT_EQ(effective_port.GetValue(), port_);
77*ec63e07aSXin Li }
78*ec63e07aSXin Li
TEST_F(CurlTest,ResponseCode)79*ec63e07aSXin Li TEST_F(CurlTest, ResponseCode) {
80*ec63e07aSXin Li ASSERT_THAT(PerformRequest().status(), IsOk());
81*ec63e07aSXin Li
82*ec63e07aSXin Li // Get response code
83*ec63e07aSXin Li sapi::v::Int response_code;
84*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
85*ec63e07aSXin Li int getinfo_code,
86*ec63e07aSXin Li api_->curl_easy_getinfo_ptr(curl_.get(), curl::CURLINFO_RESPONSE_CODE,
87*ec63e07aSXin Li response_code.PtrBoth()));
88*ec63e07aSXin Li ASSERT_EQ(getinfo_code, curl::CURLE_OK);
89*ec63e07aSXin Li
90*ec63e07aSXin Li // Check response code
91*ec63e07aSXin Li ASSERT_EQ(response_code.GetValue(), 200);
92*ec63e07aSXin Li }
93*ec63e07aSXin Li
TEST_F(CurlTest,ContentType)94*ec63e07aSXin Li TEST_F(CurlTest, ContentType) {
95*ec63e07aSXin Li sapi::v::RemotePtr content_type_ptr(nullptr);
96*ec63e07aSXin Li
97*ec63e07aSXin Li ASSERT_TRUE(PerformRequest().ok());
98*ec63e07aSXin Li
99*ec63e07aSXin Li // Get effective URL
100*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
101*ec63e07aSXin Li int getinfo_code,
102*ec63e07aSXin Li api_->curl_easy_getinfo_ptr(curl_.get(), curl::CURLINFO_CONTENT_TYPE,
103*ec63e07aSXin Li content_type_ptr.PtrBoth()));
104*ec63e07aSXin Li ASSERT_EQ(getinfo_code, curl::CURLE_OK);
105*ec63e07aSXin Li
106*ec63e07aSXin Li // Store content type in a string
107*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string content_type,
108*ec63e07aSXin Li sandbox_->GetCString(sapi::v::RemotePtr(
109*ec63e07aSXin Li content_type_ptr.GetPointedVar())));
110*ec63e07aSXin Li
111*ec63e07aSXin Li // Compare content type with "text/plain"
112*ec63e07aSXin Li ASSERT_EQ(content_type, "text/plain");
113*ec63e07aSXin Li }
114*ec63e07aSXin Li
TEST_F(CurlTest,GetResponse)115*ec63e07aSXin Li TEST_F(CurlTest, GetResponse) {
116*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string response, PerformRequest());
117*ec63e07aSXin Li
118*ec63e07aSXin Li // Compare response with expected response
119*ec63e07aSXin Li ASSERT_EQ(response, "OK");
120*ec63e07aSXin Li }
121*ec63e07aSXin Li
TEST_F(CurlTest,PostResponse)122*ec63e07aSXin Li TEST_F(CurlTest, PostResponse) {
123*ec63e07aSXin Li sapi::v::ConstCStr post_fields("postfields");
124*ec63e07aSXin Li
125*ec63e07aSXin Li // Set request method to POST
126*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
127*ec63e07aSXin Li int setopt_post,
128*ec63e07aSXin Li api_->curl_easy_setopt_long(curl_.get(), curl::CURLOPT_POST, 1l));
129*ec63e07aSXin Li ASSERT_EQ(setopt_post, curl::CURLE_OK);
130*ec63e07aSXin Li
131*ec63e07aSXin Li // Set the size of the POST fields
132*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
133*ec63e07aSXin Li int setopt_post_fields_size,
134*ec63e07aSXin Li api_->curl_easy_setopt_long(curl_.get(), curl::CURLOPT_POSTFIELDSIZE,
135*ec63e07aSXin Li post_fields.GetSize()));
136*ec63e07aSXin Li ASSERT_EQ(setopt_post_fields_size, curl::CURLE_OK);
137*ec63e07aSXin Li
138*ec63e07aSXin Li // Set the POST fields
139*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
140*ec63e07aSXin Li int setopt_post_fields,
141*ec63e07aSXin Li api_->curl_easy_setopt_ptr(curl_.get(), curl::CURLOPT_POSTFIELDS,
142*ec63e07aSXin Li post_fields.PtrBefore()));
143*ec63e07aSXin Li ASSERT_EQ(setopt_post_fields, curl::CURLE_OK);
144*ec63e07aSXin Li
145*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string response, PerformRequest());
146*ec63e07aSXin Li
147*ec63e07aSXin Li // Compare response with expected response
148*ec63e07aSXin Li ASSERT_EQ(std::string(post_fields.GetData()), response);
149*ec63e07aSXin Li }
150*ec63e07aSXin Li
151*ec63e07aSXin Li } // namespace
152*ec63e07aSXin Li } // namespace curl::tests
153