1515#include " google/cloud/spanner/client.h"
1616#include " google/cloud/spanner/database.h"
1717#include " google/cloud/spanner/database_admin_client.h"
18+ #include " google/cloud/spanner/instance_admin_client.h"
1819#include " google/cloud/internal/getenv.h"
1920#include " google/cloud/internal/random.h"
2021#include < functional>
2122
2223namespace spanner = google::cloud::spanner;
2324
24- std::function<void ()> drop_database = []{};
25+ std::function<void ()> drop_database = [] {};
2526
2627int main (int argc, char * argv[]) try {
2728 if (argc != 1 ) {
2829 std::string const cmd = argv[0 ];
29- auto last_slash = std::string (argv[0 ]).find_last_of (" / " );
30+ auto last_slash = std::string (argv[0 ]).find_last_of (' / ' );
3031 std::cerr << " Usage: " << cmd.substr (last_slash + 1 ) << " \n " ;
3132 return 1 ;
3233 }
@@ -38,28 +39,40 @@ int main(int argc, char* argv[]) try {
3839 " The GOOGLE_CLOUD_PROJECT environment variable should be set to a "
3940 " non-empty value" );
4041 }
41- auto instance_id =
42- google::cloud::internal::GetEnv (" GOOGLE_CLOUD_CPP_SPANNER_INSTANCE" )
43- .value_or (" " );
44- if (project_id.empty ()) {
45- throw std::runtime_error (
46- " The GOOGLE_CLOUD_CPP_SPANNER_INSTANCE environment variable should be "
47- " set to a non-empty value" );
48- }
42+
43+ // This program is used to test the libraries after they are installed. We
44+ // cannot use any of the functions in the testing support libraries as those
45+ // do not get installed.
46+ spanner::DatabaseAdminClient admin_client;
4947
5048 auto generator = google::cloud::internal::MakeDefaultPRNG ();
49+
50+ auto instance_id = [&project_id, &generator] {
51+ spanner::InstanceAdminClient instance_admin{
52+ spanner::MakeInstanceAdminConnection ()};
53+ std::vector<std::string> names;
54+ for (auto instance : instance_admin.ListInstances (project_id, {})) {
55+ if (!instance) throw std::runtime_error (" Error reading instance list" );
56+ auto full_name = instance->name ();
57+ names.push_back (full_name.substr (full_name.rfind (' /' ) + 1 ));
58+ }
59+ if (names.empty ()) throw std::runtime_error (" No instances in the project" );
60+
61+ return names[std::uniform_int_distribution<std::size_t >(
62+ 0 , names.size () - 1 )(generator)];
63+ }();
64+
5165 auto database_id =
5266 " db-" + google::cloud::internal::Sample (
5367 generator, 20 , " abcdefghijlkmnopqrstuvwxyz0123456789" );
5468
55- namespace spanner = google::cloud::spanner;
5669 spanner::Database const database (project_id, instance_id, database_id);
70+ std::cout << " Will run the test in database: " << database.FullName () << " \n " ;
5771
5872 using google::cloud::future;
5973 using google::cloud::StatusOr;
6074
6175 std::cout << " Creating database [" << database_id << " ] " << std::flush;
62- spanner::DatabaseAdminClient admin_client;
6376 future<StatusOr<google::spanner::admin::database::v1::Database>>
6477 created_database =
6578 admin_client.CreateDatabase (database, {R"""(
@@ -76,21 +89,14 @@ int main(int argc, char* argv[]) try {
7689 ) PRIMARY KEY (SingerId, AlbumId),
7790 INTERLEAVE IN PARENT Singers ON DELETE CASCADE)""" });
7891
79- int i = 0 ;
80- int const timeout = 120 ;
81- while (++i < timeout) {
92+ for (;;) {
8293 auto status = created_database.wait_for (std::chrono::seconds (1 ));
8394 if (status == std::future_status::ready) break ;
8495 std::cout << ' .' << std::flush;
8596 }
86- if (i >= timeout) {
87- std::cout << " TIMEOUT\n " ;
88- throw std::runtime_error (" Timeout while creating database" );
89- }
9097 std::cout << " DONE\n " ;
9198
92- StatusOr<google::spanner::admin::database::v1::Database> db =
93- created_database.get ();
99+ auto db = created_database.get ();
94100 if (!db) throw std::runtime_error (db.status ().message ());
95101
96102 drop_database = [admin_client, database]() mutable {
0 commit comments