Skip to content
This repository was archived by the owner on Jun 8, 2026. It is now read-only.
Merged
2 changes: 2 additions & 0 deletions .kokoro/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ fi

# If NOX_SESSION is set, it only runs the specified session,
# otherwise run all the sessions.
if [[ -n "${SPANNER_DATABASE_DIALECT:-}" ]]; then
export SPANNER_DATABASE_DIALECT = ${SPANNER_DATABASE_DIALECT:-}
Comment thread
IlyaFaer marked this conversation as resolved.
Outdated
if [[ -n "${NOX_SESSION:-}" ]]; then
python3 -m nox -s ${NOX_SESSION:-}
else
Expand Down
13 changes: 13 additions & 0 deletions .kokoro/presubmit/system-3.8-google-standard-sql.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Format: //devtools/kokoro/config/proto/build.proto

# Only run this nox session.
env_vars: {
key: "NOX_SESSION"
value: "system-3.8"
}

# Run for google standard sql
env_vars: {
key: "SPANNER_DATABASE_DIALECT"
value: "GOOGLE_STANDARD_SQL"
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,10 @@
env_vars: {
key: "NOX_SESSION"
value: "system-3.8"
}

# Run for postgres
env_vars: {
key: "SPANNER_DATABASE_DIALECT"
value: "POSTGRESQL"
}
5 changes: 5 additions & 0 deletions noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,9 @@ def system(session):
system_test_path = os.path.join("tests", "system.py")
system_test_folder_path = os.path.join("tests", "system")

# If POSTGRESQL tests and Emulator, skip the tests
if os.environ.get("SPANNER_EMULATOR_HOST") and os.environ.get("SPANNER_DATABASE_DIALECT") == "POSTGRESQL":
session.skip("Postgresql is not supported by Emulator yet.")
# Check the value of `RUN_SYSTEM_TESTS` env var. It defaults to true.
if os.environ.get("RUN_SYSTEM_TESTS", "true") == "false":
session.skip("RUN_SYSTEM_TESTS is set to false, skipping")
Expand Down Expand Up @@ -277,6 +280,7 @@ def system(session):
f"--junitxml=system_{session.python}_sponge_log.xml",
system_test_path,
*session.posargs,
env={"SPANNER_DATABASE_DIALECT": database_dialect},
)
if system_test_folder_exists:
session.run(
Expand All @@ -285,6 +289,7 @@ def system(session):
f"--junitxml=system_{session.python}_sponge_log.xml",
system_test_folder_path,
*session.posargs,
env={"SPANNER_DATABASE_DIALECT": database_dialect},
)


Expand Down
4 changes: 2 additions & 2 deletions tests/system/_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
INSTANCE_ID = os.environ.get(INSTANCE_ID_ENVVAR, INSTANCE_ID_DEFAULT)

SKIP_BACKUP_TESTS_ENVVAR = "SKIP_BACKUP_TESTS"
SKIP_BACKUP_TESTS = True # os.getenv(SKIP_BACKUP_TESTS_ENVVAR) == True
SKIP_BACKUP_TESTS = os.getenv(SKIP_BACKUP_TESTS_ENVVAR) is not None

INSTANCE_OPERATION_TIMEOUT_IN_SECONDS = int(
os.getenv("SPANNER_INSTANCE_OPERATION_TIMEOUT_IN_SECONDS", 560)
Expand Down Expand Up @@ -117,7 +117,7 @@ def scrub_instance_ignore_not_found(to_scrub):


def cleanup_old_instances(spanner_client):
cutoff = int(time.time()) - 2 * 60 * 60 # two hour ago
cutoff = int(time.time()) - 3 * 60 * 60 # three hour ago
instance_filter = "labels.python-spanner-systests:true"

for instance_pb in spanner_client.list_instances(filter_=instance_filter):
Expand Down
37 changes: 29 additions & 8 deletions tests/system/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@ def not_postgres(database_dialect):
)


@pytest.fixture(scope="session")
def not_google_standard_sql(database_dialect):
if database_dialect == DatabaseDialect.GOOGLE_STANDARD_SQL:
pytest.skip(
f"{_helpers.DATABASE_DIALECT_ENVVAR} set to GOOGLE_STANDARD_SQL in environment."
)
Comment thread
IlyaFaer marked this conversation as resolved.


