Skip to content

Commit 6eefb91

Browse files
authored
Merge pull request #109 from rust-lang/tests-end-to-end
Finish the move to end-to-end tests
2 parents 164043e + 7ee9577 commit 6eefb91

35 files changed

+2131
-2237
lines changed

Cargo.lock

Lines changed: 60 additions & 168 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ axum = "0.7.4"
3636
tower = { version = "0.4", features = ["limit"] }
3737
jsonwebtoken = "9.2.0"
3838
url = "2.3"
39-
reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features = false }
39+
reqwest = { version = "0.12", features = ["json", "rustls-tls"], default-features = false }
4040
http = "1.1.0"
4141

4242
# Cryptography
@@ -59,6 +59,9 @@ derive_builder = "0.20.0"
5959
wiremock = "0.6.0"
6060
base64 = "0.22.1"
6161
tracing-test = "0.2.4"
62+
regex = "1.10.4"
63+
parking_lot = "0.12.3"
64+
once_cell = "1.19.0"
6265

6366
[profile.release]
6467
debug = 1

src/bin/bors.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ fn try_main(opts: Opts) -> anyhow::Result<()> {
8888
"https://api.github.com".to_string(),
8989
opts.private_key.into_bytes().into(),
9090
)?;
91-
let repos = client.load_repositories(&team_api).await?;
91+
let repos = RepositoryLoader::new(client.clone())
92+
.load_repositories(&team_api)
93+
.await?;
9294
Ok::<_, anyhow::Error>((client, repos))
9395
})?;
9496

src/bors/context.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@ use std::{
33
sync::{Arc, RwLock},
44
};
55

6-
use crate::{bors::command::CommandParser, database::DbClient, github::GithubRepoName};
6+
use crate::{bors::command::CommandParser, github::GithubRepoName, PgDbClient};
77

8-
use super::{RepositoryClient, RepositoryState};
8+
use super::RepositoryState;
99

