--- a/persistentstorage/sql/TEST/t_sqldefect2.cpp Mon Jun 21 17:37:53 2010 +0300
+++ b/persistentstorage/sql/TEST/t_sqldefect2.cpp Thu Aug 19 11:36:21 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
@@ -16,7 +16,7 @@
#include <e32test.h>
#include <f32file.h>
#include <sqldb.h>
-
+#include <f32file.h>
///////////////////////////////////////////////////////////////////////////////////////
static RFs TheFs;
@@ -27,7 +27,7 @@
_LIT(KTestDir, "c:\\test\\");
_LIT(KTestDatabase1, "c:\\test\\t_sqldefect2.db");
_LIT(KTestDatabaseJournal1, "c:\\test\\t_sqldefect2.db-journal");
-
+_LIT(KServerTempDir, "c:\\private\\10281e17\\temp\\");
///////////////////////////////////////////////////////////////////////////////////////
@@ -259,6 +259,250 @@
TEST(diff.Int() <= 1);
}
+static TInt KillProcess(const TDesC& aProcessName)
+ {
+ TFullName name;
+ TBuf<64> pattern(aProcessName);
+ TInt length = pattern.Length();
+ pattern += _L("*");
+ TFindProcess procFinder(pattern);
+
+ while (procFinder.Next(name) == KErrNone)
+ {
+ if (name.Length() > length)
+ {//If found name is a string containing aProcessName string.
+ TChar c(name[length]);
+ if (c.IsAlphaDigit() ||
+ c == TChar('_') ||
+ c == TChar('-'))
+ {
+ // If the found name is other valid application name
+ // starting with aProcessName string.
+ continue;
+ }
+ }
+ RProcess proc;
+ if (proc.Open(name) == KErrNone)
+ {
+ proc.Kill(0);
+ }
+ proc.Close();
+ }
+ return KErrNone;
+ }
+
+/**
+@SYMTestCaseID PDS-SQL-CT-4210
+@SYMTestCaseDesc Test for the change "Temp files created during sql operations are not deleted after rebooting the phone"
+@SYMTestPriority High
+@SYMTestActions Kill the sql server
+ Create two temp files in sql server's private directory
+ Start the sql server
+ Test that the temp files do not exist.
+@SYMTestExpectedResults Test must not fail
+*/
+void DeleteTempFile()
+ {
+ _LIT(KSqlSrvName, "sqlsrv.exe");
+ _LIT(KTempFile1, "TMP00052.$$$");
+ _LIT(KTempFile2, "TMP00044.$$$");
+
+ KillProcess(KSqlSrvName);
+
+ //Create two temp file in c:\\private\\10281e17\\temp\\ folder
+ TInt err = TheFs.MkDir(KServerTempDir);
+ TEST(err == KErrNone || err == KErrAlreadyExists);
+ RFile file;
+ TFileName filename1(KServerTempDir);
+ TFileName filename2(KServerTempDir);
+ filename1.Append(KTempFile1);
+ filename2.Append(KTempFile2);
+ err = file.Replace(TheFs, filename1, 0);
+ file.Close();
+ TEST2(err, KErrNone);
+ err = file.Replace(TheFs, filename2, 0);
+ file.Close();
+ TEST2(err, KErrNone);
+
+ //Create a database that should start sql server
+ err = TheDb1.Create(KTestDatabase1);
+ TEST(err == KErrNone || err == KErrAlreadyExists);
+ //Test that the temp files have been deleted during server's start-up
+ TUint dummy;
+ err = TheFs.Att(filename1, dummy);
+ TEST2(err, KErrNotFound);
+ err = TheFs.Att(filename2, dummy);
+ TEST2(err, KErrNotFound);
+
+ TheDb1.Close();
+ err = RSqlDatabase::Delete(KTestDatabase1);
+ TEST2(err, KErrNone);
+ }
+
+TInt TempFilesCount()
+ {
+ _LIT(KServerTempDirMask, "c:\\private\\10281e17\\temp\\*.*");
+ CDir* dir = NULL;
+ TInt err = TheFs.GetDir(KServerTempDirMask, KEntryAttNormal, ESortNone, dir);
+ TEST2(err, KErrNone);
+ TInt tmpFileCount = dir->Count();
+ delete dir;
+ return tmpFileCount;
+ }
+
+/**
+@SYMTestCaseID PDS-SQL-CT-4211
+@SYMTestCaseDesc Test for the change "Temp files created during sql operations are not deleted after rebooting the phone"
+@SYMTestPriority High
+@SYMTestActions The test creates a database and runs a set of statements that
+ will lead to a delayed creation of a temp file.
+ At the end the test checks that the temp file was created.
+@SYMTestExpectedResults Test must not fail
+*/
+void TempFileTest()
+ {
+ (void)RSqlDatabase::Delete(KTestDatabase1);
+ TInt err = TheDb1.Create(KTestDatabase1);
+ TEST2(err, KErrNone);
+ //Get the number of the files in the SQL temp directory
+ TInt tmpFileCount = TempFilesCount();
+ //
+ err = TheDb1.Exec(_L("CREATE TABLE t1(x UNIQUE); INSERT INTO t1 VALUES(1)"));
+ TEST(err >= 0);
+ err = TheDb1.Exec(_L("BEGIN; UPDATE t1 SET x = 2; UPDATE t1 SET x = 3; COMMIT"));
+ TEST(err >= 0);
+ //Check that a temp file really was created
+ TInt tmpFileCount2 = TempFilesCount();
+ TEST(tmpFileCount2 > tmpFileCount);
+ //
+ TheDb1.Close();
+ err = RSqlDatabase::Delete(KTestDatabase1);
+ TEST2(err, KErrNone);
+ }
+
+/**
+@SYMTestCaseID PDS-SQL-CT-4214
+@SYMTestCaseDesc Test for the change "After *#7370# Java apps are not preinstalled again"
+@SYMTestPriority High
+@SYMTestActions The test makes sure there are no issues if the temp folder is removed after the server
+ has already started. The test performs the following actions -
+ 1. Delete the 'temp' directory.
+ 2. Create a transaction which creates temp files.
+ 3. Check 'temp' folder exists at the end
+@SYMTestExpectedResults Test must not fail
+*/
+void DeleteTempFolder()
+ {
+ //1. Delete 'temp' folder
+ TInt err = TheFs.RmDir(KServerTempDir);
+ TEST2(err, KErrNone);
+
+ //2. Create a transaction which creates temp files.
+ (void)RSqlDatabase::Delete(KTestDatabase1);
+ err = TheDb1.Create(KTestDatabase1);
+ TEST2(err, KErrNone);
+
+ err = TheDb1.Exec(_L("CREATE TABLE t1(x UNIQUE); INSERT INTO t1 VALUES(1)"));
+ TEST(err >= 0);
+ err = TheDb1.Exec(_L("BEGIN; UPDATE t1 SET x = 2; UPDATE t1 SET x = 3; COMMIT"));
+ TEST(err >= 0);
+
+ TheDb1.Close();
+ err = RSqlDatabase::Delete(KTestDatabase1);
+ TEST2(err, KErrNone);
+
+ //3. Check 'temp' folder exists
+ err = TheFs.MkDir(KServerTempDir);
+ TEST2(err, KErrAlreadyExists);
+ }
+
+/**
+@SYMTestCaseID PDS-SQL-CT-4213
+@SYMTestCaseDesc Tests the ability of the SQL server to store empty strings and retrieve them as
+ text column values, not NULLs.
+ Change: ou1cimx1#504388.
+@SYMTestPriority High
+@SYMTestActions The test creates a database and a table and stores there empty strings.
+ Then the test retrieves the stored column values and verifies that the column type is
+ "text", not "null".
+@SYMTestExpectedResults Test must not fail
+*/
+void EmptyTextColumnTest()
+ {
+ _LIT8(KEncUtf16, "encoding=\"UTF-16\"");
+ _LIT8(KEncUtf8, "encoding=\"UTF-8\"");
+ TPtrC8 enc[] = {KEncUtf16(), KEncUtf8()};
+ for(TInt i=0;i<(sizeof(enc)/sizeof(enc[0]));++i)
+ {
+ (void)RSqlDatabase::Delete(KTestDatabase1);
+ TInt err = TheDb1.Create(KTestDatabase1, &enc[i]);
+ TEST2(err, KErrNone);
+ //Insert records with empty text column values using RSqlDatabase::Exec()
+ err = TheDb1.Exec(_L("CREATE TABLE A(ID INTEGER, T TEXT)"));
+ TEST(err >= 0);
+ err = TheDb1.Exec(_L("INSERT INTO A VALUES(1, '')"));
+ TEST2(err, 1);
+ err = TheDb1.Exec(_L8("INSERT INTO A VALUES(2, '')"));
+ TEST2(err, 1);
+ //Insert a record with empty text column value using RSqlParamWriteStream
+ RSqlStatement stmt;
+ err = stmt.Prepare(TheDb1, _L("INSERT INTO A(ID, T) VALUES(:P1, :P2)"));
+ TEST2(err, KErrNone);
+ err = stmt.BindInt(0, 3);
+ TEST2(err, KErrNone);
+ RSqlParamWriteStream strm;
+ err = strm.BindText(stmt, 1);
+ TEST2(err, KErrNone);
+ TRAP(err, strm.WriteL(KNullDesC));
+ TEST2(err, KErrNone);
+ strm.Close();
+ err = stmt.Exec();
+ TEST2(err, 1);
+ stmt.Close();
+ //Insert records with empty text column values using RSqlStatement::Bind()
+ err = stmt.Prepare(TheDb1, _L("INSERT INTO A(ID, T) VALUES(:P1, :P2)"));
+ TEST2(err, KErrNone);
+ err = stmt.BindInt(0, 4);
+ TEST2(err, KErrNone);
+ err = stmt.BindText(1, KNullDesC);
+ TEST2(err, KErrNone);
+ err = stmt.Exec();
+ TEST2(err, 1);
+ //
+ err = stmt.Reset();
+ TEST2(err, KErrNone);
+ err = stmt.BindInt(0, 5);
+ TEST2(err, KErrNone);
+ _LIT(KEmptyStr, "");
+ err = stmt.BindText(1, KEmptyStr);
+ TEST2(err, KErrNone);
+ err = stmt.Exec();
+ TEST2(err, 1);
+ stmt.Close();
+ //Read the empty text column values
+ err = stmt.Prepare(TheDb1, _L("SELECT T FROM A"));
+ TEST2(err, KErrNone);
+ TInt cnt = 0;
+ while((err = stmt.Next()) == KSqlAtRow)
+ {
+ ++cnt;
+ TPtrC val;
+ err = stmt.ColumnText(0, val);
+ TEST2(err, KErrNone);
+ TEST2(val.Length(), 0);
+ TSqlColumnType type = stmt.ColumnType(0);
+ TEST2(type, ESqlText);
+ }
+ stmt.Close();
+ TEST2(err, KSqlAtEnd);
+ TEST2(cnt, 5);
+ //
+ TheDb1.Close();
+ err = RSqlDatabase::Delete(KTestDatabase1);
+ TEST2(err, KErrNone);
+ }
+ }
+
void DoTestsL()
{
TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-SQL-CT-4154 DEF143062: SQL, \"CREATE INDEX\" sql crashes SQL server"));
@@ -269,6 +513,18 @@
TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SQL-CT-4156 DEF143150: SQL, strftime() returns incorrect result"));
DEF143150();
+
+ TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SQL-CT-4210 Temp files created during sql operations are not deleted after rebooting the phone - 1"));
+ DeleteTempFile();
+
+ TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SQL-CT-4211 Temp files created during sql operations are not deleted after rebooting the phone - 2"));
+ TempFileTest();
+
+ TheTest.Next(_L(" @SYMTestCaseID:PDS-SQL-CT-4213 No support to store an empty string in symbian's sqlite."));
+ EmptyTextColumnTest();
+
+ TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SQL-CT-4214 After *#7370# Java apps are not preinstalled again"));
+ DeleteTempFolder();
}
TInt E32Main()