#!/usr/bin/env python3 # Copyright (C) 2019 Lars Wirzenius # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import copy import json import logging import os import sys import time import requests def generate_snippets(n): for i in range(n): yield 'log line {}\n'.format(i) def full_log(n): return ''.join(generate_snippets(n)) def store_snippet(url, token, i, snippet): url = '{}/res'.format(url) obj = { '_type': 'snippet', 'seq': i, 'text': snippet, } headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } r = requests.post(url, headers=headers, data=json.dumps(obj)) assert r.ok def get_snippet(url, token, rid): url = '{}/res'.format(url) headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', 'Muck-Id': rid, } r = requests.get(url, headers=headers) assert r.ok return r.json() def get_snippet_ids(url, token): search = '{}/search'.format(url) body = { 'cond': [ { "where": "data", "field": "_type", "pattern": "snippet", "op": "==" }, ], } headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } r = requests.get(search, headers=headers, data=json.dumps(body)) assert r.ok obj = r.json() return obj['resources'] def get_full_log(url, token, ids): snippets = [get_snippet(url, token, rid) for rid in ids] snippets.sort(key=lambda o: o['seq']) return ''.join(o['text'] for o in snippets) def report(msg, started): now = time.time() duration = now - started print(msg) return duration url = sys.argv[1] token = sys.argv[2] N = int(sys.argv[3]) started = time.time() _ = report('creating snippets', started) for i, snippet in enumerate(generate_snippets(N)): store_snippet(url, token, i, snippet) creation_secs = report('getting snippets', started) ids = get_snippet_ids(url, token) get_snippets_secs = report('getting full log', started) log = get_full_log(url, token, ids) get_log_secs = report('checking', started) expected = full_log(N) if expected != log: print('ERROR: actual log differs from expected') print('actual:') print(repr(log)) sys.exit(1) print('OK') print('%.0f' % creation_secs, 'creation time') print('%.0f' % get_snippets_secs, 'list snippets') print('%.0f' % get_log_secs, 'assemble log')