blob: 9d276f7d2e59379f903d4df7dbfb36dd7db7307e [file] [log] [blame]
#!/usr/bin/env ruby
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class RandomData
def initialize(schm, seed=nil)
srand(seed) if seed
@seed = seed
@schm = schm
end
def next
nextdata(@schm)
end
def nextdata(schm, d=0)
case schm.type_sym
when :boolean
rand > 0.5
when :string
randstr()
when :int
rand(Avro::Schema::INT_MAX_VALUE - Avro::Schema::INT_MIN_VALUE) + Avro::Schema::INT_MIN_VALUE
when :long
rand(Avro::Schema::LONG_MAX_VALUE - Avro::Schema::LONG_MIN_VALUE) + Avro::Schema::LONG_MIN_VALUE
when :float
(-1024 + 2048 * rand).round.to_f
when :double
Avro::Schema::LONG_MIN_VALUE + (Avro::Schema::LONG_MAX_VALUE - Avro::Schema::LONG_MIN_VALUE) * rand
when :bytes
randstr(BYTEPOOL)
when :null
nil
when :array
arr = []
len = rand(5) + 2 - d
len = 0 if len < 0
len.times{ arr << nextdata(schm.items, d+1) }
arr
when :map
map = {}
len = rand(5) + 2 - d
len = 0 if len < 0
len.times do
map[nextdata(Avro::Schema::PrimitiveSchema.new(:string))] = nextdata(schm.values, d+1)
end
map
when :record, :error
m = {}
schm.fields.each do |field|
m[field.name] = nextdata(field.type, d+1)
end
m
when :union
types = schm.schemas
nextdata(types[rand(types.size)], d)
when :enum
symbols = schm.symbols
len = symbols.size
return nil if len == 0
symbols[rand(len)]
when :fixed
f = ""
schm.size.times { f << BYTEPOOL[rand(BYTEPOOL.size), 1] }
f
end
end
CHARPOOL = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'
BYTEPOOL = '12345abcd'
def randstr(chars=CHARPOOL, length=20)
str = ''
rand(length+1).times { str << chars[rand(chars.size)] }
str
end
end