| 1 | #!/usr/bin/env python3 |
| 2 | |
| 3 | # Expects either "prepare" or "clean" argument |
| 4 | |
| 5 | import sys |
| 6 | import os |
| 7 | import struct |
| 8 | |
| 9 | def arg_err(): |
| 10 | print('Please specify "prepare <SIZE>" or "clean <SIZE>" as first argument.') |
| 11 | sys.exit(-1) |
| 12 | |
| 13 | if (len(sys.argv) <= 1): |
| 14 | arg_err() |
| 15 | mode = sys.argv[1] |
| 16 | if (len(sys.argv) <= 2): |
| 17 | arg_err() |
| 18 | array_len = int(sys.argv[2]) |
| 19 | |
| 20 | tracedir_name = './trace-' + str(array_len) + '/' |
| 21 | output_metadata = tracedir_name + 'metadata' |
| 22 | output_stream = tracedir_name + 'stream' |
| 23 | |
| 24 | |
| 25 | def write_binary(f, arr): |
| 26 | f.write(bytes(arr)) |
| 27 | |
| 28 | def generate_metadata(array_len): |
| 29 | # Generate metadata |
| 30 | metadata_str = \ |
| 31 | ('/* CTF 1.8 */\n' |
| 32 | '\n' |
| 33 | 'typealias integer {{ size = 8; align = 8; signed = false; base = hex; }} := uint8_t;\n' |
| 34 | 'typealias integer {{ size = 32; align = 8; signed = false; base = hex; }} := uint32_t;\n' |
| 35 | 'typealias integer {{ size = 64; align = 8; signed = false; base = hex; }} := uint64_t;\n' |
| 36 | '\n' |
| 37 | 'trace {{\n' |
| 38 | ' major = 1;\n' |
| 39 | ' minor = 8;\n' |
| 40 | ' uuid = "2a6422d0-6cee-11e0-8c08-cb07d7b3a564";\n' |
| 41 | ' byte_order = le;\n' |
| 42 | ' packet.header := struct {{\n' |
| 43 | ' uint32_t magic;\n' |
| 44 | ' uint8_t uuid[16];\n' |
| 45 | ' }};\n' |
| 46 | '}};\n' |
| 47 | '\n' |
| 48 | 'event {{\n' |
| 49 | ' name = myevent;\n' |
| 50 | ' fields := struct {{\n' |
| 51 | ' uint8_t f;\n' |
| 52 | ' }};\n' |
| 53 | '}};\n').format() |
| 54 | |
| 55 | metadata_f = open(output_metadata, 'w') |
| 56 | metadata_f.write(metadata_str) |
| 57 | metadata_f.close() |
| 58 | |
| 59 | def generate_stream(stream_nr): |
| 60 | # Generate stream |
| 61 | stream_packet_header = [ |
| 62 | 0xC1, 0x1F, 0xFC, 0xC1, # magic |
| 63 | 0x2A, 0x64, 0x22, 0xD0, 0x6C, 0xEE, 0x11, 0xE0, |
| 64 | 0x8C, 0x08, 0xCB, 0x07, 0xD7, 0xB3, 0xA5, 0x64, # uuid |
| 65 | ] |
| 66 | event_payload = [ |
| 67 | 0x42, |
| 68 | ] |
| 69 | stream_f = open(output_stream + str(stream_nr), 'wb') |
| 70 | write_binary(stream_f, stream_packet_header) |
| 71 | # generate 8-bit per event |
| 72 | write_binary(stream_f, event_payload) |
| 73 | stream_f.close() |
| 74 | |
| 75 | def generate_streams(array_len): |
| 76 | for i in range(array_len): |
| 77 | generate_stream(i) |
| 78 | |
| 79 | def test_prepare(): |
| 80 | print('Preparing test for ' + str(array_len) + ' streams') |
| 81 | os.mkdir(tracedir_name) |
| 82 | generate_metadata(array_len) |
| 83 | generate_streams(array_len) |
| 84 | |
| 85 | def test_clean(): |
| 86 | print('Cleaning up test for ' + str(array_len) + ' streams') |
| 87 | try: |
| 88 | os.remove(output_metadata) |
| 89 | except: |
| 90 | pass |
| 91 | for i in range(array_len): |
| 92 | try: |
| 93 | os.remove(output_stream + str(i)) |
| 94 | except: |
| 95 | pass |
| 96 | try: |
| 97 | os.rmdir(tracedir_name) |
| 98 | except: |
| 99 | pass |
| 100 | |
| 101 | if (mode == "prepare"): |
| 102 | test_clean() |
| 103 | test_prepare() |
| 104 | elif (mode == "clean"): |
| 105 | test_clean() |
| 106 | else: |
| 107 | arg_err() |