From 1bf14d8f7bd3e51c16ee6f5fbff9501f93b4aca7 Mon Sep 17 00:00:00 2001 From: Alexandre Vanini <vanini.alexandre@gmail.com> Date: Wed, 1 May 2019 18:55:30 +0200 Subject: [PATCH] [TESTS] - Docker support added --- .gitignore | 2 + README.md | 4 +- .../python/assert_test01/.idea/workspace.xml | 4 +- .../app/compilateur/compilateur.component.css | 9 +-- .../server_rest/.idea/compiler.xml | 2 +- .../server_rest/.idea/workspace.xml | 26 +++------ .../serveur_compilation/.idea/workspace.xml | 53 ++++++++++-------- .../serveur_compilation/docker/dockerfile | 12 ++++ .../__pycache__/sample.cpython-34.pyc | Bin 0 -> 349 bytes .../share_docker_file/test.txt | 1 + .../src/main/java/compilation.java | 9 +-- .../target/classes/compilation.class | Bin 4737 -> 4951 bytes 12 files changed, 70 insertions(+), 52 deletions(-) create mode 100644 tests/serveur_compilation/serveur_compilation/docker/dockerfile create mode 100644 tests/serveur_compilation/serveur_compilation/share_docker_file/__pycache__/sample.cpython-34.pyc create mode 100644 tests/serveur_compilation/serveur_compilation/share_docker_file/test.txt diff --git a/.gitignore b/.gitignore index 0485ba8..f95f670 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ \.DS_Store + +doc/ diff --git a/README.md b/README.md index fbdeaad..64419fe 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,10 @@ ## C'est quoi ? Dojo Hepia est un site propre d'HEPIA, qui à pour but de proposer une plateforme simple de publication d'entrainement constitués de kata. Le but est d'encourager les professeurs à centraliser leurs exercices (de code) sur une seule et même plateforme. +Dojo Hepia permet de créer des programmes constitués de kata. + ## Pourquoi ? -Parler de la valeur péga ajoutée et de la plateforme de code et de compilation online +Parler de la valeur pédago ajoutée et de la plateforme de code et de compilation online diff --git a/tests/python/assert_test01/.idea/workspace.xml b/tests/python/assert_test01/.idea/workspace.xml index 340adcf..3415de7 100644 --- a/tests/python/assert_test01/.idea/workspace.xml +++ b/tests/python/assert_test01/.idea/workspace.xml @@ -145,12 +145,12 @@ <option name="presentableId" value="Default" /> <updated>1556636994757</updated> <workItem from="1556636997623" duration="502000" /> - <workItem from="1556696058143" duration="2446000" /> + <workItem from="1556696058143" duration="2450000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="2948000" /> + <option name="totallyTimeSpent" value="2952000" /> </component> <component name="ToolWindowManager"> <frame x="355" y="87" width="1400" height="1000" extended-state="0" /> diff --git a/tests/serveur_compilation/front-end-compilation/src/app/compilateur/compilateur.component.css b/tests/serveur_compilation/front-end-compilation/src/app/compilateur/compilateur.component.css index 2a6ac6c..9ea716f 100644 --- a/tests/serveur_compilation/front-end-compilation/src/app/compilateur/compilateur.component.css +++ b/tests/serveur_compilation/front-end-compilation/src/app/compilateur/compilateur.component.css @@ -1,11 +1,12 @@ textarea { background-color: rgba(43, 47, 57, 1); - border: 0; + border: 2px solid rgba(44, 62, 80, 1.0); color: white; margin: 20px; border-radius: 12px; padding: 10px; resize: none; + outline: none; } button { @@ -28,14 +29,14 @@ button:hover { } .success { - border: 3px rgba(39, 174, 96,1.0) solid; - background-color: rgba(39, 174, 96,0.2); + border: 3px rgba(39, 174, 96, 1.0) solid; + background-color: rgba(39, 174, 96, 0.2); } select { padding-left: 10px; background-color: rgba(43, 47, 57, 1); - border: 0; + border: 2px solid white; color: white; margin: 20px; border-radius: 12px; diff --git a/tests/serveur_compilation/server_rest/.idea/compiler.xml b/tests/serveur_compilation/server_rest/.idea/compiler.xml index 14146fd..f8ea6ba 100644 --- a/tests/serveur_compilation/server_rest/.idea/compiler.xml +++ b/tests/serveur_compilation/server_rest/.idea/compiler.xml @@ -6,8 +6,8 @@ <sourceOutputDir name="target/generated-sources/annotations" /> <sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> <outputRelativeToContentRoot value="true" /> - <module name="server_rest_new" /> <module name="09" /> + <module name="server_rest_new" /> </profile> </annotationProcessing> </component> diff --git a/tests/serveur_compilation/server_rest/.idea/workspace.xml b/tests/serveur_compilation/server_rest/.idea/workspace.xml index cdcbdca..2f0fea1 100644 --- a/tests/serveur_compilation/server_rest/.idea/workspace.xml +++ b/tests/serveur_compilation/server_rest/.idea/workspace.xml @@ -2,20 +2,9 @@ <project version="4"> <component name="ChangeListManager"> <list default="true" id="e6a1f2e5-4f60-4227-82bb-83eb10fa94a5" name="Default Changelist" comment=""> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/assert_test01.iml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/misc.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/modules.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/vcs.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/main.py" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/test.py" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/app.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/app.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilation.service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilation.service.ts" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../../../README.md" beforeDir="false" afterPath="$PROJECT_DIR$/../../../README.md" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.css" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.css" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/src/main/java/app.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/app.java" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../serveur_compilation/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../serveur_compilation/.idea/compiler.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../serveur_compilation/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../serveur_compilation/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../serveur_compilation/src/main/java/compilation.java" beforeDir="false" afterPath="$PROJECT_DIR$/../serveur_compilation/src/main/java/compilation.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../serveur_compilation/target/classes/compilation.class" beforeDir="false" afterPath="$PROJECT_DIR$/../serveur_compilation/target/classes/compilation.class" afterDir="false" /> @@ -46,7 +35,7 @@ <entry file="file://$PROJECT_DIR$/src/main/java/app.java"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="45"> - <caret line="8" column="18" lean-forward="true" selection-start-line="8" selection-start-column="18" selection-end-line="8" selection-end-column="18" /> + <caret line="8" column="18" selection-start-line="8" selection-start-column="18" selection-end-line="8" selection-end-column="18" /> </state> </provider> </entry> @@ -91,9 +80,9 @@ <foldersAlwaysOnTop value="true" /> </navigator> <panes> - <pane id="PackagesPane" /> <pane id="ProjectPane" /> <pane id="Scope" /> + <pane id="PackagesPane" /> </panes> </component> <component name="PropertiesComponent"> @@ -160,16 +149,17 @@ <workItem from="1556636100835" duration="126000" /> <workItem from="1556699423305" duration="678000" /> <workItem from="1556700805455" duration="927000" /> + <workItem from="1556726276244" duration="564000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="1731000" /> + <option name="totallyTimeSpent" value="2295000" /> </component> <component name="ToolWindowManager"> <frame x="0" y="23" width="1920" height="1121" extended-state="0" /> <layout> - <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.2550586" /> + <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25772098" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Image Layers" order="2" /> <window_info id="Designer" order="3" /> @@ -214,7 +204,7 @@ <entry file="file://$PROJECT_DIR$/src/main/java/app.java"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="45"> - <caret line="8" column="18" lean-forward="true" selection-start-line="8" selection-start-column="18" selection-end-line="8" selection-end-column="18" /> + <caret line="8" column="18" selection-start-line="8" selection-start-column="18" selection-end-line="8" selection-end-column="18" /> </state> </provider> </entry> diff --git a/tests/serveur_compilation/serveur_compilation/.idea/workspace.xml b/tests/serveur_compilation/serveur_compilation/.idea/workspace.xml index 743efce..c44ebe8 100644 --- a/tests/serveur_compilation/serveur_compilation/.idea/workspace.xml +++ b/tests/serveur_compilation/serveur_compilation/.idea/workspace.xml @@ -2,21 +2,10 @@ <project version="4"> <component name="ChangeListManager"> <list default="true" id="8d8fb2c1-8426-4933-8193-ee68625cf8de" name="Default Changelist" comment=""> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/assert_test01.iml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/misc.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/modules.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/.idea/vcs.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/main.py" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/../../python/assert_test01/test.py" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/app.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/app.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilation.service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilation.service.ts" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../../../README.md" beforeDir="false" afterPath="$PROJECT_DIR$/../../../README.md" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.css" beforeDir="false" afterPath="$PROJECT_DIR$/../front-end-compilation/src/app/compilateur/compilateur.component.css" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../server_rest/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../server_rest/.idea/compiler.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../server_rest/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../server_rest/.idea/workspace.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../server_rest/src/main/java/app.java" beforeDir="false" afterPath="$PROJECT_DIR$/../server_rest/src/main/java/app.java" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/compilation.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/compilation.java" afterDir="false" /> </list> <ignored path="$PROJECT_DIR$/out/" /> @@ -35,7 +24,7 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/pom.xml"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="591"> + <state relative-caret-position="705"> <caret line="47" column="19" selection-start-line="47" selection-start-column="19" selection-end-line="47" selection-end-column="19" /> </state> </provider> @@ -44,8 +33,8 @@ <file pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/src/main/java/compilation.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="135"> - <caret line="9" column="82" lean-forward="true" selection-start-line="9" selection-start-column="82" selection-end-line="9" selection-end-column="82" /> + <state relative-caret-position="300"> + <caret line="20" column="1" lean-forward="true" selection-start-line="20" selection-start-column="1" selection-end-line="20" selection-end-column="1" /> <folding> <element signature="imports" expanded="true" /> </folding> @@ -94,6 +83,7 @@ </navigator> <panes> <pane id="Scope" /> + <pane id="PackagesPane" /> <pane id="ProjectPane"> <subPane> <expand> @@ -101,11 +91,28 @@ <item name="serveur_compilation" type="b2602c69:ProjectViewProjectNode" /> <item name="serveur_compilation" type="462c0819:PsiDirectoryNode" /> </path> + <path> + <item name="serveur_compilation" type="b2602c69:ProjectViewProjectNode" /> + <item name="serveur_compilation" type="462c0819:PsiDirectoryNode" /> + <item name="src" type="462c0819:PsiDirectoryNode" /> + </path> + <path> + <item name="serveur_compilation" type="b2602c69:ProjectViewProjectNode" /> + <item name="serveur_compilation" type="462c0819:PsiDirectoryNode" /> + <item name="src" type="462c0819:PsiDirectoryNode" /> + <item name="main" type="462c0819:PsiDirectoryNode" /> + </path> + <path> + <item name="serveur_compilation" type="b2602c69:ProjectViewProjectNode" /> + <item name="serveur_compilation" type="462c0819:PsiDirectoryNode" /> + <item name="src" type="462c0819:PsiDirectoryNode" /> + <item name="main" type="462c0819:PsiDirectoryNode" /> + <item name="java" type="462c0819:PsiDirectoryNode" /> + </path> </expand> <select /> </subPane> </pane> - <pane id="PackagesPane" /> </panes> </component> <component name="PropertiesComponent"> @@ -121,6 +128,7 @@ <property name="project.structure.last.edited" value="Modules" /> <property name="project.structure.proportion" value="0.15" /> <property name="project.structure.side.proportion" value="0.2" /> + <property name="restartRequiresConfirmation" value="false" /> </component> <component name="RecentsManager"> <key name="CopyFile.RECENT_KEYS"> @@ -173,17 +181,18 @@ <updated>1556635807220</updated> <workItem from="1556635811007" duration="263000" /> <workItem from="1556699075828" duration="2375000" /> + <workItem from="1556724368190" duration="1020000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="2638000" /> + <option name="totallyTimeSpent" value="3658000" /> </component> <component name="ToolWindowManager"> <frame x="1920" y="0" width="1920" height="1200" extended-state="0" /> <editor active="true" /> <layout> - <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25239617" /> + <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.2550586" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Image Layers" order="2" /> <window_info id="Designer" order="3" /> @@ -220,7 +229,7 @@ <component name="editorHistoryManager"> <entry file="file://$PROJECT_DIR$/pom.xml"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="591"> + <state relative-caret-position="705"> <caret line="47" column="19" selection-start-line="47" selection-start-column="19" selection-end-line="47" selection-end-column="19" /> </state> </provider> @@ -234,8 +243,8 @@ </entry> <entry file="file://$PROJECT_DIR$/src/main/java/compilation.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="135"> - <caret line="9" column="82" lean-forward="true" selection-start-line="9" selection-start-column="82" selection-end-line="9" selection-end-column="82" /> + <state relative-caret-position="300"> + <caret line="20" column="1" lean-forward="true" selection-start-line="20" selection-start-column="1" selection-end-line="20" selection-end-column="1" /> <folding> <element signature="imports" expanded="true" /> </folding> diff --git a/tests/serveur_compilation/serveur_compilation/docker/dockerfile b/tests/serveur_compilation/serveur_compilation/docker/dockerfile new file mode 100644 index 0000000..44733c5 --- /dev/null +++ b/tests/serveur_compilation/serveur_compilation/docker/dockerfile @@ -0,0 +1,12 @@ +FROM ubuntu:14.04 + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get update && apt-get -y upgrade +RUN apt-get install -y python3-pip python3-dev +RUN pip3 install assertpy + +RUN mkdir /env/ + +WORKDIR /env/ + diff --git a/tests/serveur_compilation/serveur_compilation/share_docker_file/__pycache__/sample.cpython-34.pyc b/tests/serveur_compilation/serveur_compilation/share_docker_file/__pycache__/sample.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23275a87c85fc51866ff958eec5377c75200dc6b GIT binary patch literal 349 zcmaFI!^?Hx@W~i01_p-53`l^9fq}t+fq|h|fPsM_g@GZ3k)efwA&P+^g^3|plR23Y zsuo0p)H;LI3WC%!f|Rr{Fw`(GxHL0@6#KzdgH*CGFfaszR7){1Fr<Uk#R@RgGBVUK zf-Dl5$iz^{#t^K@_!6XgC4(l@EhasKTa1}SAU>G*#iyT|SEgT_m|KvOs#j3?i_0b_ zv$!NVKexaRq^KA~a57ZMq$U<u=49rj>e=MvCnx3<+vy<`f=$w7yv3LYW<dy61_p*( r958Jl&w<TiU@YQbU|{gmgwPPRAWI-Dh%TGl{FKt1R6DRPQ1Ac%Zpb~y literal 0 HcmV?d00001 diff --git a/tests/serveur_compilation/serveur_compilation/share_docker_file/test.txt b/tests/serveur_compilation/serveur_compilation/share_docker_file/test.txt new file mode 100644 index 0000000..da5f074 --- /dev/null +++ b/tests/serveur_compilation/serveur_compilation/share_docker_file/test.txt @@ -0,0 +1 @@ +blablabal \ No newline at end of file diff --git a/tests/serveur_compilation/serveur_compilation/src/main/java/compilation.java b/tests/serveur_compilation/serveur_compilation/src/main/java/compilation.java index 2f16589..50756d8 100644 --- a/tests/serveur_compilation/serveur_compilation/src/main/java/compilation.java +++ b/tests/serveur_compilation/serveur_compilation/src/main/java/compilation.java @@ -7,13 +7,14 @@ public class compilation { public HashMap<String, Object> execute_kata(JSONObject input) { - String filename = "", filename_test="", cmd = "", line, output = "", error = ""; + String filename = "", filename_test="todeleteifitstayslikethis", cmd = "", line, output = "", error = ""; switch (input.get("language").toString()) { case "python": - filename = "sample.py"; - filename_test = "assert.py"; - cmd = "python3 " + filename_test; + filename = "share_docker_file/sample.py"; + filename_test = "share_docker_file/assert.py"; + // cmd = "python3 " + filename_test; + cmd = "docker run --rm --mount type=bind,source=/Users/freak/Desktop/dojo-hepia/tests/serveur_compilation/serveur_compilation/share_docker_file,dst=/env/ hey:1.1 python3 assert.py"; break; case "java": filename = "app.java"; diff --git a/tests/serveur_compilation/serveur_compilation/target/classes/compilation.class b/tests/serveur_compilation/serveur_compilation/target/classes/compilation.class index 34eb1119e3bed9e1fc9c99959481b5e220f8e396..ec8f215b9a581c2ea23d3af24924b37dd63b9fb1 100644 GIT binary patch literal 4951 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 delta 2698 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 -- GitLab