cadet.scm 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. ;; This file is part of scheme-GNUnet, a partial Scheme port of GNUnet.
  2. ;; Copyright © 2022 GNUnet e.V.
  3. ;;
  4. ;; scheme-GNUnet is free software: you can redistribute it and/or modify it
  5. ;; under the terms of the GNU Affero General Public License as published
  6. ;; by the Free Software Foundation, either version 3 of the License,
  7. ;; or (at your option) any later version.
  8. ;;
  9. ;; scheme-GNUnet is distributed in the hope that it will be useful, but
  10. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. ;; Affero General Public License for more details.
  13. ;;
  14. ;; You should have received a copy of the GNU Affero General Public License
  15. ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. ;;
  17. ;; SPDX-License-Identifier: AGPL-3.0-or-later
  18. (define-module (test-distributed-hash-table))
  19. (import (gnu gnunet cadet client)
  20. (gnu gnunet cadet network)
  21. (gnu gnunet utils bv-slice)
  22. (gnu gnunet utils hat-let)
  23. (gnu gnunet netstruct syntactic)
  24. (gnu gnunet crypto struct)
  25. (gnu gnunet hashcode struct)
  26. (rnrs bytevectors)
  27. (ice-9 match)
  28. (srfi srfi-8)
  29. (srfi srfi-64)
  30. (tests utils)
  31. (quickcheck)
  32. (quickcheck property)
  33. (quickcheck generator)
  34. (quickcheck arbitrary))
  35. (test-begin "CADET")
  36. (test-assert "(CADET) close, not connected --> all fibers stop, no callbacks called"
  37. (close-not-connected-no-fallbacks "cadet" connect disconnect!))
  38. (test-assert "(CADET) garbage collectable"
  39. (garbage-collectable "cadet" connect))
  40. (define %peer-identity
  41. (bv-slice/read-write (u8-list->bytevector (iota (sizeof /peer-identity '())))))
  42. (define %port
  43. (bv-slice/read-write
  44. (u8-list->bytevector (map (lambda (x) (- 255 x))
  45. (iota (sizeof /hashcode:512 '()))))))
  46. (test-assert "cadet-address?"
  47. (and (cadet-address? (make-cadet-address %peer-identity %port))
  48. (not (cadet-address? 'foobar))))
  49. (test-equal "cadet-address, deconstruct"
  50. '(#true #true)
  51. (let ((cadet (make-cadet-address %peer-identity %port)))
  52. ;; TODO: extend 'bytevector=?' to accept ranges, then define
  53. ;; 'slice=?'.
  54. (list (equal? (cadet-address-peer cadet) (slice/read-only %peer-identity))
  55. (equal? (cadet-address-port cadet) (slice/read-only %port)))))
  56. (test-error "cadet-address, wrong peer identity size (1)" #f
  57. (make-cadet-address (make-slice/read-write 0) %port))
  58. (test-error "cadet-address, wrong peer identity size (2)" #f
  59. (make-cadet-address
  60. (make-slice/read-write (- (sizeof /peer-identity '()) 1)) %port))
  61. (test-error "cadet-address, wrong peer identity size (3)" #f
  62. (make-cadet-address
  63. (make-slice/read-write (+ (sizeof /peer-identity '()) 1)) %port))
  64. (test-error "cadet-address, wrong port size (1)" #f
  65. (make-cadet-address %peer-identity (make-slice/read-write 0)))
  66. (test-error "cadet-address, wrong port size (2)" #f
  67. (make-cadet-address
  68. %peer-identity
  69. (make-slice/read-write (- (sizeof /hashcode:512 '()) 1))))
  70. (test-error "cadet-address, wrong port size (3)" #f
  71. (make-cadet-address
  72. %peer-identity
  73. (make-slice/read-write (+ (sizeof /hashcode:512 '()) 1))))
  74. (test-assert "cadet-address, read-only port"
  75. (let ((slice (cadet-address-port (make-cadet-address %peer-identity %port))))
  76. (and (slice-readable? slice) (not (slice-writable? slice)))))
  77. (test-assert "cadet-address, read-only peer"
  78. (let ((slice (cadet-address-peer (make-cadet-address %peer-identity %port))))
  79. (and (slice-readable? slice) (not (slice-writable? slice)))))
  80. (test-assert "cadet-address, independent slices"
  81. (let ((struct (make-cadet-address %peer-identity %port)))
  82. (and (slice-independent? %peer-identity (cadet-address-peer struct))
  83. (slice-independent? %port (cadet-address-port struct)))))
  84. (test-equal "cadet-address, equal?"
  85. (make-cadet-address %peer-identity %port)
  86. (make-cadet-address (slice-copy/read-only %peer-identity)
  87. (slice-copy/read-only %port)))
  88. ;; TODO: integrate in guile-quickcheck, (tests utils)
  89. (define ($integer-in-range lower upper)
  90. (arbitrary
  91. (gen (choose-integer lower upper))
  92. (xform #false)))
  93. (define ($sized-bytevector size)
  94. (arbitrary
  95. (gen (choose-bytevector size))
  96. (xform #false)))
  97. (define ($arbitrary-lift f . a)
  98. (arbitrary
  99. (gen (apply generator-lift f (map arbitrary-gen a)))
  100. (xform #false))) ; TODO
  101. (define ($sized-bytevector-slice/read-write size)
  102. ($arbitrary-lift bv-slice/read-write ($sized-bytevector size)))
  103. (define ($sized-bytevector-slice/read-only size)
  104. ($arbitrary-lift slice/read-only ($sized-bytevector-slice/read-write size)))
  105. (define $channel-number ($integer-in-range 0 (- (expt 2 32) 1)))
  106. (define $peer ($sized-bytevector-slice/read-only (sizeof /peer-identity '())))
  107. (define $port ($sized-bytevector-slice/read-only (sizeof /hashcode:512 '())))
  108. (define $options ($integer-in-range 0 (- (expt 2 32) 1)))
  109. (define $cadet-address ($arbitrary-lift make-cadet-address $peer $port))
  110. (define $priority-preference ($integer-in-range 0 (- (expt 2 32) 1)))
  111. ;; Actual sizes can be a lot larger
  112. (define $cadet-data ($sized-bytevector-slice/read-only 500))
  113. (define (normalise list)
  114. (map (match-lambda
  115. ((? slice? s) (slice-copy/read-only s))
  116. (foo foo))
  117. list))
  118. (define-syntax-rule
  119. (test-roundtrip testcase analyse construct (name $arbitrary) ...)
  120. (test-assert testcase
  121. (quickcheck
  122. (property ((name $arbitrary) ...)
  123. (let^ ((! expected (pk 'e (list name ...)))
  124. (! constructed (construct name ...))
  125. (<-- analysed (analyse constructed))
  126. (! analysed (normalise analysed)))
  127. (and (slice-readable? constructed)
  128. (slice-writable? constructed)
  129. (equal? expected analysed)))))))
  130. (test-roundtrip "analyse + construct round-trips (local-channel-create)"
  131. analyse-local-channel-create construct-local-channel-create
  132. (cadet-address $cadet-address)
  133. (channel-number $channel-number)
  134. (options $options))
  135. (test-roundtrip "analyse + construct round-trips (local-channel-destroy)"
  136. analyse-local-channel-destroy construct-local-channel-destroy
  137. (channel-number $channel-number))
  138. (test-roundtrip "analyse + construct round-trips (local-data)"
  139. analyse-local-data construct-local-data
  140. (channel-number $channel-number)
  141. (priority-preference $priority-preference)
  142. (data $cadet-data))
  143. (test-roundtrip "analyse + construct round-tripes (local-acknowledgement)"
  144. analyse-local-acknowledgement construct-local-acknowledgement
  145. (channel-number $channel-number))
  146. ;; header information will be tested elsewhere (TODO)
  147. (test-end "CADET")