From 1ae0db2388fd3f22d98ad20cacc4d0002b226364 Mon Sep 17 00:00:00 2001 From: nezu <29180158+dumbasPL@users.noreply.github.com> Date: Mon, 13 Nov 2023 20:23:00 +0100 Subject: [PATCH] added tests --- .github/workflows/test_ci.yml | 20 +++++++++ examples/get-test-data.rs | 72 ++++++++++++++++++++++++++++++++ tests/data/captcha_5wq5kg82.jpg | Bin 0 -> 6237 bytes tests/data/captcha_gvvpvbrk.jpg | Bin 0 -> 5703 bytes tests/data/captcha_h9q55ini.jpg | Bin 0 -> 5210 bytes tests/data/captcha_jky533gk.jpg | Bin 0 -> 5880 bytes tests/data/captcha_jv26634d.jpg | Bin 0 -> 5357 bytes tests/data/captcha_jv34w6k8.jpg | Bin 0 -> 5811 bytes tests/data/captcha_kg32n4r6.jpg | Bin 0 -> 5536 bytes tests/data/captcha_pvbj3839.jpg | Bin 0 -> 5795 bytes tests/data/captcha_qhpy47fr.jpg | Bin 0 -> 5938 bytes tests/data/captcha_whpvhmt5.jpg | Bin 0 -> 6016 bytes tests/offline_solve.rs | 38 +++++++++++++++++ 13 files changed, 130 insertions(+) create mode 100644 .github/workflows/test_ci.yml create mode 100644 examples/get-test-data.rs create mode 100644 tests/data/captcha_5wq5kg82.jpg create mode 100644 tests/data/captcha_gvvpvbrk.jpg create mode 100644 tests/data/captcha_h9q55ini.jpg create mode 100644 tests/data/captcha_jky533gk.jpg create mode 100644 tests/data/captcha_jv26634d.jpg create mode 100644 tests/data/captcha_jv34w6k8.jpg create mode 100644 tests/data/captcha_kg32n4r6.jpg create mode 100644 tests/data/captcha_pvbj3839.jpg create mode 100644 tests/data/captcha_qhpy47fr.jpg create mode 100644 tests/data/captcha_whpvhmt5.jpg create mode 100644 tests/offline_solve.rs diff --git a/.github/workflows/test_ci.yml b/.github/workflows/test_ci.yml new file mode 100644 index 0000000..c1271a0 --- /dev/null +++ b/.github/workflows/test_ci.yml @@ -0,0 +1,20 @@ +name: Build and Test + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose \ No newline at end of file diff --git a/examples/get-test-data.rs b/examples/get-test-data.rs new file mode 100644 index 0000000..f39c487 --- /dev/null +++ b/examples/get-test-data.rs @@ -0,0 +1,72 @@ +use std::{ + fs::{create_dir_all, File}, + io::Write, +}; + +use aero2solver::{ + constants::{BASE_URL, USER_AGENT}, + portal::PortalClient, + solver::Aero2Solver, +}; +use anyhow::{anyhow, Result}; + +fn run(solver: &mut Aero2Solver) -> Result<()> { + let client = PortalClient::new(BASE_URL, USER_AGENT)?; + + let state = client.get_state()?; + + let mut tries = 0; + let (solution, captcha) = loop { + tries += 1; + println!("Trying to solve captcha (try {})", tries); + let captcha = client.get_captcha(&state.session_id)?; + match solver.solve(&captcha, 0.9, 8) { + Ok(solution) => { + println!("Captcha solved as {} after {}", solution, tries); + break (solution, captcha); + } + Err(e) => println!("Error while solving captcha: {}", e), + } + }; + + let state = client.submit_captcha(&state.session_id, &solution)?; + match state.message { + Some(ref message) if message.eq("Rozłącz i ponownie połącz się z Internetem.") => { + println!("Captcha solved, code: {}", solution); + } + _ => Err(anyhow!( + "Captcha solved with message: {}", + state.message.unwrap_or_default() + ))?, + } + + let mut file = File::create(format!("./tests/data/captcha_{}.jpg", solution))?; + file.write_all(&captcha)?; + + Ok(()) +} + +fn main() -> Result<()> { + let mut solver = Aero2Solver::new( + "./model/captcha.names", + "./model/captcha.cfg", + "./model/captcha.weights", + )?; + + create_dir_all("./tests/data")?; + + // loop until we have 10 successful solves + let mut success_count = 0; + loop { + if success_count >= 10 { + break; + } + + match run(&mut solver) { + Ok(_) => success_count += 1, + Err(e) => println!("Error: {}", e), + } + } + + Ok(()) +} diff --git a/tests/data/captcha_5wq5kg82.jpg b/tests/data/captcha_5wq5kg82.jpg new file mode 100644 index 0000000000000000000000000000000000000000..731464e34ee6d85e754d0191ca8ced1e4177b59d GIT binary patch literal 6237 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 literal 0 HcmV?d00001 diff --git a/tests/data/captcha_jv26634d.jpg b/tests/data/captcha_jv26634d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..642a88c519d854d278caab7e8fc70161cafdf894 GIT binary patch literal 5357 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 literal 0 HcmV?d00001 diff --git a/tests/data/captcha_kg32n4r6.jpg b/tests/data/captcha_kg32n4r6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f24e72fd3be4e0daf704521dc2c3dd913c6012cd GIT binary patch literal 5536 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 literal 0 HcmV?d00001 diff --git a/tests/data/captcha_pvbj3839.jpg b/tests/data/captcha_pvbj3839.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec34cd44397d62287d495f1e41312c25c5b1672d GIT binary patch literal 5795 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 LUH<<8JsJNudo3yf literal 0 HcmV?d00001 diff --git a/tests/data/captcha_whpvhmt5.jpg b/tests/data/captcha_whpvhmt5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db3da48b732d9bbf7eb081125afccd6994ce0112 GIT binary patch literal 6016 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 + + for ref file in files { + // extract text between captcha_ and .jpg + let correct_solution = file + .file_stem() + .unwrap() + .to_str() + .unwrap() + .split('_') + .last() + .unwrap(); + + let captcha = fs::read(file).unwrap(); + let solution = solver.solve(&captcha, 0.9, 8).unwrap(); + assert_eq!(solution, correct_solution); + println!("solved test captcha: {}", solution); + } +}