From e9011a8c5525678c1574d59d243af17fca16e9ae Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Mon, 12 May 2014 13:55:23 +0200 Subject: adding unit tests for encryption data migration --- apps/files_encryption/tests/encryption_table.xml | 39 +++++++ apps/files_encryption/tests/migration.php | 130 +++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 apps/files_encryption/tests/encryption_table.xml create mode 100644 apps/files_encryption/tests/migration.php (limited to 'apps/files_encryption/tests') diff --git a/apps/files_encryption/tests/encryption_table.xml b/apps/files_encryption/tests/encryption_table.xml new file mode 100644 index 00000000000..c0f63dc0efa --- /dev/null +++ b/apps/files_encryption/tests/encryption_table.xml @@ -0,0 +1,39 @@ + + + *dbname* + true + false + utf8 + + *dbprefix*encryption_test + + + uid + text + true + 64 + + + mode + text + true + 64 + What client-side / server-side configuration is used + + + recovery_enabled + integer + true + 0 + Whether encryption key recovery is enabled + + + migration_status + integer + true + 0 + Whether encryption migration has been performed + + +
+
diff --git a/apps/files_encryption/tests/migration.php b/apps/files_encryption/tests/migration.php new file mode 100644 index 00000000000..3ef528c24bb --- /dev/null +++ b/apps/files_encryption/tests/migration.php @@ -0,0 +1,130 @@ +. + * + */ + +use OCA\Encryption; +use OCA\Files_Encryption\Migration; + +class Test_Migration extends PHPUnit_Framework_TestCase { + + public function tearDown() { + if (OC_DB::tableExists('encryption_test')) { + OC_DB::dropTable('encryption_test'); + } + $this->assertTableNotExist('encryption_test'); + } + + public function setUp() { + if (OC_DB::tableExists('encryption_test')) { + OC_DB::dropTable('encryption_test'); + } + $this->assertTableNotExist('encryption_test'); + } + + public function testEncryptionTableDoesNotExist() { + + $this->assertTableNotExist('encryption_test'); + + $migration = new Migration('encryption_test'); + $migration->dropTableEncryption(); + + $this->assertTableNotExist('encryption_test'); + + } + + public function testDataMigration() { + + $this->assertTableNotExist('encryption_test'); + + // create test table + OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml'); + $this->assertTableExist('encryption_test'); + + OC_DB::executeAudited('INSERT INTO `*PREFIX*encryption_test` values(?, ?, ?, ?)', + array('user1', 'server-side', 1, 1)); + + // preform migration + $migration = new Migration('encryption_test'); + $migration->dropTableEncryption(); + + // assert + $this->assertTableNotExist('encryption_test'); + + $rec = \OC_Preferences::getValue('user1', 'files_encryption', 'recovery_enabled'); + $mig = \OC_Preferences::getValue('user1', 'files_encryption', 'migration_status'); + + $this->assertEquals(1, $rec); + $this->assertEquals(1, $mig); + } + + public function testDuplicateDataMigration() { + + // create test table + OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml'); + + // in case of duplicate entries we want to preserve 0 on migration status and 1 on recovery + $data = array( + array('user1', 'server-side', 1, 1), + array('user1', 'server-side', 1, 0), + array('user1', 'server-side', 0, 1), + array('user1', 'server-side', 0, 0), + ); + foreach ($data as $d) { + OC_DB::executeAudited( + 'INSERT INTO `*PREFIX*encryption_test` values(?, ?, ?, ?)', + $d); + } + + // preform migration + $migration = new Migration('encryption_test'); + $migration->dropTableEncryption(); + + // assert + $this->assertTableNotExist('encryption_test'); + + $rec = \OC_Preferences::getValue('user1', 'files_encryption', 'recovery_enabled'); + $mig = \OC_Preferences::getValue('user1', 'files_encryption', 'migration_status'); + + $this->assertEquals(1, $rec); + $this->assertEquals(0, $mig); + } + + /** + * @param string $table + */ + public function assertTableExist($table) { + $this->assertTrue(OC_DB::tableExists($table), 'Table ' . $table . ' does not exist'); + } + + /** + * @param string $table + */ + public function assertTableNotExist($table) { + $type=OC_Config::getValue( "dbtype", "sqlite" ); + if( $type == 'sqlite' || $type == 'sqlite3' ) { + // sqlite removes the tables after closing the DB + $this->assertTrue(true); + } else { + $this->assertFalse(OC_DB::tableExists($table), 'Table ' . $table . ' exists.'); + } + } + +} -- cgit v1.2.3