123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- ;;;; sandbox.test --- tests guile's evaluator -*- scheme -*-
- ;;;; Copyright (C) 2017 Free Software Foundation, Inc.
- ;;;;
- ;;;; This library is free software; you can redistribute it and/or
- ;;;; modify it under the terms of the GNU Lesser General Public
- ;;;; License as published by the Free Software Foundation; either
- ;;;; version 3 of the License, or (at your option) any later version.
- ;;;;
- ;;;; This library is distributed in the hope that it will be useful,
- ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- ;;;; Lesser General Public License for more details.
- ;;;;
- ;;;; You should have received a copy of the GNU Lesser General Public
- ;;;; License along with this library; if not, write to the Free Software
- ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- (define-module (test-suite sandbox)
- #:use-module (test-suite lib)
- #:use-module (ice-9 sandbox))
- (define exception:bad-expression
- (cons 'syntax-error "Bad expression"))
- (define exception:failed-match
- (cons 'syntax-error "failed to match any pattern"))
- (define exception:not-a-list
- (cons 'wrong-type-arg "Not a list"))
- (define exception:wrong-length
- (cons 'wrong-type-arg "wrong length"))
- (define (usleep-loop usecs)
- (unless (zero? usecs)
- (usleep-loop (usleep usecs))))
- (define (busy-loop)
- (busy-loop))
- (with-test-prefix "time limit"
- (pass-if "0 busy loop"
- (call-with-time-limit 0 busy-loop (lambda () #t)))
- (pass-if "0.001 busy loop"
- (call-with-time-limit 0.001 busy-loop (lambda () #t)))
- (pass-if "0 sleep"
- (call-with-time-limit 0 (lambda () (usleep-loop #e1e6) #f)
- (lambda () #t)))
- (pass-if "0.001 sleep"
- (call-with-time-limit 0.001 (lambda () (usleep-loop #e1e6) #f)
- (lambda () #t))))
- (define (alloc-loop)
- (let lp ((ret #t))
- (and ret
- (lp (cons #t #t)))))
- (define (recur-loop)
- (1+ (recur-loop)))
- (with-test-prefix "allocation limit"
- (pass-if "0 alloc loop"
- (call-with-allocation-limit 0 alloc-loop (lambda () #t)))
- (pass-if "1e6 alloc loop"
- (call-with-allocation-limit #e1e6 alloc-loop (lambda () #t)))
- (pass-if "0 recurse"
- (call-with-allocation-limit 0 recur-loop (lambda () #t)))
- (pass-if "1e6 recurse"
- (call-with-allocation-limit #e1e6 recur-loop (lambda () #t))))
- (define-syntax-rule (pass-if-unbound foo)
- (pass-if-exception (format #f "~a unavailable" 'foo)
- exception:unbound-var (eval-in-sandbox 'foo))
- )
- (with-test-prefix "eval-in-sandbox"
- (pass-if-equal 42
- (eval-in-sandbox 42))
- (pass-if-equal 'foo
- (eval-in-sandbox ''foo))
- (pass-if-equal '(1 . 2)
- (eval-in-sandbox '(cons 1 2)))
- (pass-if-unbound @@)
- (pass-if-unbound foo)
- (pass-if-unbound set!)
- (pass-if-unbound open-file)
- (pass-if-unbound current-input-port)
- (pass-if-unbound call-with-output-file)
- (pass-if-unbound vector-set!)
- (pass-if-equal vector-set!
- (eval-in-sandbox 'vector-set!
- #:bindings all-pure-and-impure-bindings))
- (pass-if-exception "limit exceeded"
- '(limit-exceeded . "")
- (eval-in-sandbox '(let lp () (lp)))))
|