Commit | Line | Data |
---|---|---|
1b761a9e MD |
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 | ||
22 | def write_binary(f, arr): | |
23 | f.write(bytes(arr)) | |
24 | ||
25 | def generate_metadata(trace_nr): | |
26 | # Generate metadata | |
27 | metadata_str = \ | |
28 | ('/* CTF 1.8 */\n' | |
29 | '\n' | |
30 | 'typealias integer {{ size = 8; align = 8; signed = false; base = hex; }} := uint8_t;\n' | |
31 | 'typealias integer {{ size = 32; align = 8; signed = false; base = hex; }} := uint32_t;\n' | |
32 | 'typealias integer {{ size = 64; align = 8; signed = false; base = hex; }} := uint64_t;\n' | |
33 | '\n' | |
34 | 'trace {{\n' | |
83fcdab0 FD |
35 | ' major = 1;\n' |
36 | ' minor = 8;\n' | |
1b761a9e MD |
37 | ' uuid = "2a6422d0-6cee-11e0-8c08-cb07d7b3a564";\n' |
38 | ' byte_order = le;\n' | |
39 | ' packet.header := struct {{\n' | |
40 | ' uint32_t magic;\n' | |
41 | ' uint8_t uuid[16];\n' | |
42 | ' }};\n' | |
43 | '}};\n' | |
44 | '\n' | |
45 | 'clock {{\n' | |
46 | ' name = monotonic;\n' | |
47 | ' uuid = "e016a9b9-1058-40d5-9074-6ce5e2bb59c6";\n' | |
48 | ' description = "Monotonic Clock";\n' | |
49 | ' freq = 1000000000;\n' | |
50 | ' offset = 1415075600471492540;\n' | |
51 | '}};\n' | |
52 | '\n' | |
53 | 'event {{\n' | |
54 | ' name = myevent;\n' | |
55 | ' fields := struct {{\n' | |
56 | ' uint8_t f;\n' | |
57 | ' }};\n' | |
58 | '}};\n').format() | |
59 | ||
60 | metadata_f = open(tracedir_name + '/' + str(trace_nr) + '/metadata', 'w') | |
61 | metadata_f.write(metadata_str) | |
62 | metadata_f.close() | |
63 | ||
64 | def generate_stream(trace_nr): | |
65 | # Generate stream | |
66 | stream_packet_header = [ | |
67 | 0xC1, 0x1F, 0xFC, 0xC1, # magic | |
68 | 0x2A, 0x64, 0x22, 0xD0, 0x6C, 0xEE, 0x11, 0xE0, | |
69 | 0x8C, 0x08, 0xCB, 0x07, 0xD7, 0xB3, 0xA5, 0x64, # uuid | |
70 | ] | |
71 | event_payload = [ | |
72 | 0x42, | |
73 | ] | |
74 | stream_f = open(tracedir_name + '/' + str(trace_nr) + '/stream', 'wb') | |
75 | write_binary(stream_f, stream_packet_header) | |
76 | # generate 8-bit per event | |
77 | write_binary(stream_f, event_payload) | |
78 | stream_f.close() | |
79 | ||
80 | def generate_traces(array_len): | |
81 | for i in range(array_len): | |
82 | os.mkdir(tracedir_name + '/' + str(i)) | |
83 | generate_metadata(i) | |
84 | generate_stream(i) | |
85 | ||
86 | def test_prepare(): | |
87 | print('Preparing test for ' + str(array_len) + ' traces') | |
88 | os.mkdir(tracedir_name) | |
89 | generate_traces(array_len) | |
90 | ||
91 | def test_clean(): | |
92 | print('Cleaning up test for ' + str(array_len) + ' traces') | |
93 | try: | |
94 | os.remove(output_metadata) | |
95 | except: | |
96 | pass | |
97 | for i in range(array_len): | |
98 | try: | |
99 | os.remove(tracedir_name + '/' + str(i) + '/metadata') | |
100 | except: | |
101 | pass | |
102 | try: | |
103 | os.remove(tracedir_name + '/' + str(i) + '/stream') | |
104 | except: | |
105 | pass | |
106 | try: | |
107 | os.rmdir(tracedir_name + '/' + str(i)) | |
108 | except: | |
109 | pass | |
110 | try: | |
111 | os.rmdir(tracedir_name) | |
112 | except: | |
113 | pass | |
114 | ||
115 | if (mode == "prepare"): | |
116 | test_clean() | |
117 | test_prepare() | |
118 | elif (mode == "clean"): | |
119 | test_clean() | |
120 | else: | |
121 | arg_err() |