1 /*
2  * Copyright 2020 Google LLC
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     https://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.cloud.bigqueryconnection.v1.it;
18 
19 import static junit.framework.TestCase.assertEquals;
20 import static junit.framework.TestCase.assertNotNull;
21 
22 import com.google.api.resourcenames.ResourceName;
23 import com.google.cloud.ServiceOptions;
24 import com.google.cloud.bigquery.connection.v1.CloudSqlCredential;
25 import com.google.cloud.bigquery.connection.v1.CloudSqlProperties;
26 import com.google.cloud.bigquery.connection.v1.Connection;
27 import com.google.cloud.bigquery.connection.v1.ConnectionName;
28 import com.google.cloud.bigquery.connection.v1.CreateConnectionRequest;
29 import com.google.cloud.bigquery.connection.v1.DeleteConnectionRequest;
30 import com.google.cloud.bigquery.connection.v1.GetConnectionRequest;
31 import com.google.cloud.bigquery.connection.v1.ListConnectionsRequest;
32 import com.google.cloud.bigquery.connection.v1.LocationName;
33 import com.google.cloud.bigquery.connection.v1.UpdateConnectionRequest;
34 import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
35 import com.google.common.collect.ImmutableList;
36 import com.google.iam.v1.Binding;
37 import com.google.iam.v1.Policy;
38 import com.google.iam.v1.SetIamPolicyRequest;
39 import com.google.protobuf.FieldMask;
40 import com.google.protobuf.util.FieldMaskUtil;
41 import java.io.IOException;
42 import java.util.UUID;
43 import org.junit.After;
44 import org.junit.Before;
45 import org.junit.BeforeClass;
46 import org.junit.Ignore;
47 import org.junit.Test;
48 
49 @Ignore(
50     "Excluding this test until the problem is resolved. https://github.com/googleapis/google-cloud-java/issues/9040")
51 public class ITSystemTest {
52 
53   private static final String ID = UUID.randomUUID().toString().substring(0, 8);
54   private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId();
55   private static final String CONNECTION_ID = "test-connectin-id-" + ID;
56   private static final String LOCATION = "US";
57   private static final String PARENT = LocationName.of(PROJECT_ID, LOCATION).toString();
58   private static final String REGION = "us-central1";
59   private static final String MY_SQL_DATABASE = requireEnvVar("MY_SQL_DATABASE");
60   private static final String MY_SQL_INSTANCE = requireEnvVar("MY_SQL_INSTANCE");
61   private static final String DB_USER = requireEnvVar("DB_USER");
62   private static final String DB_PWD = requireEnvVar("DB_PWD");
63   private static ConnectionServiceClient client;
64   private static Connection connection;
65 
requireEnvVar(String varName)66   private static String requireEnvVar(String varName) {
67     String value = System.getenv(varName);
68     assertNotNull(
69         "Environment variable " + varName + " is required to perform these tests.",
70         System.getenv(varName));
71     return value;
72   }
73 
74   @BeforeClass
checkRequirements()75   public static void checkRequirements() {
76     requireEnvVar("MY_SQL_DATABASE");
77     requireEnvVar("MY_SQL_INSTANCE");
78     requireEnvVar("DB_USER");
79     requireEnvVar("DB_PWD");
80   }
81 
82   @Before
setUp()83   public void setUp() throws IOException {
84     client = ConnectionServiceClient.create();
85     // create a temporary connection to be deleted
86     String instanceId = String.format("%s:%s:%s", PROJECT_ID, REGION, MY_SQL_INSTANCE);
87     CloudSqlCredential cloudSqlCredential =
88         CloudSqlCredential.newBuilder().setUsername(DB_USER).setPassword(DB_PWD).build();
89     CloudSqlProperties cloudSqlProperties =
90         CloudSqlProperties.newBuilder()
91             .setType(CloudSqlProperties.DatabaseType.MYSQL)
92             .setDatabase(MY_SQL_DATABASE)
93             .setInstanceId(instanceId)
94             .setCredential(cloudSqlCredential)
95             .build();
96     CreateConnectionRequest request =
97         CreateConnectionRequest.newBuilder()
98             .setParent(PARENT)
99             .setConnection(Connection.newBuilder().setCloudSql(cloudSqlProperties).build())
100             .setConnectionId(CONNECTION_ID)
101             .build();
102     connection = client.createConnection(request);
103   }
104 
105   @After
tearDown()106   public void tearDown() {
107     // delete a connection
108     DeleteConnectionRequest request =
109         DeleteConnectionRequest.newBuilder().setName(connection.getName()).build();
110     client.deleteConnection(request);
111     client.close();
112   }
113 
114   @Test
testGetConnection()115   public void testGetConnection() {
116     GetConnectionRequest request =
117         GetConnectionRequest.newBuilder().setName(connection.getName()).build();
118     Connection actualConnection = client.getConnection(request);
119     assertEquals(connection, actualConnection);
120   }
121 
122   @Test
testListConnections()123   public void testListConnections() {
124     int pageSize = 10;
125     ListConnectionsRequest request =
126         ListConnectionsRequest.newBuilder().setParent(PARENT).setPageSize(pageSize).build();
127     for (Connection actualConnection : client.listConnections(request).iterateAll()) {
128       if (connection.getName().equals(actualConnection.getName())) {
129         assertEquals(connection, actualConnection);
130       }
131     }
132   }
133 
134   @Test
testUpdateConnection()135   public void testUpdateConnection() {
136     String description = "MY_DESCRIPTION";
137     FieldMask updateMask = FieldMaskUtil.fromString("description");
138     UpdateConnectionRequest request =
139         UpdateConnectionRequest.newBuilder()
140             .setName(connection.getName())
141             .setConnection(Connection.newBuilder().setDescription(description).build())
142             .setUpdateMask(updateMask)
143             .build();
144     Connection actualConnection = client.updateConnection(request);
145     assertEquals(description, actualConnection.getDescription());
146   }
147 
148   @Test
testShareConnection()149   public void testShareConnection() {
150     ResourceName resource = ConnectionName.of(PROJECT_ID, LOCATION, CONNECTION_ID);
151     Binding binding =
152         Binding.newBuilder()
153             .addMembers("group:[email protected]")
154             .setRole("roles/bigquery.connectionUser")
155             .build();
156     Policy policy = Policy.newBuilder().addBindings(binding).build();
157     SetIamPolicyRequest request =
158         SetIamPolicyRequest.newBuilder().setResource(resource.toString()).setPolicy(policy).build();
159     Policy actualPolicy = client.setIamPolicy(request);
160     assertEquals(ImmutableList.of(binding), actualPolicy.getBindingsList());
161   }
162 }
163