Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 3 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,10 @@ jobs:
- if: ${{ endsWith(matrix.os.cargo_build_target, '-musl') }}
run: sudo apt-get update && sudo apt-get install --yes musl-tools
- if: ${{ startsWith(matrix.os.version, 'ubuntu-') }}
run: sudo apt-get update && sudo apt-get install --yes postgresql-client git-restore-mtime
- if: ${{ startsWith(matrix.os.version, 'macos-') }}
run: brew install git-tools
run: sudo apt-get update && sudo apt-get install --yes postgresql-client
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- run: git restore-mtime
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
Expand All @@ -43,12 +40,11 @@ jobs:
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
target/
~/.cargo/bin/
~/.cargo/git/db/
~/.cargo/registry/cache/
~/.cargo/registry/index/
key: ${{ matrix.os.version }}-build-${{ matrix.os.cargo_build_target }}-${{ hashFiles('.github/workflows/ci.yml', '**/Cargo.lock', 'rust-toolchain.toml') }}
key: ${{ matrix.os.version }}-cargo-${{ matrix.os.cargo_build_target }}-${{ hashFiles('.github/workflows/ci.yml', '**/Cargo.lock', 'rust-toolchain.toml') }}

- name: Run fmt
run: cargo --verbose fmt --check
Expand All @@ -63,9 +59,7 @@ jobs:
run: target/${{ matrix.os.cargo_build_target }}/release/manager repository-lint rust-version

- name: Verify stratosphere generated code is committed
run: |
target/${{ matrix.os.cargo_build_target }}/release/manager stratosphere sync --reject-dirty
git restore-mtime
run: target/${{ matrix.os.cargo_build_target }}/release/manager stratosphere sync --reject-dirty

- name: Run clippy
run: cargo --verbose clippy --all-features --all-targets --release
Expand Down Expand Up @@ -224,11 +218,9 @@ jobs:
permissions:
contents: write
steps:
- run: sudo apt-get update && sudo apt-get install --yes git-restore-mtime
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- run: git restore-mtime

