Сбой чтения тестовой базы данных - отказано в разрешении - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь запустить тест для моей асинхронной задачи, часть из нее читает из базы данных (Room), но я получаю сообщение об ошибке

W/ContextImpl: Failed to ensure /data/user/0/MyApplication/databases: mkdir 
failed: EACCES (Permission denied)

, которое выглядит как разрешение во время выполнения, что действительно странно, так как тот же метод в моем приложении выполняется и прекрасно выполняется без каких-либо разрешений и без каких-либо проблем, хотя W / ContextImpl выглядит угрожающе. Я действительно понятия не имею с этим, поэтому любую дополнительную информацию нужно просто спросить, и я добавлю ее. Итак, вот некоторый код, сначала тестовый класс, здесь я создаю экземпляр асинхронной задачи, передаю его контексту и заключаю в обратный вызов

public class ProcessJobsAsyncTaskTest {

private Context context;
@Before
public void setUp() throws Exception {
    context = InstrumentationRegistry.getContext();
    //have also tried InstrumentationRegistry.getTargetContext();
}

@After
public void tearDown() throws Exception {
}

@Test
public void processJobsGetJobsList() throws InterruptedException {
    ProcessJobsAsyncTaskForTesting task = new ProcessJobsAsyncTaskForTesting(context);
    task.setProcessJobsGetTaskListener(new ProcessJobsAsyncTaskForTesting.processJobsGetTaskListener(){
        @Override
        public void onComplete(JobList jobList, Exception e) {
            System.out.println(Arrays.toString(jobList.getJobListsTags()));
            System.out.println(jobList.getJobList());

        }
    }).execute();
  }
}

в моей асинхронной задаче я получаю список своих объектов с будущей задачей в репозитории, например: (как уже упоминалось, это работает в моем приложении на физическом устройстве)

JobListRepository jobListRepository = new JobListRepository(context);
List<JobList> jobListArrayList = 
jobListRepository.getFutureAllWithLimit(Constants.JOB_LISTS_TO_RETURN);

    if (jobListArrayList != null){
        for (JobList jobList : jobListArrayList){
            Log.d(TAG,"for loop");
            //get all tags and only add them if they're unique, could use a hashset
            for (String tag : jobList.getJobListsTags()){
                if (!tags.contains(tag)){
                    tags.add(tag);
                }
            }
            listOfJobs.addAll(ListConverter.
                            jobListFromString(jobList.getJobList()));
        }
    }else{
        return null;
    }

здесь я добавлю полную трассировку стека и помогу оценить

    W/ContextImpl: Failed to ensure /data/user/0/com.sealstudios.bullsheetgenerator2.test/databases: mkdir failed: EACCES (Permission denied)
    E/SQLiteLog: (14) cannot open file at line 36758 of [8201f4e1c5]
    E/SQLiteDatabase: Failed to open database '/data/user/0/com.sealstudios.bullsheetgenerator2.test/databases/jobLists'.
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:210)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:464)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:186)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:918)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:895)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:798)
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:724)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
    at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233)
    at com.sealstudios.bullsheetgenerator2.database.JobDao_Impl.getAllJobListsWithLimit(JobDao_Impl.java:321)
    at com.sealstudios.bullsheetgenerator2.database.JobListRepository$getFutureJobListsWithLimit.call(JobListRepository.java:94)
    at com.sealstudios.bullsheetgenerator2.database.JobListRepository$getFutureJobListsWithLimit.call(JobListRepository.java:82)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
   W/System.err: java.util.concurrent.ExecutionException: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
    at java.util.concurrent.FutureTask.report(FutureTask.java:123)
    at java.util.concurrent.FutureTask.get(FutureTask.java:193)
    at com.sealstudios.bullsheetgenerator2.database.JobListRepository.getFutureAllWithLimit(JobListRepository.java:73)
    at com.sealstudios.bullsheetgenerator2.jobtasks.ProcessJobsAsyncTaskForTesting.doInBackground(ProcessJobsAsyncTaskForTesting.java:50)
    at com.sealstudios.bullsheetgenerator2.jobtasks.ProcessJobsAsyncTaskForTesting.doInBackground(ProcessJobsAsyncTaskForTesting.java:26)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
    Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:210)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:464)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:186)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:918)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:895)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:798)
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:724)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
    at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233)
    at com.sealstudios.bullsheetgenerator2.database.JobDao_Impl.getAllJobListsWithLimit(JobDao_Impl.java:321)
    at com.sealstudios.bullsheetgenerator2.database.JobListRepository$getFutureJobListsWithLimit.call(JobListRepository.java:94)
    at com.sealstudios.bullsheetgenerator2.database.JobListRepository$getFutureJobListsWithLimit.call(JobListRepository.java:82)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    ... 3 more
...