diff --git a/.gitignore b/.gitignore index e69de29..c2956c7 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +*.py[oc] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..26ac3fe --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM baseruntime/baseruntime:latest + +ENV NAME=nodejs \ + VERSION=0 \ + RELEASE=1 \ + ARCH=x86_64 + +LABEL summary="Javascript runtime." \ + name="$FGC/$NAME" \ + version="$VERSION" \ + release="$RELEASE.$DISTTAG" \ + architecture="$ARCH" \ + usage="docker run nodejs node" \ + description="Node.js is a platform built on V8 JavaScript Engine for easily building fast, scalable network applications." \ + io.k8s.description="Node.js is a platform built on V8 JavaScript Engine for easily building fast, scalable network applications." + + +RUN microdnf --nodocs install nodejs npm + +EXPOSE 8080 + +CMD /bin/sh/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3d9a1b8 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +IMAGE_NAME=nodejs + +MODULEMDURL=http://pkgs.fedoraproject.org/cgit/modules/nodejs.git/plain/nodejs.yaml + +default: run + +build: + docker build --tag=$(IMAGE_NAME) . + +run: build + docker run -d $(IMAGE_NAME) + +test: build + cd tests; MODULE=docker MODULEMD=$(MODULEMDURL) URL="docker=$(IMAGE_NAME)" make all + cd tests; MODULE=rpm MODULEMD=$(MODULEMDURL) make all + diff --git a/nodejs.yaml b/nodejs.yaml index 0e26ef5..d0d5c80 100644 --- a/nodejs.yaml +++ b/nodejs.yaml @@ -1,28 +1,49 @@ -data: - api: - rpms: - - nodejs - components: - rpms: - compat-openssl10: {rationale: Build dependency.} - gcc: {rationale: Build dependency.} - icu: {rationale: Build dependency.} - libuv: {rationale: Build and runtime dependency.} - description: 'Node.js is a platform built on Chrome''s JavaScript runtime - - for easily building fast, scalable network applications. - - Node.js uses an event-driven, non-blocking I/O model that - - makes it lightweight and efficient, perfect for data-intensive - - real-time applications that run across distributed devices.' - filter: {} - license: - module: [MIT and ASL 2.0 and ISC and BSD] - name: '' - stream: '' - summary: JavaScript runtime - version: 0 document: modulemd version: 1 +data: + summary: Javascript runtime + description: 'Node.js is a platform built on Chrome''s JavaScript runtime + for easily building fast, scalable network applications. + Node.js uses an event-driven, non-blocking I/O model that + makes it lightweight and efficient, perfect for data-intensive + real-time applications that run across distributed devices.' + license: + module: GPLv3 + content: + - MIT + - ASL 2.0 + - ISC + - BSD + dependencies: + buildrequires: + base-runtime: f26 + shared-userspace: f26 + requires: + base-runtime: f26 + shared-userspace: f26 + references: + community: https://docs.pagure.org/modularity/ + documentation: https://github.com/modularity-modules/nodejs + tracker: https://github.com/modularity-modules/nodejs + profiles: + default: + rpms: + - nodejs + - npm + minimal: + rpms: + - nodejs + api: + rpms: + - npm + - nodejs + components: + rpms: + nodejs: + rationale: JavaScript runtime + # commit from f26 which enables bootstrapping + ref: b0da67b00a92f2ad570d91d6f50fb9b1786650c9 + buildorder: 0 + nodejs-packaging: + rationale: packaging macros for nodejs + ref: 037154a07e3fec45be281d29831d0b52e836bcce diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..8fd8ae7 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,6 @@ +MODULE_LINT=/usr/share/moduleframework/tools/modulelint.py +CMD=python -m avocado run --filter-by-tags=-WIP $(MODULE_LINT) *.py + +# +all: + $(CMD) diff --git a/tests/config.yaml b/tests/config.yaml new file mode 100644 index 0000000..518482c --- /dev/null +++ b/tests/config.yaml @@ -0,0 +1,26 @@ +document: modularity-testing +version: 1 +name: nodejs +modulemd-url: http://pkgs.fedoraproject.org/cgit/modules/nodejs.git/plain/nodejs.yaml +service: + port: 8080 +packages: + rpms: + - nodejs + - npm +testdependecies: + rpms: + - curl +module: + docker: + start: "docker run -td -u=0 --entrypoint /usr/bin/bash -p 8080:8080" + labels: + description: "Node.js is a platform built on V8 JavaScript Engine for easily building fast, scalable network applications." + io.k8s.description: "Node.js is a platform built on V8 JavaScript Engine for easily building fast, scalable network applications." + source: https://github.com/container-images/nodejs + container: docker.io/modularitycontainers/nodejs + rpm: + start: bash + stop: "forever stopall" + repos: + - http://mirror.vutbr.cz/fedora/releases/26/Everything/x86_64/os/ diff --git a/tests/resources/hello.txt b/tests/resources/hello.txt new file mode 100644 index 0000000..cd08755 --- /dev/null +++ b/tests/resources/hello.txt @@ -0,0 +1 @@ +Hello world! diff --git a/tests/resources/server1.js b/tests/resources/server1.js new file mode 100644 index 0000000..993b51b --- /dev/null +++ b/tests/resources/server1.js @@ -0,0 +1,13 @@ +const http = require('http'); + +const port = 8080; + +const server = http.createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Hello World\n'); +}); + +server.listen(port, () => { + console.log(`Server running at http://127.0.0.1:${port}/`); +}); diff --git a/tests/resources/server2.js b/tests/resources/server2.js new file mode 100644 index 0000000..67cab3f --- /dev/null +++ b/tests/resources/server2.js @@ -0,0 +1,27 @@ +const http = require('http'); +const fs = require('fs'); + +const port = 8080; + +string = "ERROR" + +fs.readFile('/tmp/test/hello.txt','utf-8', function (err,data) { + if (err) { + console.log("Error"); + } + else + { + string = data; + + } + +}); +const server = http.createServer((req, res) => { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end(string); +}); + +server.listen(port, () => { + console.log(`Server running at http://127.0.0.1:${port}/`); +}); diff --git a/tests/sanity_check.py b/tests/sanity_check.py new file mode 100644 index 0000000..6b3aaa4 --- /dev/null +++ b/tests/sanity_check.py @@ -0,0 +1,63 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# This Modularity Testing Framework helps you to write tests for modules +# Copyright (C) 2017 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# he Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Authors: Jan Koscielniak +# +import socket +from avocado import main +from avocado.core import exceptions +from moduleframework import module_framework +import urllib, os, time + + +class SanityCheckTemplate(module_framework.AvocadoTest): + """ + :avocado: enable + """ + def setUp(self): + super(self.__class__, self).setUp() + self.start() + self.run("mkdir -p /tmp/test") + self.run('cd /tmp/test/ && npm install -g forever') + + def testServer(self): + self.copyTo(os.path.abspath("resources/server1.js"), "/tmp/test/server1.js") + self.run('cd /tmp/test/ && forever start server1.js') + time.sleep(2) + conn = urllib.urlopen("http://127.0.0.1:8080") + code = conn.getcode() + print ">>> Testing a simple server" + print ">>> Returned code: " + str(code) + assert code == 200 + + def testSyscall(self): + self.copyTo(os.path.abspath("resources/server2.js"), "/tmp/test/server2.js") + self.copyTo(os.path.abspath("resources/hello.txt"), "/tmp/test/hello.txt") + self.run('cd /tmp/test/ && npm install -g fs') + self.run('cd /tmp/test/ && forever start server2.js') + time.sleep(2) + conn = urllib.urlopen("http://127.0.0.1:8080") + response = conn.read() + print ">>> Response: " + response + assert response == "Hello world!" + +if __name__ == '__main__': + main() +