Skip to content

Commit 65e946c

Browse files
authored
Merge pull request #1309 from syphar/build-test
add build tests for the doc-build
2 parents 60a3413 + 050b8a3 commit 65e946c

File tree

4 files changed

+130
-6
lines changed

4 files changed

+130
-6
lines changed

.github/workflows/ci.yml

+11-1
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,19 @@ jobs:
6060
- name: Build
6161
run: cargo build --workspace --locked
6262

63-
- name: Test
63+
- name: fast tests
6464
run: cargo test --workspace --locked
6565

66+
- name: create small build-environment
67+
run: |
68+
docker build -t buildenv - < dockerfiles/Dockerfile-small-build-env
69+
70+
- name: slow tests
71+
env:
72+
DOCSRS_INCLUDE_DEFAULT_TARGETS: true
73+
DOCS_RS_LOCAL_DOCKER_IMAGE: buildenv
74+
run: cargo test --workspace --locked -- --ignored
75+
6676
- name: Clean up the database
6777
run: docker-compose down --volumes
6878

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FROM ubuntu:focal
2+
3+
RUN apt-get update
4+
RUN apt-get install -y --no-install-recommends apt-utils build-essential sudo git
5+
6+
CMD ["bash"]

src/docbuilder/rustwide_builder.rs

+102
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ impl RustwideBuilder {
8686
if let Some(custom_image) = &config.local_docker_image {
8787
builder = builder.sandbox_image(SandboxImage::local(&custom_image)?);
8888
}
89+
if cfg!(test) {
90+
builder = builder.fast_init(true);
91+
}
8992

9093
let workspace = builder.init()?;
9194
workspace.purge_all_build_dirs()?;
@@ -752,3 +755,102 @@ pub(crate) struct BuildResult {
752755
pub(crate) docsrs_version: String,
753756
pub(crate) successful: bool,
754757
}
758+
759+
#[cfg(test)]
760+
mod tests {
761+
use super::*;
762+
use crate::test::{assert_redirect, assert_success, wrapper};
763+
764+
#[test]
765+
#[ignore]
766+
fn test_build_crate() {
767+
wrapper(|env| {
768+
let crate_ = DUMMY_CRATE_NAME;
769+
let crate_path = crate_.replace("-", "_");
770+
let version = DUMMY_CRATE_VERSION;
771+
let default_target = "x86_64-unknown-linux-gnu";
772+
773+
assert_eq!(env.config().include_default_targets, true);
774+
775+
let mut builder = RustwideBuilder::init(env).unwrap();
776+
builder
777+
.build_package(crate_, version, PackageKind::CratesIo)
778+
.map(|_| ())?;
779+
780+
// check release record in the db (default and other targets)
781+
let mut conn = env.db().conn();
782+
let rows = conn
783+
.query(
784+
"SELECT
785+
r.rustdoc_status,
786+
r.default_target,
787+
r.doc_targets
788+
FROM
789+
crates as c
790+
INNER JOIN releases AS r ON c.id = r.crate_id
791+
WHERE
792+
c.name = $1 AND
793+
r.version = $2",
794+
&[&crate_, &version],
795+
)
796+
.unwrap();
797+
let row = rows.get(0).unwrap();
798+
799+
assert_eq!(row.get::<_, bool>("rustdoc_status"), true);
800+
assert_eq!(row.get::<_, String>("default_target"), default_target);
801+
802+
let mut targets: Vec<String> = row
803+
.get::<_, Value>("doc_targets")
804+
.as_array()
805+
.unwrap()
806+
.iter()
807+
.map(|v| v.as_str().unwrap().to_owned())
808+
.collect();
809+
targets.sort();
810+
assert_eq!(
811+
targets,
812+
vec![
813+
"i686-pc-windows-msvc",
814+
"i686-unknown-linux-gnu",
815+
"x86_64-apple-darwin",
816+
"x86_64-pc-windows-msvc",
817+
"x86_64-unknown-linux-gnu",
818+
]
819+
);
820+
821+
let storage = env.storage();
822+
let web = env.frontend();
823+
824+
let base = format!("rustdoc/{}/{}", crate_, version);
825+
826+
// default target was built and is accessible
827+
assert!(storage.exists(&format!("{}/{}/index.html", base, crate_path))?);
828+
assert_success(&format!("/{}/{}/{}", crate_, version, crate_path), web)?;
829+
830+
// other targets too
831+
for target in DEFAULT_TARGETS {
832+
let target_docs_present =
833+
storage.exists(&format!("{}/{}/{}/index.html", base, target, crate_path))?;
834+
835+
let target_url = format!(
836+
"/{}/{}/{}/{}/index.html",
837+
crate_, version, target, crate_path
838+
);
839+
840+
if target == &default_target {
841+
assert!(!target_docs_present);
842+
assert_redirect(
843+
&target_url,
844+
&format!("/{}/{}/{}/index.html", crate_, version, crate_path),
845+
web,
846+
)?;
847+
} else {
848+
assert!(target_docs_present);
849+
assert_success(&target_url, web)?;
850+
}
851+
}
852+
853+
Ok(())
854+
})
855+
}
856+
}

src/test/mod.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use reqwest::{
1313
blocking::{Client, RequestBuilder},
1414
Method,
1515
};
16+
use std::fs;
1617
use std::{panic, sync::Arc};
1718

1819
pub(crate) fn wrapper(f: impl FnOnce(&TestEnvironment) -> Result<(), Error>) {
@@ -103,10 +104,12 @@ pub(crate) struct TestEnvironment {
103104
}
104105

105106
pub(crate) fn init_logger() {
106-
// If this fails it's probably already initialized
107-
let _ = env_logger::from_env(env_logger::Env::default().filter("DOCSRS_LOG"))
108-
.is_test(true)
109-
.try_init();
107+
// initializing rustwide logging also sets the global logger
108+
rustwide::logging::init_with(
109+
env_logger::from_env(env_logger::Env::default().filter("DOCSRS_LOG"))
110+
.is_test(true)
111+
.build(),
112+
);
110113
}
111114

112115
impl TestEnvironment {
@@ -137,8 +140,11 @@ impl TestEnvironment {
137140
fn base_config(&self) -> Config {
138141
let mut config = Config::from_env().expect("failed to get base config");
139142

143+
// create index directory
144+
fs::create_dir_all(config.registry_index_path.clone()).unwrap();
145+
140146
// Use less connections for each test compared to production.
141-
config.max_pool_size = 2;
147+
config.max_pool_size = 4;
142148
config.min_pool_idle = 0;
143149

144150
// Use the database for storage, as it's faster than S3.

0 commit comments

Comments
 (0)