Compare commits

..

13 Commits

Author SHA1 Message Date
Girish Ramakrishnan
c82a4acadc Version 0.7.0 2020-04-11 14:02:59 -07:00
Girish Ramakrishnan
090dbb0244 set turn servers as array and not as string 2020-04-11 13:59:23 -07:00
Girish Ramakrishnan
4f78f5c92f add test also 2020-04-11 11:22:39 -07:00
Girish Ramakrishnan
a28bca9bd6 Version 0.6.0-2 2020-04-09 23:56:14 -07:00
Girish Ramakrishnan
27e270ada5 Update screenshots 2020-04-09 23:56:02 -07:00
Girish Ramakrishnan
606cd9d4cc don't use logo in screenshot 2020-04-09 23:51:14 -07:00
Girish Ramakrishnan
62c69c156b Version 0.6.0-1 2020-04-09 23:36:17 -07:00
Girish Ramakrishnan
f2ac369762 multiple tags 2020-04-09 23:35:54 -07:00
Girish Ramakrishnan
ed5ccef86c Version 0.6.0 2020-04-09 23:31:53 -07:00
Girish Ramakrishnan
d67738a588 Fix title 2020-04-09 23:31:34 -07:00
Girish Ramakrishnan
9deeef98ab rename dir 2020-04-09 19:24:46 -07:00
Girish Ramakrishnan
2ee1d46abc Finish tests 2020-04-09 19:18:16 -07:00
Girish Ramakrishnan
2dc1259813 add test template 2020-04-09 14:00:07 -07:00
9 changed files with 1725 additions and 7 deletions

View File

