Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* Copyright (c) 2026 zHd4
* SPDX-License-Identifier: MIT
*/

package app.notesr.activity.security;

import static org.junit.Assert.assertNotNull;

import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
import android.content.Intent;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.test.core.app.ActivityScenario;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import app.notesr.activity.note.list.NotesListActivity;
import app.notesr.service.security.rotation.SecretsUpdateAndroidService;
import app.notesr.core.security.SecretCache;
import app.notesr.service.AndroidServiceRegistry;
import app.notesr.service.AndroidServiceEntry;
import app.notesr.service.security.rotation.SecretsUpdateAndroidServiceStarter;

@RunWith(AndroidJUnit4.class)
public class SecretsUpdateActivityTest {

private Context context;
private Instrumentation instrumentation;

@Before
public void setUp() {
instrumentation = InstrumentationRegistry.getInstrumentation();
context = instrumentation.getTargetContext();

instrumentation.getUiAutomation().adoptShellPermissionIdentity();

AndroidServiceRegistry registry = AndroidServiceRegistry.getInstance(context);
AndroidServiceEntry entry = AndroidServiceEntry.builder()
.serviceName(SecretsUpdateAndroidService.class.getSimpleName())
.serviceClass(SecretsUpdateAndroidService.class)
.starterClass(SecretsUpdateAndroidServiceStarter.class)
.autoStart(true)
.requiresAuth(true)
.build();

registry.register(entry);
}

@After
public void tearDown() {
AndroidServiceRegistry.getInstance(context).unregister(SecretsUpdateAndroidService.class);
SecretCache.clear();
}

@Test
public void secretsUpdateCompleteNavigatesToNotesListAndFinishes() {
ActivityScenario<SecretsUpdateActivity> scenario =
ActivityScenario.launch(SecretsUpdateActivity.class);

try (scenario) {
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(
NotesListActivity.class.getName(), null, false);

Intent intent = new Intent(SecretsUpdateAndroidService.BROADCAST_ACTION);
intent.putExtra(SecretsUpdateAndroidService.EXTRA_COMPLETE, true);

LocalBroadcastManager.getInstance(context)
.sendBroadcast(intent);

Activity started = instrumentation.waitForMonitorWithTimeout(monitor, 2000);
instrumentation.removeMonitor(monitor);

assertNotNull("NotesListActivity should be started on secrets update complete",
started);
}
}

@Test
public void secretsUpdateFailedNavigatesToNotesListActivity() {
ActivityScenario<SecretsUpdateActivity> scenario =
ActivityScenario.launch(SecretsUpdateActivity.class);

try (scenario) {
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(
NotesListActivity.class.getName(), null, false);

Intent intent = new Intent(SecretsUpdateAndroidService.BROADCAST_ACTION);
intent.putExtra(SecretsUpdateAndroidService.EXTRA_FAIL, true);

LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

Activity started = instrumentation.waitForMonitorWithTimeout(monitor, 2000);
instrumentation.removeMonitor(monitor);

assertNotNull("NotesListActivity should be started when secrets update fails",
started);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,6 @@ protected void onCreate(Bundle savedInstanceState) {
startSecretsUpdateService();
}

@Override
protected boolean requiresSession() {
return false;
}

private void startSecretsUpdateService() {
AndroidServiceRegistry serviceRegistry = AndroidServiceRegistry
.getInstance(getApplicationContext());
Expand All @@ -66,6 +61,12 @@ private void onSecretsUpdateComplete() {
}

private void onSecretsUpdateFailed() {
if (isFinishing() || isDestroyed()) {
startActivity(new Intent(getApplicationContext(), NotesListActivity.class));
finish();
return;
}

DialogFactory dialogFactory = new DialogFactory(this);
dialogFactory.getThemedAlertDialogBuilder(R.layout.dialog_secrets_update_failed)
.setTitle(R.string.error)
Expand Down
Loading