javacommons/jvms/nativeportlayer/tsrc/src/testjvmnativeport.cpp
changeset 80 d6dafc5d983f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/jvms/nativeportlayer/tsrc/src/testjvmnativeport.cpp	Fri Oct 15 12:29:39 2010 +0300
@@ -0,0 +1,749 @@
+/*
+* Copyright (c) 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"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Tests for function server
+*
+*/
+
+#include <e32base.h>
+#include "TestHarness.h"
+#include "testutils.h"
+
+#include "mjvmnativeportlayer.h"
+#include "mjavafile.h"
+
+TEST_GROUP(TestJvmPortPriority)
+{
+    TEST_SETUP()
+    {
+    }
+
+    TEST_TEARDOWN()
+    {
+    }
+};
+
+TEST_GROUP(TestJvmPort)
+{
+    TEST_SETUP()
+    {
+    }
+
+    TEST_TEARDOWN()
+    {
+    }
+};
+
+_LIT(KTestFileName, "c:\\javaFileTest.txt");
+_LIT(KTestReplaceFileName, "c:\\javaFileReplaceTest.txt");
+_LIT(KTestDrmFileName1, "c:\\test.dm");
+_LIT(KTestDrmFileName2, "c:\\test.dcf");
+_LIT(KTestJarFileName, "c:\\test.jar");
+_LIT(KTestDrmEncryptedFileName, "c:\\testDrm.dcf");
+_LIT(KTestDrmEncryptedInstallerFileName, "c:\\testDrm.jar");
+
+_LIT8(KTestText, "Testing..");
+_LIT8(KTestText2, "Testing2..");
+_LIT8(KJarText, "This is a jar file.");
+_LIT8(KDrmText, "This is a drm protected file.");
+_LIT8(KDM_CONTENT, "This is a dm file.");
+_LIT8(KDCF_CONTENT, "This is a dcf file.");
+
+TEST_GROUP(TestJavaFile)
+{
+    RFs fs;
+    javaruntime::MJvmNativePortLayer* port;
+    javaruntime::MJavaFile* file;
+    TEST_SETUP()
+    {
+        port = 0;
+        fs.Connect();
+        fs.Delete(KTestFileName);
+        fs.Delete(KTestReplaceFileName);
+    }
+
+    TEST_TEARDOWN()
+    {
+        delete port;
+        delete file;
+        fs.Close();
+    }
+};
+// #undef CHECKWITHNOTE
+// #define CHECKWITHNOTE(x, y) CHECK(x)
+void checkPriority(const TThreadPriority& expected,
+                   const TThreadPriority& recieved)
+{
+    CHECKWITHNOTE(expected == recieved, "Priority check failed. Expecting: "<<expected<<", received: "<<recieved);
+}
+
+// Testing priority table.
+TEST(TestJvmPortPriority, priorityTest)
+{
+    int i = 0;
+    checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityNormal, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityNormal, javaruntime::GetSingleThreadPriority(i++));
+    checkPriority(EPriorityMore, javaruntime::GetSingleThreadPriority(i++));
+
+}
+void getPort(javaruntime::MJvmNativePortLayer*& port)
+{
+    TRAPD(err, port = javaruntime::GetPortLayerL());
+    CHECKWITHNOTE(err == KErrNone, "Error in getting MJvmNativePortLayer: "<<err);
+    CHECKWITHNOTE(port, "Got null pointer when getting port layer");
+}
+
+void getFileAndPort(javaruntime::MJvmNativePortLayer*& port, javaruntime::MJavaFile*& file)
+{
+    if (port == 0)
+    {
+        getPort(port);
+    }
+    TRAPD(err, file = port->GetJavaFileL());
+    CHECKWITHNOTE(err == KErrNone, "Error in getting MJavaFile: "<<err);
+    CHECKWITHNOTE(file, "Got null pointer when getting Java file");
+}
+
+_LIT(KOutpuFullDir,"c:\\logs\\java\\");
+_LIT(KOutpuFullDir2,"c:\\logs\\java2\\");
+_LIT(KConsole,"c:\\logs\\java\\vmconsole.txt");
+
+// Testing log writings works.
+TEST(TestJvmPort, logWritingTest)
+{
+    RFs fs;
+    fs.Connect();
+    TUint dummy;
+    TBool dirExists = fs.Att(KOutpuFullDir, dummy) == KErrNone;
+
+    TInt res;
+
+    // If the c:\logs\java directory exixts rename it to java2
+    if (dirExists)
+    {
+        res = fs.Rename(KOutpuFullDir, KOutpuFullDir2);
+        CHECKWITHNOTE(res == KErrNone, "Rename failed: "<<res);
+    }
+
+    // Testing that writing to nonexisting dir works.
+    javaruntime::MJvmNativePortLayer* port;
+    getPort(port);
+    TRAP(res, port->WriteToStdoutL(_L8("StdOutTestNonExisting\n")));
+    CHECKWITHNOTE(res == KErrNone, "Error in writing to std.out: "<<res);
+    TRAP(res, port->WriteToStderrL(_L8("StdErrTestNonExisting\n")));
+    CHECKWITHNOTE(res == KErrNone, "Error in writing to std.err: "<<res);
+
+    CHECKWITHNOTE(fs.Att(KOutpuFullDir, dummy) != KErrNone, "The logs\\java dir should not be present: ");
+
+    delete port;
+    port = 0;
+
+    // Create c:\logs\java directory.
+    res = fs.MkDir(KOutpuFullDir);
+    CHECKWITHNOTE(res == KErrNone, "MkDir failed: "<<res);
+
+    // Needs to reinit the port, because the logs dir exists now.
+    getPort(port);
+    TRAP(res, port->WriteToStdoutL(_L8("StdOutTest\n")));
+    CHECKWITHNOTE(res == KErrNone, "Error in writing to std.out: "<<res);
+    TRAP(res, port->WriteToStderrL(_L8("StdErrTest\n")));
+    CHECKWITHNOTE(res == KErrNone, "Error in writing to std.err: "<<res);
+
+    // Check that the vmconsole.txt contains correct content.
+    RFile file;
+    res = file.Open(fs, KConsole, EFileShareReadersOrWriters);
+    CHECKWITHNOTE(res == KErrNone, "file open failed: "<<res);
+    TBuf8<30> bufR;
+    res = file.Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "file read failed: "<<res);
+    file.Close();
+    res = bufR.Compare(_L8("StdOutTest\nStdErrTest\n"));
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    // Delete the vmconsole.txt. RFileLogger seems to keep the file open for
+    // a while.
+    int tryCount = 0;
+    do
+    {
+        res = fs.Delete(KConsole);
+        if (res == KErrInUse)
+        {
+            tryCount++;
+            User::After(500 * 1000);
+        }
+    }
+    while (res == KErrInUse && tryCount < 200);
+
+    CHECKWITHNOTE(res == 0, "Delete failed: "<<res);
+
+    // Delete c:\logs\java directory.
+    res = fs.RmDir(KOutpuFullDir);;
+    CHECKWITHNOTE(res == 0, "RmDir failed: "<<res);
+
+    // If the c:\logs\java directory exixted before the tests, return it back.
+    if (dirExists)
+    {
+        res = fs.Rename(KOutpuFullDir2, KOutpuFullDir);
+        CHECKWITHNOTE(res == 0, "Rename2 failed: "<<res);
+    }
+    fs.Close();
+    delete port;
+}
+
+// Testing that opening a file works ok and when trying to re-open KErrInUse
+// is returned.
+TEST(TestJavaFile, fileOpen)
+{
+    getFileAndPort(port, file);
+    int res = file->Open(fs, KTestJarFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
+
+    res = file->Open(fs, KTestJarFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "Open, unexpected result: "<<res);
+    file->Close();
+}
+
+// Testing that opening unexisting files.
+TEST(TestJavaFile, fileOpenUnexisting)
+{
+    getFileAndPort(port, file);
+    int res = file->Open(fs, _L("c:\\nonexisting.txt"), EFileRead);
+    CHECKWITHNOTE(res == KErrNotFound, "Open, unexpected result: "<<res);
+
+    res = file->Open(fs, _L("c:\\nonexisting.dcf"), EFileRead);
+    CHECKWITHNOTE(res == KErrNotFound, "Open2, unexpected result: "<<res);
+
+    res = file->Open(fs, _L("c:\\nonexisting.txt"), EFileRead);
+    CHECKWITHNOTE(res == KErrNotFound, "Open3, unexpected result: "<<res);
+    file->Close();
+
+    res = file->Open(fs, _L("c:\\nonexisting.dcf"), EFileRead);
+    CHECKWITHNOTE(res == KErrNotFound, "Open4, unexpected result: "<<res);
+
+    file->Close();
+}
+
+// Testing that creation of file to unaccessable location fails.
+TEST(TestJavaFile, fileCreateUnAccessible)
+{
+    getFileAndPort(port, file);
+    int res = file->Create(fs, _L("z:\\nonexisting.txt"), EFileRead);
+    CHECKWITHNOTE(res == KErrAccessDenied, "Create, unexpected result: "<<res);
+    file->Close();
+}
+
+// Testing that Replacing of file to unaccessable location fails.
+TEST(TestJavaFile, fileReplaceUnAccessible)
+{
+    getFileAndPort(port, file);
+    int res = file->Replace(fs, _L("z:\\nonexisting.txt"), EFileRead);
+    CHECKWITHNOTE(res == KErrAccessDenied, "Replace, unexpected result: "<<res);
+    file->Close();
+}
+
+// Testing that file creation succceeds. As a side test testing that Open,
+// Create and replace will fail when using file object that is in use.
+TEST(TestJavaFile, fileCreate1)
+{
+    getFileAndPort(port, file);
+    int res = file->Create(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to create file: "<<res);
+    TUint dummy;
+    CHECKWITHNOTE(fs.Att(KTestFileName, dummy) == KErrNone, "File does't exist");
+
+    res = file->Open(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReOpen, unexpected result: "<<res);
+
+    res = file->Replace(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReReplace, unexpected result: "<<res);
+
+    res = file->Create(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReCreate, unexpected result: "<<res);
+
+    file->Close();
+}
+
+// Testing read, write flush and seek for normal files.
+TEST(TestJavaFile, fileCreateWriteReads)
+{
+    getFileAndPort(port, file);
+
+    // Create the test file.
+    int res = file->Create(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to create file: "<<res);
+    TUint dummy;
+    CHECKWITHNOTE(fs.Att(KTestFileName, dummy) == KErrNone, "File does't exist");
+
+    TBuf8<15> bufR;
+    TBuf8<15> bufW;
+    bufW.Append(KTestText);
+
+    // Write content to buffer.
+    res = file->Write(bufW);
+    CHECKWITHNOTE(res == KErrNone, "Write failed: "<<res);
+
+    // Flush content to buffer.
+    res = file->Flush();
+    CHECKWITHNOTE(res == KErrNone, "Flush failed: "<<res);
+
+    // Set current position to the start of the file.
+    TInt pos = 0;
+    res = file->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
+
+    // Read the whole content of the file.
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+
+    // Compare the the read and written are the same.
+    res = bufW.Compare(bufR);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    // Read a portion of the content from the file.
+    bufR.Zero();
+    pos = 2;
+    res = file->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek2 failed: "<<res);
+    res = file->Read(bufR, 5);
+    CHECKWITHNOTE(res == KErrNone, "Read2 failed: "<<res);
+    res = bufW.Mid(2,5).Compare(bufR);
+    CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
+
+    // Read a portion of the content from the file. Testing
+    // ESeekEnd.
+    bufR.Zero();
+    pos = -6;
+    res = file->Seek(ESeekEnd, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek3 failed: "<<res);
+    res = file->Read(bufR, 4);
+    CHECKWITHNOTE(res == KErrNone, "Read3 failed: "<<res);
+    res = bufW.Mid(3,4).Compare(bufR);
+    CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
+
+    file->Close();
+}
+
+// Testing all variants of Write methods, Size, and SetSize. As a side test
+// testing that Open, Create and replace will fail when using file object
+// that is in use.
+TEST(TestJavaFile, fileCreateWritesRead)
+{
+    getFileAndPort(port, file);
+    int res = file->Create(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to create file: "<<res);
+    TUint dummy;
+    CHECKWITHNOTE(fs.Att(KTestFileName, dummy) == KErrNone, "File does't exist");
+
+    res = file->Open(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReOpen, unexpected result: "<<res);
+
+    res = file->Replace(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReReplace, unexpected result: "<<res);
+
+    res = file->Create(fs, KTestFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReCreate, unexpected result: "<<res);
+
+
+    // Write some content to file.
+    TBuf8<45> bufR;
+    TBuf8<15> bufW;
+    bufW.Append(KTestText);
+    res = file->Write(bufW);
+    CHECKWITHNOTE(res == KErrNone, "Write failed: "<<res);
+    res = file->Write(bufW, 8);  // Testing..Testing.
+    CHECKWITHNOTE(res == KErrNone, "Write failed2: "<<res);
+    res = file->Write(2, bufW);  // TeTesting..sting.
+    CHECKWITHNOTE(res == KErrNone, "Write failed3: "<<res);
+    res = file->Write(8, bufW, 2); // TeTestinTe.sting.
+    CHECKWITHNOTE(res == KErrNone, "Write failed4: "<<res);
+    TInt pos = 0;
+    res = file->Seek(ESeekEnd, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
+    res = file->Write(bufW, 4);  // TeTestinTe.sting.Test
+    CHECKWITHNOTE(res == KErrNone, "Write failed5: "<<res);
+    file->Flush();
+    CHECKWITHNOTE(res == KErrNone, "Flush failed: "<<res);
+
+    // Set current position to the start of the file.
+    pos = 0;
+    res = file->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed2: "<<res);
+
+    // Read the whole content of the file.
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    _LIT8(KTestRes, "TeTestinTe.sting.Test");
+
+    // Compare that the file content is correct.
+    res = bufR.Compare(KTestRes);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    // Testing that Size works ok.
+    TInt size;
+    res = file->Size(size);
+    CHECKWITHNOTE(res == 0, "Size call failed: "<<res);
+    CHECKWITHNOTE(size == 21, "Size failed: "<<size);
+
+    // Testing that SetSize works ok.
+    res = file->SetSize(10);
+    CHECKWITHNOTE(size == 21, "SetSize failed: "<<res);
+
+    // Read the content ater size change.
+    bufR.Zero();
+    res = file->Seek(ESeekStart, pos);
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
+
+    // The new size should be smaller that before SetSize.
+    pos = 0;
+    res = file->Size(size);
+    CHECKWITHNOTE(res == 0, "Size call failed2: "<<res);
+    CHECKWITHNOTE(size == 10, "Size failed2: "<<size);
+
+    // Compare that the file content is correct.
+    res = bufR.Compare(KTestRes().Left(10));
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    file->Close();
+}
+
+// Testing Replace method. As a side test testing that Open, Create and
+// replace will fail when using file object that is in use.
+TEST(TestJavaFile, fileReplace)
+{
+    getFileAndPort(port, file);
+
+    // Checking that file that we are about to create doesn't exist.
+    TUint dummy;
+    CHECKWITHNOTE(fs.Att(KTestReplaceFileName, dummy) != KErrNone, "File exists before");
+
+    // Using Replace to create the file.
+    int res = file->Replace(fs, KTestReplaceFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to Replace file: "<<res);
+    CHECKWITHNOTE(fs.Att(KTestReplaceFileName, dummy) == KErrNone, "File does't exist");
+
+    res = file->Open(fs, KTestReplaceFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReOpen, unexpected result: "<<res);
+
+    res = file->Replace(fs, KTestReplaceFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReReplace, unexpected result: "<<res);
+
+    res = file->Create(fs, KTestReplaceFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "ReCreate, unexpected result: "<<res);
+
+    // Write content to created file.
+    TBuf8<45> bufR;
+    TBuf8<15> bufW;
+    bufW.Append(KTestText);
+    res = file->Write(bufW);
+    CHECKWITHNOTE(res == KErrNone, "Write failed: "<<res);
+
+    // Read the content and compare that the content is correct.
+    TInt pos = 0;
+    res = file->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    res = bufR.Compare(KTestText);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+    file->Close();
+
+    // Replace the existing file.
+    res = file->Replace(fs, KTestReplaceFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to Replace file2: "<<res);
+    CHECKWITHNOTE(fs.Att(KTestReplaceFileName, dummy) == KErrNone, "File does't exist2");
+
+    // Check that the file size is zero i.e. a new file.
+    TInt size;
+    res = file->Size(size);
+    CHECKWITHNOTE(res == 0, "Size call failed: "<<res);
+    CHECKWITHNOTE(size == 0, "Size failed: "<<size);
+
+    // Write content to recreated file.
+    bufW.Zero();
+    bufR.Zero();
+    bufW.Append(KTestText2);
+    res = file->Write(bufW);
+    CHECKWITHNOTE(res == KErrNone, "Write failed2: "<<res);
+
+    // Read the content and compare that the content is correct.
+    res = file->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed2: "<<res);
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
+    res = bufR.Compare(KTestText2);
+    CHECKWITHNOTE(res == 0, "Compare failed2: "<<res);
+    file->Close();
+}
+
+// Testing Lock and Unlock methods.
+TEST(TestJavaFile, fileLock)
+{
+    getFileAndPort(port, file);
+
+    // Creating two files objects pointing to same directory.
+    int res = file->Create(fs, KTestFileName, EFileWrite | EFileShareAny);
+    CHECKWITHNOTE(res == KErrNone, "Failed to Create file: "<<res);
+
+    javaruntime::MJavaFile* file2;
+    getFileAndPort(port, file2);
+    res = file2->Open(fs, KTestFileName, EFileRead | EFileShareAny);
+    CHECKWITHNOTE(res == KErrNone, "Failed to Open file: "<<res);
+
+    // Write some content.
+    res = file->Write(KTestText);
+    CHECKWITHNOTE(res == KErrNone, "Failed to write to file: "<<res);
+
+    // Write some content.
+    res = file->Lock(3, 4);
+    CHECKWITHNOTE(res == KErrNone, "Failed to lock the file: "<<res);
+
+    // Lock the area
+    TInt pos = 4;
+    res = file2->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
+
+    // Check that locked the area is unaccessable.
+    TBuf8<45> bufR;
+    res = file2->Read(bufR, 2);
+    CHECKWITHNOTE(res == KErrLocked, "Expecting locked when reading: "<<res);
+
+    // Unlock the area
+    res = file->UnLock(3, 4);
+    CHECKWITHNOTE(res == KErrNone, "Failed to unlock the file: "<<res);
+
+    // Check that unlocked the area is now accessable.
+    res = file2->Read(bufR, 2);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    res = KTestText().Mid(4,2).Compare(bufR);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    file->Close();
+    file2->Close();
+    delete file2;
+}
+
+
+// Testing that jar file can be opened. This test is for checking a branch in
+// IsDrm() method.
+TEST(TestJavaFile, openJar)
+{
+    getFileAndPort(port, file);
+
+    // Open the jar file.
+    TInt res = file->Open(fs, KTestJarFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Open, unexpected result: "<<res);
+
+    // Read and compare content.
+    TBuf8<45> bufR;
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    res = bufR.Compare(KJarText);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+    file->Close();
+}
+
+// Testing the file open through CAF with files that are not DRM protected.
+void testOpenCafFile(RFs& fs,
+                     javaruntime::MJavaFile* file,
+                     const TDesC& fileName,
+                     const TDesC8& compareString)
+{
+    // Open file using CAF.
+    TInt res = file->Open(fs, fileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
+
+    // Read the content and compare.
+    TBuf8<45> bufR;
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    res = bufR.Compare(compareString);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    // Read the partial content and compare. Using ESeekStart.
+    bufR.Zero();
+    TInt pos = 2;
+    res = file->Seek(ESeekStart, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
+    res = file->Read(bufR, 5);
+    CHECKWITHNOTE(res == KErrNone, "Read2 failed: "<<res);
+    res = compareString.Mid(2,5).Compare(bufR);
+    CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
+
+    // Read the partial content and compare. Using ESeekEnd.
+    bufR.Zero();
+    pos = -6;
+    res = file->Seek(ESeekEnd, pos);
+    CHECKWITHNOTE(res == KErrNone, "Seek3 failed: "<<res);
+    res = file->Read(bufR, 4);
+    CHECKWITHNOTE(res == KErrNone, "Read3 failed: "<<res);
+    res = compareString.Mid(compareString.Length() - 6, 4).Compare(bufR);
+    CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
+
+    // Check that Size method works also in case of CAF.
+    TInt size;
+    res = file->Size(size);
+    CHECKWITHNOTE(res == 0, "Size call failed: "<<res);
+    CHECKWITHNOTE(size == compareString.Length(), "Size failed: "<<size);
+
+    file->Close();
+}
+
+
+// Testing CAF with .dm file extension.
+TEST(TestJavaFile, readDrmDmFile)
+{
+    getFileAndPort(port, file);
+    testOpenCafFile(fs, file, KTestDrmFileName1, KDM_CONTENT);
+}
+
+// Testing CAF with .dcf file extension.
+TEST(TestJavaFile, readDrmDcfFile)
+{
+    getFileAndPort(port, file);
+    testOpenCafFile(fs, file, KTestDrmFileName2, KDCF_CONTENT);
+}
+
+// Testing methods that are not supported by CAF. Expecting correct error codes.
+TEST(TestJavaFile, readDrmNotSupportedMethods)
+{
+    // Open file using CAF.
+    getFileAndPort(port, file);
+    TInt res = file->Open(fs, KTestDrmFileName1, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
+
+    // Trying to re-open the file - this should fail.
+    res = file->Open(fs, KTestDrmFileName1, EFileRead);
+    CHECKWITHNOTE(res == KErrInUse, "Open, unexpected result: "<<res);
+
+    res = file->SetSize(10);
+    CHECKWITHNOTE(res == KErrNotSupported, "SetSize, unexpected result: "<<res);
+
+    _LIT8(KDummy, "dummy");
+    res = file->Write(KDummy);
+    CHECKWITHNOTE(res == KErrNotSupported, "Write, unexpected result: "<<res);
+
+    res = file->Write(KDummy, 1);
+    CHECKWITHNOTE(res == KErrNotSupported, "Write2, unexpected result: "<<res);
+
+    res = file->Write(1, KDummy);
+    CHECKWITHNOTE(res == KErrNotSupported, "Write3, unexpected result: "<<res);
+
+    res = file->Write(1, KDummy, 1);
+    CHECKWITHNOTE(res == KErrNotSupported, "Write4, unexpected result: "<<res);
+
+    res = file->Lock(1, 1);
+    CHECKWITHNOTE(res == KErrNotSupported, "Lock, unexpected result: "<<res);
+
+    res = file->UnLock(1, 1);
+    CHECKWITHNOTE(res == KErrNotSupported, "UnLock, unexpected result: "<<res);
+
+    res = file->Flush();
+    CHECKWITHNOTE(res == KErrNotSupported, "Flush, unexpected result: "<<res);
+
+    file->Close();
+}
+
+// Testing file reading that is DRM protected. Reading through CAF. This test
+// requires that rights object is added to key store. See readme.txt for
+// instructions.
+TEST(TestJavaFile, readDrmProtectedFile)
+{
+    // Open the DRM protected jar file.
+    getFileAndPort(port, file);
+    TInt res = file->Open(fs, KTestDrmEncryptedFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
+
+    // Read the content and compare.
+    TBuf8<45> bufR;
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    res = bufR.Compare(KDrmText);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    file->Close();
+
+    // Open the DRM protected file having .jar extension. This will not be
+    // opened through CAF and therefore the content should not be in decrypted
+    // format.
+    res = file->Open(fs, KTestDrmEncryptedInstallerFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file2: "<<res);
+
+    // Read the content.
+    bufR.Zero();
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
+
+    // Check that we were not able to read the content as decrypted format.
+    res = bufR.Compare(KDrmText);
+    CHECKWITHNOTE(res != 0, "Compare failed2: "<<res);
+    file->Close();
+}
+
+// This test tests that the jar file that is DRM protected can be opended in
+// decrypted format when the process name is JavaInstaller.
+TEST(TestJavaFile, readDrmProtectedInstaller)
+{
+    // OpenC uses statics and those will cause a memory allocations that will
+    // be interpreted as a leak.
+    EXPECT_N_LEAKS(33);
+
+    // Faking the process name to be JavaInstaller.
+    _LIT(KJavaInstallerProcessName, "JavaInstaller");
+    _LIT(KOrigProcessName, "testjvmport");
+    // Rename installer process and main thread.
+    TInt res = User::RenameProcess(KJavaInstallerProcessName);
+
+    // Open the DRM protected jar file.
+    getFileAndPort(port, file);
+    res = file->Open(fs, KTestDrmEncryptedInstallerFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
+
+    // Read the content and check that it was in decrypted format.
+    TBuf8<45> bufR;
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
+    res = bufR.Compare(KDrmText);
+    CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
+
+    file->Close();
+
+    // Testing that opening of jar file that is not DRM protected succeeds.
+    res = file->Open(fs, KTestJarFileName, EFileRead);
+    CHECKWITHNOTE(res == KErrNone, "Failed to open file2: "<<res);
+
+    // Read the content and compare.
+    bufR.Zero();
+    res = file->Read(bufR);
+    CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
+    res = bufR.Compare(KJarText);
+    CHECKWITHNOTE(res == 0, "Compare failed2: "<<res);
+    file->Close();
+
+    // Testing that opening nonexisting file leads to error.
+    res = file->Open(fs, _L("c:\\nonexisting.jar"), EFileRead);
+    CHECKWITHNOTE(res == KErrNotFound, "Open, unexpected result: "<<res);
+    file->Close();
+
+    // Rename the process name to original.
+    User::RenameProcess(KOrigProcessName);
+}