def test_wrong_name(self): trait = self.get_test_trait() trait.state_list.append( schema.Field('a_field', 1000, '', schema.Field.DataType.INT32, None)) trait.extends = schema.Trait('super_trait', 1000, '') trait.extends.state_list.append( schema.Field('b_field', 1000, '', schema.Field.DataType.INT32, None)) self.assert_invalid(extends_validator.ExtendsValidator, 'missing field b_field')
def test_wrong_type(self): trait = self.get_test_trait() trait.state_list.append( schema.Field('a_field', 1000, '', schema.Field.DataType.INT32, None)) trait.extends = schema.Trait('super_trait', 1000, '') trait.extends.state_list.append( schema.Field('a_field', 1000, '', schema.Field.DataType.FLOAT, None)) self.assert_invalid(extends_validator.ExtendsValidator, 'types for field a_field do not match')
def test_bad_map(self): map_key = schema.Field('key', 1, '', schema.Field.DataType.UINT64, None) field = schema.Field('invalid_map', 1000, '', schema.Field.DataType.STRUCT, None) field.is_map = True field.map_key = map_key self.get_test_trait().state_list.append(field) self.assert_invalid(map_validator.MapValidator, '64 bit keys are not allowed in map keys.')
def test_wrong_struct_type(self): trait = self.get_test_trait() sub_field = schema.Field('a_field', 1000, '', schema.Field.DataType.STRUCT, None) sub_field.metadata = self.get_test_struct() trait.state_list.append(sub_field) super_field = schema.Field('a_field', 1000, '', schema.Field.DataType.STRUCT, None) super_field.metadata = schema.Struct('SomeStruct', 1, '') trait.extends = schema.Trait('super_trait', 1000, '') trait.extends.state_list.append(super_field) self.assert_invalid(extends_validator.ExtendsValidator, 'types for field a_field do not match')
def test_bad_underscore(self): self.get_test_trait().state_list.append( schema.Field('badUnderScore', 1000, '', schema.Field.DataType.STRING, None)) self.assert_invalid( name_inflection_validator.NameInflectionValidator, 'incorrect name inflection; expected.*bad_under_score')
def test_field_added_to_trait_without_min_version(self): added_field = schema.Field('new_field', 1000, '', schema.Field.DataType.INT32, None) self.get_test_trait().state_list.append(added_field) self.assert_invalid(added_object_validator.AddedObjectValidator, self.NEW_OBJECT_ADDED_ERR_MSG)
def test_nullable_enum(self): field = schema.Field('nullable_enum', 1000, '', schema.Field.DataType.ENUM, None) field.metadata = self.get_test_enum() field.is_nullable = True self.get_test_trait().state_list.append(field) self.assert_invalid(nullable_validator.NullableValidator, 'Enums cannot be nullable')
def test_nullable_array(self): field = schema.Field('nullable_array', 1000, '', schema.Field.DataType.STRUCT, None) field.is_array = True field.metadata = self.get_test_struct() field.is_nullable = True self.get_test_trait().state_list.append(field) self.assert_invalid(nullable_validator.NullableValidator, 'Arrays cannot be nullable')
def test_field_added_to_prod_trait_without_increment_trait_version(self): self.get_test_trait().stability = schema.Stability.PROD self.get_previous_test_trait().stability = schema.Stability.PROD added_field = schema.Field('new_field', 1000, '', schema.Field.DataType.INT32, None) added_field.min_version = self.get_test_trait().version self.get_test_trait().state_list.append(added_field) self.assert_invalid(added_object_validator.AddedObjectValidator, self.NEW_OBJECT_ON_PROD_ERR_MSG)
def test_field_added_to_prod_trait_correctly(self): self.get_test_trait().version = 2 self.get_previous_test_trait().version = 1 self.get_test_trait().stability = schema.Stability.PROD self.get_previous_test_trait().stability = schema.Stability.PROD added_field = schema.Field('new_field', 1000, '', schema.Field.DataType.INT32, None) added_field.min_version = 2 self.assert_valid(added_object_validator.AddedObjectValidator)
def test_bad_fixed_width(self): trait = self.get_test_trait() field = schema.Field('some_float', 1000, '') field.data_type = schema.Field.DataType.FLOAT field.precision = 0.01 field.max_value = 20.0 field.min_value = -10.0 field.fixed_width = 128 trait.state_list.append(field) self.assert_invalid(number_validator.NumberValidator, 'Fixed width must be')
def test_bad_min_max(self): trait = self.get_test_trait() field = schema.Field('some_float', 1000, '') field.data_type = schema.Field.DataType.FLOAT field.precision = 0.01 field.max_value = 20.0 field.min_value = 20.0 field.fixed_width = 32 trait.state_list.append(field) self.assert_invalid(number_validator.NumberValidator, r'Max < min \+ precision')
def test_too_big(self): trait = self.get_test_trait() field = schema.Field('some_float', 1000, '') field.data_type = schema.Field.DataType.FLOAT field.precision = 0.0000000001 field.max_value = 2**32 field.min_value = -2**32 field.fixed_width = 32 trait.state_list.append(field) self.assert_invalid(number_validator.NumberValidator, 'fixed_encoding_width > 64')
def test_writable_array(self): field = schema.Field('writable_array', 1000, '', schema.Field.DataType.STRUCT, None) field.is_array = True field.metadata = self.get_test_struct() field.struct_type = field.metadata field.writable = True self.get_test_trait().state_list.append(field) self.assert_invalid( read_write_validator.ReadWriteValidator, 'Field writable_array in TestTrait is writable. ' 'Arrays of structs must not be writable')
def test_invalid_min_version_on_state_field(self): trait = self.get_test_trait() trait.version = 2 field = schema.Field('invalid_version', 1000, '', schema.Field.DataType.STRUCT, None) field.min_version = 3 trait.state_list.append(field) self.assert_invalid(min_version_validator.MinVersionValidator, 'Fields cannot have a min_version > trait ' 'version.')
def test_trait_referencing_old_trait(self): trait = schema.Trait('Test2Trait', 2, '') trait.version = 2 self.get_test_vendor().trait_list.append(trait) struct = schema.Struct('Test2Struct', 2, '') trait.struct_list.append(struct) field = schema.Field('field', 1000, '') field.struct_type = struct self.get_test_trait().state_list.append(field) trait.stability = schema.Stability.ALPHA self.get_test_trait().stability = schema.Stability.BETA self.assert_valid( stability_reference_validator.StabilityReferenceValidator)
def test_trait_referencing_current_trait(self): trait = schema.Trait('Test2Trait', 2, '') trait.version = 2 self.get_test_vendor().trait_list.append(trait) struct = schema.Struct('Test2Struct', 2, '') trait.struct_list.append(struct) field = schema.Field('field', 1000, '') field.struct_type = struct self.get_test_trait().state_list.append(field) self.get_test_trait().version_map = schema.VersionMap() self.get_test_trait().version_map._parsed_map = {2: {'Test2Trait': 2}} # pylint: disable=protected-access trait.stability = schema.Stability.ALPHA self.get_test_trait().stability = schema.Stability.BETA self.assert_invalid( stability_reference_validator.StabilityReferenceValidator, r'.*Traits can only reference Traits.*')
def gen_test_schema(self): schema_obj = schema.Schema() vendor = schema.Vendor('test', 0xfe00, '') schema_obj.vendor_list.append(vendor) resource = schema.Resource('TestResource', 0x0001, '') resource.file = schema.File('test_resource', 1, '') resource.version = 2 vendor.resource_list.append(resource) iface = schema.Interface('TestIface', 0x0001, '') iface.file = schema.File('test_iface', 1, '') vendor.interface_list.append(iface) trait = schema.Trait('TestTrait', 1, '') trait.file = schema.File('test_trait', 1, '') vendor.trait_list.append(trait) typespace = schema.Typespace('TestTypespace', 1, '') typespace.file = schema.File('test_typespace', 1, '') vendor.typespace_list.append(typespace) trait.version = 2 trait.stability = schema.Stability.ALPHA field = schema.Field('test_field', 1, '', schema.Field.DataType.INT32, None) trait.state_list.append(field) resource_component = schema.ResourceComponent('test_component', 1, '') resource_component.trait = trait resource.component_list.append(resource_component) interface_component = schema.InterfaceComponent( 'test_component', 1, '') interface_component.trait = trait iface.component_list.append(interface_component) group = schema.Group('test_group', 1, '') group.interface = iface resource.group_list.append(group) struct = schema.Struct('TestStruct', 1, '') trait.struct_list.append(struct) enum = schema.Enum('TestEnum', 1, '') enum.pair_list.append(schema.EnumPair('TEST_ENUM_UNSPECIFIED', 0, '')) enum.pair_list.append(schema.EnumPair('TEST_ENUM_ONE', 1, '')) enum.pair_list.append(schema.EnumPair('TEST_ENUM_TWO', 2, '')) trait.enum_list.append(enum) event = schema.Event('TestEvent', 1, '') event.field_list.append(field) trait.event_list.append(event) response = schema.CommandResponse('TestRequestResponse', 1, '') response.field_list.append(field) command = schema.Command('TestRequest', 1, '') command.parameter_list.append(field) trait.command_list.append(command) command.response = response response.parent = command return schema_obj
def test_large_tag(self): self.get_test_trait().state_list.append( schema.Field('large_tag', 256, '', schema.Field.DataType.STRING, None)) self.assert_invalid(one_byte_field_tag_validator.OneByteFieldTagValidator, 'Field tags must be in range 1-255; got 256')