diff options
author | Florian Dold <florian@dold.me> | 2021-03-03 21:20:05 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-03-03 21:20:05 +0100 |
commit | 1a0610f222f841237f9940a3a3a55635eec7d324 (patch) | |
tree | b80c67be371a006080cd26b2d61f26cd3aa77697 /packages/taler-wallet-cli/src/integrationtests/sync.ts | |
parent | 186a38250ff4a11f88c8956db4da574f08e741dc (diff) | |
download | wallet-core-1a0610f222f841237f9940a3a3a55635eec7d324.tar.gz wallet-core-1a0610f222f841237f9940a3a3a55635eec7d324.tar.bz2 wallet-core-1a0610f222f841237f9940a3a3a55635eec7d324.zip |
WIP: wallet backup integration test
Diffstat (limited to 'packages/taler-wallet-cli/src/integrationtests/sync.ts')
-rw-r--r-- | packages/taler-wallet-cli/src/integrationtests/sync.ts | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/packages/taler-wallet-cli/src/integrationtests/sync.ts b/packages/taler-wallet-cli/src/integrationtests/sync.ts new file mode 100644 index 000000000..7aa4b2893 --- /dev/null +++ b/packages/taler-wallet-cli/src/integrationtests/sync.ts @@ -0,0 +1,121 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler 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 + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * Imports. + */ +import axios from "axios"; +import { Configuration, URL } from "@gnu-taler/taler-wallet-core"; +import { getRandomIban, getRandomString } from "./helpers"; +import * as fs from "fs"; +import * as util from "util"; +import { + GlobalTestState, + DbInfo, + pingProc, + ProcessWrapper, + runCommand, + setupDb, + sh, +} from "./harness"; + +const exec = util.promisify(require("child_process").exec); + +export interface SyncConfig { + /** + * Human-readable name used in the test harness logs. + */ + name: string; + + httpPort: number; + + /** + * Database connection string (ony postgres is supported). + */ + database: string; + + annualFee: string; + + currency: string; + + uploadLimitMb: number; + + /** + * Fulfillment URL used for contract terms related to + * sync. + */ + fulfillmentUrl: string; + + paymentBackendUrl: string; +} + +function setSyncPaths(config: Configuration, home: string) { + config.setString("paths", "sync_home", home); + // We need to make sure that the path of taler_runtime_dir isn't too long, + // as it contains unix domain sockets (108 character limit). + const runDir = fs.mkdtempSync("/tmp/taler-test-"); + config.setString("paths", "sync_runtime_dir", runDir); + config.setString("paths", "sync_data_home", "$SYNC_HOME/.local/share/sync/"); + config.setString("paths", "sync_config_home", "$SYNC_HOME/.config/sync/"); + config.setString("paths", "sync_cache_home", "$SYNC_HOME/.config/sync/"); +} + +export class SyncService { + static async create( + gc: GlobalTestState, + sc: SyncConfig, + ): Promise<SyncService> { + const config = new Configuration(); + + const cfgFilename = gc.testDir + `/sync-${sc.name}.conf`; + setSyncPaths(config, gc.testDir + "/synchome"); + config.setString("taler", "currency", sc.currency); + config.setString("sync", "serve", "tcp"); + config.setString("sync", "port", `${sc.httpPort}`); + config.setString("sync", "db", "postgres"); + config.setString("syncdb-postgres", "config", sc.database); + config.write(cfgFilename); + + return new SyncService(gc, sc, cfgFilename); + } + + proc: ProcessWrapper | undefined; + + get baseUrl(): string { + return `http://localhost:${this.syncConfig.httpPort}/`; + } + + async start(): Promise<void> { + await exec(`sync-dbinit -c "${this.configFilename}"`); + + this.proc = this.globalState.spawnService( + "sync-httpd", + ["-LDEBUG", "-c", this.configFilename], + `sync-${this.syncConfig.name}`, + ); + } + + async pingUntilAvailable(): Promise<void> { + const url = new URL("config", this.baseUrl).href; + await pingProc(this.proc, url, "sync"); + } + + constructor( + private globalState: GlobalTestState, + private syncConfig: SyncConfig, + private configFilename: string, + ) {} +} |