• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<lambda>null1 package com.android.launcher3.model
2 
3 import android.content.Context
4 import android.database.sqlite.SQLiteDatabase
5 import android.os.UserHandle
6 import androidx.test.ext.junit.runners.AndroidJUnit4
7 import androidx.test.filters.SmallTest
8 import androidx.test.platform.app.InstrumentationRegistry
9 import com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME
10 import com.android.launcher3.LauncherSettings.Favorites.TMP_TABLE
11 import com.android.launcher3.LauncherSettings.Favorites.addTableToDb
12 import com.android.launcher3.pm.UserCache
13 import com.android.launcher3.provider.LauncherDbUtils
14 import com.android.launcher3.util.ModelTestExtensions
15 import java.util.function.ToLongFunction
16 import org.junit.After
17 import org.junit.Assert.assertEquals
18 import org.junit.Assert.assertFalse
19 import org.junit.Before
20 import org.junit.Test
21 import org.junit.runner.RunWith
22 
23 private const val INSERTION_SQL = "databases/v30_workspace_items.sql"
24 
25 private const val ICON_PACKAGE = "iconPackage"
26 private const val ICON_RESOURCE = "iconResource"
27 
28 @SmallTest
29 @RunWith(AndroidJUnit4::class)
30 class DatabaseHelperTest {
31     val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
32     // v30 - 21 columns
33     lateinit var db: SQLiteDatabase
34 
35     @Before
36     fun setUp() {
37         db = ModelTestExtensions.createInMemoryDb(INSERTION_SQL)
38     }
39 
40     @After
41     fun tearDown() {
42         db.close()
43     }
44 
45     /**
46      * b/304687723 occurred when a return was accidentally added to a case statement in
47      * DatabaseHelper.onUpgrade, which stopped the final data migration from successfully occurring.
48      * This test loads an in-memory db from a text file containing SQL statements, and then performs
49      * the migration on the db, and verifies that the correct columns have been deleted.
50      */
51     @Test
52     fun onUpgrade_to_version_32_from_30() {
53         val userSerialProvider =
54             ToLongFunction<UserHandle> {
55                 UserCache.INSTANCE.get(context).getSerialNumberForUser(it)
56             }
57         val dbHelper = DatabaseHelper(context, null, userSerialProvider) {}
58 
59         dbHelper.onUpgrade(db, 30, 32)
60 
61         assertFalse(hasFavoritesColumn(db, ICON_PACKAGE))
62         assertFalse(hasFavoritesColumn(db, ICON_RESOURCE))
63     }
64 
65     /**
66      * b/304687723 causes a crash due to copying a table with 21 columns to a table with 19 columns.
67      * This test loads an in-memory db from a text file containing SQL statements, and then copies
68      * data from the created table into a temporary one, and verifies that no exception is thrown.
69      */
70     @Test
71     fun after_migrating_from_db_v30_to_v32_copy_table() {
72         addTableToDb(db, 1, true, TMP_TABLE)
73         LauncherDbUtils.copyTable(db, TABLE_NAME, db, TMP_TABLE, context)
74 
75         val c1 = db.query(TABLE_NAME, null, null, null, null, null, null)
76         val c2 = db.query(TMP_TABLE, null, null, null, null, null, null)
77 
78         assertEquals(21, c1.columnCount)
79         assertEquals(19, c2.columnCount)
80         assertEquals(c1.count, c2.count)
81 
82         c1.close()
83         c2.close()
84     }
85 
86     private fun hasFavoritesColumn(db: SQLiteDatabase, columnName: String): Boolean {
87         db.query(TABLE_NAME, null, null, null, null, null, null).use { c ->
88             return c.getColumnIndex(columnName) >= 0
89         }
90     }
91 }
92