@pytest.fixture(scope="session")
def database_dialect():
return (
Expand Down Expand Up @@ -169,14 +177,27 @@ def shared_instance(
def shared_database(shared_instance, database_operation_timeout, database_dialect):
database_name = _helpers.unique_id("test_database")
pool = spanner_v1.BurstyPool(labels={"testcase": "database_api"})
database = shared_instance.database(
database_name,
ddl_statements=_helpers.DDL_STATEMENTS,
pool=pool,
database_dialect=database_dialect,
)
operation = database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.
if database_dialect == DatabaseDialect.POSTGRESQL:
database = shared_instance.database(
database_name,
pool=pool,
database_dialect=database_dialect,
)
operation = database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.

operation = database.update_ddl(ddl_statements=_helpers.DDL_STATEMENTS)
operation.result(database_operation_timeout) # raises on failure / timeout.

else:
database = shared_instance.database(
database_name,
ddl_statements=_helpers.DDL_STATEMENTS,
pool=pool,
database_dialect=database_dialect,
)
operation = database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.

yield database

Expand Down
30 changes: 22 additions & 8 deletions tests/system/test_backup_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import datetime
import time
from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect

import pytest

Expand Down Expand Up @@ -96,14 +97,27 @@ def database_version_time(shared_database):
def second_database(shared_instance, database_operation_timeout, database_dialect):
database_name = _helpers.unique_id("test_database2")
pool = spanner_v1.BurstyPool(labels={"testcase": "database_api"})
database = shared_instance.database(
database_name,
ddl_statements=_helpers.DDL_STATEMENTS,
pool=pool,
database_dialect=database_dialect,
)
operation = database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.
if database_dialect == DatabaseDialect.POSTGRESQL:
database = shared_instance.database(
database_name,
pool=pool,
database_dialect=database_dialect,
)
operation = database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.

operation = database.update_ddl(ddl_statements=_helpers.DDL_STATEMENTS)
operation.result(database_operation_timeout) # raises on failure / timeout.

else:
database = shared_instance.database(
database_name,
ddl_statements=_helpers.DDL_STATEMENTS,
pool=pool,
database_dialect=database_dialect,
)
operation = database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.

yield database

Expand Down
2 changes: 2 additions & 0 deletions tests/system/test_database_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ def test_create_database_pitr_success(

def test_create_database_with_default_leader_success(
not_emulator, # Default leader setting not supported by the emulator
not_postgres,
multiregion_instance,
databases_to_delete,
):
Expand Down Expand Up @@ -270,6 +271,7 @@ def test_update_ddl_w_pitr_success(

def test_update_ddl_w_default_leader_success(
not_emulator,
not_postgres,
multiregion_instance,
databases_to_delete,
):
Expand Down
70 changes: 52 additions & 18 deletions tests/system/test_session_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,29 @@
def sessions_database(shared_instance, database_operation_timeout, database_dialect):
database_name = _helpers.unique_id("test_sessions", separator="_")
pool = spanner_v1.BurstyPool(labels={"testcase": "session_api"})
sessions_database = shared_instance.database(
database_name,
ddl_statements=_helpers.DDL_STATEMENTS,
pool=pool,
)
operation = sessions_database.create()
operation.result(database_operation_timeout) # raises on failure / timeout.

if database_dialect == DatabaseDialect.POSTGRESQL:
sessions_database = shared_instance.database(
database_name,
pool=pool,
database_dialect=database_dialect,
)

operation = sessions_database.create()
operation.result(database_operation_timeout)

operation = sessions_database.update_ddl(ddl_statements=_helpers.DDL_STATEMENTS)
operation.result(database_operation_timeout)

else:
sessions_database = shared_instance.database(
database_name,
ddl_statements=_helpers.DDL_STATEMENTS,
pool=pool,
)

operation = sessions_database.create()
operation.result(database_operation_timeout)

_helpers.retry_has_all_dll(sessions_database.reload)()
# Some tests expect there to be a session present in the pool.
Expand Down Expand Up @@ -1322,16 +1338,32 @@ def test_read_w_index(
# Create an alternate dataase w/ index.
extra_ddl = ["CREATE INDEX contacts_by_last_name ON contacts(last_name)"]
pool = spanner_v1.BurstyPool(labels={"testcase": "read_w_index"})
temp_db = shared_instance.database(
_helpers.unique_id("test_read", separator="_"),
ddl_statements=_helpers.DDL_STATEMENTS + extra_ddl,
pool=pool,
database_dialect=database_dialect,
)
operation = temp_db.create()
databases_to_delete.append(temp_db)
operation.result(database_operation_timeout) # raises on failure / timeout.

if database_dialect == DatabaseDialect.POSTGRESQL:
temp_db = shared_instance.database(
_helpers.unique_id("test_read", separator="_"),
pool=pool,
database_dialect=database_dialect,
)
operation = temp_db.create()
operation.result(database_operation_timeout)

operation = temp_db.update_ddl(
ddl_statements=_helpers.DDL_STATEMENTS + extra_ddl,
)
operation.result(database_operation_timeout)

else:
temp_db = shared_instance.database(
_helpers.unique_id("test_read", separator="_"),
ddl_statements=_helpers.DDL_STATEMENTS + extra_ddl,
pool=pool,
database_dialect=database_dialect,
)
operation = temp_db.create()
operation.result(database_operation_timeout) # raises on failure / timeout.

databases_to_delete.append(temp_db)
committed = _set_up_table(temp_db, row_count)

with temp_db.snapshot(read_timestamp=committed) as snapshot:
Expand Down Expand Up @@ -2040,7 +2072,7 @@ def test_execute_sql_w_date_bindings(sessions_database, not_postgres, database_d


def test_execute_sql_w_numeric_bindings(
not_emulator, not_postgres, sessions_database, database_dialect
not_emulator, sessions_database, database_dialect
):
if database_dialect == DatabaseDialect.POSTGRESQL:
_bind_test_helper(
Expand All @@ -2060,7 +2092,9 @@ def test_execute_sql_w_numeric_bindings(
)


def test_execute_sql_w_json_bindings(not_emulator, sessions_database, database_dialect):
def test_execute_sql_w_json_bindings(
not_emulator, not_postgres, sessions_database, database_dialect
):
_bind_test_helper(
sessions_database,
database_dialect,
Expand Down