summaryrefslogtreecommitdiff
path: root/tests/src/com/android/launcher3/model/DatabaseHelperTest.kt
blob: c9ea4210392bda14832a40e81be7dee637adf537 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.android.launcher3.model

import android.database.sqlite.SQLiteDatabase
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME
import com.android.launcher3.LauncherSettings.Favorites.TMP_TABLE
import com.android.launcher3.LauncherSettings.Favorites.addTableToDb
import com.android.launcher3.pm.UserCache
import com.android.launcher3.provider.LauncherDbUtils
import java.util.function.ToLongFunction
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Test
import org.junit.runner.RunWith

private const val INSERTION_SQL = "databases/v30_workspace_items.sql"

private const val ICON_PACKAGE = "iconPackage"
private const val ICON_RESOURCE = "iconResource"

@SmallTest
@RunWith(AndroidJUnit4::class)
class DatabaseHelperTest {

    /**
     * b/304687723 occurred when a return was accidentally added to a case statement in
     * DatabaseHelper.onUpgrade, which stopped the final data migration from successfully occurring.
     * This test loads an in-memory db from a text file containing SQL statements, and then performs
     * the migration on the db, and verifies that the correct columns have been deleted.
     */
    @Test
    fun onUpgrade_to_version_32_from_30() {
        val context = InstrumentationRegistry.getInstrumentation().targetContext
        val userSerialProvider =
            ToLongFunction<UserHandle> {
                UserCache.INSTANCE.get(context).getSerialNumberForUser(it)
            }
        val dbHelper = DatabaseHelper(context, null, userSerialProvider) {}
        val db = FactitiousDbController(context, INSERTION_SQL).inMemoryDb

        dbHelper.onUpgrade(db, 30, 32)

        assertFalse(hasFavoritesColumn(db, ICON_PACKAGE))
        assertFalse(hasFavoritesColumn(db, ICON_RESOURCE))
    }

    /**
     * b/304687723 causes a crash due to copying a table with 21 columns to a table with 19 columns.
     * This test loads an in-memory db from a text file containing SQL statements, and then copies
     * data from the created table into a temporary one, and verifies that no exception is thrown.
     */
    @Test
    fun after_migrating_from_db_v30_to_v32_copy_table() {
        val context = InstrumentationRegistry.getInstrumentation().targetContext
        val db = FactitiousDbController(context, INSERTION_SQL).inMemoryDb // v30 - 21 columns

        addTableToDb(db, 1, true, TMP_TABLE)
        LauncherDbUtils.copyTable(db, TABLE_NAME, db, TMP_TABLE, context)

        val c1 = db.query(TABLE_NAME, null, null, null, null, null, null)
        val c2 = db.query(TMP_TABLE, null, null, null, null, null, null)

        assertEquals(21, c1.columnCount)
        assertEquals(19, c2.columnCount)
        assertEquals(c1.count, c2.count)

        c1.close()
        c2.close()
    }

    private fun hasFavoritesColumn(db: SQLiteDatabase, columnName: String): Boolean {
        db.query(TABLE_NAME, null, null, null, null, null, null).use { c ->
            return c.getColumnIndex(columnName) >= 0
        }
    }
}