javacommons/jvms/nativeportlayer/tsrc/src/testjvmnativeport.cpp
author hgs
Fri, 15 Oct 2010 12:29:39 +0300
changeset 80 d6dafc5d983f
permissions -rw-r--r--
v2.2.19_1

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