10-
pub struct BorsContext<Client: RepositoryClient> {
10+
pub struct BorsContext {
1111
pub parser: CommandParser,
12-
pub db: Arc<dyn DbClient>,
13-
pub repositories: RwLock<HashMap<GithubRepoName, Arc<RepositoryState<Client>>>>,
12+
pub db: Arc<PgDbClient>,
13+
pub repositories: RwLock<HashMap<GithubRepoName, Arc<RepositoryState>>>,
1414
}
1515

16-
impl<Client: RepositoryClient> BorsContext<Client> {
16+
impl BorsContext {
1717
pub fn new(
1818
parser: CommandParser,
19-
db: Arc<dyn DbClient>,
20-
repositories: HashMap<GithubRepoName, Arc<RepositoryState<Client>>>,
19+
db: Arc<PgDbClient>,
20+
repositories: HashMap<GithubRepoName, Arc<RepositoryState>>,
2121
) -> Self {
2222
let repositories = RwLock::new(repositories);
2323
Self {

src/bors/handlers/help.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::sync::Arc;
22

33
use crate::bors::Comment;
4-
use crate::bors::RepositoryClient;
54
use crate::bors::RepositoryState;
65
use crate::github::PullRequest;
76

@@ -12,8 +11,8 @@ const HELP_MESSAGE: &str = r#"
1211
- help: Print this help message
1312
"#;
1413

15-
pub(super) async fn command_help<Client: RepositoryClient>(
16-
repo: Arc<RepositoryState<Client>>,
14+
pub(super) async fn command_help(
15+
repo: Arc<RepositoryState>,
1716
pr: &PullRequest,
1817
) -> anyhow::Result<()> {
1918
repo.client
@@ -30,8 +29,8 @@ mod tests {
3029
#[sqlx::test]
3130
async fn help_command(pool: sqlx::PgPool) {
3231
run_test(pool, |mut tester| async {
33-
tester.post_comment("@bors help").await;
34-
assert_eq!(tester.get_comment().await, HELP_MESSAGE);
32+
tester.post_comment("@bors help").await?;
33+
assert_eq!(tester.get_comment().await?, HELP_MESSAGE);
3534
Ok(tester)
3635
})
3736
.await;

src/bors/handlers/labels.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use itertools::Itertools;
22
use tracing::log;
33

4-
use crate::bors::{RepositoryClient, RepositoryState};
4+
use crate::bors::RepositoryState;
55
use crate::github::{LabelModification, LabelTrigger, PullRequestNumber};
66

77
/// If there are any label modifications that should be performed on the given PR when `trigger`
88
/// happens, this function will perform them.
9-
pub async fn handle_label_trigger<Client: RepositoryClient>(
10-
repo: &RepositoryState<Client>,
9+
pub async fn handle_label_trigger(
10+
repo: &RepositoryState,
1111
pr: PullRequestNumber,
1212
trigger: LabelTrigger,
1313
) -> anyhow::Result<()> {

src/bors/handlers/mod.rs

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ use crate::bors::handlers::trybuild::{command_try_build, command_try_cancel, TRY
1212
use crate::bors::handlers::workflow::{
1313
handle_check_suite_completed, handle_workflow_completed, handle_workflow_started,
1414
};
15-
use crate::bors::{BorsContext, Comment, RepositoryClient, RepositoryLoader, RepositoryState};
16-
use crate::database::DbClient;
17-
use crate::utils::logging::LogError;
18-
use crate::TeamApiClient;
15+
use crate::bors::{BorsContext, Comment, RepositoryLoader, RepositoryState};
16+
use crate::{PgDbClient, TeamApiClient};
17+
18+
#[cfg(test)]
19+
use crate::tests::util::TestSyncMarker;
1920

2021
mod help;
2122
mod labels;
@@ -24,18 +25,21 @@ mod refresh;
2425
mod trybuild;
2526
mod workflow;
2627

28+
#[cfg(test)]
29+
pub static WAIT_FOR_WORKFLOW_STARTED: TestSyncMarker = TestSyncMarker::new();
30+
2731
/// This function executes a single BORS repository event
28-
pub async fn handle_bors_repository_event<Client: RepositoryClient>(
32+
pub async fn handle_bors_repository_event(
2933
event: BorsRepositoryEvent,
30-
ctx: Arc<BorsContext<Client>>,
34+
ctx: Arc<BorsContext>,
3135
) -> anyhow::Result<()> {
3236
let db = Arc::clone(&ctx.db);
3337
let Some(repo) = ctx
3438
.repositories
3539
.read()
3640
.unwrap()
3741
.get(event.repository())
38-
.map(Arc::clone)
42+
.cloned()
3943
else {
4044
return Err(anyhow::anyhow!(
4145
"Repository {} not found in the bot state",
@@ -61,7 +65,6 @@ pub async fn handle_bors_repository_event<Client: RepositoryClient>(
6165
.instrument(span.clone())
6266
.await
6367
{
64-
span.log_error(error);
6568
repo.client
6669
.post_comment(
6770
pr_number,
@@ -71,6 +74,7 @@ pub async fn handle_bors_repository_event<Client: RepositoryClient>(
7174
)
7275
.await
7376
.context("Cannot send comment reacting to an error")?;
77+
return Err(error.context("Cannot perform command"));
7478
}
7579
}
7680

@@ -80,47 +84,44 @@ pub async fn handle_bors_repository_event<Client: RepositoryClient>(
8084
repo = payload.repository.to_string(),
8185
id = payload.run_id.into_inner()
8286
);
83-
if let Err(error) = handle_workflow_started(db, payload)
87+
handle_workflow_started(db, payload)
8488
.instrument(span.clone())
85-
.await
86-
{
87-
span.log_error(error);
88-
}
89+
.await?;
90+
91+
#[cfg(test)]
92+
WAIT_FOR_WORKFLOW_STARTED.mark();
8993
}
9094
BorsRepositoryEvent::WorkflowCompleted(payload) => {
9195
let span = tracing::info_span!(
9296
"Workflow completed",
9397
repo = payload.repository.to_string(),
9498
id = payload.run_id.into_inner()
9599
);
96-
if let Err(error) = handle_workflow_completed(repo, db, payload)
100+
handle_workflow_completed(repo, db, payload)
97101
.instrument(span.clone())
98-
.await
99-
{
100-
span.log_error(error);
101-
}
102+
.await?;
102103
}
103104
BorsRepositoryEvent::CheckSuiteCompleted(payload) => {
104105
let span = tracing::info_span!(
105106
"Check suite completed",
106107
repo = payload.repository.to_string(),
107108
);
108-
if let Err(error) = handle_check_suite_completed(repo, db, payload)
109+
handle_check_suite_completed(repo, db, payload)
109110
.instrument(span.clone())
110-
.await
111-
{
112-
span.log_error(error);
113-
}
111+
.await?;
114112
}
115113
}
116114
Ok(())
117115
}
118116

117+
#[cfg(test)]
118+
pub static WAIT_FOR_REFRESH: TestSyncMarker = TestSyncMarker::new();
119+
119120
/// This function executes a single BORS global event
120-
pub async fn handle_bors_global_event<Client: RepositoryClient>(
121+
pub async fn handle_bors_global_event(
121122
event: BorsGlobalEvent,
122-
ctx: Arc<BorsContext<Client>>,
123-
repo_loader: &dyn RepositoryLoader<Client>,
123+
ctx: Arc<BorsContext>,
124+
repo_loader: &RepositoryLoader,
124125
team_api_client: &TeamApiClient,
125126
) -> anyhow::Result<()> {
126127
let db = Arc::clone(&ctx.db);
@@ -133,7 +134,7 @@ pub async fn handle_bors_global_event<Client: RepositoryClient>(
133134
}
134135
BorsGlobalEvent::Refresh => {
135136
let span = tracing::info_span!("Refresh");
136-
let repos: Vec<Arc<RepositoryState<Client>>> =
137+
let repos: Vec<Arc<RepositoryState>> =
137138
ctx.repositories.read().unwrap().values().cloned().collect();
138139
futures::future::join_all(repos.into_iter().map(|repo| {
139140
let repo = Arc::clone(&repo);
@@ -146,15 +147,18 @@ pub async fn handle_bors_global_event<Client: RepositoryClient>(
146147
}))
147148
.instrument(span)
148149
.await;
150+
151+
#[cfg(test)]
152+
WAIT_FOR_REFRESH.mark();
149153
}
150154
}
151155
Ok(())
152156
}
153157

154-
async fn handle_comment<Client: RepositoryClient>(
155-
repo: Arc<RepositoryState<Client>>,
156-
database: Arc<dyn DbClient>,
157-
ctx: Arc<BorsContext<Client>>,
158+
async fn handle_comment(
159+
repo: Arc<RepositoryState>,
160+
database: Arc<PgDbClient>,
161+
ctx: Arc<BorsContext>,
158162
comment: PullRequestComment,
159163
) -> anyhow::Result<()> {
160164
let pr_number = comment.pr_number;
@@ -237,9 +241,9 @@ async fn handle_comment<Client: RepositoryClient>(
237241
Ok(())
238242
}
239243

240-
async fn reload_repos<Client: RepositoryClient>(
241-
ctx: Arc<BorsContext<Client>>,
242-
repo_loader: &dyn RepositoryLoader<Client>,
244+
async fn reload_repos(
245+
ctx: Arc<BorsContext>,
246+
repo_loader: &RepositoryLoader,
243247
team_api_client: &TeamApiClient,
244248
) -> anyhow::Result<()> {
245249
let reloaded_repos = repo_loader.load_repositories(team_api_client).await?;
@@ -281,7 +285,7 @@ mod tests {
281285
run_test(pool, |mut tester| async {
282286
tester
283287
.post_comment(Comment::from("@bors ping").with_author(User::bors_bot()))
284-
.await;
288+
.await?;
285289
// Returning here will make sure that no comments were received
286290
Ok(tester)
287291
})

src/bors/handlers/ping.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
use std::sync::Arc;
22

33
use crate::bors::Comment;
4-
use crate::bors::RepositoryClient;
54
use crate::bors::RepositoryState;
65
use crate::github::PullRequest;
76

8-
pub(super) async fn command_ping<Client: RepositoryClient>(
9-
repo: Arc<RepositoryState<Client>>,
7+
pub(super) async fn command_ping(
8+
repo: Arc<RepositoryState>,
109
pr: &PullRequest,
1110
) -> anyhow::Result<()> {
1211
repo.client
@@ -22,8 +21,8 @@ mod tests {
2221
#[sqlx::test]
2322
async fn ping_command(pool: sqlx::PgPool) {
2423
run_test(pool, |mut tester| async {
25-
tester.post_comment("@bors ping").await;
26-
assert_eq!(tester.get_comment().await, "Pong 🏓!");
24+
tester.post_comment("@bors ping").await?;
25+
assert_eq!(tester.get_comment().await?, "Pong 🏓!");
2726
Ok(tester)
2827
})
2928
.await;

0 commit comments

Comments
 (0)