From 74b95333991537bb1e77e5df1823820f27d8721e Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 18:29:26 +0000 Subject: [PATCH 1/2] doc: examples use declarative configuration 3/N --- ci/build-examples.yaml | 5 --- .../concepts_after_response.cc | 22 ++++++------ .../concepts_after_timeout.cc | 15 ++++---- .../concepts_filesystem.cc | 23 ++++++------ .../site/concepts_request/concepts_request.cc | 15 ++++---- .../concepts_stateless/concepts_stateless.cc | 11 +++--- examples/site_test.cc | 36 +++++++++++-------- 7 files changed, 66 insertions(+), 61 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 059d5e0d..06577562 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -162,7 +162,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_after_response' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_after_response', '--path', 'examples/site/concepts_after_response', 'site-concepts_after_response', @@ -171,7 +170,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_after_timeout' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_after_timeout', '--path', 'examples/site/concepts_after_timeout', 'site-concepts_after_timeout', @@ -180,7 +178,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_filesystem' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_filesystem', '--path', 'examples/site/concepts_filesystem', 'site-concepts_filesystem', @@ -189,7 +186,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_request' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_request', '--path', 'examples/site/concepts_request', 'site-concepts_request', @@ -198,7 +194,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_stateless' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_stateless', '--path', 'examples/site/concepts_stateless', 'site-concepts_stateless', diff --git a/examples/site/concepts_after_response/concepts_after_response.cc b/examples/site/concepts_after_response/concepts_after_response.cc index cba26f87..7f2413a7 100644 --- a/examples/site/concepts_after_response/concepts_after_response.cc +++ b/examples/site/concepts_after_response/concepts_after_response.cc @@ -13,21 +13,21 @@ // limitations under the License. // [START functions_concepts_after_response] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse concepts_after_response( - gcf::HttpRequest /*request*/) { // NOLINT - (void)std::async(std::launch::async, [] { - // This code may fail to complete, or even fail to start at all. - auto constexpr kIterations = 10; - int sum = 0; - for (int i = 0; i != kIterations; ++i) sum += i; - return sum; +gcf::Function concepts_after_response() { + return gcf::MakeFunction([](gcf::HttpRequest const&) { + (void)std::async(std::launch::async, [] { + // This code may fail to complete, or even fail to start at all. + auto constexpr kIterations = 10; + int sum = 0; + for (int i = 0; i != kIterations; ++i) sum += i; + return sum; + }); + return gcf::HttpResponse{}.set_payload("Hello World!"); }); - return gcf::HttpResponse{}.set_payload("Hello World!"); } // [END functions_concepts_after_response] diff --git a/examples/site/concepts_after_timeout/concepts_after_timeout.cc b/examples/site/concepts_after_timeout/concepts_after_timeout.cc index 67206a2a..a27c8dde 100644 --- a/examples/site/concepts_after_timeout/concepts_after_timeout.cc +++ b/examples/site/concepts_after_timeout/concepts_after_timeout.cc @@ -13,19 +13,20 @@ // limitations under the License. // [START functions_concepts_after_timeout] -#include -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse concepts_after_timeout(gcf::HttpRequest request) { // NOLINT +gcf::Function concepts_after_timeout() { using std::chrono::minutes; - std::cout << "Function running..." << std::endl; - if (request.verb() == "GET") std::this_thread::sleep_for(minutes(2)); - std::cout << "Function completed!" << std::endl; - return gcf::HttpResponse{}.set_payload("Function completed!"); + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + std::cout << "Function running..." << std::endl; + if (request.verb() == "GET") std::this_thread::sleep_for(minutes(2)); + std::cout << "Function completed!" << std::endl; + return gcf::HttpResponse{}.set_payload("Function completed!"); + }); } // [END functions_concepts_after_timeout] diff --git a/examples/site/concepts_filesystem/concepts_filesystem.cc b/examples/site/concepts_filesystem/concepts_filesystem.cc index d1ef30e2..0a4a7c72 100644 --- a/examples/site/concepts_filesystem/concepts_filesystem.cc +++ b/examples/site/concepts_filesystem/concepts_filesystem.cc @@ -13,20 +13,21 @@ // limitations under the License. // [START functions_concepts_filesystem] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse concepts_filesystem(gcf::HttpRequest /*request*/) { // NOLINT - std::string payload; - for (auto const& p : std::filesystem::directory_iterator(".")) { - payload += p.path().generic_string(); - payload += "\n"; - } - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload(payload); +gcf::Function concepts_filesystem() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + std::string payload; + for (auto const& p : std::filesystem::directory_iterator(".")) { + payload += p.path().generic_string(); + payload += "\n"; + } + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(payload); + }); } // [END functions_concepts_filesystem] diff --git a/examples/site/concepts_request/concepts_request.cc b/examples/site/concepts_request/concepts_request.cc index 9c021689..a601d50b 100644 --- a/examples/site/concepts_request/concepts_request.cc +++ b/examples/site/concepts_request/concepts_request.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_concepts_requests] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; @@ -24,11 +23,13 @@ namespace { unsigned int make_http_request(std::string const& host); } // namespace -gcf::HttpResponse concepts_request(gcf::HttpRequest /*request*/) { // NOLINT - std::string const host = "example.com"; - auto const code = make_http_request(host); - return gcf::HttpResponse{}.set_payload( - "Received code " + std::to_string(code) + " from " + host); +gcf::Function concepts_request() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + std::string const host = "example.com"; + auto const code = make_http_request(host); + return gcf::HttpResponse{}.set_payload( + "Received code " + std::to_string(code) + " from " + host); + }); } // [END functions_concepts_requests] diff --git a/examples/site/concepts_stateless/concepts_stateless.cc b/examples/site/concepts_stateless/concepts_stateless.cc index ad65e81d..9e3286a3 100644 --- a/examples/site/concepts_stateless/concepts_stateless.cc +++ b/examples/site/concepts_stateless/concepts_stateless.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_concepts_stateless] -#include -#include +#include #include #include @@ -24,8 +23,10 @@ namespace { std::atomic count{0}; } // namespace -gcf::HttpResponse concepts_stateless(gcf::HttpRequest /*request*/) { // NOLINT - return gcf::HttpResponse{}.set_payload("Instance execution count: " + - std::to_string(++count)); +gcf::Function concepts_stateless() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{}.set_payload("Instance execution count: " + + std::to_string(++count)); + }); } // [END functions_concepts_stateless] diff --git a/examples/site_test.cc b/examples/site_test.cc index 852a503a..43c3da87 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -32,11 +32,11 @@ namespace gcf = ::google::cloud::functions; namespace gcf_internal = ::google::cloud::functions_internal; extern gcf::HttpResponse bearer_token(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_after_response(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_after_timeout(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_filesystem(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_request(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_stateless(gcf::HttpRequest request); +extern gcf::Function concepts_after_response(); +extern gcf::Function concepts_after_timeout(); +extern gcf::Function concepts_filesystem(); +extern gcf::Function concepts_request(); +extern gcf::Function concepts_stateless(); extern gcf::HttpResponse env_vars(gcf::HttpRequest request); extern gcf::HttpResponse hello_world_error(gcf::HttpRequest request); extern gcf::HttpResponse hello_world_get(gcf::HttpRequest request); @@ -156,28 +156,34 @@ lUtj+/nH3HDQjM4ltYfTPUg= } TEST(ExamplesSiteTest, ConceptsAfterResponse) { - auto actual = concepts_after_response(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Hello World!")); + auto function = concepts_after_response(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Hello World!")); } TEST(ExamplesSiteTest, ConceptsAfterTimeout) { - auto actual = concepts_after_timeout(gcf::HttpRequest{}.set_verb("PUT")); - EXPECT_THAT(actual.payload(), HasSubstr("Function completed!")); + auto function = concepts_after_timeout(); + auto const actual = + TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("PUT")); + EXPECT_THAT(actual.body(), HasSubstr("Function completed!")); } TEST(ExamplesSiteTest, ConceptsFilesystem) { - auto actual = concepts_filesystem(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), Not(IsEmpty())); + auto function = concepts_filesystem(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), Not(IsEmpty())); } TEST(ExamplesSiteTest, ConceptsRequest) { - auto actual = concepts_request(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Received code")); + auto function = concepts_request(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Received code")); } TEST(ExamplesSiteTest, ConceptsStateless) { - auto actual = concepts_stateless(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Instance execution count: ")); + auto function = concepts_stateless(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Instance execution count: ")); } TEST(ExamplesSiteTest, EnvVars) { From c1caa33b257685bd0378086ca3bca0f9474b4baf Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 18:59:52 +0000 Subject: [PATCH 2/2] Fix formatting --- examples/site_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/site_test.cc b/examples/site_test.cc index 43c3da87..42641aff 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -176,7 +176,7 @@ TEST(ExamplesSiteTest, ConceptsFilesystem) { TEST(ExamplesSiteTest, ConceptsRequest) { auto function = concepts_request(); - auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); EXPECT_THAT(actual.body(), HasSubstr("Received code")); }