{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## The Testing Notebook used to run all of the tests from cryptoguard.py\n", "\n", "### Note: If this is run on MyBinder the AndroidSDK is not yet setup thus Android tests will all fail" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python Version: 3\n" ] } ], "source": [ "import sys;\n", "\n", "version = str(sys.version[0])\n", "print('Python Version: ' + version)\n", "if version == '2':\n", " print('This script requires python3')\n", " sys.exit(0)\n", "#Only run this once\n", "import os;os.chdir('../')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "JAVA_HOME: 1.8.0_252\n", "JAVA7_HOME: 1.7.0\n" ] } ], "source": [ "def getVersion(env):\n", " java_var = {}\n", " with open(os.path.join(os.environ[env],'release'), 'r') as foil:\n", " for line in [x for x in foil if '=' in x]:\n", " name, value = line.split('=',1)\n", " java_var[name.strip().replace('\"','')] = value.strip().replace('\"','')\n", " return java_var\n", "def getMajorVersion(env):\n", " return int(getVersion(env)['JAVA_VERSION'].split('.')[1])\n", "\n", "print('JAVA_HOME: ' + str(getVersion('JAVA_HOME')['JAVA_VERSION']))\n", "print('JAVA7_HOME: ' + str(getVersion('JAVA7_HOME')['JAVA_VERSION']))\n", "\n", "if getMajorVersion('JAVA_HOME') != 8:\n", " print('Cryptoguard requires Java 8 JDK')\n", " sys.exit(0)\n", "if getMajorVersion('JAVA7_HOME') != 7:\n", " print('Cryptoguard requires access to Java 7 JDK')\n", " sys.exit(0)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook\n", "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patch\n", "\n", "sys.path.append('../')\n", "import cryptosouple as cryptoguard\n", "\n", "saveFigs = False\n", "plotNum = 0\n", "\n", "def getBaseFig():\n", " global plotNum\n", " plotNum = plotNum + 1\n", " return plt.figure(plotNum)\n", "\n", "def getFig():\n", " return getBaseFig().add_subplot(111)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "liveTests, skippedTests, grouping = cryptoguard.TestUtils.getHelpTests()\n", "\n", "groupLive = sum([grouping[x]['Active'] for x in grouping.keys()])\n", "groupSkip = sum([grouping[x]['Skipped'] for x in grouping.keys()])\n", "grouping['Other'] = {\n", " 'Active':liveTests - groupLive,\n", " 'Skipped':skippedTests - groupSkip\n", "}" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "activeTests = [int(grouping[x]['Active']) for x in grouping.keys()]\n", "\n", "def func(pct, allvals):\n", " absolute = int(pct/100.*np.sum(allvals))\n", " return \"{:.1f}%: ({:d} Tests)\".format(pct, absolute)\n", "\n", "axss = getFig()\n", "wedges, texts, autotexts = axss.pie(activeTests, \n", " labels=grouping.keys(), \n", " autopct=lambda pct: func(pct, activeTests), \n", " shadow=True, \n", " startangle=0)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "totalTests = [int(grouping[x]['Active']) + int(grouping[x]['Skipped']) for x in grouping.keys()]\n", "\n", "def func(pct, allvals):\n", " absolute = int(pct/100.*np.sum(allvals))\n", " return \"{:.1f}%: ({:d} Tests)\".format(pct, absolute)\n", "\n", "axss = getFig()\n", "wedges, texts, autotexts = axss.pie(totalTests, \n", " labels=grouping.keys(), \n", " autopct=lambda pct: func(pct, totalTests), \n", " shadow=True, \n", " startangle=0)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running the test: EntryPointTest_APK.main_TestableApk_Default\n", "=========================\n", "Passed\n" ] } ], "source": [ "cryptoguard.TestUtils.test(passedtests='EntryPointTest_APK.main_TestableApk_Default')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cleaning the project\n", "=========================\n", "Cleaning the project using | ./gradlew clean | Removing the Generated files\n", "Removing the build file\n", "Successful\n", "Custom command spotlessApply\n", "=========================\n", "Building the project using | ./gradlew spotlessApply| Successful | 6 (s)\n", "Building the project\n", "=========================\n", "Building the project using | ./gradlew clean build -x test | Successful | 14 (s)\n", "Copying the jar file to the current directory | Successful\n", "Running all of the available tests.\n", "=========================\n", "Custom command test\n", "=========================\n", "Building the project using | ./gradlew test| The build broke, exiting now\n" ] }, { "ename": "SystemExit", "evalue": "0", "output_type": "error", "traceback": [ "An exception has occurred, use %tb to see the full traceback.\n", "\u001b[0;31mSystemExit\u001b[0m\u001b[0;31m:\u001b[0m 0\n" ] } ], "source": [ "#Running the tests\n", "streamTests = False\n", "testResults = cryptoguard.TestUtils.tests()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "replica = {\n", " 'APK': {},\n", " 'JAR': {},\n", " 'JAVA': {},\n", " 'SOURCE': {},\n", " 'CLASS': {},\n", " 'OTHER':{}\n", " }\n", "#results = {\n", " #'APK': {\n", " #'Pass':[\n", " #{\n", " #'name': name,\n", " #'timeTaken':time,\n", " #'timesReRun':timeReRun\n", " #},\n", " #],\n", " #'Fail':[\n", " #{\n", " #'name': name,\n", " #'timeTaken':time,\n", " #'timesReRun':timeReRun\n", " #},\n", " #],\n", " #'Skip':[\n", " #{\n", " #'name': name,\n", " #'timeTaken':time,\n", " #'timesReRun':timeReRun\n", " #},\n", " #]\n", " #}\n", "#},\n", "for key, value in testResults.items():\n", " passArr = [int(x['timeTaken']) for x in value['Pass']]\n", " replica[key]['PassCount'] = len(passArr)\n", " replica[key]['PassTime'] = sum(passArr)\n", " \n", " failArr = [int(x['timeTaken']) for x in value['Fail']]\n", " replica[key]['FailCount'] = len(failArr)\n", " replica[key]['FailTime'] = sum(failArr)\n", " \n", " replica[key]['Skipped'] = len([x for x in value['Skip']])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "totalTime = [int(replica[x]['PassTime'] + replica[x]['FailTime']) for x in replica.keys()]\n", "\n", "def func(pct, allvals):\n", " absolute = int(pct/100.*np.sum(allvals))\n", " return \"{:d} s\".format(absolute)\n", "\n", "axss = getFig()\n", "wedges, texts, autotexts = axss.pie(totalTime, \n", " labels=replica.keys(), \n", " autopct=lambda pct: func(pct, totalTime), \n", " shadow=True, \n", " startangle=0)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "totalCounts = [int(replica[x]['PassCount'] + replica[x]['FailCount']) for x in replica.keys()]\n", "\n", "def func(pct, allvals):\n", " absolute = int(pct/100.*np.sum(allvals))\n", " return \"{:d} tests\".format(absolute)\n", "\n", "axss = getFig()\n", "wedges, texts, autotexts = axss.pie(totalCounts, \n", " labels=replica.keys(), \n", " autopct=lambda pct: func(pct, totalCounts), \n", " shadow=True, \n", " startangle=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "groups = np.arange(len(replica.keys()))\n", "groupwidth = .2\n", "trend = 50\n", "rangeLine = range(0, 100)\n", "\n", "Passed = [float(replica[x]['PassTime']) for x in replica.keys()]\n", "#ant.reverse()\n", "\n", "Failed = [float(replica[x]['FailTime']) for x in replica.keys()]\n", "#sbt.reverse()\n", "\n", "ax = getFig()\n", "\n", "plt.bar(groups + (groupwidth*0), Failed, color='red', width=groupwidth, label='Failed')\n", "plt.bar(groups + (groupwidth*1), Passed, color='green', width=groupwidth, label='Passed')\n", "\n", "plt.legend(loc='best')\n", "ax.set_title(\"Time taken for test type\")\n", "ax.set_xticks([x + groupwidth*1.5 for x in np.arange(6)])\n", "ax.set_xticklabels(replica.keys())\n", "ax.set_xlabel('Test Type')\n", "ax.set_ylabel('Time Taken (s)')\n", "plt.show()\n", "if saveFigs:\n", " plt.savefig('Resources/Imgs/BuildToolTrend.png')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "groups = np.arange(len(replica.keys()))\n", "groupwidth = .2\n", "trend = 50\n", "rangeLine = range(0, 100)\n", "\n", "Passed = [int(replica[x]['PassCount']) for x in replica.keys()]\n", "#ant.reverse()\n", "\n", "Skipped = [int(replica[x]['Skipped']) for x in replica.keys()]\n", "#sbt.reverse()\n", "\n", "Failed = [int(replica[x]['FailCount']) for x in replica.keys()]\n", "#sbt.reverse()\n", "\n", "ax = getFig()\n", "\n", "plt.bar(groups + (groupwidth*0), Failed, color='red', width=groupwidth, label='Failed')\n", "plt.bar(groups + (groupwidth*1), Skipped, color='yellow', width=groupwidth, label='Skipped')\n", "plt.bar(groups + (groupwidth*2), Passed, color='green', width=groupwidth, label='Passed')\n", "\n", "plt.legend(loc='best')\n", "ax.set_title(\"Test Count for test type\")\n", "ax.set_xticks([x + groupwidth*1.5 for x in np.arange(6)])\n", "ax.set_xticklabels(replica.keys())\n", "ax.set_xlabel('Test Type')\n", "ax.set_ylabel('Test counts')\n", "plt.show()\n", "if saveFigs:\n", " plt.savefig('Resources/Imgs/BuildToolTrend.png')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "groups = np.arange(len(replica.keys()))\n", "groupwidth = .2\n", "trend = 50\n", "rangeLine = range(0, 100)\n", "\n", "def smartDiv(x,y):\n", " if y == 0:\n", " y = 1\n", " return x/y\n", "\n", "Passed = [int(smartDiv(replica[x]['PassTime'],replica[x]['PassCount'])) for x in replica.keys()]\n", "#ant.reverse()\n", "\n", "Failed = [int(smartDiv(replica[x]['FailTime'],replica[x]['FailCount'])) for x in replica.keys()]\n", "#sbt.reverse()\n", "\n", "ax = getFig()\n", "\n", "plt.bar(groups + (groupwidth*0), Failed, color='red', width=groupwidth, label='Failed')\n", "plt.bar(groups + (groupwidth*2), Passed, color='green', width=groupwidth, label='Passed')\n", "\n", "plt.legend(loc='best')\n", "ax.set_title(\"Test Count for test type\")\n", "ax.set_xticks([x + groupwidth*1.5 for x in np.arange(6)])\n", "ax.set_xticklabels(replica.keys())\n", "ax.set_xlabel('Test Type')\n", "ax.set_ylabel('Test counts')\n", "plt.show()\n", "if saveFigs:\n", " plt.savefig('Resources/Imgs/BuildToolTrend.png')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }