cddl 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/cddl.gemspec +1 -1
  3. data/lib/cddl.rb +42 -1
  4. data/test/test-cddl.rb +99 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f786ac685c1f30ca4a1510ad4e40981a6403dc7f
4
- data.tar.gz: 8d2a5a22918683e260bbd79331e1b9874ea649a1
3
+ metadata.gz: ea47a90f675f5589227fb3a10db240bddaae6c8e
4
+ data.tar.gz: 04f10cc045bbc451c244e2d6de26e8a1c0a64cf9
5
5
  SHA512:
6
- metadata.gz: 2055bf34a4f4b366b12455723dcc86eba307064c0831dad03d864f7f6a014eab724b9283917341f88c6daf8a08ecb9d4808f269161b7127404d689684f5165db
7
- data.tar.gz: b3693cc1e1277a2f7848fb886ed1665cfc885438da1d2e3fd7d94355a6081265eaa62fd4db3fafea38ade41e708d0515c51a0c0001ad453ccf711009adc8b6d4
6
+ metadata.gz: 7d1bda5f7bf502ba4dbb0d11ff1ac40ee249892a086e95c0c00dc4f4928e2384b6a8b26a2940c6ea7e7b342af06ec8aa5320d61ea019bce101945b287910bb8b
7
+ data.tar.gz: 7f69f714dcc39eb85474df6823a48b7a67b8dfdbc5fcfdb8b459ba7798a411e66673de622a690486dfe85ad6feb88ea9188ab4966b3d5b3a028982c1f97d9f75
data/cddl.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.6.5'
3
+ s.version = '0.7.0'
4
4
  s.summary = "CDDL generator and validator."
5
5
  s.description = %{A parser, generator, and validator for CDDL}
6
6
  s.add_dependency('cbor-diag')
data/lib/cddl.rb CHANGED
@@ -415,6 +415,34 @@ module CDDL
415
415
  fail "Don't know yet how to generate #{where}"
416
416
  end
417
417
  REGEXP_FOR_STRING[regexp].random_example(max_repeater_variance: 5)
418
+ when :cbor, :cborseq
419
+ unless target == [:prim, 2]
420
+ fail "Don't know yet how to generate #{where}"
421
+ end
422
+ content = CBOR::encode(generate1(control))
423
+ if where[1] == :cborseq
424
+ # remove the first head
425
+ n = case content.getbyte(0) - (4 << 5)
426
+ when 0..23; 1
427
+ when 24; 2
428
+ when 25; 3
429
+ when 26; 5
430
+ when 27; 9 # unlikely :-)
431
+ else fail "Generated .cborseq sequence for #{where} not an array"
432
+ end
433
+ content[0...n] = ''
434
+ end
435
+ content
436
+ when :within, :and
437
+ 32.times do
438
+ content = generate1(target)
439
+ if validate1(content, control)
440
+ return content
441
+ elsif where[1] == :within
442
+ warn "*** #{content.inspect} meets #{target.inspect} but not #{control.inspect}"
443
+ end
444
+ end
445
+ fail "Not smart enough to generate #{where}"
418
446
  else
419
447
  fail "Don't know yet how to generate from #{where}"
420
448
  end
@@ -684,6 +712,19 @@ module CDDL
684
712
  end
685
713
  end
686
714
  )
715
+ when :cbor
716
+ ann if validate1((CBOR::decode(d) rescue :BAD_CBOR), control)
717
+ when :cborseq
718
+ ann if validate1((CBOR::decode("\x9f".b << d << "\xff".b) rescue :BAD_CBOR), control)
719
+ when :within
720
+ if validate1(d, control)
721
+ ann
722
+ else
723
+ warn "*** #{d.inspect} meets #{target} but not #{control}"
724
+ nil
725
+ end
726
+ when :and
727
+ ann if validate1(d, control)
687
728
  else
688
729
  fail "Don't know yet how to validate against #{where}"
689
730
  end
@@ -996,7 +1037,7 @@ module CDDL
996
1037
 
997
1038
  BRACE = {"{" => :map, "[" => :array}
998
1039
  RANGE_EXCLUDE_END = {".." => false, "..." => true}
999
- SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp]
1040
+ SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and]
1000
1041
 
1001
1042
  def type1(n, canbegroup = false)
1002
1043
  # puts "NVALUE #{n.value.inspect}"
data/test/test-cddl.rb CHANGED
@@ -902,6 +902,104 @@ HERE
902
902
  refute parser.validate("re", false)
903
903
  end
904
904
 
905
+ def test_cbor_annotation1
906
+ parser = CDDL::Parser.new <<HERE
907
+ test = bytes .cbor 1
908
+ HERE
909
+ pp parser.rules
910
+ 5.times do
911
+ gen = parser.generate
912
+ assert_equal "\x01", gen
913
+ pp gen
914
+ assert parser.validate(gen)
915
+ end
916
+ assert parser.validate("\x01".b)
917
+ assert parser.validate("\x18\x01".b)
918
+ refute parser.validate("1", false)
919
+ refute parser.validate("\x00".b, false)
920
+ end
921
+
922
+ def test_cbor_annotation_uint
923
+ parser = CDDL::Parser.new <<HERE
924
+ test = bytes .cbor uint
925
+ HERE
926
+ pp parser.rules
927
+ 5.times do
928
+ gen = parser.generate
929
+ assert String === gen
930
+ assert_equal 0, gen.getbyte(0) >> 5
931
+ pp ["CAU", gen]
932
+ assert parser.validate(gen)
933
+ end
934
+ assert parser.validate("\x01".b)
935
+ assert parser.validate("\x00".b)
936
+ assert parser.validate("\x18\x01".b)
937
+ refute parser.validate("1", false)
938
+ refute parser.validate("\x00\x00".b, false)
939
+ end
940
+
941
+ def test_cborseq_annotation_uint
942
+ parser = CDDL::Parser.new <<HERE
943
+ test = bytes .cborseq uint
944
+ HERE
945
+ assert_raise {
946
+ parser.generate
947
+ }
948
+ end
949
+
950
+ def test_cbor_annotation_uint_array
951
+ parser = CDDL::Parser.new <<HERE
952
+ test = bytes .cborseq myarray
953
+ myarray = [1*4uint]
954
+ HERE
955
+ pp parser.rules
956
+ 5.times do
957
+ gen = parser.generate
958
+ assert String === gen
959
+ pp ["CAUA", gen]
960
+ assert_equal 0, gen.getbyte(0) >> 5 unless gen == ''
961
+ assert parser.validate(gen)
962
+ end
963
+ assert parser.validate("\x01".b)
964
+ assert parser.validate("\x18\x01".b)
965
+ refute parser.validate("1", false)
966
+ refute parser.validate("\x00\x00\x00\x00\x00".b, false)
967
+ end
968
+
969
+ def test_and_annotation
970
+ parser = CDDL::Parser.new <<HERE
971
+ test = mtype .and uint
972
+ mtype = 1/2/3/4/-1
973
+ HERE
974
+ pp parser.rules
975
+ 5.times do
976
+ gen = parser.generate
977
+ assert Integer === gen
978
+ pp ["CAA", gen]
979
+ assert parser.validate(gen)
980
+ end
981
+ assert parser.validate(1)
982
+ refute parser.validate(-1, false)
983
+ refute parser.validate(0, false)
984
+ end
985
+
986
+ def test_within_annotation
987
+ parser = CDDL::Parser.new <<HERE
988
+ test = mtype .within uint
989
+ mtype = 1/2/3/4/-1
990
+ HERE
991
+ pp parser.rules
992
+ 20.times do
993
+ gen = parser.generate
994
+ assert Integer === gen
995
+ pp ["CWA", gen] # should also generate some warnings
996
+ assert parser.validate(gen)
997
+ end
998
+ assert parser.validate(1)
999
+ refute parser.validate(-1, false)
1000
+ refute parser.validate(0, false)
1001
+ end
1002
+
905
1003
  def test_dcaf
906
1004
  parser1 = CDDL::Parser.new(File.read("#{TEST_DATA_DIR}/dcaf1.cddl"))
907
1005
  # assert_equal EXPECTED_RULES, parser1.rules
@@ -1196,7 +1294,7 @@ HERE
1196
1294
  # pp parser.rules
1197
1295
  assert_equal(["abs"], parser.generate.keys)
1198
1296
  v = {}
1199
- 10.times do
1297
+ 20.times do # OK, this is probabilistic...
1200
1298
  v[parser.generate["abs"]] = true
1201
1299
  end
1202
1300
  assert_equal({3 => true, -3 => true}, v)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cddl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.5
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-09 00:00:00.000000000 Z
11
+ date: 2015-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor-diag