1#!/usr/bin/python3 2# 3# Copyright (c) 2009-2021, Google LLC 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are met: 8# * Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# * Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# * Neither the name of Google LLC nor the 14# names of its contributors may be used to endorse or promote products 15# derived from this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY 21# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28import sys 29import random 30 31base = sys.argv[1] 32 33field_freqs = [ 34 (('bool', 'optional'), 8.321), 35 (('bool', 'repeated'), 0.033), 36 (('bytes', 'optional'), 0.809), 37 (('bytes', 'repeated'), 0.065), 38 (('double', 'optional'), 2.845), 39 (('double', 'repeated'), 0.143), 40 (('fixed32', 'optional'), 0.084), 41 (('fixed32', 'repeated'), 0.012), 42 (('fixed64', 'optional'), 0.204), 43 (('fixed64', 'repeated'), 0.027), 44 (('float', 'optional'), 2.355), 45 (('float', 'repeated'), 0.132), 46 (('int32', 'optional'), 6.717), 47 (('int32', 'repeated'), 0.366), 48 (('int64', 'optional'), 9.678), 49 (('int64', 'repeated'), 0.425), 50 (('sfixed32', 'optional'), 0.018), 51 (('sfixed32', 'repeated'), 0.005), 52 (('sfixed64', 'optional'), 0.022), 53 (('sfixed64', 'repeated'), 0.005), 54 (('sint32', 'optional'), 0.026), 55 (('sint32', 'repeated'), 0.009), 56 (('sint64', 'optional'), 0.018), 57 (('sint64', 'repeated'), 0.006), 58 (('string', 'optional'), 25.461), 59 (('string', 'repeated'), 2.606), 60 (('Enum', 'optional'), 6.16), 61 (('Enum', 'repeated'), 0.576), 62 (('Message', 'optional'), 22.472), 63 (('Message', 'repeated'), 7.766), 64 (('uint32', 'optional'), 1.289), 65 (('uint32', 'repeated'), 0.051), 66 (('uint64', 'optional'), 1.044), 67 (('uint64', 'repeated'), 0.079), 68] 69 70population = [item[0] for item in field_freqs] 71weights = [item[1] for item in field_freqs] 72 73def choices(k): 74 if sys.version_info >= (3, 6): 75 return random.choices(population=population, weights=weights, k=k) 76 else: 77 print("WARNING: old Python version, field types are not properly weighted!") 78 return [random.choice(population) for _ in range(k)] 79 80with open(base + "/100_msgs.proto", "w") as f: 81 f.write('syntax = "proto3";\n') 82 f.write('package upb_benchmark;\n') 83 f.write('message Message {}\n') 84 for i in range(2, 101): 85 f.write('message Message{i} {{}}\n'.format(i=i)) 86 87with open(base + "/200_msgs.proto", "w") as f: 88 f.write('syntax = "proto3";\n') 89 f.write('package upb_benchmark;\n') 90 f.write('message Message {}\n') 91 for i in range(2, 501): 92 f.write('message Message{i} {{}}\n'.format(i=i)) 93 94with open(base + "/100_fields.proto", "w") as f: 95 f.write('syntax = "proto2";\n') 96 f.write('package upb_benchmark;\n') 97 f.write('enum Enum { ZERO = 0; }\n') 98 f.write('message Message {\n') 99 i = 1 100 random.seed(a=0, version=2) 101 for field in choices(100): 102 field_type, label = field 103 f.write(' {label} {field_type} field{i} = {i};\n'.format(i=i, label=label, field_type=field_type)) 104 i += 1 105 f.write('}\n') 106 107with open(base + "/200_fields.proto", "w") as f: 108 f.write('syntax = "proto2";\n') 109 f.write('package upb_benchmark;\n') 110 f.write('enum Enum { ZERO = 0; }\n') 111 f.write('message Message {\n') 112 i = 1 113 random.seed(a=0, version=2) 114 for field in choices(200): 115 field_type, label = field 116 f.write(' {label} {field_type} field{i} = {i};\n'.format(i=i, label=label,field_type=field_type)) 117 i += 1 118 f.write('}\n') 119