@@ -198,6 +198,12 @@ cargo watch -x test
198198# Run specific test
199199cargo test test_name -- --nocapture
200200
201+ # Run tests with test-utils feature (required for integration tests)
202+ cargo test --features test-utils
203+
204+ # Run tests with CI environment setup
205+ RUST_TEST_THREADS=1 cargo test --features test-utils
206+
201207# Check code without building
202208cargo check
203209
@@ -338,19 +344,31 @@ Located in `tests/` directory:
338344
339345``` rust
340346// tests/device_lifecycle_test.rs
341- use emu :: managers :: AndroidManager ;
342- use emu :: models :: DeviceConfig ;
347+ use emu :: managers :: android :: AndroidManager ;
348+ use emu :: managers :: common :: DeviceConfig ;
349+ use emu :: utils :: command_executor :: mock :: MockCommandExecutor ;
350+ use std :: sync :: Arc ;
351+
352+ mod common ;
353+ use common :: setup_mock_android_sdk;
343354
344355#[tokio:: test]
345356async fn test_complete_device_lifecycle () {
346- let manager = AndroidManager :: new (). unwrap ();
357+ // Setup mock Android SDK
358+ let temp_dir = setup_mock_android_sdk ();
359+ std :: env :: set_var (" ANDROID_HOME" , temp_dir . path ());
360+
361+ // Create mock executor
362+ let mock_executor = MockCommandExecutor :: new ()
363+ . with_success (" avdmanager" , & [" list" , " avd" ], "" )
364+ . with_success (" adb" , & [" devices" ], " List of devices attached\ n" );
365+
366+ // Create manager with mock
367+ let manager = AndroidManager :: with_executor (Arc :: new (mock_executor )). unwrap ();
347368
348369 // Test complete workflow
349370 let config = DeviceConfig :: new (" test_device" , " pixel_7" , " 31" );
350- manager . create_device (& config ). await . unwrap ();
351- manager . start_device (" test_device" ). await . unwrap ();
352- manager . stop_device (" test_device" ). await . unwrap ();
353- manager . delete_device (" test_device" ). await . unwrap ();
371+ // Note: In real tests, we would test against mock responses
354372}
355373```
356374
@@ -377,6 +395,9 @@ cargo test --bins --tests
377395# Run all tests including doctests (may have import issues in examples)
378396cargo test
379397
398+ # Run all tests with test-utils feature (required for integration tests)
399+ cargo test --features test-utils
400+
380401# Run with output
381402cargo test -- --nocapture
382403
@@ -392,8 +413,12 @@ cargo test android::
392413# Run performance tests
393414cargo test responsiveness_validation_test -- --nocapture
394415
395- # Run tests with coverage (requires cargo-tarpaulin)
396- cargo tarpaulin --out Html
416+ # Test coverage with cargo-llvm-cov (recommended)
417+ cargo llvm-cov --lcov --output-path coverage/lcov.info --features test-utils \
418+ --ignore-filename-regex ' (tests/|src/main\.rs|src/bin/|src/app/test_helpers\.rs|src/fixtures/|src/managers/mock\.rs)'
419+
420+ # Alternative: Test coverage with tarpaulin
421+ cargo tarpaulin --features test-utils --out Html
397422```
398423
399424### Test Guidelines
@@ -409,30 +434,43 @@ cargo tarpaulin --out Html
409434
410435#### Mock Usage
411436
412- ``` rust
413- use mockall :: predicate :: * ;
414- use mockall :: mock;
437+ The project uses ` MockCommandExecutor ` for testing Android SDK commands:
415438
416- mock! {
417- AndroidManager {}
439+ ``` rust
440+ use emu :: utils :: command_executor :: mock :: MockCommandExecutor ;
441+ use std :: sync :: Arc ;
418442
419- #[async_trait]
420- impl DeviceManager for AndroidManager {
421- async fn list_devices (& self ) -> Result <Vec <AndroidDevice >>;
422- async fn start_device (& self , id : & str ) -> Result <()>;
423- }
443+ #[tokio:: test]
444+ async fn test_with_mock_executor () {
445+ // Create mock executor with predefined responses
446+ let mock_executor = MockCommandExecutor :: new ()
447+ . with_success (" avdmanager" , & [" list" , " avd" ],
448+ " Available Android Virtual Devices:\ n Name: test_device\ n Path: /path/to/avd" )
449+ . with_success (" adb" , & [" devices" ],
450+ " List of devices attached\ n emulator-5554\ t device\ n" );
451+
452+ // Use with AndroidManager
453+ let manager = AndroidManager :: with_executor (Arc :: new (mock_executor )). unwrap ();
454+
455+ // Test operations
456+ let devices = manager . list_devices (). await . unwrap ();
457+ assert_eq! (devices . len (), 1 );
424458}
459+ ```
425460
426- #[tokio:: test]
427- async fn test_with_mock () {
428- let mut mock_manager = MockAndroidManager :: new ();
461+ For common test setup, use the shared utilities:
429462
430- mock_manager
431- . expect_list_devices ()
432- . returning ( || Ok ( vec! [ create_mock_device ()])) ;
463+ ``` rust
464+ mod common ;
465+ use common :: setup_mock_android_sdk ;
433466
434- let devices = mock_manager . list_devices (). await . unwrap ();
435- assert_eq! (devices . len (), 1 );
467+ #[tokio:: test]
468+ async fn test_with_mock_sdk () {
469+ // Setup mock Android SDK directory
470+ let temp_dir = setup_mock_android_sdk ();
471+ std :: env :: set_var (" ANDROID_HOME" , temp_dir . path ());
472+
473+ // Continue with test...
436474}
437475```
438476
@@ -1013,6 +1051,7 @@ impl DeviceConfig {
10131051 - Manual updates are only needed for major releases or special announcements
10141052
101510534 . Commit the version bump:
1054+
10161055 ``` bash
10171056 git add Cargo.toml CHANGELOG.md
10181057 git commit -m " chore: bump version to v0.2.2"
0 commit comments