@@ -3,4 +3,5 @@
.dockerignore
node_modules
screenshots/*
test/*

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules/

View File

@@ -101,3 +101,9 @@
[0.5.0]
* New reworked app
[0.6.0]
* Fix title
[0.7.0]
* Set turn_uris to an array and not a string

View File

@@ -1,11 +1,11 @@
{
"id": "org.matrix.synapse",
"title": "An Open network for secure, decentralized communication",
"title": "Matrix Synapse",
"author": "Matrix synapse authors",
"description": "file://DESCRIPTION.md",
"changelog": "file://CHANGELOG",
"tagline": "Matrix homeserver",
"version": "0.5.0",
"tagline": "Secure & decentralized communication",
"version": "0.7.0",
"healthCheckPath": "/",
"httpPort": 8008,
"memoryLimit": 536870912,
@@ -24,9 +24,9 @@
"im", "collaboration", "voip", "videochat", "chat"
],
"mediaLinks": [
"https://cloudron-app-screenshots.s3.amazonaws.com/org.matrix.synapse/924b87f40eacc15e444cd45cc93d2ead0aa440c2/1.png",
"https://cloudron-app-screenshots.s3.amazonaws.com/org.matrix.synapse/924b87f40eacc15e444cd45cc93d2ead0aa440c2/2.png",
"https://cloudron-app-screenshots.s3.amazonaws.com/org.matrix.synapse/924b87f40eacc15e444cd45cc93d2ead0aa440c2/3.png"
"https://cloudron-app-screenshots.s3.amazonaws.com/org.matrix.synapse/606cd9d4ccc3bee11a49f91444a2dad8947cbc7c/1.png",
"https://cloudron-app-screenshots.s3.amazonaws.com/org.matrix.synapse/606cd9d4ccc3bee11a49f91444a2dad8947cbc7c/2.png",
"https://cloudron-app-screenshots.s3.amazonaws.com/org.matrix.synapse/606cd9d4ccc3bee11a49f91444a2dad8947cbc7c/3.png"
],
"changelog": "file://CHANGELOG",
"postInstallMessage": "file://POSTINSTALL.md",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 193 KiB

View File

@@ -55,7 +55,9 @@ yq w -i /app/data/configs/homeserver.yaml 'password_providers[0].config.bind_pas
yq w -i /app/data/configs/homeserver.yaml 'password_providers[0].config.filter' "(objectClass=user)"
# turn (https://github.com/matrix-org/synapse/blob/master/docs/turn-howto.md#synapse-setup)
yq w -i /app/data/configs/homeserver.yaml turn_uris "[\"turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=udp\", \"turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=tcp\"]"
yq w -i /app/data/configs/homeserver.yaml turn_uris "[]"
yq w -i /app/data/configs/homeserver.yaml turn_uris\[0\] "turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=udp"
yq w -i /app/data/configs/homeserver.yaml turn_uris\[1\] "turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=tcp"
yq w -i /app/data/configs/homeserver.yaml turn_shared_secret "${CLOUDRON_TURN_SECRET}"
# fix permissions

1501
test/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

22
test/package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"chromedriver": "^80.0.2",
"ejs": "^3.0.2",
"expect.js": "^0.3.1",
"mkdirp": "^1.0.4",
"mocha": "^7.1.1",
"rimraf": "^3.0.2",
"selenium-server-standalone-jar": "^3.141.59",
"selenium-webdriver": "^3.6.0",
"superagent": "^5.2.2"
}
}

184
test/test.js Normal file
View File

@@ -0,0 +1,184 @@
#!/usr/bin/env node
/* jslint node:true */
/* global it:false */
/* global xit:false */
/* global describe:false */
/* global before:false */
/* global after:false */
'use strict';
require('chromedriver');
var execSync = require('child_process').execSync,
expect = require('expect.js'),
path = require('path'),
superagent = require('superagent'),
webdriver = require('selenium-webdriver');
var by = require('selenium-webdriver').By,
until = require('selenium-webdriver').until,
Key = require('selenium-webdriver').Key;
describe('Application life cycle test', function () {
this.timeout(0);
var server, browser = new webdriver.Builder().forBrowser('chrome').build();
var LOCATION = 'test';
var app;
var username = process.env.USERNAME;
var password = process.env.PASSWORD;
var TIMEOUT = process.env.TIMEOUT | 30000;
var token, roomId;
before(function (done) {
if (!process.env.USERNAME) return done(new Error('USERNAME env var not set'));
if (!process.env.PASSWORD) return done(new Error('PASSWORD env var not set'));
var seleniumJar= require('selenium-server-standalone-jar');
var SeleniumServer = require('selenium-webdriver/remote').SeleniumServer;
server = new SeleniumServer(seleniumJar.path, { port: 4444 });
server.start();
done();
});
after(function (done) {
browser.quit();
server.stop();
done();
});
function checkLandingPage(done) {
browser.get('https://' + app.fqdn).then(function () {
return browser.wait(until.elementLocated(by.xpath('//h1[contains(text(),"Synapse is running")]')), TIMEOUT);
}).then(function () {
done();
});
}
// https://matrix.org/docs/spec/client_server/latest
function checkLogin(done) {
superagent.post('https://' + app.fqdn + '/_matrix/client/r0/login').send({
type: 'm.login.password',
user: username,
password: password
}).end(function (error, result) {
if (error) return done(error);
if (result.statusCode !== 200) return done(new Error('Login failed with status ' + result.statusCode));
token = result.body.access_token;
if (!token) return done(new Error('No token'));
done();
});
}
function createRoom(done) {
superagent.post('https://' + app.fqdn + '/_matrix/client/r0/createRoom?access_token=' + token).send({
room_alias_name: 'discuss'
}).end(function (error, result) {
if (error) return done(error);
if (result.statusCode !== 200) return done(new Error('Room creation failed with status ' + result.statusCode));
roomId = result.body.room_id;
if (!roomId) return done(new Error('No room id'));
done();
});
}
function checkRoom(done) {
superagent.get('https://' + app.fqdn + '/_matrix/client/r0/joined_rooms?access_token=' + token).end(function (error, result) {
if (error) return done(error);
if (result.statusCode !== 200) return done(new Error('Room listing failed with status ' + result.statusCode));
if (!result.body.joined_rooms.includes(roomId)) return done(new Error('No room in list: ' + JSON.stringify(result.body)));
done();
});
}
xit('build app', function () {
execSync('cloudron build', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
it('install app', function () {
execSync('cloudron install --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
it('can get app information', function () {
var inspect = JSON.parse(execSync('cloudron inspect'));
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
expect(app).to.be.an('object');
});
it('check landing page', checkLandingPage);
it('can login', checkLogin);
it('create room', createRoom);
it('check room', checkRoom);
it('can restart app', function (done) {
execSync('cloudron restart');
done();
});
it('check landing page', checkLandingPage);
it('check room', checkRoom);
it('backup app', function () {
execSync('cloudron backup create --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
it('check landing page', checkLandingPage);
it('check room', checkRoom);
it('restore app', function () {
execSync('cloudron restore --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
it('check landing page', checkLandingPage);
it('check room', checkRoom);
it('move to different location', function () {
browser.manage().deleteAllCookies();
execSync('cloudron configure --location ' + LOCATION + '2', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
var inspect = JSON.parse(execSync('cloudron inspect'));
app = inspect.apps.filter(function (a) { return a.location === LOCATION + '2'; })[0];
expect(app).to.be.an('object');
});
it('check landing page', checkLandingPage);
it('check room', checkRoom);
it('uninstall app', function () {
execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
// test update
it('can install app', function () {
execSync('cloudron install --appstore-id org.matrix.synapse --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
var inspect = JSON.parse(execSync('cloudron inspect'));
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
expect(app).to.be.an('object');
});
it('check landing page', checkLandingPage);
it('can login', checkLogin);
it('create room', createRoom);
it('check room', checkRoom);
it('can update', function () {
execSync('cloudron update --app ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
it('check landing page', checkLandingPage);
it('check room', checkRoom);
it('uninstall app', function () {
execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
});
});