15 KiB
DailyNotification Plugin Testing Procedures
Overview
This document provides comprehensive testing procedures for the DailyNotification Capacitor plugin, covering both manual and automated testing scenarios.
Table of Contents
- Manual Testing Procedures
- Scripted Testing Procedures
- ADB Commands Reference
- Troubleshooting
- Test Scenarios
Manual Testing Procedures
Prerequisites
- Android device or emulator with ADB enabled
- DailyNotification app installed
- ADB tools installed on development machine
- Notification permissions granted
Basic Functionality Test
1. Plugin Registration Test
Objective: Verify the plugin loads and registers correctly
Steps:
- Launch the app:
adb shell am start -n com.timesafari.dailynotification/.MainActivity
- Tap "Test Plugin" button
- Verify status shows "Plugin is loaded and ready!"
Expected Result: Green status with plugin loaded confirmation
2. Permission Management Test
Objective: Test permission request and status checking
Steps:
- Tap "Check Permissions" button
- Note current permission status (✅/❌ indicators)
- Tap "Request Permissions" button
- Grant permissions in system dialog if prompted
- Tap "Check Permissions" again to verify
Expected Result: All permissions show ✅ after granting
3. Notification Scheduling Test
Objective: Test basic notification scheduling
Steps:
- Tap "Test Notification" button
- Verify status shows "Notification scheduled for [time]!"
- Wait 1 minute for notification to appear
- Check notification panel for the test notification
Expected Result: Notification appears in system notification panel
Background Notification Test
4. App Background Notification Test
Objective: Verify notifications work when app is in background
Steps:
- Schedule a notification using "Test Notification"
- Send app to background:
adb shell input keyevent KEYCODE_HOME
- Verify app is still running:
adb shell "ps | grep timesafari"
- Wait for scheduled time
- Check notification panel
Expected Result: Notification appears even with app in background
5. App Closed Notification Test
Objective: Verify notifications work when app is closed normally
Steps:
- Schedule a notification using "Test Notification"
- Close app normally:
adb shell input keyevent KEYCODE_HOME
- Verify app process is still running:
adb shell "ps | grep timesafari"
- Wait for scheduled time
- Check notification panel
Expected Result: Notification appears with app closed
Edge Case Testing
6. Force Stop Test (Expected Failure)
Objective: Verify force-stop cancels notifications (expected behavior)
Steps:
- Schedule a notification using "Test Notification"
- Force stop the app:
adb shell am force-stop com.timesafari.dailynotification
- Verify app is killed:
adb shell "ps | grep timesafari"
(should return nothing) - Wait for scheduled time
- Check notification panel
Expected Result: No notification appears (this is correct behavior)
7. Reboot Recovery Test
Objective: Test notification recovery after device reboot
Steps:
- Schedule a notification for future time
- Reboot device:
adb reboot
- Wait for device to fully boot
- Check if notification still scheduled:
adb shell "dumpsys alarm | grep timesafari"
- Wait for scheduled time
- Check notification panel
Expected Result: Notification should still fire after reboot
Scripted Testing Procedures
Automated Test Script
Create a test script for automated testing:
#!/bin/bash
# daily-notification-test.sh
set -e
APP_PACKAGE="com.timesafari.dailynotification"
APP_ACTIVITY=".MainActivity"
TEST_TIMEOUT=120 # 2 minutes
echo "🧪 Starting DailyNotification Plugin Tests"
echo "=========================================="
# Function to check if app is running
check_app_running() {
adb shell "ps | grep $APP_PACKAGE" > /dev/null 2>&1
}
# Function to wait for app to be ready
wait_for_app() {
echo "⏳ Waiting for app to be ready..."
sleep 3
}
# Function to schedule notification
schedule_notification() {
echo "📅 Scheduling test notification..."
# This would need to be implemented with UI automation
# For now, we'll assume manual scheduling
echo "⚠️ Manual step: Schedule notification in app UI"
read -p "Press Enter when notification is scheduled..."
}
# Test 1: App Launch
echo "🚀 Test 1: App Launch"
adb shell am start -n $APP_PACKAGE/$APP_ACTIVITY
wait_for_app
if check_app_running; then
echo "✅ App launched successfully"
else
echo "❌ App failed to launch"
exit 1
fi
# Test 2: Background Test
echo "🔄 Test 2: Background Notification Test"
schedule_notification
echo "📱 Sending app to background..."
adb shell input keyevent KEYCODE_HOME
sleep 2
if check_app_running; then
echo "✅ App running in background"
else
echo "❌ App not running in background"
exit 1
fi
# Test 3: Wait for notification
echo "⏰ Test 3: Waiting for notification ($TEST_TIMEOUT seconds)..."
echo "👀 Watch for notification in system panel"
# Check for notification in logs
timeout $TEST_TIMEOUT bash -c '
while true; do
if adb logcat -d | grep -q "Notification displayed successfully"; then
echo "✅ Notification displayed successfully"
exit 0
fi
sleep 5
done
'
if [ $? -eq 0 ]; then
echo "✅ Notification test passed"
else
echo "❌ Notification test failed or timed out"
fi
# Test 4: Force Stop Test
echo "🛑 Test 4: Force Stop Test (Expected Failure)"
schedule_notification
echo "💀 Force stopping app..."
adb shell am force-stop $APP_PACKAGE
sleep 2
if check_app_running; then
echo "❌ App still running after force stop"
exit 1
else
echo "✅ App successfully force stopped"
fi
echo "⏰ Waiting for notification (should NOT appear)..."
sleep 60
if adb logcat -d | grep -q "Notification displayed successfully"; then
echo "❌ Notification appeared after force stop (unexpected)"
else
echo "✅ No notification after force stop (expected)"
fi
echo "🎉 All tests completed!"
Python Test Script
For more advanced testing with UI automation:
#!/usr/bin/env python3
"""
DailyNotification Plugin Automated Test Suite
"""
import subprocess
import time
import json
import sys
from typing import Optional, Dict, Any
class DailyNotificationTester:
def __init__(self, package: str = "com.timesafari.dailynotification"):
self.package = package
self.activity = f"{package}/.MainActivity"
def run_adb_command(self, command: str) -> subprocess.CompletedProcess:
"""Run ADB command and return result"""
return subprocess.run(
f"adb {command}",
shell=True,
capture_output=True,
text=True
)
def is_app_running(self) -> bool:
"""Check if app is currently running"""
result = self.run_adb_command(f'shell "ps | grep {self.package}"')
return result.returncode == 0 and self.package in result.stdout
def launch_app(self) -> bool:
"""Launch the app"""
result = self.run_adb_command(f"shell am start -n {self.activity}")
time.sleep(3) # Wait for app to load
return self.is_app_running()
def send_to_background(self) -> bool:
"""Send app to background"""
self.run_adb_command("shell input keyevent KEYCODE_HOME")
time.sleep(2)
return self.is_app_running()
def force_stop_app(self) -> bool:
"""Force stop the app"""
self.run_adb_command(f"shell am force-stop {self.package}")
time.sleep(2)
return not self.is_app_running()
def check_notification_logs(self, timeout: int = 60) -> bool:
"""Check for notification success in logs"""
start_time = time.time()
while time.time() - start_time < timeout:
result = self.run_adb_command("logcat -d")
if "Notification displayed successfully" in result.stdout:
return True
time.sleep(5)
return False
def run_test_suite(self) -> Dict[str, Any]:
"""Run complete test suite"""
results = {}
print("🧪 Starting DailyNotification Test Suite")
print("=" * 50)
# Test 1: App Launch
print("🚀 Test 1: App Launch")
results["app_launch"] = self.launch_app()
print(f"Result: {'✅ PASS' if results['app_launch'] else '❌ FAIL'}")
# Test 2: Background Test
print("🔄 Test 2: Background Test")
results["background"] = self.send_to_background()
print(f"Result: {'✅ PASS' if results['background'] else '❌ FAIL'}")
# Test 3: Force Stop Test
print("🛑 Test 3: Force Stop Test")
results["force_stop"] = self.force_stop_app()
print(f"Result: {'✅ PASS' if results['force_stop'] else '❌ FAIL'}")
# Test 4: Notification Test (requires manual scheduling)
print("📱 Test 4: Notification Test")
print("⚠️ Manual step required: Schedule notification in app")
input("Press Enter when notification is scheduled...")
results["notification"] = self.check_notification_logs()
print(f"Result: {'✅ PASS' if results['notification'] else '❌ FAIL'}")
return results
def main():
tester = DailyNotificationTester()
results = tester.run_test_suite()
print("\n📊 Test Results Summary:")
print("=" * 30)
for test, passed in results.items():
status = "✅ PASS" if passed else "❌ FAIL"
print(f"{test.replace('_', ' ').title()}: {status}")
# Exit with error code if any test failed
if not all(results.values()):
sys.exit(1)
if __name__ == "__main__":
main()
ADB Commands Reference
App Management Commands
# Launch app
adb shell am start -n com.timesafari.dailynotification/.MainActivity
# Send to background (normal close)
adb shell input keyevent KEYCODE_HOME
# Force stop app
adb shell am force-stop com.timesafari.dailynotification
# Check if app is running
adb shell "ps | grep timesafari"
# Clear app data
adb shell pm clear com.timesafari.dailynotification
Notification Testing Commands
# Check notification settings
adb shell "dumpsys notification | grep -A5 -B5 timesafari"
# List all notifications
adb shell "cmd notification list"
# Open notification settings
adb shell "am start -a android.settings.APP_NOTIFICATION_SETTINGS -e android.provider.extra.APP_PACKAGE com.timesafari.dailynotification"
Alarm Management Commands
# Check scheduled alarms
adb shell "dumpsys alarm | grep -i alarm"
# Check specific app alarms
adb shell "dumpsys alarm | grep timesafari"
# Check exact alarm permissions
adb shell "dumpsys alarm | grep SCHEDULE_EXACT_ALARM"
Logging Commands
# Monitor logs in real-time
adb logcat | grep -i "dailynotification\|notification"
# Get recent logs
adb logcat -d | grep -i "dailynotification"
# Clear logs
adb logcat -c
Troubleshooting
Common Issues
1. Plugin Not Loading
Symptoms: "Plugin not available" error Solutions:
- Check
capacitor.plugins.json
file exists and is valid - Verify plugin is built:
./gradlew assembleDebug
- Reinstall app:
adb install -r app/build/outputs/apk/debug/app-debug.apk
2. Notifications Not Appearing
Symptoms: No notification in system panel Solutions:
- Check notification permissions: Use "Check Permissions" button
- Verify notification importance:
adb shell "dumpsys notification | grep timesafari"
- Check if notifications are enabled in system settings
3. Alarms Not Firing
Symptoms: Scheduled notifications don't appear Solutions:
- Check exact alarm permissions:
adb shell "dumpsys alarm | grep SCHEDULE_EXACT_ALARM"
- Verify alarm is scheduled:
adb shell "dumpsys alarm | grep timesafari"
- Check battery optimization settings
4. App Crashes on Force Stop
Symptoms: App crashes when force-stopped Solutions:
- This is expected behavior - force-stop kills the app
- Use normal closure for testing:
adb shell input keyevent KEYCODE_HOME
Debug Commands
# Check app permissions
adb shell dumpsys package com.timesafari.dailynotification | grep permission
# Check app info
adb shell dumpsys package com.timesafari.dailynotification | grep -A10 "Application Info"
# Check notification channels
adb shell "dumpsys notification | grep -A10 timesafari"
# Monitor system events
adb shell "dumpsys activity activities | grep timesafari"
Test Scenarios
Scenario 1: Basic Functionality
- Objective: Verify plugin works in normal conditions
- Steps: Launch app → Test plugin → Schedule notification → Verify delivery
- Expected: All functions work correctly
Scenario 2: Background Operation
- Objective: Verify notifications work with app in background
- Steps: Schedule notification → Send to background → Wait for delivery
- Expected: Notification appears despite app being backgrounded
Scenario 3: Permission Management
- Objective: Test permission request and status
- Steps: Check permissions → Request permissions → Verify status
- Expected: Permissions granted and status updated
Scenario 4: Edge Cases
- Objective: Test behavior under extreme conditions
- Steps: Force stop → Reboot → Battery optimization
- Expected: Graceful handling of edge cases
Scenario 5: Performance Testing
- Objective: Test under load and stress
- Steps: Multiple notifications → Rapid scheduling → Memory pressure
- Expected: Stable performance under load
Best Practices
Testing Environment
- Use physical device for most accurate results
- Test on multiple Android versions (API 21+)
- Test on different OEMs (Samsung, Huawei, etc.)
- Test with different battery optimization settings
Test Data
- Use realistic notification content
- Test with various time intervals
- Test with different notification priorities
- Test with sound/vibration enabled/disabled
Documentation
- Record test results with timestamps
- Screenshot notification appearances
- Log any errors or unexpected behavior
- Document device-specific issues
Conclusion
This testing procedure ensures the DailyNotification plugin works correctly across all scenarios. Regular testing helps maintain reliability and catch issues early in development.
For questions or issues, refer to the troubleshooting section or check the plugin logs using the provided ADB commands.