- name: Download all artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down
17 changes: 9 additions & 8 deletions pg-ephemeral/tests/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ async fn pull_test_images() {
async fn test_base_feature() {
let backend = ociman::test_backend_setup!();

common::test_definition(backend)
common::test_definition(backend, "base-feature".parse().unwrap())
.with_container(async |container| {
container
.with_connection(async |connection| {
Expand All @@ -41,7 +41,7 @@ async fn test_base_feature() {
async fn test_ssl_generated() {
let backend = ociman::test_backend_setup!();

common::test_definition(backend)
common::test_definition(backend, "ssl-generated".parse().unwrap())
.ssl_config(pg_ephemeral::definition::SslConfig::Generated {
hostname: "postgresql.example.com".parse().unwrap(),
})
Expand All @@ -64,11 +64,12 @@ async fn test_ssl_generated() {
async fn test_ssl_parameter_conflict_rejected() {
let backend = ociman::test_backend_setup!();

let mut definition = common::test_definition(backend).ssl_config(
pg_ephemeral::definition::SslConfig::Generated {
hostname: "postgresql.example.com".parse().unwrap(),
},
);
let mut definition =
common::test_definition(backend, "ssl-parameter-conflict".parse().unwrap()).ssl_config(
pg_ephemeral::definition::SslConfig::Generated {
hostname: "postgresql.example.com".parse().unwrap(),
},
);
definition.parameters.insert(
pg_client::parameter::Name::from_static_or_panic("ssl"),
pg_client::parameter::Value::from_static_or_panic("off"),
Expand Down Expand Up @@ -276,7 +277,7 @@ async fn test_run_env() {

let backend = ociman::test_backend_setup!();

common::test_definition(backend)
common::test_definition(backend, "run-env".parse().unwrap())
.with_container(async |container| {
// Use sh -c to emit both PG* and DATABASE_URL
let output = cmd_proc::Command::new("sh")
Expand Down
2 changes: 1 addition & 1 deletion pg-ephemeral/tests/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -926,7 +926,7 @@ async fn test_container_script_with_pg_cron() {
async fn test_stale_connection_terminated_before_stop() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend);
let definition = common::test_definition(backend, "stale-connection".parse().unwrap());

// with_container returns the JoinHandle; stop() runs before it returns.
let sleep_handle = definition
Expand Down
24 changes: 16 additions & 8 deletions pg-ephemeral/tests/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,21 @@ pub static NODE_IMAGE: std::sync::LazyLock<ociman::image::Reference> =
/// Create a test definition with extended timeout.
///
/// CI environments may be slow, so we use 30s instead of the default 10s.
///
/// Each caller passes a distinct `instance_name` so the resulting
/// `pg-ephemeral/<instance>` cache image namespace is unique per test.
/// Tests share seed-chain prefixes (e.g. the same SQL fixture), which
/// produces identical cache hashes — under a shared instance name those
/// hashes collide on the same `pg-ephemeral/test:<hash>` reference and
/// race in the backend daemon when tests run in parallel.
#[allow(dead_code)]
#[must_use]
pub fn test_definition(backend: ociman::Backend) -> pg_ephemeral::Definition {
pg_ephemeral::Definition::new(
backend,
pg_ephemeral::Image::default(),
"test".parse().unwrap(),
)
.wait_available_timeout(std::time::Duration::from_secs(30))
pub fn test_definition(
backend: ociman::Backend,
instance_name: pg_ephemeral::InstanceName,
) -> pg_ephemeral::Definition {
pg_ephemeral::Definition::new(backend, pg_ephemeral::Image::default(), instance_name)
.wait_available_timeout(std::time::Duration::from_secs(30))
}

/// Run pg-ephemeral with the given arguments and assert success.
Expand Down Expand Up @@ -196,7 +202,9 @@ pub async fn test_database_url_integration(
) {
let backend = ociman::test_backend_setup!();

let definition = test_definition(backend.clone()).cross_container_access(true);
let instance_name: pg_ephemeral::InstanceName =
format!("database-url-{language}").parse().unwrap();
let definition = test_definition(backend.clone(), instance_name).cross_container_access(true);

definition
.with_container(async |container| {
Expand Down
12 changes: 6 additions & 6 deletions pg-ephemeral/tests/seed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ async fn assert_environment_matches(
async fn test_command_seed_receives_environment() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend)
let definition = common::test_definition(backend, "command-seed-env".parse().unwrap())
.apply_file(
"create-table".parse().unwrap(),
"tests/fixtures/create_seed_env_table.sql".into(),
Expand Down Expand Up @@ -99,7 +99,7 @@ async fn test_command_seed_receives_environment() {
async fn test_script_seed_receives_environment() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend)
let definition = common::test_definition(backend, "script-seed-env".parse().unwrap())
.apply_file(
"create-table".parse().unwrap(),
"tests/fixtures/create_seed_env_table.sql".into(),
Expand Down Expand Up @@ -128,7 +128,7 @@ async fn test_script_seed_receives_environment() {
async fn test_sql_statement_seed_multi_statement() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend)
let definition = common::test_definition(backend, "sql-statement-multi".parse().unwrap())
.apply_sql_statement(
"schema-and-data".parse().unwrap(),
indoc::indoc! {r#"
Expand Down Expand Up @@ -161,7 +161,7 @@ async fn test_sql_statement_seed_multi_statement() {
async fn test_csv_file_seed() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend)
let definition = common::test_definition(backend, "csv-file-seed".parse().unwrap())
.apply_file(
"create-table".parse().unwrap(),
"tests/fixtures/create_users_table.sql".into(),
Expand Down Expand Up @@ -206,7 +206,7 @@ async fn test_csv_file_seed() {
async fn test_csv_file_seed_column_reorder() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend)
let definition = common::test_definition(backend, "csv-column-reorder".parse().unwrap())
.apply_file(
"create-table".parse().unwrap(),
"tests/fixtures/create_users_table_serial.sql".into(),
Expand Down Expand Up @@ -251,7 +251,7 @@ async fn test_csv_file_seed_column_reorder() {
async fn test_csv_file_seed_header_mismatch() {
let backend = ociman::test_backend_setup!();

let definition = common::test_definition(backend)
let definition = common::test_definition(backend, "csv-header-mismatch".parse().unwrap())
.apply_file(
"create-table".parse().unwrap(),
"tests/fixtures/create_users_table_serial.sql".into(),
Expand Down