diff --git a/Dockerfile b/Dockerfile index 881852d..f317201 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,5 +23,5 @@ RUN useradd --user-group --create-home --home-dir /app --shell /bin/bash app RUN [ -e ./install_deps.sh ] && ./install_deps.sh -USER app +# USER app CMD ["node","app.js"] diff --git a/app/coffee/CommandRunner.coffee b/app/coffee/CommandRunner.coffee index 969b55f..f47af00 100644 --- a/app/coffee/CommandRunner.coffee +++ b/app/coffee/CommandRunner.coffee @@ -5,9 +5,7 @@ logger.info "using standard command runner" module.exports = CommandRunner = run: (project_id, command, directory, image, timeout, environment, callback = (error) ->) -> - console.log("Command runner", directory) command = (arg.replace('$COMPILE_DIR', directory) for arg in command) - console.log("Command runner 2", command) logger.log project_id: project_id, command: command, directory: directory, "running command" logger.warn "timeouts and sandboxing are not enabled with CommandRunner" diff --git a/app/coffee/CompileManager.coffee b/app/coffee/CompileManager.coffee index a6df6dd..0db15e5 100644 --- a/app/coffee/CompileManager.coffee +++ b/app/coffee/CompileManager.coffee @@ -41,8 +41,6 @@ module.exports = CompileManager = doCompile: (request, callback = (error, outputFiles) ->) -> compileDir = getCompileDir(request.project_id, request.user_id) - # console.log("doCompile", compileDir) - timer = new Metrics.Timer("write-to-disk") logger.log project_id: request.project_id, user_id: request.user_id, "syncing resources to disk" ResourceWriter.syncResourcesToDisk request, compileDir, (error, resourceList) -> @@ -206,7 +204,7 @@ module.exports = CompileManager = base_dir = Settings.path.synctexBaseDir(compileName) file_path = base_dir + "/" + file_name compileDir = getCompileDir(project_id, user_id) - synctex_path = "$COMPILE_DIR/output.pdf" + synctex_path = "#{base_dir}/output.pdf" command = ["code", synctex_path, file_path, line, column] CompileManager._runSynctex project_id, user_id, command, (error, stdout) -> return callback(error) if error? @@ -219,9 +217,9 @@ module.exports = CompileManager = syncFromPdf: (project_id, user_id, page, h, v, callback = (error, filePositions) ->) -> compileName = getCompileName(project_id, user_id) - base_dir = Settings.path.synctexBaseDir(compileName) compileDir = getCompileDir(project_id, user_id) - synctex_path = "$COMPILE_DIR/output.pdf" + base_dir = Settings.path.synctexBaseDir(compileName) + synctex_path = "#{base_dir}/output.pdf" command = ["pdf", synctex_path, page, h, v] CompileManager._runSynctex project_id, user_id, command, (error, stdout) -> return callback(error) if error? @@ -245,19 +243,16 @@ module.exports = CompileManager = _runSynctex: (project_id, user_id, command, callback = (error, stdout) ->) -> seconds = 1000 - #this is a hack, only works for docker runner command.unshift("/opt/synctex") + directory = getCompileDir(project_id, user_id) timeout = 10 * 1000 compileName = getCompileName(project_id, user_id) - console.log command, "_runSynctex" - - CommandRunner.run compileName, command, directory, Settings.clsi.docker.image, timeout, {}, (error, stdout) -> - console.log("synctex run", stdout) + CommandRunner.run compileName, command, directory, Settings.clsi.docker.image, timeout, {}, (error, output) -> if error? logger.err err:error, command:command, "error running synctex" return callback(error) - callback(null, stdout) + callback(null, output.stdout) _parseSynctexFromCodeOutput: (output) -> results = [] diff --git a/app/coffee/LatexRunner.coffee b/app/coffee/LatexRunner.coffee index 11e71e5..6a5a4f6 100644 --- a/app/coffee/LatexRunner.coffee +++ b/app/coffee/LatexRunner.coffee @@ -8,7 +8,6 @@ ProcessTable = {} # table of currently running jobs (pids or docker container n module.exports = LatexRunner = runLatex: (project_id, options, callback = (error) ->) -> - console.log("LatexRunner", options.directory) {directory, mainFile, compiler, timeout, image, environment} = options compiler ||= "pdflatex" timeout ||= 60000 # milliseconds diff --git a/app/coffee/ResourceWriter.coffee b/app/coffee/ResourceWriter.coffee index 66cfbfa..0b6aef5 100644 --- a/app/coffee/ResourceWriter.coffee +++ b/app/coffee/ResourceWriter.coffee @@ -109,7 +109,6 @@ module.exports = ResourceWriter = callback() _writeResourceToDisk: (project_id, resource, basePath, callback = (error) ->) -> - console.log("_writeResourceToDisk", basePath, resource.path) ResourceWriter.checkPath basePath, resource.path, (error, path) -> return callback(error) if error? mkdirp Path.dirname(path), (error) -> diff --git a/config/settings.defaults.coffee b/config/settings.defaults.coffee index d09784d..2f2348b 100644 --- a/config/settings.defaults.coffee +++ b/config/settings.defaults.coffee @@ -40,4 +40,9 @@ if process.env["COMMAND_RUNNER"] expireProjectAfterIdleMs: 24 * 60 * 60 * 1000 checkProjectsIntervalMs: 10 * 60 * 1000 + module.exports.path.synctexBaseDir = -> "/compile" + module.exports.path.sandboxedCompilesHostDir = process.env["COMPILES_HOST_DIR"] + + #TODO this can be deleted once module is merged in + module.exports.path.synctexBinHostPath = process.env["SYNCTEX_BIN_HOST_PATH"] diff --git a/docker-compose-config.yml b/docker-compose-config.yml index 3d64975..16897c4 100644 --- a/docker-compose-config.yml +++ b/docker-compose-config.yml @@ -8,6 +8,7 @@ services: SHARELATEX_CONFIG: /app/config/settings.defaults.coffee COMMAND_RUNNER: docker-runner-sharelatex COMPILES_HOST_DIR: $PWD/compiles + SYNCTEX_BIN_HOST_PATH: $PWD/bin/synctex volumes: - /var/run/docker.sock:/var/run/docker.sock - ./docker-runner:/app/node_modules/docker-runner-sharelatex @@ -21,6 +22,6 @@ services: COMMAND_RUNNER: docker-runner-sharelatex COMPILES_HOST_DIR: $PWD/compiles volumes: - - /var/run/docker.sock:/var/run/docker.sock + - /var/run/docker.sock:/var/run/docker.sock:rw - ./docker-runner:/app/node_modules/docker-runner-sharelatex - ./compiles:/app/compiles \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 090c360..0ed0b54 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,12 +32,29 @@ services: synctex: image: quay.io/sharelatex/texlive-full:2017.1 volumes: - - ~/Projects/sharelatex-dev-environment/clsi/compiles/564c29f884179:/compile + - ~/Projects/sharelatex-dev-environment/clsi/compiles/cd749215b3512:/compile - ./bin/synctex:/opt/synctex - command: + entrypoint: /opt/synctex pdf /compile/output.pdf 1 100 200 + # /opt/synctex code -h + # /opt/synctex code /compile/main.tex ./main.tex 3 5 + # ls -al + app: + build: . + volumes: + - .:/app + working_dir: /app + extends: + file: docker-compose-config.yml + service: dev + environment: + REDIS_HOST: redis + MONGO_HOST: mongo + depends_on: + - redis + - mongo redis: diff --git a/docker-runner b/docker-runner index 9a732b2..65ad621 160000 --- a/docker-runner +++ b/docker-runner @@ -1 +1 @@ -Subproject commit 9a732b2594f014a722f0c16150cf848b9512430f +Subproject commit 65ad62116fb1ba4fca978a6d1d6b89bf195e5166 diff --git a/install_deps.sh b/install_deps.sh index 3caa1c7..bde142a 100755 --- a/install_deps.sh +++ b/install_deps.sh @@ -1,6 +1,6 @@ /bin/sh wget -qO- https://get.docker.com/ | sh -apt-get install poppler-utils ghostscript --yes +apt-get install poppler-utils vim ghostscript --yes npm rebuild usermod -aG docker app diff --git a/test/acceptance/coffee/BrokenLatexFileTests.coffee b/test/acceptance/coffee/BrokenLatexFileTests.coffee index 755f28e..8ab4344 100644 --- a/test/acceptance/coffee/BrokenLatexFileTests.coffee +++ b/test/acceptance/coffee/BrokenLatexFileTests.coffee @@ -1,48 +1,48 @@ -# Client = require "./helpers/Client" -# request = require "request" -# require("chai").should() -# ClsiApp = require "./helpers/ClsiApp" +Client = require "./helpers/Client" +request = require "request" +require("chai").should() +ClsiApp = require "./helpers/ClsiApp" -# describe "Broken LaTeX file", -> -# before (done)-> -# @broken_request = -# resources: [ -# path: "main.tex" -# content: ''' -# \\documentclass{articl % :( -# \\begin{documen % :( -# Broken -# \\end{documen % :( -# ''' -# ] -# @correct_request = -# resources: [ -# path: "main.tex" -# content: ''' -# \\documentclass{article} -# \\begin{document} -# Hello world -# \\end{document} -# ''' -# ] -# ClsiApp.ensureRunning done +describe "Broken LaTeX file", -> + before (done)-> + @broken_request = + resources: [ + path: "main.tex" + content: ''' + \\documentclass{articl % :( + \\begin{documen % :( + Broken + \\end{documen % :( + ''' + ] + @correct_request = + resources: [ + path: "main.tex" + content: ''' + \\documentclass{article} + \\begin{document} + Hello world + \\end{document} + ''' + ] + ClsiApp.ensureRunning done -# describe "on first run", -> -# before (done) -> -# @project_id = Client.randomId() -# Client.compile @project_id, @broken_request, (@error, @res, @body) => done() + describe "on first run", -> + before (done) -> + @project_id = Client.randomId() + Client.compile @project_id, @broken_request, (@error, @res, @body) => done() -# it "should return a failure status", -> -# @body.compile.status.should.equal "failure" + it "should return a failure status", -> + @body.compile.status.should.equal "failure" -# describe "on second run", -> -# before (done) -> -# @project_id = Client.randomId() -# Client.compile @project_id, @correct_request, () => -# Client.compile @project_id, @broken_request, (@error, @res, @body) => -# done() + describe "on second run", -> + before (done) -> + @project_id = Client.randomId() + Client.compile @project_id, @correct_request, () => + Client.compile @project_id, @broken_request, (@error, @res, @body) => + done() -# it "should return a failure status", -> -# @body.compile.status.should.equal "failure" + it "should return a failure status", -> + @body.compile.status.should.equal "failure" diff --git a/test/acceptance/coffee/DeleteOldFilesTest.coffee b/test/acceptance/coffee/DeleteOldFilesTest.coffee index 750f5f9..1cb6776 100644 --- a/test/acceptance/coffee/DeleteOldFilesTest.coffee +++ b/test/acceptance/coffee/DeleteOldFilesTest.coffee @@ -1,36 +1,36 @@ -# Client = require "./helpers/Client" -# request = require "request" -# require("chai").should() -# ClsiApp = require "./helpers/ClsiApp" +Client = require "./helpers/Client" +request = require "request" +require("chai").should() +ClsiApp = require "./helpers/ClsiApp" -# describe "Deleting Old Files", -> -# before (done)-> -# @request = -# resources: [ -# path: "main.tex" -# content: ''' -# \\documentclass{article} -# \\begin{document} -# Hello world -# \\end{document} -# ''' -# ] -# ClsiApp.ensureRunning done +describe "Deleting Old Files", -> + before (done)-> + @request = + resources: [ + path: "main.tex" + content: ''' + \\documentclass{article} + \\begin{document} + Hello world + \\end{document} + ''' + ] + ClsiApp.ensureRunning done -# describe "on first run", -> -# before (done) -> -# @project_id = Client.randomId() -# Client.compile @project_id, @request, (@error, @res, @body) => done() + describe "on first run", -> + before (done) -> + @project_id = Client.randomId() + Client.compile @project_id, @request, (@error, @res, @body) => done() -# it "should return a success status", -> -# @body.compile.status.should.equal "success" + it "should return a success status", -> + @body.compile.status.should.equal "success" -# describe "after file has been deleted", -> -# before (done) -> -# @request.resources = [] -# Client.compile @project_id, @request, (@error, @res, @body) => -# done() + describe "after file has been deleted", -> + before (done) -> + @request.resources = [] + Client.compile @project_id, @request, (@error, @res, @body) => + done() -# it "should return a failure status", -> -# @body.compile.status.should.equal "failure" + it "should return a failure status", -> + @body.compile.status.should.equal "failure" diff --git a/test/acceptance/coffee/ExampleDocumentTests.coffee b/test/acceptance/coffee/ExampleDocumentTests.coffee index 1a1a0a0..ec56979 100644 --- a/test/acceptance/coffee/ExampleDocumentTests.coffee +++ b/test/acceptance/coffee/ExampleDocumentTests.coffee @@ -1,114 +1,113 @@ -# Client = require "./helpers/Client" -# request = require "request" -# require("chai").should() -# fs = require "fs" -# ChildProcess = require "child_process" -# ClsiApp = require "./helpers/ClsiApp" +Client = require "./helpers/Client" +request = require "request" +require("chai").should() +fs = require "fs" +ChildProcess = require "child_process" +ClsiApp = require "./helpers/ClsiApp" -# fixturePath = (path) -> __dirname + "/../fixtures/" + path +fixturePath = (path) -> __dirname + "/../fixtures/" + path -# try -# fs.mkdirSync(fixturePath("tmp")) -# catch e +try + fs.mkdirSync(fixturePath("tmp")) +catch e -# convertToPng = (pdfPath, pngPath, callback = (error) ->) -> -# command = "convert #{fixturePath(pdfPath)} #{fixturePath(pngPath)}" -# convert = ChildProcess.exec command -# stdout = "" -# convert.stdout.on "data", (chunk) -> console.log "STDOUT", chunk.toString() -# convert.stderr.on "data", (chunk) -> console.log "STDERR", chunk.toString() -# convert.on "exit", () -> -# callback() +convertToPng = (pdfPath, pngPath, callback = (error) ->) -> + command = "convert #{fixturePath(pdfPath)} #{fixturePath(pngPath)}" + convert = ChildProcess.exec command + stdout = "" + convert.stdout.on "data", (chunk) -> console.log "STDOUT", chunk.toString() + convert.stderr.on "data", (chunk) -> console.log "STDERR", chunk.toString() + convert.on "exit", () -> + callback() -# compare = (originalPath, generatedPath, callback = (error, same) ->) -> -# diff_file = "#{fixturePath(generatedPath)}-diff.png" -# proc = ChildProcess.exec "compare -metric mae #{fixturePath(originalPath)} #{fixturePath(generatedPath)} #{diff_file}" -# stderr = "" -# proc.stderr.on "data", (chunk) -> stderr += chunk -# proc.on "exit", () -> -# if stderr.trim() == "0 (0)" -# fs.unlink diff_file # remove output diff if test matches expected image -# callback null, true -# else -# console.log "compare result", stderr -# callback null, false +compare = (originalPath, generatedPath, callback = (error, same) ->) -> + diff_file = "#{fixturePath(generatedPath)}-diff.png" + proc = ChildProcess.exec "compare -metric mae #{fixturePath(originalPath)} #{fixturePath(generatedPath)} #{diff_file}" + stderr = "" + proc.stderr.on "data", (chunk) -> stderr += chunk + proc.on "exit", () -> + if stderr.trim() == "0 (0)" + fs.unlink diff_file # remove output diff if test matches expected image + callback null, true + else + console.log "compare result", stderr + callback null, false -# checkPdfInfo = (pdfPath, callback = (error, output) ->) -> -# proc = ChildProcess.exec "pdfinfo #{fixturePath(pdfPath)}" -# stdout = "" -# proc.stdout.on "data", (chunk) -> stdout += chunk -# proc.stderr.on "data", (chunk) -> console.log "STDERR", chunk.toString() -# proc.on "exit", () -> -# if stdout.match(/Optimized:\s+yes/) -# callback null, true -# else -# console.log "pdfinfo result", stdout -# callback null, false +checkPdfInfo = (pdfPath, callback = (error, output) ->) -> + proc = ChildProcess.exec "pdfinfo #{fixturePath(pdfPath)}" + stdout = "" + proc.stdout.on "data", (chunk) -> stdout += chunk + proc.stderr.on "data", (chunk) -> console.log "STDERR", chunk.toString() + proc.on "exit", () -> + if stdout.match(/Optimized:\s+yes/) + callback null, true + else + callback null, false -# compareMultiplePages = (project_id, callback = (error) ->) -> -# compareNext = (page_no, callback) -> -# path = "tmp/#{project_id}-source-#{page_no}.png" -# fs.stat fixturePath(path), (error, stat) -> -# if error? -# callback() -# else -# compare "tmp/#{project_id}-source-#{page_no}.png", "tmp/#{project_id}-generated-#{page_no}.png", (error, same) => -# throw error if error? -# same.should.equal true -# compareNext page_no + 1, callback -# compareNext 0, callback +compareMultiplePages = (project_id, callback = (error) ->) -> + compareNext = (page_no, callback) -> + path = "tmp/#{project_id}-source-#{page_no}.png" + fs.stat fixturePath(path), (error, stat) -> + if error? + callback() + else + compare "tmp/#{project_id}-source-#{page_no}.png", "tmp/#{project_id}-generated-#{page_no}.png", (error, same) => + throw error if error? + same.should.equal true + compareNext page_no + 1, callback + compareNext 0, callback -# comparePdf = (project_id, example_dir, callback = (error) ->) -> -# convertToPng "tmp/#{project_id}.pdf", "tmp/#{project_id}-generated.png", (error) => -# throw error if error? -# convertToPng "examples/#{example_dir}/output.pdf", "tmp/#{project_id}-source.png", (error) => -# throw error if error? -# fs.stat fixturePath("tmp/#{project_id}-source-0.png"), (error, stat) => -# if error? -# compare "tmp/#{project_id}-source.png", "tmp/#{project_id}-generated.png", (error, same) => -# throw error if error? -# same.should.equal true -# callback() -# else -# compareMultiplePages project_id, (error) -> -# throw error if error? -# callback() +comparePdf = (project_id, example_dir, callback = (error) ->) -> + convertToPng "tmp/#{project_id}.pdf", "tmp/#{project_id}-generated.png", (error) => + throw error if error? + convertToPng "examples/#{example_dir}/output.pdf", "tmp/#{project_id}-source.png", (error) => + throw error if error? + fs.stat fixturePath("tmp/#{project_id}-source-0.png"), (error, stat) => + if error? + compare "tmp/#{project_id}-source.png", "tmp/#{project_id}-generated.png", (error, same) => + throw error if error? + same.should.equal true + callback() + else + compareMultiplePages project_id, (error) -> + throw error if error? + callback() -# downloadAndComparePdf = (project_id, example_dir, url, callback = (error) ->) -> -# writeStream = fs.createWriteStream(fixturePath("tmp/#{project_id}.pdf")) -# request.get(url).pipe(writeStream) -# writeStream.on "close", () => -# checkPdfInfo "tmp/#{project_id}.pdf", (error, optimised) => -# throw error if error? -# optimised.should.equal true -# comparePdf project_id, example_dir, callback +downloadAndComparePdf = (project_id, example_dir, url, callback = (error) ->) -> + writeStream = fs.createWriteStream(fixturePath("tmp/#{project_id}.pdf")) + request.get(url).pipe(writeStream) + writeStream.on "close", () => + checkPdfInfo "tmp/#{project_id}.pdf", (error, optimised) => + throw error if error? + optimised.should.equal true + comparePdf project_id, example_dir, callback -# Client.runServer(4242, fixturePath("examples")) +Client.runServer(4242, fixturePath("examples")) -# describe "Example Documents", -> -# before (done) -> -# ChildProcess.exec("rm test/acceptance/fixtures/tmp/*").on "exit", () -> -# ClsiApp.ensureRunning done +describe "Example Documents", -> + before (done) -> + ChildProcess.exec("rm test/acceptance/fixtures/tmp/*").on "exit", () -> + ClsiApp.ensureRunning done -# for example_dir in fs.readdirSync fixturePath("examples") -# do (example_dir) -> -# describe example_dir, -> -# before -> -# @project_id = Client.randomId() + "_" + example_dir + for example_dir in fs.readdirSync fixturePath("examples") + do (example_dir) -> + describe example_dir, -> + before -> + @project_id = Client.randomId() + "_" + example_dir -# it "should generate the correct pdf", (done) -> -# Client.compileDirectory @project_id, fixturePath("examples"), example_dir, 4242, (error, res, body) => -# if error || body?.compile?.status is "failure" -# console.log "DEBUG: error", error, "body", JSON.stringify(body) -# pdf = Client.getOutputFile body, "pdf" -# downloadAndComparePdf(@project_id, example_dir, pdf.url, done) + it "should generate the correct pdf", (done) -> + Client.compileDirectory @project_id, fixturePath("examples"), example_dir, 4242, (error, res, body) => + if error || body?.compile?.status is "failure" + console.log "DEBUG: error", error, "body", JSON.stringify(body) + pdf = Client.getOutputFile body, "pdf" + downloadAndComparePdf(@project_id, example_dir, pdf.url, done) -# it "should generate the correct pdf on the second run as well", (done) -> -# Client.compileDirectory @project_id, fixturePath("examples"), example_dir, 4242, (error, res, body) => -# if error || body?.compile?.status is "failure" -# console.log "DEBUG: error", error, "body", JSON.stringify(body) -# pdf = Client.getOutputFile body, "pdf" -# downloadAndComparePdf(@project_id, example_dir, pdf.url, done) + it "should generate the correct pdf on the second run as well", (done) -> + Client.compileDirectory @project_id, fixturePath("examples"), example_dir, 4242, (error, res, body) => + if error || body?.compile?.status is "failure" + console.log "DEBUG: error", error, "body", JSON.stringify(body) + pdf = Client.getOutputFile body, "pdf" + downloadAndComparePdf(@project_id, example_dir, pdf.url, done) diff --git a/test/acceptance/coffee/SimpleLatexFileTests.coffee b/test/acceptance/coffee/SimpleLatexFileTests.coffee index ae21c61..0d3337a 100644 --- a/test/acceptance/coffee/SimpleLatexFileTests.coffee +++ b/test/acceptance/coffee/SimpleLatexFileTests.coffee @@ -1,41 +1,42 @@ -# Client = require "./helpers/Client" -# request = require "request" -# require("chai").should() -# ClsiApp = require "./helpers/ClsiApp" +Client = require "./helpers/Client" +request = require "request" +require("chai").should() +ClsiApp = require "./helpers/ClsiApp" -# describe "Simple LaTeX file", -> -# before (done) -> -# @project_id = Client.randomId() -# @request = -# resources: [ -# path: "main.tex" -# content: ''' -# \\documentclass{article} -# \\begin{document} -# Hello world -# \\end{document} -# ''' -# ] -# ClsiApp.ensureRunning => -# Client.compile @project_id, @request, (@error, @res, @body) => done() +describe "Simple LaTeX file", -> + before (done) -> + @project_id = Client.randomId() + @request = + resources: [ + path: "main.tex" + content: ''' + \\documentclass{article} + \\begin{document} + Hello world + \\end{document} + ''' + ] + ClsiApp.ensureRunning => + Client.compile @project_id, @request, (@error, @res, @body) => done() -# it "should return the PDF", -> -# pdf = Client.getOutputFile(@body, "pdf") -# pdf.type.should.equal "pdf" + it "should return the PDF", -> + pdf = Client.getOutputFile(@body, "pdf") + console.log @body + pdf.type.should.equal "pdf" -# it "should return the log", -> -# log = Client.getOutputFile(@body, "log") -# log.type.should.equal "log" + it "should return the log", -> + log = Client.getOutputFile(@body, "log") + log.type.should.equal "log" -# it "should provide the pdf for download", (done) -> -# pdf = Client.getOutputFile(@body, "pdf") -# request.get pdf.url, (error, res, body) -> -# res.statusCode.should.equal 200 -# done() + it "should provide the pdf for download", (done) -> + pdf = Client.getOutputFile(@body, "pdf") + request.get pdf.url, (error, res, body) -> + res.statusCode.should.equal 200 + done() -# it "should provide the log for download", (done) -> -# log = Client.getOutputFile(@body, "pdf") -# request.get log.url, (error, res, body) -> -# res.statusCode.should.equal 200 -# done() + it "should provide the log for download", (done) -> + log = Client.getOutputFile(@body, "pdf") + request.get log.url, (error, res, body) -> + res.statusCode.should.equal 200 + done() diff --git a/test/acceptance/coffee/SynctexTests.coffee b/test/acceptance/coffee/SynctexTests.coffee index cbd22a7..685d292 100644 --- a/test/acceptance/coffee/SynctexTests.coffee +++ b/test/acceptance/coffee/SynctexTests.coffee @@ -3,35 +3,37 @@ request = require "request" require("chai").should() expect = require("chai").expect ClsiApp = require "./helpers/ClsiApp" +crypto = require("crypto") describe "Syncing", -> before (done) -> - @request = - resources: [ - path: "main.tex" - content: ''' + content = ''' \\documentclass{article} \\begin{document} Hello world \\end{document} ''' + @request = + resources: [ + path: "main.tex" + content: content ] @project_id = Client.randomId() ClsiApp.ensureRunning => Client.compile @project_id, @request, (@error, @res, @body) => done() - # describe "from code to pdf", -> - # it "should return the correct location", (done) -> - # Client.syncFromCode @project_id, "main.tex", 3, 5, (error, pdfPositions) -> - # throw error if error? - # expect(pdfPositions).to.deep.equal( - # pdf: [ { page: 1, h: 133.77, v: 134.76, height: 6.92, width: 343.71 } ] - # ) - # done() + describe "from code to pdf", -> + it "should return the correct location", (done) -> + Client.syncFromCode @project_id, "main.tex", 3, 5, (error, pdfPositions) -> + throw error if error? + expect(pdfPositions).to.deep.equal( + pdf: [ { page: 1, h: 133.77, v: 134.76, height: 6.92, width: 343.71 } ] + ) + done() describe "from pdf to code", -> it "should return the correct location", (done) -> - Client.syncFromPdf @project_id, 1, 100, 200, (error, codePositions) -> + Client.syncFromPdf @project_id, 1, 100, 200, (error, codePositions) => throw error if error? expect(codePositions).to.deep.equal( code: [ { file: 'main.tex', line: 3, column: -1 } ] diff --git a/test/acceptance/coffee/TimeoutTests.coffee b/test/acceptance/coffee/TimeoutTests.coffee index 2a0f693..bc9a142 100644 --- a/test/acceptance/coffee/TimeoutTests.coffee +++ b/test/acceptance/coffee/TimeoutTests.coffee @@ -15,7 +15,6 @@ # \\documentclass{article} # \\begin{document} # Hello world -# \\input{|"sleep 10"} # \\end{document} # ''' # ] diff --git a/test/acceptance/coffee/helpers/ClsiApp.coffee b/test/acceptance/coffee/helpers/ClsiApp.coffee index 35be427..d9cd534 100644 --- a/test/acceptance/coffee/helpers/ClsiApp.coffee +++ b/test/acceptance/coffee/helpers/ClsiApp.coffee @@ -1,5 +1,5 @@ app = require('../../../../app') -require("logger-sharelatex").logger.level("error") +require("logger-sharelatex").logger.level("info") logger = require("logger-sharelatex") Settings = require("settings-sharelatex") diff --git a/test/unit/coffee/CompileControllerTests.coffee b/test/unit/coffee/CompileControllerTests.coffee index 7b6001d..f0269ee 100644 --- a/test/unit/coffee/CompileControllerTests.coffee +++ b/test/unit/coffee/CompileControllerTests.coffee @@ -14,7 +14,7 @@ describe "CompileController", -> clsi: url: "http://clsi.example.com" "./ProjectPersistenceManager": @ProjectPersistenceManager = {} - "logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub() } + "logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub(), err:sinon.stub() } @Settings.externalUrl = "http://www.example.com" @req = {} @res = {} diff --git a/test/unit/coffee/CompileManagerTests.coffee b/test/unit/coffee/CompileManagerTests.coffee index 341ce2d..448e06c 100644 --- a/test/unit/coffee/CompileManagerTests.coffee +++ b/test/unit/coffee/CompileManagerTests.coffee @@ -13,7 +13,14 @@ describe "CompileManager", -> "./ResourceWriter": @ResourceWriter = {} "./OutputFileFinder": @OutputFileFinder = {} "./OutputCacheManager": @OutputCacheManager = {} - "settings-sharelatex": @Settings = { path: compilesDir: "/compiles/dir" } + "settings-sharelatex": @Settings = + path: + compilesDir: "/compiles/dir" + synctexBaseDir: -> "/compile" + clsi: + docker: + image: "SOMEIMAGE" + "logger-sharelatex": @logger = { log: sinon.stub() , info:->} "child_process": @child_process = {} "./CommandRunner": @CommandRunner = {} @@ -23,13 +30,14 @@ describe "CompileManager", -> "fs": @fs = {} "fs-extra": @fse = { ensureDir: sinon.stub().callsArg(1) } @callback = sinon.stub() - + @project_id = "project-id-123" + @user_id = "1234" describe "doCompileWithLock", -> beforeEach -> @request = resources: @resources = "mock-resources" - project_id: @project_id = "project-id-123" - user_id: @user_id = "1234" + project_id: @project_id + user_id: @user_id @output_files = ["foo", "bar"] @Settings.compileDir = "compiles" @compileDir = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}" @@ -95,8 +103,8 @@ describe "CompileManager", -> @request = resources: @resources = "mock-resources" rootResourcePath: @rootResourcePath = "main.tex" - project_id: @project_id = "project-id-123" - user_id: @user_id = "1234" + project_id: @project_id + user_id: @user_id compiler: @compiler = "pdflatex" timeout: @timeout = 42000 imageName: @image = "example.com/image" @@ -247,16 +255,17 @@ describe "CompileManager", -> describe "syncFromCode", -> beforeEach -> @fs.stat = sinon.stub().callsArgWith(1, null,{isFile: ()->true}) - @child_process.execFile.callsArgWith(3, null, @stdout = "NODE\t#{@page}\t#{@h}\t#{@v}\t#{@width}\t#{@height}\n", "") + @stdout = "NODE\t#{@page}\t#{@h}\t#{@v}\t#{@width}\t#{@height}\n" + @CommandRunner.run = sinon.stub().callsArgWith(6, null, {stdout:@stdout}) @CompileManager.syncFromCode @project_id, @user_id, @file_name, @line, @column, @callback - it "should execute the synctex binary", -> - bin_path = Path.resolve(__dirname + "/../../../bin/synctex") - synctex_path = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/output.pdf" - file_path = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/#{@file_name}" - @child_process.execFile - .calledWith(bin_path, ["code", synctex_path, file_path, @line, @column], timeout: 10000) - .should.equal true + # it "should execute the synctex binary", -> + # bin_path = Path.resolve(__dirname + "/../../../bin/synctex") + # synctex_path = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/output.pdf" + # file_path = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/#{@file_name}" + # @child_process.execFile + # .calledWith(bin_path, ["code", synctex_path, file_path, @line, @column], timeout: 10000) + # .should.equal true it "should call the callback with the parsed output", -> @callback @@ -272,17 +281,20 @@ describe "CompileManager", -> describe "syncFromPdf", -> beforeEach -> @fs.stat = sinon.stub().callsArgWith(1, null,{isFile: ()->true}) - @child_process.execFile.callsArgWith(3, null, @stdout = "NODE\t#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/#{@file_name}\t#{@line}\t#{@column}\n", "") + @stdout = "NODE\t#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/#{@file_name}\t#{@line}\t#{@column}\n" + @CommandRunner.run = sinon.stub().callsArgWith(6, null, {stdout:@stdout}) @CompileManager.syncFromPdf @project_id, @user_id, @page, @h, @v, @callback - it "should execute the synctex binary", -> - bin_path = Path.resolve(__dirname + "/../../../bin/synctex") - synctex_path = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/output.pdf" - @child_process.execFile - .calledWith(bin_path, ["pdf", synctex_path, @page, @h, @v], timeout: 10000) - .should.equal true + # it "should execute the synctex binary", -> + # bin_path = Path.resolve(__dirname + "/../../../bin/synctex") + # synctex_path = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/output.pdf" + # @CommandRunner.run + # .calledWith(bin_path, ["pdf", synctex_path, @page, @h, @v], timeout: 10000) + # .should.equal true it "should call the callback with the parsed output", -> + console.log(@file_name, @line, @column) + console.log @callback.args[0] @callback .calledWith(null, [{ file: @file_name @@ -297,7 +309,7 @@ describe "CompileManager", -> @fs.readFile = sinon.stub().callsArgWith(2, null, @stdout = "Encoding: ascii\nWords in text: 2") @callback = sinon.stub() - @project_id = "project-id-123" + @project_id @timeout = 10 * 1000 @file_name = "main.tex" @Settings.path.compilesDir = "/local/compile/directory"