javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/InstallerEngineTest.java
changeset 21 2a9601315dfc
child 35 85266cc22c7f
child 60 6c158198356e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javainstaller/installer/tsrc/javasrc/com/nokia/mj/impl/installer/InstallerEngineTest.java	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,1144 @@
+/*
+* Copyright (c) 2008-2009 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:
+*
+*/
+
+
+package com.nokia.mj.impl.installer;
+
+import com.nokia.mj.impl.installer.storagehandler.SuiteInfo;
+import com.nokia.mj.impl.installer.utils.FileUtils;
+import com.nokia.mj.impl.installer.utils.InstallerMain;
+import com.nokia.mj.impl.installer.utils.Log;
+import com.nokia.mj.impl.installer.utils.Platform;
+import com.nokia.mj.impl.installer.utils.PlatformUid;
+import com.nokia.mj.impl.rt.support.ApplicationInfo;
+import com.nokia.mj.impl.utils.InstallerErrorMessage;
+import com.nokia.mj.impl.utils.InstallerDetailedErrorMessage;
+import com.nokia.mj.impl.utils.OtaStatusCode;
+import com.nokia.mj.impl.utils.Uid;
+
+import java.io.IOException;
+import java.util.Vector;
+
+import j2meunit.framework.Test;
+import j2meunit.framework.TestCase;
+import j2meunit.framework.TestMethod;
+import j2meunit.framework.TestSuite;
+
+/**
+ * Test cases for InstallerEngine.
+ */
+public class InstallerEngineTest extends TestCase implements InstallerMain
+{
+    private InstallerTestUtils iItu = null;
+    private Vector iDefaultOptions = null;
+
+    // Begin j2meunit test framework setup
+
+    public void installerMain(String[] aArgs)
+    {
+        TestSuite suite = new TestSuite(this.getClass().getName());
+
+        if (Platform.isLinux())
+        {
+            // In S60 this would be interactive test, so disable it there.
+            suite.addTest(new InstallerEngineTest("testTrustedJadNonSilentOk", new TestMethod()
+            {
+                public void run(TestCase tc)
+                {
+                    ((InstallerEngineTest)tc).testTrustedJadNonSilentOk();
+                }
+            }));
+        }
+
+        suite.addTest(new InstallerEngineTest("testMidletMessageOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testMidletMessageOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testMidletMessageNok", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testMidletMessageNok();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testTrustedJadOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testTrustedJadOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testTrustedJarOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testTrustedJarOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("test3AppsOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).test3AppsOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJadOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJadOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJarOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJarOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJadHttpRedirectOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJadHttpRedirectOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJarHttpRedirectOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJarHttpRedirectOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJadHttpRedirectCountExceeded", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJadHttpRedirectCountExceeded();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJadHttpAuthNok", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJadHttpAuthNok();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJadHttpAuthOk", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJadHttpAuthOk();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testDownloadJadCancel", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testDownloadJadCancel();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testJadNoName", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testJadNoName();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testInvalidJar", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testInvalidJar();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testInvalidPush", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testInvalidPush();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testNoJad", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testNoJad();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testNoJar", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testNoJar();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testNoJavaBinRoot", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testNoJavaBinRoot();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testBlockUninstall", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testBlockUninstall();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testOutputCommands", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testOutputCommands();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testApplicationInfo", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testApplicationInfo();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testInstallOptions", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testInstallOptions();
+            }
+        }));
+
+        suite.addTest(new InstallerEngineTest("testInstallAuthAndBig", new TestMethod()
+        {
+            public void run(TestCase tc)
+            {
+                ((InstallerEngineTest)tc).testInstallAuthAndBig();
+            }
+        }));
+
+        com.nokia.mj.impl.utils.OmjTestRunner.run(suite);
+    }
+
+    public InstallerEngineTest()
+    {
+    }
+
+    public InstallerEngineTest(String aTestName, TestMethod aTestMethod)
+    {
+        super(aTestName, aTestMethod);
+    }
+
+    public void assertFalse(String aMsg, boolean aCondition)
+    {
+        assertTrue(aMsg, !aCondition);
+    }
+
+    // End j2meunit test framework setup
+
+    protected void setUp()
+    {
+        iItu = new InstallerTestUtils();
+        iItu.init();
+        iDefaultOptions = new Vector();
+        iDefaultOptions.addElement("-silent");
+        iDefaultOptions.addElement("-iap=1");
+    }
+
+    protected void tearDown()
+    {
+        iItu.destroy();
+    }
+
+    public void assertResult(int aResult, int aExpectedResult)
+    {
+        assertTrue("Installer returned " + aResult +
+                   ", expected " + aExpectedResult,
+                   aResult == aExpectedResult);
+    }
+
+    public void assertResult(String aMsg, int aResult, int aExpectedResult)
+    {
+        assertTrue(aMsg + ": Installer returned " + aResult +
+                   ", expected " + aExpectedResult,
+                   aResult == aExpectedResult);
+    }
+
+    public void assertNoIsDir()
+    {
+        assertTrue("IntegrityService root dir exists",
+                   !FileUtils.exists(FileUtils.getIntegrityServiceRoot()));
+    }
+
+    /**
+     * Makes installation, update and uninstallation for given application.
+     * Does the following steps:
+     * install with cancellation and check that app is not installed,
+     * install and check that app is installed,
+     * update with cancellation and check that app is installed,
+     * update and check that app is installed,
+     * update again and check that app is installed,
+     * uninstall with cancellation and check that app is still installed,
+     * uninstall and check that app is no longer installed.
+     */
+    public void doInstallUninstall(String aFilename, boolean aIsJad, Vector aInstallOptions)
+    {
+        SuiteInfo suite = null;
+        try
+        {
+            suite = iItu.getNameVendor(aFilename, aIsJad);
+            assertTrue("getNameVendor returns null for " + aFilename,
+                       suite != null);
+        }
+        catch (IOException ioe)
+        {
+            ioe.printStackTrace();
+            assertTrue("getNameVendor throws exception for " + aFilename +
+                       ": " + ioe, false);
+        }
+        doInstallUninstall(suite, aFilename, aIsJad, aInstallOptions);
+    }
+
+    /**
+     * Makes installation, update and uninstallation for given application.
+     * Does the following steps:
+     * install with cancellation and check that app is not installed,
+     * install and check that app is installed,
+     * update with cancellation and check that app is installed,
+     * update and check that app is installed,
+     * uninstall with cancellation and check that app is still installed,
+     * uninstall and check that app is no longer installed.
+     */
+    public void doInstallUninstall(SuiteInfo aSuite, String aFilename, boolean aIsJad, Vector aInstallOptions)
+    {
+        // Construct install command arguments.
+        Vector installOptions = new Vector();
+        installOptions.addElement("install");
+        if (aIsJad)
+        {
+            installOptions.addElement("-jad=" + aFilename);
+        }
+        else
+        {
+            installOptions.addElement("-jar=" + aFilename);
+        }
+        if (aInstallOptions != null)
+        {
+            for (int i = 0; i < aInstallOptions.size(); i++)
+            {
+                installOptions.addElement(aInstallOptions.elementAt(i));
+            }
+        }
+        String[] args = new String[installOptions.size()];
+        installOptions.copyInto(args);
+        installOptions.addElement("-forcecancel");
+        String[] cancelArgs = new String[installOptions.size()];
+        installOptions.copyInto(cancelArgs);
+
+        // Check that suite is not installed.
+        assertFalse("exists before installation: " + aFilename, iItu.exists(aSuite));
+
+        // Install with cancellation.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: install with cancellation " + aFilename);
+        int result = Installer.mainWithResult(cancelArgs);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception.
+        assertTrue("cancelled installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_UNEXPECTED_ERR,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INTERNAL_ERROR));
+        // Check that suite is not installed.
+        assertFalse("exists after cancelled install: " + aFilename, iItu.exists(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // Install.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: install " + aFilename);
+        result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_NONE);
+        // Check exception.
+        assertTrue("installation returns exception",
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid not found after installation", Installer.iInstalledApps.length > 0);
+        // Check that suite is installed.
+        assertTrue("does not exist after installation: " + aFilename, iItu.exists(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // List.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: list -v");
+        result = Installer.mainWithResult(new String[] { "list", "-v" });
+        assertResult(result, Installer.ERR_NONE);
+        Log.logOut("InstallerEngineTest.doInstallUninstall: list -otastatus");
+        result = Installer.mainWithResult(new String[] { "list", "-otastatus" });
+        assertResult(result, Installer.ERR_NONE);
+
+        // Update with cancellation.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: update with cancellation " + aFilename);
+        result = Installer.mainWithResult(cancelArgs);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception.
+        assertTrue("cancelled update returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_UNEXPECTED_ERR,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INTERNAL_ERROR));
+        // Check that suite is installed.
+        assertTrue("does not exists after cancelled update: " + aFilename, iItu.exists(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // Update.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: update " + aFilename);
+        result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_NONE);
+        // Check exception.
+        assertTrue("update returns exception",
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid not found after update", Installer.iInstalledApps.length > 0);
+        // Check that suite is installed.
+        assertTrue("does not exist after update: " + aFilename, iItu.exists(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // Update again.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: 2nd update " + aFilename);
+        result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_NONE);
+        // Check exception.
+        assertTrue("2nd update returns exception",
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid not found after 2nd update", Installer.iInstalledApps.length > 0);
+        // Check that suite is installed.
+        assertTrue("does not exist after 2nd update: " + aFilename, iItu.exists(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // Construct uninstall command arguments.
+        Vector uninstallOptions = new Vector();
+        uninstallOptions.addElement("uninstall");
+        uninstallOptions.addElement("-uid=" + Installer.iInstalledApps[0]);
+        if (aInstallOptions != null)
+        {
+            for (int i = 0; i < aInstallOptions.size(); i++)
+            {
+                uninstallOptions.addElement(aInstallOptions.elementAt(i));
+            }
+        }
+        args = new String[uninstallOptions.size()];
+        uninstallOptions.copyInto(args);
+        uninstallOptions.addElement("-forcecancel");
+        cancelArgs = new String[uninstallOptions.size()];
+        uninstallOptions.copyInto(cancelArgs);
+
+        // Uninstall with cancellation.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: uninstall with cancellation " + aFilename);
+        result = Installer.mainWithResult(cancelArgs);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception.
+        assertTrue("cancelled uninstallation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.UNINST_UNEXPECTED_ERR,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INTERNAL_ERROR));
+        // Check that suite is still installed.
+        assertTrue("does not exist after cancelled uninstall: " + aFilename, iItu.exists(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // Uninstall.
+        Log.logOut("InstallerEngineTest.doInstallUninstall: uninstall " + aFilename);
+        result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_NONE);
+        // Check exception.
+        assertTrue("installation returns exception",
+                   Installer.getExecuteException() == null);
+        // Check that suite is no longer installed.
+        assertTrue("exists after uninstallation: " + aFilename, iItu.doesNotExist(aSuite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+    }
+
+    public void testTrustedJadNonSilentOk()
+    {
+        Log.logOut("InstallerEngineTest.testTrustedJadNonSilentOk begins");
+        doInstallUninstall(iItu.getTestDir() + "HelloWorld.jad", true, null);
+    }
+
+    public void testMidletMessageOk()
+    {
+        Log.logOut("InstallerEngineTest.testMidletMessageOk begins");
+        doInstallUninstall(new SuiteInfo("HelloWorld", "Nokia"),
+                           iItu.getTestDir() + "helloworldmm.jar",
+                           false, iDefaultOptions);
+    }
+
+    public void testMidletMessageNok()
+    {
+        Log.logOut("InstallerEngineTest.testMidletMessageNok begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jar=" + iItu.getTestDir() + "helloworldmm_invalid.jar",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CORRUPT_PKG,
+                    InstallerDetailedErrorMessage.ATTR_HANDLING_FAILED,
+                    OtaStatusCode.INVALID_JAR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testTrustedJadOk()
+    {
+        Log.logOut("InstallerEngineTest.testTrustedJadOk begins");
+        doInstallUninstall(iItu.getTestDir() + "HelloWorld.jad", true, iDefaultOptions);
+    }
+
+    public void testTrustedJarOk()
+    {
+        Log.logOut("InstallerEngineTest.testTrustedJarOk begins");
+        doInstallUninstall(iItu.getTestDir() + "HelloWorld.jar", false, iDefaultOptions);
+    }
+
+    public void test3AppsOk()
+    {
+        Log.logOut("InstallerEngineTest.test3AppsOk begins");
+        doInstallUninstall(iItu.getTestDir() + "HelloWorld_3_midlets.jad", true, iDefaultOptions);
+    }
+
+    public void testDownloadJadOk()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJadOk begins");
+        SuiteInfo suite = new SuiteInfo("JBenchmark2", "Kishonti LP");
+        doInstallUninstall(suite, "http://195.134.231.83:7070/omjserver/resources/omj/T00000900_JBenchmark2_gcf.jsp", true, iDefaultOptions);
+    }
+
+    public void testDownloadJarOk()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJarOk begins");
+        SuiteInfo suite = new SuiteInfo("JBenchmark2", "Kishonti LP");
+        doInstallUninstall(suite, "http://195.134.231.83:7070/omjserver/resources/omj/JBenchmark2.jar", false, iDefaultOptions);
+    }
+
+    public void testDownloadJadHttpRedirectOk()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJadHttpRedirectOk begins");
+        SuiteInfo suite = new SuiteInfo("JBenchmark2", "Kishonti LP");
+        doInstallUninstall(suite, "http://195.134.231.83:7070/RedirectServlet/redirect?name=JBenchmark2.jad&count=5", true, iDefaultOptions);
+    }
+
+    public void testDownloadJarHttpRedirectOk()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJarHttpRedirectOk begins");
+        SuiteInfo suite = new SuiteInfo("JBenchmark2", "Kishonti LP");
+        doInstallUninstall(suite, "http://195.134.231.83:7070/RedirectServlet/redirect?name=JBenchmark2.jar", false, iDefaultOptions);
+    }
+
+    public void testDownloadJadHttpAuthOk()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJadHttpAuthOk begins");
+        SuiteInfo suite = new SuiteInfo("DS_Snow_http_auth", "DS_Effects");
+        iDefaultOptions.addElement("-username=guest");
+        iDefaultOptions.addElement("-password=guest");
+        doInstallUninstall(suite, "http://195.134.231.83:7070/httpauth/DS_Snow_http_auth.jad", true, iDefaultOptions);
+    }
+
+    public void testDownloadJadHttpAuthNok()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJadHttpAuthNok begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=http://195.134.231.83:7070/httpauth/DS_Snow_http_auth.jad",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_CANCEL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CANCEL,
+                    InstallerDetailedErrorMessage.NO_MSG,
+                    OtaStatusCode.USER_CANCELLED));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testDownloadJadHttpRedirectCountExceeded()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJadHttpRedirectCountExceeded begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=http://195.134.231.83:7070/RedirectServlet/redirect?name=JBenchmark2.jad&count=6",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_NO_NET,
+                    InstallerDetailedErrorMessage.NO_NET,
+                    OtaStatusCode.LOSS_OF_SERVICE));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testDownloadJadCancel()
+    {
+        Log.logOut("InstallerEngineTest.testDownloadJadCancel begins");
+        Log.log("InstallerEngineTest.testDownloadJadCancel: start");
+        // Create a thread which sleeps a moment and then cancels installation.
+        new Thread(new Runnable()
+        {
+            public void run()
+            {
+                Log.log("InstallerEngineTest.testDownloadJadCancel: canceler thread starts to wait");
+                try
+                {
+                    Thread.sleep(12000);
+                }
+                catch (InterruptedException ie)
+                {
+                }
+                Log.log("InstallerEngineTest.testDownloadJadCancel: canceler thread calls cancel");
+                Installer.cancel();
+            }
+        }).start();
+
+        // Start installation which downloads a large file.
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=http://195.134.231.83:7070/omjserver/resources/omj/T00000900_JBenchmark2_8mb_gcf.jsp",
+        };
+        Log.log("InstallerEngineTest.testDownloadJadCancel: installation starts");
+        int result = Installer.mainWithResult(args);
+        Log.log("InstallerEngineTest.testDownloadJadCancel: installation returned");
+        // Check result code.
+        assertResult(result, Installer.ERR_CANCEL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CANCEL,
+                    InstallerDetailedErrorMessage.NO_MSG,
+                    OtaStatusCode.USER_CANCELLED));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+        Log.log("InstallerEngineTest.testDownloadJadCancel: end");
+    }
+
+    public void testNoJad()
+    {
+        Log.logOut("InstallerEngineTest.testNoJad begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=" + iItu.getTestDir() + "HelloWorld_nonexisting.jad",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CORRUPT_PKG,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INVALID_DESCRIPTOR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testNoJar()
+    {
+        Log.logOut("InstallerEngineTest.testNoJar begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jar=" + iItu.getTestDir() + "HelloWorld_nonexisting.jar",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CORRUPT_PKG,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INVALID_JAR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testJadNoName()
+    {
+        Log.logOut("InstallerEngineTest.testJadNoName begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=" + iItu.getTestDir() + "HelloWorld_NoName.jad",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CORRUPT_PKG,
+                    InstallerDetailedErrorMessage.ATTR_MISSING,
+                    OtaStatusCode.INVALID_DESCRIPTOR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testInvalidJar()
+    {
+        Log.logOut("InstallerEngineTest.testInvalidJar begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jar=" + iItu.getTestDir() + "HelloWorld_NoName.jad",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_CORRUPT_PKG,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INVALID_JAR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testInvalidPush()
+    {
+        Log.logOut("InstallerEngineTest.testInvalidPush begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=" + iItu.getTestDir() + "HelloWorld_invalid_push.jad",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_PUSH_REG_ERR,
+                    InstallerDetailedErrorMessage.ATTR_UNSUPPORTED,
+                    OtaStatusCode.PUSH_REGISTRATION_FAILURE));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testNoJavaBinRoot()
+    {
+        Log.logOut("InstallerEngineTest.testNoJavaBinRoot begins");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=" + iItu.getTestDir() + "HelloWorld_nonexisting.jad",
+        };
+        String javaBinRootName = "JAVA_BIN_ROOT";
+        String oldJavaBinRoot = System.getProperty(javaBinRootName);
+        System.setProperty(javaBinRootName, "");
+        int result = Installer.mainWithResult(args);
+        System.setProperty(javaBinRootName, oldJavaBinRoot);
+        // Check result code.
+        assertResult(result, Installer.ERR_NOT_FOUND);
+        // Check exception
+        assertTrue("installation returned exception " +
+                   Installer.getExecuteException(),
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    public void testBlockUninstall()
+    {
+        Log.logOut("InstallerEngineTest.testBlockUninstall begins");
+        // Get suite info for block uninstall test application.
+        String filename = iItu.getTestDir() + "HelloWorld_block_uninstall.jad";
+        SuiteInfo suite = null;
+        try
+        {
+            suite = iItu.getNameVendor(filename, true);
+            assertTrue("getNameVendor returns null for " + filename,
+                       suite != null);
+        }
+        catch (IOException ioe)
+        {
+            ioe.printStackTrace();
+            assertTrue("getNameVendor throws exception for " + filename +
+                       ": " + ioe, false);
+        }
+
+        Log.logOut("InstallerEngineTest.testBlockUninstall: Install application whose uninstallation is blocked.");
+        String[] args = new String[]
+        {
+            "install", "-silent",
+            "-jad=" + filename,
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult("Installing block uninstall app failed",
+                     result, Installer.ERR_NONE);
+        // Check exception.
+        assertTrue("installation returns exception",
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid not found after installation", Installer.iInstalledApps.length > 0);
+        // Check that suite is installed.
+        assertTrue("does not exist after installation", iItu.exists(suite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // Save installed application uid.
+        Uid appUid = Installer.iInstalledApps[0];
+
+        // List application info.
+        Log.logOut("InstallerEngineTest.testBlockUninstall: list -v");
+        result = Installer.mainWithResult(new String[] { "list", "-v" });
+        assertResult(result, Installer.ERR_NONE);
+
+        Log.logOut("InstallerEngineTest.testBlockUninstall: Try to uninstall application whose uninstallation is blocked.");
+        String[] uninstallArgs = new String[]
+        {
+            "uninstall", "-silent", "-uid=" + appUid,
+        };
+        result = Installer.mainWithResult(uninstallArgs);
+        // Check result code.
+        assertResult("Uninstalling app whose uninstallation was blocked did not fail",
+                     result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("blocked uninstallation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.UNINST_NOT_ALLOWED,
+                    InstallerDetailedErrorMessage.UNINST_BLOCKED,
+                    OtaStatusCode.USER_CANCELLED));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+        // Check that suite is installed.
+        assertTrue("does not exist after blocked uninstallation", iItu.exists(suite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        Log.logOut("InstallerEngineTest.testBlockUninstall: Upgrade application with a version whose uninstallation is not blocked.");
+        args = new String[]
+        {
+            "install", "-silent",
+            "-jad=" + iItu.getTestDir() + "HelloWorld_unblock_uninstall.jad",
+        };
+        result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult("Upgrading app whose uninstallation was blocked failed",
+                     result, Installer.ERR_NONE);
+        // Check exception.
+        assertTrue("installation returns exception",
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid not found after installation", Installer.iInstalledApps.length > 0);
+        // Check that suite is installed.
+        assertTrue("does not exist after installation", iItu.exists(suite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+        // Check that uid is the same after upgrade.
+        assertTrue("appUid differs after upgrade, old=" + appUid +
+                   ", new=" + Installer.iInstalledApps[0],
+                   appUid.equals(Installer.iInstalledApps[0]));
+
+        // List application info.
+        Log.logOut("InstallerEngineTest.testBlockUninstall: list -v");
+        result = Installer.mainWithResult(new String[] { "list", "-v" });
+        assertResult(result, Installer.ERR_NONE);
+
+        Log.logOut("InstallerEngineTest.testBlockUninstall: Uninstall application whose uninstallation is no longer blocked.");
+        result = Installer.mainWithResult(uninstallArgs);
+        // Check result code.
+        assertResult("Uninstalling app whose uninstallation is no longer blocked failed",
+                     result, Installer.ERR_NONE);
+        // Check exception
+        assertTrue("blocked uninstallation returns exception",
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+        // Check that suite is uninstalled.
+        assertTrue("exists after unblocked uninstallation", !iItu.exists(suite));
+        // Check that IntegrityService root dir does not exist.
+        assertNoIsDir();
+
+        // List application info.
+        Log.logOut("InstallerEngineTest.testBlockUninstall: list -v");
+        result = Installer.mainWithResult(new String[] { "list", "-v" });
+        assertResult(result, Installer.ERR_NONE);
+
+    }
+
+    public void testOutputCommands()
+    {
+        Log.logOut("InstallerEngineTest.testOutputCommands begins");
+        // Some parameter combinations which cause an error to be returned.
+        int result = Installer.mainWithResult(new String[] { });
+        assertResult(result, Installer.ERR_NOT_FOUND);
+        result = Installer.mainWithResult(new String[] { "list", "-nosystemexit" });
+        assertResult(result, Installer.RET_NO_SYSTEM_EXIT);
+        result = Installer.mainWithResult(new String[] { "list", "-storage=APPLICATION_PACKAGE_TABLE" });
+        assertResult(result, Installer.ERR_GENERAL);
+
+        // Parameter combinations that can be executed successfully.
+        callInstallerOk(new String[] { "unknowncommand" });
+        callInstallerOk(new String[] { "version" });
+        callInstallerOk(new String[] { "help" });
+        callInstallerOk(new String[] { "help", "unknowncommand" });
+        callInstallerOk(new String[] { "help", "help" });
+        callInstallerOk(new String[] { "help", "version" });
+        callInstallerOk(new String[] { "help", "install" });
+        callInstallerOk(new String[] { "help", "uninstall" });
+        callInstallerOk(new String[] { "help", "uninstallall" });
+        callInstallerOk(new String[] { "help", "list" });
+        callInstallerOk(new String[] { "help", "launch" });
+        callInstallerOk(new String[] { "help", "poll" });
+        callInstallerOk(new String[] { "help", "rollback" });
+        callInstallerOk(new String[] { "help", "test" });
+        callInstallerOk(new String[] { "list" });
+        callInstallerOk(new String[] { "list", "-v" });
+        callInstallerOk(new String[] { "list", "-storage" });
+        callInstallerOk(new String[] { "list", "-otastatus" });
+        callInstallerOk(new String[] { "list", "-systemproperties" });
+        callInstallerOk(new String[] { "launch", "-nouid" });
+        callInstallerOk(new String[] { "launch", "-uid=invaliduid" });
+        callInstallerOk(new String[] { "uninstallall" });
+        callInstallerOk(new String[] { "unregister" });
+        callInstallerOk(new String[] { "test", "-nomainclass" });
+    }
+
+    public void testApplicationInfo()
+    {
+        Log.logOut("InstallerEngineTest.testApplicationInfo begins");
+        ApplicationInfo applicationInfo = ApplicationInfo.getInstance();
+        assertTrue("ApplicationInfo.getName returns incorrect value " +
+                   applicationInfo.getName(),
+                   "JavaInstaller".equals(applicationInfo.getName()));
+        assertTrue("ApplicationInfo.getSuiteName returns incorrect value " +
+                   applicationInfo.getSuiteName(),
+                   "JavaInstaller".equals(applicationInfo.getSuiteName()));
+        assertTrue("ApplicationInfo.getVendor returns incorrect value " +
+                   applicationInfo.getVendor(),
+                   "Nokia".equals(applicationInfo.getVendor()));
+        assertTrue("ApplicationInfo.getRuntimeType returns incorrect value " +
+                   applicationInfo.getRuntimeType(),
+                   "INSTALLER".equals(applicationInfo.getRuntimeType()));
+        assertTrue("ApplicationInfo.getProtectionDomain returns incorrect value " +
+                   applicationInfo.getProtectionDomain(),
+                   ApplicationInfo.MANUFACTURER_DOMAIN.equals
+                   (applicationInfo.getProtectionDomain()));
+        assertTrue("ApplicationInfo.getUid returns incorrect value " +
+                   applicationInfo.getUid(),
+                   PlatformUid.createUid("0x2001843A").equals
+                   (applicationInfo.getUid()));
+        assertTrue("ApplicationInfo.getSuiteUid returns incorrect value " +
+                   applicationInfo.getSuiteUid(),
+                   applicationInfo.getUid().equals
+                   (applicationInfo.getSuiteUid()));
+        assertTrue("ApplicationInfo.getAttribute returns incorrect value " +
+                   applicationInfo.getAttribute(null),
+                   applicationInfo.getAttribute(null) == null);
+
+        try
+        {
+            String mainClass = applicationInfo.getMainClass();
+            assertTrue("ApplicationInfo.getMainClass did not throw exception", false);
+        }
+        catch (RuntimeException rte)
+        {
+            // expected exception
+        }
+        catch (Exception ex)
+        {
+            assertTrue("ApplicationInfo.getMainClass threw unexpected exception: " + ex, false);
+        }
+    }
+
+    public void testInstallOptions()
+    {
+        Log.logOut("InstallerEngineTest.testInstallOptions begins");
+        // Install with all possible options.
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-forcecancel",
+            "-jad=" + iItu.getTestDir() + "HelloWorld.jad",
+            "-sourceurl=http://nohost/HelloWorld.jad",
+            "-charset=UTF-8",
+            "-iap=1",
+            "-drive=C",
+            "-upgrade=yes",
+            "-upgrade_data=no",
+            "-overwrite=yes",
+            "-untrusted=yes",
+            "-ocsp=yes",
+            "-ignore_ocsp_warnings=no",
+            "-download=no",
+            "-username=username",
+            "-password=password",
+            "-proxyhost=proxyhost",
+            "-proxyport=proxyport",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_UNEXPECTED_ERR,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INTERNAL_ERROR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+
+        // Install with both jad and jar options should fail.
+        args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=" + iItu.getTestDir() + "HelloWorld.jad",
+            "-jar=" + iItu.getTestDir() + "HelloWorld.jar",
+        };
+        result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_GENERAL);
+        // Check exception
+        assertTrue("failed installation returns incorrect exception " +
+                   Installer.getExecuteException(),
+                   iItu.isExceptionReason
+                   (Installer.getExecuteException(),
+                    InstallerErrorMessage.INST_UNEXPECTED_ERR,
+                    InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                    OtaStatusCode.INTERNAL_ERROR));
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+    }
+
+    /**
+     * Tests subsequent application installations. First installs an application
+     * which requires authentication and then downloads a big application.
+     */
+    public void testInstallAuthAndBig()
+    {
+        Log.logOut("InstallerEngineTest.testInstallAuthAndBig begins");
+        // Do first installation with doInstallUninstall helper
+        SuiteInfo suite = new SuiteInfo("DS_Snow_http_auth", "DS_Effects");
+        iDefaultOptions.addElement("-username=guest");
+        iDefaultOptions.addElement("-password=guest");
+        doInstallUninstall(suite, "http://195.134.231.83:7070/httpauth/DS_Snow_http_auth.jad", true, iDefaultOptions);
+
+        // Then start installation which downloads a large file.
+        Log.log("InstallerEngineTest.testInstallAuthAndBig begin to install big app");
+        String[] args = new String[]
+        {
+            "install",
+            "-silent",
+            "-jad=http://195.134.231.83:7070/omjserver/resources/omj/T00000900_JBenchmark2_8mb_gcf.jsp",
+        };
+        int result = Installer.mainWithResult(args);
+        // Check result code.
+        assertResult(result, Installer.ERR_NONE);
+        // Check exception
+        assertTrue("installation returned exception " +
+                   Installer.getExecuteException(),
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid should exist", Installer.iInstalledApps.length == 1);
+    }
+
+    private int callInstallerOk(String[] aArgs)
+    {
+        int result = Installer.mainWithResult(aArgs);
+        // Check result code.
+        assertResult(result, Installer.ERR_NONE);
+        // Check exception
+        assertTrue("installation returned exception " +
+                   Installer.getExecuteException(),
+                   Installer.getExecuteException() == null);
+        assertTrue("installed app uid should not exist", Installer.iInstalledApps.length == 0);
+        return result;
+    }
+}