javacommons/jvms/nativeportlayer/tsrc/src/testjvmnativeport.cpp
changeset 80 d6dafc5d983f
equal deleted inserted replaced
78:71ad690e91f5 80:d6dafc5d983f
       
     1 /*
       
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Tests for function server
       
    15 *
       
    16 */
       
    17 
       
    18 #include <e32base.h>
       
    19 #include "TestHarness.h"
       
    20 #include "testutils.h"
       
    21 
       
    22 #include "mjvmnativeportlayer.h"
       
    23 #include "mjavafile.h"
       
    24 
       
    25 TEST_GROUP(TestJvmPortPriority)
       
    26 {
       
    27     TEST_SETUP()
       
    28     {
       
    29     }
       
    30 
       
    31     TEST_TEARDOWN()
       
    32     {
       
    33     }
       
    34 };
       
    35 
       
    36 TEST_GROUP(TestJvmPort)
       
    37 {
       
    38     TEST_SETUP()
       
    39     {
       
    40     }
       
    41 
       
    42     TEST_TEARDOWN()
       
    43     {
       
    44     }
       
    45 };
       
    46 
       
    47 _LIT(KTestFileName, "c:\\javaFileTest.txt");
       
    48 _LIT(KTestReplaceFileName, "c:\\javaFileReplaceTest.txt");
       
    49 _LIT(KTestDrmFileName1, "c:\\test.dm");
       
    50 _LIT(KTestDrmFileName2, "c:\\test.dcf");
       
    51 _LIT(KTestJarFileName, "c:\\test.jar");
       
    52 _LIT(KTestDrmEncryptedFileName, "c:\\testDrm.dcf");
       
    53 _LIT(KTestDrmEncryptedInstallerFileName, "c:\\testDrm.jar");
       
    54 
       
    55 _LIT8(KTestText, "Testing..");
       
    56 _LIT8(KTestText2, "Testing2..");
       
    57 _LIT8(KJarText, "This is a jar file.");
       
    58 _LIT8(KDrmText, "This is a drm protected file.");
       
    59 _LIT8(KDM_CONTENT, "This is a dm file.");
       
    60 _LIT8(KDCF_CONTENT, "This is a dcf file.");
       
    61 
       
    62 TEST_GROUP(TestJavaFile)
       
    63 {
       
    64     RFs fs;
       
    65     javaruntime::MJvmNativePortLayer* port;
       
    66     javaruntime::MJavaFile* file;
       
    67     TEST_SETUP()
       
    68     {
       
    69         port = 0;
       
    70         fs.Connect();
       
    71         fs.Delete(KTestFileName);
       
    72         fs.Delete(KTestReplaceFileName);
       
    73     }
       
    74 
       
    75     TEST_TEARDOWN()
       
    76     {
       
    77         delete port;
       
    78         delete file;
       
    79         fs.Close();
       
    80     }
       
    81 };
       
    82 // #undef CHECKWITHNOTE
       
    83 // #define CHECKWITHNOTE(x, y) CHECK(x)
       
    84 void checkPriority(const TThreadPriority& expected,
       
    85                    const TThreadPriority& recieved)
       
    86 {
       
    87     CHECKWITHNOTE(expected == recieved, "Priority check failed. Expecting: "<<expected<<", received: "<<recieved);
       
    88 }
       
    89 
       
    90 // Testing priority table.
       
    91 TEST(TestJvmPortPriority, priorityTest)
       
    92 {
       
    93     int i = 0;
       
    94     checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
       
    95     checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
       
    96     checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
       
    97     checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
       
    98     checkPriority(EPriorityMuchLess, javaruntime::GetSingleThreadPriority(i++));
       
    99     checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
       
   100     checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
       
   101     checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
       
   102     checkPriority(EPriorityLess, javaruntime::GetSingleThreadPriority(i++));
       
   103     checkPriority(EPriorityNormal, javaruntime::GetSingleThreadPriority(i++));
       
   104     checkPriority(EPriorityNormal, javaruntime::GetSingleThreadPriority(i++));
       
   105     checkPriority(EPriorityMore, javaruntime::GetSingleThreadPriority(i++));
       
   106 
       
   107 }
       
   108 void getPort(javaruntime::MJvmNativePortLayer*& port)
       
   109 {
       
   110     TRAPD(err, port = javaruntime::GetPortLayerL());
       
   111     CHECKWITHNOTE(err == KErrNone, "Error in getting MJvmNativePortLayer: "<<err);
       
   112     CHECKWITHNOTE(port, "Got null pointer when getting port layer");
       
   113 }
       
   114 
       
   115 void getFileAndPort(javaruntime::MJvmNativePortLayer*& port, javaruntime::MJavaFile*& file)
       
   116 {
       
   117     if (port == 0)
       
   118     {
       
   119         getPort(port);
       
   120     }
       
   121     TRAPD(err, file = port->GetJavaFileL());
       
   122     CHECKWITHNOTE(err == KErrNone, "Error in getting MJavaFile: "<<err);
       
   123     CHECKWITHNOTE(file, "Got null pointer when getting Java file");
       
   124 }
       
   125 
       
   126 _LIT(KOutpuFullDir,"c:\\logs\\java\\");
       
   127 _LIT(KOutpuFullDir2,"c:\\logs\\java2\\");
       
   128 _LIT(KConsole,"c:\\logs\\java\\vmconsole.txt");
       
   129 
       
   130 // Testing log writings works.
       
   131 TEST(TestJvmPort, logWritingTest)
       
   132 {
       
   133     RFs fs;
       
   134     fs.Connect();
       
   135     TUint dummy;
       
   136     TBool dirExists = fs.Att(KOutpuFullDir, dummy) == KErrNone;
       
   137 
       
   138     TInt res;
       
   139 
       
   140     // If the c:\logs\java directory exixts rename it to java2
       
   141     if (dirExists)
       
   142     {
       
   143         res = fs.Rename(KOutpuFullDir, KOutpuFullDir2);
       
   144         CHECKWITHNOTE(res == KErrNone, "Rename failed: "<<res);
       
   145     }
       
   146 
       
   147     // Testing that writing to nonexisting dir works.
       
   148     javaruntime::MJvmNativePortLayer* port;
       
   149     getPort(port);
       
   150     TRAP(res, port->WriteToStdoutL(_L8("StdOutTestNonExisting\n")));
       
   151     CHECKWITHNOTE(res == KErrNone, "Error in writing to std.out: "<<res);
       
   152     TRAP(res, port->WriteToStderrL(_L8("StdErrTestNonExisting\n")));
       
   153     CHECKWITHNOTE(res == KErrNone, "Error in writing to std.err: "<<res);
       
   154 
       
   155     CHECKWITHNOTE(fs.Att(KOutpuFullDir, dummy) != KErrNone, "The logs\\java dir should not be present: ");
       
   156 
       
   157     delete port;
       
   158     port = 0;
       
   159 
       
   160     // Create c:\logs\java directory.
       
   161     res = fs.MkDir(KOutpuFullDir);
       
   162     CHECKWITHNOTE(res == KErrNone, "MkDir failed: "<<res);
       
   163 
       
   164     // Needs to reinit the port, because the logs dir exists now.
       
   165     getPort(port);
       
   166     TRAP(res, port->WriteToStdoutL(_L8("StdOutTest\n")));
       
   167     CHECKWITHNOTE(res == KErrNone, "Error in writing to std.out: "<<res);
       
   168     TRAP(res, port->WriteToStderrL(_L8("StdErrTest\n")));
       
   169     CHECKWITHNOTE(res == KErrNone, "Error in writing to std.err: "<<res);
       
   170 
       
   171     // Check that the vmconsole.txt contains correct content.
       
   172     RFile file;
       
   173     res = file.Open(fs, KConsole, EFileShareReadersOrWriters);
       
   174     CHECKWITHNOTE(res == KErrNone, "file open failed: "<<res);
       
   175     TBuf8<30> bufR;
       
   176     res = file.Read(bufR);
       
   177     CHECKWITHNOTE(res == KErrNone, "file read failed: "<<res);
       
   178     file.Close();
       
   179     res = bufR.Compare(_L8("StdOutTest\nStdErrTest\n"));
       
   180     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   181 
       
   182     // Delete the vmconsole.txt. RFileLogger seems to keep the file open for
       
   183     // a while.
       
   184     int tryCount = 0;
       
   185     do
       
   186     {
       
   187         res = fs.Delete(KConsole);
       
   188         if (res == KErrInUse)
       
   189         {
       
   190             tryCount++;
       
   191             User::After(500 * 1000);
       
   192         }
       
   193     }
       
   194     while (res == KErrInUse && tryCount < 200);
       
   195 
       
   196     CHECKWITHNOTE(res == 0, "Delete failed: "<<res);
       
   197 
       
   198     // Delete c:\logs\java directory.
       
   199     res = fs.RmDir(KOutpuFullDir);;
       
   200     CHECKWITHNOTE(res == 0, "RmDir failed: "<<res);
       
   201 
       
   202     // If the c:\logs\java directory exixted before the tests, return it back.
       
   203     if (dirExists)
       
   204     {
       
   205         res = fs.Rename(KOutpuFullDir2, KOutpuFullDir);
       
   206         CHECKWITHNOTE(res == 0, "Rename2 failed: "<<res);
       
   207     }
       
   208     fs.Close();
       
   209     delete port;
       
   210 }
       
   211 
       
   212 // Testing that opening a file works ok and when trying to re-open KErrInUse
       
   213 // is returned.
       
   214 TEST(TestJavaFile, fileOpen)
       
   215 {
       
   216     getFileAndPort(port, file);
       
   217     int res = file->Open(fs, KTestJarFileName, EFileRead);
       
   218     CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
       
   219 
       
   220     res = file->Open(fs, KTestJarFileName, EFileRead);
       
   221     CHECKWITHNOTE(res == KErrInUse, "Open, unexpected result: "<<res);
       
   222     file->Close();
       
   223 }
       
   224 
       
   225 // Testing that opening unexisting files.
       
   226 TEST(TestJavaFile, fileOpenUnexisting)
       
   227 {
       
   228     getFileAndPort(port, file);
       
   229     int res = file->Open(fs, _L("c:\\nonexisting.txt"), EFileRead);
       
   230     CHECKWITHNOTE(res == KErrNotFound, "Open, unexpected result: "<<res);
       
   231 
       
   232     res = file->Open(fs, _L("c:\\nonexisting.dcf"), EFileRead);
       
   233     CHECKWITHNOTE(res == KErrNotFound, "Open2, unexpected result: "<<res);
       
   234 
       
   235     res = file->Open(fs, _L("c:\\nonexisting.txt"), EFileRead);
       
   236     CHECKWITHNOTE(res == KErrNotFound, "Open3, unexpected result: "<<res);
       
   237     file->Close();
       
   238 
       
   239     res = file->Open(fs, _L("c:\\nonexisting.dcf"), EFileRead);
       
   240     CHECKWITHNOTE(res == KErrNotFound, "Open4, unexpected result: "<<res);
       
   241 
       
   242     file->Close();
       
   243 }
       
   244 
       
   245 // Testing that creation of file to unaccessable location fails.
       
   246 TEST(TestJavaFile, fileCreateUnAccessible)
       
   247 {
       
   248     getFileAndPort(port, file);
       
   249     int res = file->Create(fs, _L("z:\\nonexisting.txt"), EFileRead);
       
   250     CHECKWITHNOTE(res == KErrAccessDenied, "Create, unexpected result: "<<res);
       
   251     file->Close();
       
   252 }
       
   253 
       
   254 // Testing that Replacing of file to unaccessable location fails.
       
   255 TEST(TestJavaFile, fileReplaceUnAccessible)
       
   256 {
       
   257     getFileAndPort(port, file);
       
   258     int res = file->Replace(fs, _L("z:\\nonexisting.txt"), EFileRead);
       
   259     CHECKWITHNOTE(res == KErrAccessDenied, "Replace, unexpected result: "<<res);
       
   260     file->Close();
       
   261 }
       
   262 
       
   263 // Testing that file creation succceeds. As a side test testing that Open,
       
   264 // Create and replace will fail when using file object that is in use.
       
   265 TEST(TestJavaFile, fileCreate1)
       
   266 {
       
   267     getFileAndPort(port, file);
       
   268     int res = file->Create(fs, KTestFileName, EFileRead);
       
   269     CHECKWITHNOTE(res == KErrNone, "Failed to create file: "<<res);
       
   270     TUint dummy;
       
   271     CHECKWITHNOTE(fs.Att(KTestFileName, dummy) == KErrNone, "File does't exist");
       
   272 
       
   273     res = file->Open(fs, KTestFileName, EFileRead);
       
   274     CHECKWITHNOTE(res == KErrInUse, "ReOpen, unexpected result: "<<res);
       
   275 
       
   276     res = file->Replace(fs, KTestFileName, EFileRead);
       
   277     CHECKWITHNOTE(res == KErrInUse, "ReReplace, unexpected result: "<<res);
       
   278 
       
   279     res = file->Create(fs, KTestFileName, EFileRead);
       
   280     CHECKWITHNOTE(res == KErrInUse, "ReCreate, unexpected result: "<<res);
       
   281 
       
   282     file->Close();
       
   283 }
       
   284 
       
   285 // Testing read, write flush and seek for normal files.
       
   286 TEST(TestJavaFile, fileCreateWriteReads)
       
   287 {
       
   288     getFileAndPort(port, file);
       
   289 
       
   290     // Create the test file.
       
   291     int res = file->Create(fs, KTestFileName, EFileRead);
       
   292     CHECKWITHNOTE(res == KErrNone, "Failed to create file: "<<res);
       
   293     TUint dummy;
       
   294     CHECKWITHNOTE(fs.Att(KTestFileName, dummy) == KErrNone, "File does't exist");
       
   295 
       
   296     TBuf8<15> bufR;
       
   297     TBuf8<15> bufW;
       
   298     bufW.Append(KTestText);
       
   299 
       
   300     // Write content to buffer.
       
   301     res = file->Write(bufW);
       
   302     CHECKWITHNOTE(res == KErrNone, "Write failed: "<<res);
       
   303 
       
   304     // Flush content to buffer.
       
   305     res = file->Flush();
       
   306     CHECKWITHNOTE(res == KErrNone, "Flush failed: "<<res);
       
   307 
       
   308     // Set current position to the start of the file.
       
   309     TInt pos = 0;
       
   310     res = file->Seek(ESeekStart, pos);
       
   311     CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
       
   312 
       
   313     // Read the whole content of the file.
       
   314     res = file->Read(bufR);
       
   315     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   316 
       
   317     // Compare the the read and written are the same.
       
   318     res = bufW.Compare(bufR);
       
   319     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   320 
       
   321     // Read a portion of the content from the file.
       
   322     bufR.Zero();
       
   323     pos = 2;
       
   324     res = file->Seek(ESeekStart, pos);
       
   325     CHECKWITHNOTE(res == KErrNone, "Seek2 failed: "<<res);
       
   326     res = file->Read(bufR, 5);
       
   327     CHECKWITHNOTE(res == KErrNone, "Read2 failed: "<<res);
       
   328     res = bufW.Mid(2,5).Compare(bufR);
       
   329     CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
       
   330 
       
   331     // Read a portion of the content from the file. Testing
       
   332     // ESeekEnd.
       
   333     bufR.Zero();
       
   334     pos = -6;
       
   335     res = file->Seek(ESeekEnd, pos);
       
   336     CHECKWITHNOTE(res == KErrNone, "Seek3 failed: "<<res);
       
   337     res = file->Read(bufR, 4);
       
   338     CHECKWITHNOTE(res == KErrNone, "Read3 failed: "<<res);
       
   339     res = bufW.Mid(3,4).Compare(bufR);
       
   340     CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
       
   341 
       
   342     file->Close();
       
   343 }
       
   344 
       
   345 // Testing all variants of Write methods, Size, and SetSize. As a side test
       
   346 // testing that Open, Create and replace will fail when using file object
       
   347 // that is in use.
       
   348 TEST(TestJavaFile, fileCreateWritesRead)
       
   349 {
       
   350     getFileAndPort(port, file);
       
   351     int res = file->Create(fs, KTestFileName, EFileRead);
       
   352     CHECKWITHNOTE(res == KErrNone, "Failed to create file: "<<res);
       
   353     TUint dummy;
       
   354     CHECKWITHNOTE(fs.Att(KTestFileName, dummy) == KErrNone, "File does't exist");
       
   355 
       
   356     res = file->Open(fs, KTestFileName, EFileRead);
       
   357     CHECKWITHNOTE(res == KErrInUse, "ReOpen, unexpected result: "<<res);
       
   358 
       
   359     res = file->Replace(fs, KTestFileName, EFileRead);
       
   360     CHECKWITHNOTE(res == KErrInUse, "ReReplace, unexpected result: "<<res);
       
   361 
       
   362     res = file->Create(fs, KTestFileName, EFileRead);
       
   363     CHECKWITHNOTE(res == KErrInUse, "ReCreate, unexpected result: "<<res);
       
   364 
       
   365 
       
   366     // Write some content to file.
       
   367     TBuf8<45> bufR;
       
   368     TBuf8<15> bufW;
       
   369     bufW.Append(KTestText);
       
   370     res = file->Write(bufW);
       
   371     CHECKWITHNOTE(res == KErrNone, "Write failed: "<<res);
       
   372     res = file->Write(bufW, 8);  // Testing..Testing.
       
   373     CHECKWITHNOTE(res == KErrNone, "Write failed2: "<<res);
       
   374     res = file->Write(2, bufW);  // TeTesting..sting.
       
   375     CHECKWITHNOTE(res == KErrNone, "Write failed3: "<<res);
       
   376     res = file->Write(8, bufW, 2); // TeTestinTe.sting.
       
   377     CHECKWITHNOTE(res == KErrNone, "Write failed4: "<<res);
       
   378     TInt pos = 0;
       
   379     res = file->Seek(ESeekEnd, pos);
       
   380     CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
       
   381     res = file->Write(bufW, 4);  // TeTestinTe.sting.Test
       
   382     CHECKWITHNOTE(res == KErrNone, "Write failed5: "<<res);
       
   383     file->Flush();
       
   384     CHECKWITHNOTE(res == KErrNone, "Flush failed: "<<res);
       
   385 
       
   386     // Set current position to the start of the file.
       
   387     pos = 0;
       
   388     res = file->Seek(ESeekStart, pos);
       
   389     CHECKWITHNOTE(res == KErrNone, "Seek failed2: "<<res);
       
   390 
       
   391     // Read the whole content of the file.
       
   392     res = file->Read(bufR);
       
   393     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   394     _LIT8(KTestRes, "TeTestinTe.sting.Test");
       
   395 
       
   396     // Compare that the file content is correct.
       
   397     res = bufR.Compare(KTestRes);
       
   398     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   399 
       
   400     // Testing that Size works ok.
       
   401     TInt size;
       
   402     res = file->Size(size);
       
   403     CHECKWITHNOTE(res == 0, "Size call failed: "<<res);
       
   404     CHECKWITHNOTE(size == 21, "Size failed: "<<size);
       
   405 
       
   406     // Testing that SetSize works ok.
       
   407     res = file->SetSize(10);
       
   408     CHECKWITHNOTE(size == 21, "SetSize failed: "<<res);
       
   409 
       
   410     // Read the content ater size change.
       
   411     bufR.Zero();
       
   412     res = file->Seek(ESeekStart, pos);
       
   413     res = file->Read(bufR);
       
   414     CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
       
   415 
       
   416     // The new size should be smaller that before SetSize.
       
   417     pos = 0;
       
   418     res = file->Size(size);
       
   419     CHECKWITHNOTE(res == 0, "Size call failed2: "<<res);
       
   420     CHECKWITHNOTE(size == 10, "Size failed2: "<<size);
       
   421 
       
   422     // Compare that the file content is correct.
       
   423     res = bufR.Compare(KTestRes().Left(10));
       
   424     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   425 
       
   426     file->Close();
       
   427 }
       
   428 
       
   429 // Testing Replace method. As a side test testing that Open, Create and
       
   430 // replace will fail when using file object that is in use.
       
   431 TEST(TestJavaFile, fileReplace)
       
   432 {
       
   433     getFileAndPort(port, file);
       
   434 
       
   435     // Checking that file that we are about to create doesn't exist.
       
   436     TUint dummy;
       
   437     CHECKWITHNOTE(fs.Att(KTestReplaceFileName, dummy) != KErrNone, "File exists before");
       
   438 
       
   439     // Using Replace to create the file.
       
   440     int res = file->Replace(fs, KTestReplaceFileName, EFileRead);
       
   441     CHECKWITHNOTE(res == KErrNone, "Failed to Replace file: "<<res);
       
   442     CHECKWITHNOTE(fs.Att(KTestReplaceFileName, dummy) == KErrNone, "File does't exist");
       
   443 
       
   444     res = file->Open(fs, KTestReplaceFileName, EFileRead);
       
   445     CHECKWITHNOTE(res == KErrInUse, "ReOpen, unexpected result: "<<res);
       
   446 
       
   447     res = file->Replace(fs, KTestReplaceFileName, EFileRead);
       
   448     CHECKWITHNOTE(res == KErrInUse, "ReReplace, unexpected result: "<<res);
       
   449 
       
   450     res = file->Create(fs, KTestReplaceFileName, EFileRead);
       
   451     CHECKWITHNOTE(res == KErrInUse, "ReCreate, unexpected result: "<<res);
       
   452 
       
   453     // Write content to created file.
       
   454     TBuf8<45> bufR;
       
   455     TBuf8<15> bufW;
       
   456     bufW.Append(KTestText);
       
   457     res = file->Write(bufW);
       
   458     CHECKWITHNOTE(res == KErrNone, "Write failed: "<<res);
       
   459 
       
   460     // Read the content and compare that the content is correct.
       
   461     TInt pos = 0;
       
   462     res = file->Seek(ESeekStart, pos);
       
   463     CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
       
   464     res = file->Read(bufR);
       
   465     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   466     res = bufR.Compare(KTestText);
       
   467     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   468     file->Close();
       
   469 
       
   470     // Replace the existing file.
       
   471     res = file->Replace(fs, KTestReplaceFileName, EFileRead);
       
   472     CHECKWITHNOTE(res == KErrNone, "Failed to Replace file2: "<<res);
       
   473     CHECKWITHNOTE(fs.Att(KTestReplaceFileName, dummy) == KErrNone, "File does't exist2");
       
   474 
       
   475     // Check that the file size is zero i.e. a new file.
       
   476     TInt size;
       
   477     res = file->Size(size);
       
   478     CHECKWITHNOTE(res == 0, "Size call failed: "<<res);
       
   479     CHECKWITHNOTE(size == 0, "Size failed: "<<size);
       
   480 
       
   481     // Write content to recreated file.
       
   482     bufW.Zero();
       
   483     bufR.Zero();
       
   484     bufW.Append(KTestText2);
       
   485     res = file->Write(bufW);
       
   486     CHECKWITHNOTE(res == KErrNone, "Write failed2: "<<res);
       
   487 
       
   488     // Read the content and compare that the content is correct.
       
   489     res = file->Seek(ESeekStart, pos);
       
   490     CHECKWITHNOTE(res == KErrNone, "Seek failed2: "<<res);
       
   491     res = file->Read(bufR);
       
   492     CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
       
   493     res = bufR.Compare(KTestText2);
       
   494     CHECKWITHNOTE(res == 0, "Compare failed2: "<<res);
       
   495     file->Close();
       
   496 }
       
   497 
       
   498 // Testing Lock and Unlock methods.
       
   499 TEST(TestJavaFile, fileLock)
       
   500 {
       
   501     getFileAndPort(port, file);
       
   502 
       
   503     // Creating two files objects pointing to same directory.
       
   504     int res = file->Create(fs, KTestFileName, EFileWrite | EFileShareAny);
       
   505     CHECKWITHNOTE(res == KErrNone, "Failed to Create file: "<<res);
       
   506 
       
   507     javaruntime::MJavaFile* file2;
       
   508     getFileAndPort(port, file2);
       
   509     res = file2->Open(fs, KTestFileName, EFileRead | EFileShareAny);
       
   510     CHECKWITHNOTE(res == KErrNone, "Failed to Open file: "<<res);
       
   511 
       
   512     // Write some content.
       
   513     res = file->Write(KTestText);
       
   514     CHECKWITHNOTE(res == KErrNone, "Failed to write to file: "<<res);
       
   515 
       
   516     // Write some content.
       
   517     res = file->Lock(3, 4);
       
   518     CHECKWITHNOTE(res == KErrNone, "Failed to lock the file: "<<res);
       
   519 
       
   520     // Lock the area
       
   521     TInt pos = 4;
       
   522     res = file2->Seek(ESeekStart, pos);
       
   523     CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
       
   524 
       
   525     // Check that locked the area is unaccessable.
       
   526     TBuf8<45> bufR;
       
   527     res = file2->Read(bufR, 2);
       
   528     CHECKWITHNOTE(res == KErrLocked, "Expecting locked when reading: "<<res);
       
   529 
       
   530     // Unlock the area
       
   531     res = file->UnLock(3, 4);
       
   532     CHECKWITHNOTE(res == KErrNone, "Failed to unlock the file: "<<res);
       
   533 
       
   534     // Check that unlocked the area is now accessable.
       
   535     res = file2->Read(bufR, 2);
       
   536     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   537     res = KTestText().Mid(4,2).Compare(bufR);
       
   538     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   539 
       
   540     file->Close();
       
   541     file2->Close();
       
   542     delete file2;
       
   543 }
       
   544 
       
   545 
       
   546 // Testing that jar file can be opened. This test is for checking a branch in
       
   547 // IsDrm() method.
       
   548 TEST(TestJavaFile, openJar)
       
   549 {
       
   550     getFileAndPort(port, file);
       
   551 
       
   552     // Open the jar file.
       
   553     TInt res = file->Open(fs, KTestJarFileName, EFileRead);
       
   554     CHECKWITHNOTE(res == KErrNone, "Open, unexpected result: "<<res);
       
   555 
       
   556     // Read and compare content.
       
   557     TBuf8<45> bufR;
       
   558     res = file->Read(bufR);
       
   559     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   560     res = bufR.Compare(KJarText);
       
   561     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   562     file->Close();
       
   563 }
       
   564 
       
   565 // Testing the file open through CAF with files that are not DRM protected.
       
   566 void testOpenCafFile(RFs& fs,
       
   567                      javaruntime::MJavaFile* file,
       
   568                      const TDesC& fileName,
       
   569                      const TDesC8& compareString)
       
   570 {
       
   571     // Open file using CAF.
       
   572     TInt res = file->Open(fs, fileName, EFileRead);
       
   573     CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
       
   574 
       
   575     // Read the content and compare.
       
   576     TBuf8<45> bufR;
       
   577     res = file->Read(bufR);
       
   578     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   579     res = bufR.Compare(compareString);
       
   580     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   581 
       
   582     // Read the partial content and compare. Using ESeekStart.
       
   583     bufR.Zero();
       
   584     TInt pos = 2;
       
   585     res = file->Seek(ESeekStart, pos);
       
   586     CHECKWITHNOTE(res == KErrNone, "Seek failed: "<<res);
       
   587     res = file->Read(bufR, 5);
       
   588     CHECKWITHNOTE(res == KErrNone, "Read2 failed: "<<res);
       
   589     res = compareString.Mid(2,5).Compare(bufR);
       
   590     CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
       
   591 
       
   592     // Read the partial content and compare. Using ESeekEnd.
       
   593     bufR.Zero();
       
   594     pos = -6;
       
   595     res = file->Seek(ESeekEnd, pos);
       
   596     CHECKWITHNOTE(res == KErrNone, "Seek3 failed: "<<res);
       
   597     res = file->Read(bufR, 4);
       
   598     CHECKWITHNOTE(res == KErrNone, "Read3 failed: "<<res);
       
   599     res = compareString.Mid(compareString.Length() - 6, 4).Compare(bufR);
       
   600     CHECKWITHNOTE(res == 0, "Compare2 failed: "<<res);
       
   601 
       
   602     // Check that Size method works also in case of CAF.
       
   603     TInt size;
       
   604     res = file->Size(size);
       
   605     CHECKWITHNOTE(res == 0, "Size call failed: "<<res);
       
   606     CHECKWITHNOTE(size == compareString.Length(), "Size failed: "<<size);
       
   607 
       
   608     file->Close();
       
   609 }
       
   610 
       
   611 
       
   612 // Testing CAF with .dm file extension.
       
   613 TEST(TestJavaFile, readDrmDmFile)
       
   614 {
       
   615     getFileAndPort(port, file);
       
   616     testOpenCafFile(fs, file, KTestDrmFileName1, KDM_CONTENT);
       
   617 }
       
   618 
       
   619 // Testing CAF with .dcf file extension.
       
   620 TEST(TestJavaFile, readDrmDcfFile)
       
   621 {
       
   622     getFileAndPort(port, file);
       
   623     testOpenCafFile(fs, file, KTestDrmFileName2, KDCF_CONTENT);
       
   624 }
       
   625 
       
   626 // Testing methods that are not supported by CAF. Expecting correct error codes.
       
   627 TEST(TestJavaFile, readDrmNotSupportedMethods)
       
   628 {
       
   629     // Open file using CAF.
       
   630     getFileAndPort(port, file);
       
   631     TInt res = file->Open(fs, KTestDrmFileName1, EFileRead);
       
   632     CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
       
   633 
       
   634     // Trying to re-open the file - this should fail.
       
   635     res = file->Open(fs, KTestDrmFileName1, EFileRead);
       
   636     CHECKWITHNOTE(res == KErrInUse, "Open, unexpected result: "<<res);
       
   637 
       
   638     res = file->SetSize(10);
       
   639     CHECKWITHNOTE(res == KErrNotSupported, "SetSize, unexpected result: "<<res);
       
   640 
       
   641     _LIT8(KDummy, "dummy");
       
   642     res = file->Write(KDummy);
       
   643     CHECKWITHNOTE(res == KErrNotSupported, "Write, unexpected result: "<<res);
       
   644 
       
   645     res = file->Write(KDummy, 1);
       
   646     CHECKWITHNOTE(res == KErrNotSupported, "Write2, unexpected result: "<<res);
       
   647 
       
   648     res = file->Write(1, KDummy);
       
   649     CHECKWITHNOTE(res == KErrNotSupported, "Write3, unexpected result: "<<res);
       
   650 
       
   651     res = file->Write(1, KDummy, 1);
       
   652     CHECKWITHNOTE(res == KErrNotSupported, "Write4, unexpected result: "<<res);
       
   653 
       
   654     res = file->Lock(1, 1);
       
   655     CHECKWITHNOTE(res == KErrNotSupported, "Lock, unexpected result: "<<res);
       
   656 
       
   657     res = file->UnLock(1, 1);
       
   658     CHECKWITHNOTE(res == KErrNotSupported, "UnLock, unexpected result: "<<res);
       
   659 
       
   660     res = file->Flush();
       
   661     CHECKWITHNOTE(res == KErrNotSupported, "Flush, unexpected result: "<<res);
       
   662 
       
   663     file->Close();
       
   664 }
       
   665 
       
   666 // Testing file reading that is DRM protected. Reading through CAF. This test
       
   667 // requires that rights object is added to key store. See readme.txt for
       
   668 // instructions.
       
   669 TEST(TestJavaFile, readDrmProtectedFile)
       
   670 {
       
   671     // Open the DRM protected jar file.
       
   672     getFileAndPort(port, file);
       
   673     TInt res = file->Open(fs, KTestDrmEncryptedFileName, EFileRead);
       
   674     CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
       
   675 
       
   676     // Read the content and compare.
       
   677     TBuf8<45> bufR;
       
   678     res = file->Read(bufR);
       
   679     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   680     res = bufR.Compare(KDrmText);
       
   681     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   682 
       
   683     file->Close();
       
   684 
       
   685     // Open the DRM protected file having .jar extension. This will not be
       
   686     // opened through CAF and therefore the content should not be in decrypted
       
   687     // format.
       
   688     res = file->Open(fs, KTestDrmEncryptedInstallerFileName, EFileRead);
       
   689     CHECKWITHNOTE(res == KErrNone, "Failed to open file2: "<<res);
       
   690 
       
   691     // Read the content.
       
   692     bufR.Zero();
       
   693     res = file->Read(bufR);
       
   694     CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
       
   695 
       
   696     // Check that we were not able to read the content as decrypted format.
       
   697     res = bufR.Compare(KDrmText);
       
   698     CHECKWITHNOTE(res != 0, "Compare failed2: "<<res);
       
   699     file->Close();
       
   700 }
       
   701 
       
   702 // This test tests that the jar file that is DRM protected can be opended in
       
   703 // decrypted format when the process name is JavaInstaller.
       
   704 TEST(TestJavaFile, readDrmProtectedInstaller)
       
   705 {
       
   706     // OpenC uses statics and those will cause a memory allocations that will
       
   707     // be interpreted as a leak.
       
   708     EXPECT_N_LEAKS(33);
       
   709 
       
   710     // Faking the process name to be JavaInstaller.
       
   711     _LIT(KJavaInstallerProcessName, "JavaInstaller");
       
   712     _LIT(KOrigProcessName, "testjvmport");
       
   713     // Rename installer process and main thread.
       
   714     TInt res = User::RenameProcess(KJavaInstallerProcessName);
       
   715 
       
   716     // Open the DRM protected jar file.
       
   717     getFileAndPort(port, file);
       
   718     res = file->Open(fs, KTestDrmEncryptedInstallerFileName, EFileRead);
       
   719     CHECKWITHNOTE(res == KErrNone, "Failed to open file: "<<res);
       
   720 
       
   721     // Read the content and check that it was in decrypted format.
       
   722     TBuf8<45> bufR;
       
   723     res = file->Read(bufR);
       
   724     CHECKWITHNOTE(res == KErrNone, "Read failed: "<<res);
       
   725     res = bufR.Compare(KDrmText);
       
   726     CHECKWITHNOTE(res == 0, "Compare failed: "<<res);
       
   727 
       
   728     file->Close();
       
   729 
       
   730     // Testing that opening of jar file that is not DRM protected succeeds.
       
   731     res = file->Open(fs, KTestJarFileName, EFileRead);
       
   732     CHECKWITHNOTE(res == KErrNone, "Failed to open file2: "<<res);
       
   733 
       
   734     // Read the content and compare.
       
   735     bufR.Zero();
       
   736     res = file->Read(bufR);
       
   737     CHECKWITHNOTE(res == KErrNone, "Read failed2: "<<res);
       
   738     res = bufR.Compare(KJarText);
       
   739     CHECKWITHNOTE(res == 0, "Compare failed2: "<<res);
       
   740     file->Close();
       
   741 
       
   742     // Testing that opening nonexisting file leads to error.
       
   743     res = file->Open(fs, _L("c:\\nonexisting.jar"), EFileRead);
       
   744     CHECKWITHNOTE(res == KErrNotFound, "Open, unexpected result: "<<res);
       
   745     file->Close();
       
   746 
       
   747     // Rename the process name to original.
       
   748     User::RenameProcess(KOrigProcessName);
       
   749 }