From ad7156acfc9f706bc59299cc595408323410660c Mon Sep 17 00:00:00 2001 From: suryakumari Date: Fri, 24 Jan 2025 16:36:43 +0530 Subject: [PATCH] e2e cloudSqlMySql source additional scenarios --- ...=> CloudMySqlDesignTimeValidation.feature} | 64 +++++++++++++ .../features/source/CloudMySqlRunTime.feature | 89 +++++++++++++++++++ .../source/CloudMySqlRunTimeMacro.feature | 56 ++++++++++++ .../java/io/cdap/plugin/CloudMySqlClient.java | 33 +++++++ .../common/stepsdesign/TestSetupHooks.java | 33 ++++++- .../resources/errorMessage.properties | 2 + .../resources/pluginParameters.properties | 4 + 7 files changed, 280 insertions(+), 1 deletion(-) rename cloudsql-mysql-plugin/src/e2e-test/features/source/{CloudMySqlDesignTimeVaidation.feature => CloudMySqlDesignTimeValidation.feature} (76%) diff --git a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlDesignTimeVaidation.feature b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlDesignTimeValidation.feature similarity index 76% rename from cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlDesignTimeVaidation.feature rename to cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlDesignTimeValidation.feature index 9e54df419..c5fa3d226 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlDesignTimeVaidation.feature +++ b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlDesignTimeValidation.feature @@ -180,3 +180,67 @@ Feature: CloudMySql source- Verify CloudMySql source plugin design time validati Then Click on the Validate button Then Verify that the Plugin Property: "boundingQuery" is displaying an in-line error message: "errorMessageBoundingQuery" Then Verify that the Plugin Property: "numSplits" is displaying an in-line error message: "errorMessageNumberOfSplits" + + @CloudMySql_Required + Scenario: Verify CloudSQLMySQL source plugin validation errors for mandatory fields + Given Open Datafusion Project to configure pipeline + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Click on the Validate button + Then Verify mandatory property error for below listed properties: + | jdbcPluginName | + | connectionName | + | database | + | referenceName | + | importQuery | + + @CloudMySql_Required + Scenario: To verify CloudSQLMySQL source plugin validation error message with invalid connection name with public instance + Given Open Datafusion Project to configure pipeline + When Expand Plugin group in the LHS plugins list: "Source" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "invalidConnectionName" + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "sourceRef" + Then Replace input plugin property: "database" with value: "DatabaseName" + Then Enter textarea plugin property: "importQuery" with value: "selectQuery" + Then Click on the Validate button + Then Verify that the Plugin Property: "connectionName" is displaying an in-line error message: "errorMessageConnectionName" + + @CloudMySql_Required + Scenario: To verify CloudSQLMySQL source plugin validation error message with invalid connection name with private instance + Given Open Datafusion Project to configure pipeline + When Expand Plugin group in the LHS plugins list: "Source" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "private" + Then Replace input plugin property: "connectionName" with value: "invalidConnectionName" + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "sourceRef" + Then Replace input plugin property: "database" with value: "DatabaseName" + Then Enter textarea plugin property: "importQuery" with value: "selectQuery" + Then Click on the Validate button + Then Verify that the Plugin Property: "connectionName" is displaying an in-line error message: "errorMessagePrivateConnectionName" + + @CloudMySql_Required + Scenario: To verify CloudSQLMySQL source plugin validation error message with invalid password + Given Open Datafusion Project to configure pipeline + When Expand Plugin group in the LHS plugins list: "Source" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "invalidPassword" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "sourceRef" + Then Replace input plugin property: "database" with value: "DatabaseName" + Then Enter textarea plugin property: "importQuery" with value: "selectQuery" + Then Click on the Validate button + Then Verify that the Plugin is displaying an error message: "errorMessageInvalidPassword" on the header diff --git a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature index 242e53d5d..c68915628 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature +++ b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature @@ -230,3 +230,92 @@ Feature: CloudMySql Source - Run time scenarios Then Open Pipeline logs and verify Log entries having below listed Level and Message: | Level | Message | | ERROR | errorLogsMessageInvalidBoundingQuery | + + @CLOUDSQLMYSQL_SOURCE_TEST @CLOUDSQLMYSQL_TARGET_TEST @CloudMySql_Required + Scenario: To verify data is getting transferred from CloudMySql source to CloudMySql sink successfully with bounding query + Given Open Datafusion Project to configure pipeline + When Expand Plugin group in the LHS plugins list: "Source" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + When Expand Plugin group in the LHS plugins list: "Sink" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Sink" + Then Connect plugins: "CloudSQL MySQL" and "CloudSQL MySQL2" to establish connection + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "RefName" + Then Enter input plugin property: "database" with value: "DatabaseName" + Then Enter textarea plugin property: "importQuery" with value: "selectQuery" + Then Enter textarea plugin property: "boundingQuery" with value: "boundingQuery" + Then Click on the Get Schema button + Then Verify the Output Schema matches the Expected Schema: "outputSourceSchema" + Then Validate "CloudSQL MySQL" plugin properties + Then Close the Plugin Properties page + Then Navigate to the properties page of plugin: "CloudSQL MySQL2" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "RefName" + Then Enter input plugin property: "database" with value: "DatabaseName" + Then Replace input plugin property: "tableName" with value: "targetTable" + Then Validate "CloudSQL MySQL2" plugin properties + Then Close the Plugin Properties page + Then Save the pipeline + Then Preview and run the pipeline + Then Verify the preview of pipeline is "success" + Then Close the preview + Then Deploy the pipeline + Then Run the Pipeline in Runtime + Then Wait till pipeline is in running state + Then Open and capture logs + Then Verify the pipeline status is "Succeeded" + Then Validate the values of records transferred to target table is equal to the values from source table + + @CLOUDSQLMYSQL_SOURCE_TEST @CLOUDSQLMYSQL_TARGET_TEST @CloudMySql_Required + Scenario: To verify data is getting transferred from CloudMySql source to CloudMySql sink successfully when connection arguments are set to read boolean datatype + Given Open Datafusion Project to configure pipeline + When Expand Plugin group in the LHS plugins list: "Source" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + When Expand Plugin group in the LHS plugins list: "Sink" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Sink" + Then Connect plugins: "CloudSQL MySQL" and "CloudSQL MySQL2" to establish connection + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "RefName" + Then Enter input plugin property: "database" with value: "DatabaseName" + Then Enter key value pairs for plugin property: "connectionArguments" with values from json: "connectionArgumentsForBooleanDataType" + Then Enter textarea plugin property: "importQuery" with value: "selectQuery" + Then Click on the Get Schema button + Then Verify the Output Schema matches the Expected Schema: "outputSourceSchema" + Then Validate "CloudSQL MySQL" plugin properties + Then Close the Plugin Properties page + Then Navigate to the properties page of plugin: "CloudSQL MySQL2" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Enter input plugin property: "referenceName" with value: "RefName" + Then Enter key value pairs for plugin property: "connectionArguments" with values from json: "connectionArgumentsForBooleanDataType" + Then Enter input plugin property: "database" with value: "DatabaseName" + Then Replace input plugin property: "tableName" with value: "targetTable" + Then Validate "CloudSQL MySQL2" plugin properties + Then Close the Plugin Properties page + Then Save the pipeline + Then Preview and run the pipeline + Then Verify the preview of pipeline is "success" + Then Close the preview + Then Deploy the pipeline + Then Run the Pipeline in Runtime + Then Wait till pipeline is in running state + Then Open and capture logs + Then Verify the pipeline status is "Succeeded" + Then Validate the values of records transferred to target table is equal to the values from source table diff --git a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTimeMacro.feature b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTimeMacro.feature index f1ae4ed52..09dd9ca4a 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTimeMacro.feature +++ b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTimeMacro.feature @@ -305,3 +305,59 @@ Feature: CloudMySql - Verify CloudMySql plugin data transfer with macro argument Then Verify the pipeline status is "Succeeded" Then Close the pipeline logs Then Validate the values of records transferred to target Big Query table is equal to the values from source table + + @CLOUDSQLMYSQL_SOURCE_TEST @CLOUDSQLMYSQL_TARGET_TEST @CloudMySql_Required + Scenario: To verify data is getting transferred from CloudMySql to CloudMySql successfully when connection arguments,bounding query are macro enabled + Given Open Datafusion Project to configure pipeline + When Expand Plugin group in the LHS plugins list: "Source" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Source" + When Expand Plugin group in the LHS plugins list: "Sink" + When Select plugin: "CloudSQL MySQL" from the plugins list as: "Sink" + Then Connect plugins: "CloudSQL MySQL" and "CloudSQL MySQL2" to establish connection + Then Navigate to the properties page of plugin: "CloudSQL MySQL" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Click on the Macro button of Property: "connectionArguments" and set the value to: "connArgumentsSource" + Then Enter input plugin property: "referenceName" with value: "RefName" + Then Enter textarea plugin property: "importQuery" with value: "selectQuery" + Then Enter input plugin property: "database" with value: "DatabaseName" + Then Click on the Macro button of Property: "boundingQuery" and set the value in textarea: "CloudMysqlBoundingQuery" + Then Validate "CloudSQL MySQL" plugin properties + Then Close the Plugin Properties page + Then Navigate to the properties page of plugin: "CloudSQL MySQL2" + Then Select dropdown plugin property: "select-jdbcPluginName" with option value: "driverName" + Then Select radio button plugin property: "instanceType" with value: "public" + Then Replace input plugin property: "connectionName" with value: "connectionName" for Credentials and Authorization related fields + Then Replace input plugin property: "user" with value: "username" for Credentials and Authorization related fields + Then Replace input plugin property: "password" with value: "password" for Credentials and Authorization related fields + Then Click on the Macro button of Property: "connectionArguments" and set the value to: "connArgumentsSink" + Then Enter input plugin property: "referenceName" with value: "RefName" + Then Enter input plugin property: "database" with value: "DatabaseName" + Then Replace input plugin property: "tableName" with value: "targetTable" + Then Validate "CloudSQL MySQL2" plugin properties + Then Close the Plugin Properties page + Then Save the pipeline + Then Preview and run the pipeline + Then Enter runtime argument value "connectionArguments" for key "connArgumentsSource" + Then Enter runtime argument value "connectionArguments" for key "connArgumentsSink" + Then Enter runtime argument value "boundingQuery" for key "CloudMysqlBoundingQuery" + Then Run the preview of pipeline with runtime arguments + Then Wait till pipeline preview is in running state + Then Open and capture pipeline preview logs + Then Verify the preview run status of pipeline in the logs is "succeeded" + Then Close the pipeline logs + Then Close the preview + Then Deploy the pipeline + Then Run the Pipeline in Runtime + Then Enter runtime argument value "connectionArguments" for key "connArgumentsSource" + Then Enter runtime argument value "connectionArguments" for key "connArgumentsSink" + Then Enter runtime argument value "boundingQuery" for key "CloudMysqlBoundingQuery" + Then Run the Pipeline in Runtime with runtime arguments + Then Wait till pipeline is in running state + Then Open and capture logs + Then Verify the pipeline status is "Succeeded" + Then Close the pipeline logs + Then Validate the values of records transferred to target table is equal to the values from source table diff --git a/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/CloudMySqlClient.java b/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/CloudMySqlClient.java index ca46e9dae..29ef9faa8 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/CloudMySqlClient.java +++ b/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/CloudMySqlClient.java @@ -178,4 +178,37 @@ public static void deleteTable(String table) statement.execute(dropTableQuery); } } + + public static void createSourceTestTable(String sourceTable) throws SQLException, ClassNotFoundException { + try (Connection connect = getCloudSqlConnection(); + Statement statement = connect.createStatement()) { + String createSourceTableQuery = "CREATE TABLE IF NOT EXISTS " + sourceTable + + "(id int, lastName varchar(255), PRIMARY KEY (id), is_active BOOLEAN NOT NULL)"; + statement.executeUpdate(createSourceTableQuery); + + // Truncate table to clean the data of last failure run. + String truncateSourceTableQuery = "TRUNCATE TABLE " + sourceTable; + statement.executeUpdate(truncateSourceTableQuery); + + // Insert dummy data. + statement.executeUpdate("INSERT INTO " + sourceTable + " (id, lastName, is_active)" + + "VALUES (1, 'Simpson', true)"); + statement.executeUpdate("INSERT INTO " + sourceTable + " (id, lastName, is_active)" + + "VALUES (2, 'McBeal', true)"); + statement.executeUpdate("INSERT INTO " + sourceTable + " (id, lastName, is_active)" + + "VALUES (3, 'Flinstone', false)"); + } + } + + public static void createTargetTestTable(String targetTable) throws SQLException, ClassNotFoundException { + try (Connection connect = getCloudSqlConnection(); + Statement statement = connect.createStatement()) { + String createTargetTableQuery = "CREATE TABLE IF NOT EXISTS " + targetTable + + "(id int, lastName varchar(255), PRIMARY KEY (id), is_active BOOLEAN NOT NULL)"; + statement.executeUpdate(createTargetTableQuery); + // Truncate table to clean the data of last failure run. + String truncateTargetTableQuery = "TRUNCATE TABLE " + targetTable; + statement.executeUpdate(truncateTargetTableQuery); + } + } } diff --git a/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/common/stepsdesign/TestSetupHooks.java b/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/common/stepsdesign/TestSetupHooks.java index a4a1f5491..85c9c62de 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/common/stepsdesign/TestSetupHooks.java +++ b/cloudsql-mysql-plugin/src/e2e-test/java/io/cdap/plugin/common/stepsdesign/TestSetupHooks.java @@ -45,7 +45,10 @@ public static void setTableName() { String targetTableName = String.format("TargetTable_%s", randomString); PluginPropertyUtils.addPluginProp("sourceTable", sourceTableName); PluginPropertyUtils.addPluginProp("targetTable", targetTableName); - PluginPropertyUtils.addPluginProp("selectQuery", String.format("select * from %s", sourceTableName)); + PluginPropertyUtils.addPluginProp("selectQuery", String.format("select * from %s" + + " WHERE $CONDITIONS", sourceTableName)); + PluginPropertyUtils.addPluginProp("boundingQuery", String.format("select MIN(id),MAX(id)" + + " from %s", sourceTableName)); } @Before(order = 1) @@ -209,4 +212,32 @@ private static void createSourceBQTableWithQueries(String bqCreateTableQueryFile PluginPropertyUtils.addPluginProp("bqSourceTable", bqSourceTable); BeforeActions.scenario.write("BQ Source Table " + bqSourceTable + " created successfully"); } + + @Before(order = 2, value = "@CLOUDSQLMYSQL_SOURCE_TEST") + public static void createSourceTestTable() throws SQLException, ClassNotFoundException { + CloudMySqlClient.createSourceTestTable(PluginPropertyUtils.pluginProp("sourceTable")); + BeforeActions.scenario.write("CLOUDMYSQL Source table - " + PluginPropertyUtils.pluginProp("sourceTable") + + " created successfully"); + } + + @After(order = 2, value = "@CLOUDSQLMYSQL_SOURCE_TEST") + public static void deleteSourceTestTable() throws SQLException, ClassNotFoundException { + CloudMySqlClient.deleteTable(PluginPropertyUtils.pluginProp("sourceTable")); + BeforeActions.scenario.write("CLOUDMYSQL Source table - " + + PluginPropertyUtils.pluginProp("sourceTable") + " deleted successfully"); + } + + @Before(order = 2, value = "@CLOUDSQLMYSQL_TARGET_TEST") + public static void createTargetTestTables() throws SQLException, ClassNotFoundException { + CloudMySqlClient.createTargetTestTable(PluginPropertyUtils.pluginProp("targetTable")); + BeforeActions.scenario.write("CLOUDMYSQL Target table - " + PluginPropertyUtils.pluginProp("targetTable") + + " created successfully"); + } + + @After(order = 2, value = "@CLOUDSQLMYSQL_TARGET_TEST") + public static void deleteTargetTestTable() throws SQLException, ClassNotFoundException { + CloudMySqlClient.deleteTable(PluginPropertyUtils.pluginProp("targetTable")); + BeforeActions.scenario.write("CLOUDMYSQL Target Table - " + + PluginPropertyUtils.pluginProp("targetTable") + " deleted successfully"); + } } diff --git a/cloudsql-mysql-plugin/src/e2e-test/resources/errorMessage.properties b/cloudsql-mysql-plugin/src/e2e-test/resources/errorMessage.properties index d4fc1de28..4ccfa1f56 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/resources/errorMessage.properties +++ b/cloudsql-mysql-plugin/src/e2e-test/resources/errorMessage.properties @@ -21,3 +21,5 @@ errorLogsMessageInvalidCredentials =Spark program 'phase-1' failed with error: S Exception while trying to validate schema of database table errorLogsMessageInvalidBoundingQuery=Spark program 'phase-1' failed with error: Stage 'CloudSQL MySQL' encountered : java.io.IOException: You have an error in your SQL syntax; \ check the manual that corresponds to your MySQL server version for the right syntax to use near 'table' at line 1. Please check the system logs for more details. +errorMessageInvalidPassword=SQL error while getting query schema: Error: Access denied for user +errorMessagePrivateConnectionName=Enter the internal IP address of the Compute Engine VM cloudsql proxy is running on, to connect to a private diff --git a/cloudsql-mysql-plugin/src/e2e-test/resources/pluginParameters.properties b/cloudsql-mysql-plugin/src/e2e-test/resources/pluginParameters.properties index 9a6181214..374e9c38b 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/resources/pluginParameters.properties +++ b/cloudsql-mysql-plugin/src/e2e-test/resources/pluginParameters.properties @@ -84,6 +84,10 @@ bqOutputMultipleDatatypesSchema= [{"key":"COL1","value":"bytes"},{"key":"COL2"," {"key":"COL8","value":"boolean"},{"key":"COL9","value":"long"},{"key":"COL10","value":"time"}] CloudMySqlDatatypesColumns=(COL1 VARBINARY(100) , COL2 VARCHAR(100), COL3 DATE, COL4 DOUBLE,\ COL6 TIMESTAMP, COL8 BIT, COL9 BIGINT, COL10 TIME) +connectionArgumentsForBooleanDataType=[{"key":"tinyInt1isBit","value":"true"}] +connectionArguments=queryTimeout=50 +outputSchema=[{"key":"id","value":"int"},{"key":"lastName","value":"string"},{"key":"is_active","value":"int"}] +outputSourceSchema=[{"key":"id","value":"int"},{"key":"lastName","value":"string"},{"key":"is_active","value":"boolean"}] #bq queries file path CreateBQTableQueryFile=BigQuery/BigQueryCreateTableQuery.txt InsertBQDataQueryFile=BigQuery/BigQueryInsertDataQuery.txt