--- /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);
+}