mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			240 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
 | |
| #
 | |
| # Licensed under the OpenSSL license (the "License").  You may not use
 | |
| # this file except in compliance with the License.  You can obtain a copy
 | |
| # in the file LICENSE in the source distribution or at
 | |
| # https://www.openssl.org/source/license.html
 | |
| 
 | |
| package OpenSSL::Test::Utils;
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| use Exporter;
 | |
| use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 | |
| $VERSION = "0.1";
 | |
| @ISA = qw(Exporter);
 | |
| @EXPORT = qw(alldisabled anydisabled disabled config available_protocols
 | |
|              have_IPv4 have_IPv6);
 | |
| 
 | |
| =head1 NAME
 | |
| 
 | |
| OpenSSL::Test::Utils - test utility functions
 | |
| 
 | |
| =head1 SYNOPSIS
 | |
| 
 | |
|   use OpenSSL::Test::Utils;
 | |
| 
 | |
|   my @tls = available_protocols("tls");
 | |
|   my @dtls = available_protocols("dtls");
 | |
|   alldisabled("dh", "dsa");
 | |
|   anydisabled("dh", "dsa");
 | |
| 
 | |
|   config("fips");
 | |
| 
 | |
|   have_IPv4();
 | |
|   have_IPv6();
 | |
| 
 | |
| =head1 DESCRIPTION
 | |
| 
 | |
| This module provides utility functions for the testing framework.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| use OpenSSL::Test qw/:DEFAULT bldtop_file/;
 | |
| 
 | |
| =over 4
 | |
| 
 | |
| =item B<available_protocols STRING>
 | |
| 
 | |
| Returns a list of strings for all the available SSL/TLS versions if
 | |
| STRING is "tls", or for all the available DTLS versions if STRING is
 | |
| "dtls".  Otherwise, it returns the empty list.  The strings in the
 | |
| returned list can be used with B<alldisabled> and B<anydisabled>.
 | |
| 
 | |
| =item B<alldisabled ARRAY>
 | |
| =item B<anydisabled ARRAY>
 | |
| 
 | |
| In an array context returns an array with each element set to 1 if the
 | |
| corresponding feature is disabled and 0 otherwise.
 | |
| 
 | |
| In a scalar context, alldisabled returns 1 if all of the features in
 | |
| ARRAY are disabled, while anydisabled returns 1 if any of them are
 | |
| disabled.
 | |
| 
 | |
| =item B<config STRING>
 | |
| 
 | |
| Returns an item from the %config hash in \$TOP/configdata.pm.
 | |
| 
 | |
| =item B<have_IPv4>
 | |
| =item B<have_IPv6>
 | |
| 
 | |
| Return true if IPv4 / IPv6 is possible to use on the current system.
 | |
| 
 | |
| =back
 | |
| 
 | |
| =cut
 | |
| 
 | |
| our %available_protocols;
 | |
| our %disabled;
 | |
| our %config;
 | |
| my $configdata_loaded = 0;
 | |
| 
 | |
| sub load_configdata {
 | |
|     # We eval it so it doesn't run at compile time of this file.
 | |
|     # The latter would have bldtop_file() complain that setup() hasn't
 | |
|     # been run yet.
 | |
|     my $configdata = bldtop_file("configdata.pm");
 | |
|     eval { require $configdata;
 | |
| 	   %available_protocols = %configdata::available_protocols;
 | |
| 	   %disabled = %configdata::disabled;
 | |
| 	   %config = %configdata::config;
 | |
|     };
 | |
|     $configdata_loaded = 1;
 | |
| }
 | |
| 
 | |
| # args
 | |
| #  list of 1s and 0s, coming from check_disabled()
 | |
| sub anyof {
 | |
|     my $x = 0;
 | |
|     foreach (@_) { $x += $_ }
 | |
|     return $x > 0;
 | |
| }
 | |
| 
 | |
| # args
 | |
| #  list of 1s and 0s, coming from check_disabled()
 | |
| sub allof {
 | |
|     my $x = 1;
 | |
|     foreach (@_) { $x *= $_ }
 | |
|     return $x > 0;
 | |
| }
 | |
| 
 | |
| # args
 | |
| #  list of strings, all of them should be names of features
 | |
| #  that can be disabled.
 | |
| # returns a list of 1s (if the corresponding feature is disabled)
 | |
| #  and 0s (if it isn't)
 | |
| sub check_disabled {
 | |
|     return map { exists $disabled{lc $_} ? 1 : 0 } @_;
 | |
| }
 | |
| 
 | |
| # Exported functions #################################################
 | |
| 
 | |
| # args:
 | |
| #  list of features to check
 | |
| sub anydisabled {
 | |
|     load_configdata() unless $configdata_loaded;
 | |
|     my @ret = check_disabled(@_);
 | |
|     return @ret if wantarray;
 | |
|     return anyof(@ret);
 | |
| }
 | |
| 
 | |
| # args:
 | |
| #  list of features to check
 | |
| sub alldisabled {
 | |
|     load_configdata() unless $configdata_loaded;
 | |
|     my @ret = check_disabled(@_);
 | |
|     return @ret if wantarray;
 | |
|     return allof(@ret);
 | |
| }
 | |
| 
 | |
| # !!! Kept for backward compatibility
 | |
| # args:
 | |
| #  single string
 | |
| sub disabled {
 | |
|     anydisabled(@_);
 | |
| }
 | |
| 
 | |
| sub available_protocols {
 | |
|     load_configdata() unless $configdata_loaded;
 | |
|     my $protocol_class = shift;
 | |
|     if (exists $available_protocols{lc $protocol_class}) {
 | |
| 	return @{$available_protocols{lc $protocol_class}}
 | |
|     }
 | |
|     return ();
 | |
| }
 | |
| 
 | |
| sub config {
 | |
|     load_configdata() unless $configdata_loaded;
 | |
|     return $config{$_[0]};
 | |
| }
 | |
| 
 | |
| # IPv4 / IPv6 checker
 | |
| my $have_IPv4 = -1;
 | |
| my $have_IPv6 = -1;
 | |
| my $IP_factory;
 | |
| sub check_IP {
 | |
|     my $listenaddress = shift;
 | |
| 
 | |
|     eval {
 | |
|         require IO::Socket::IP;
 | |
|         my $s = IO::Socket::IP->new(
 | |
|             LocalAddr => $listenaddress,
 | |
|             LocalPort => 0,
 | |
|             Listen=>1,
 | |
|             );
 | |
|         $s or die "\n";
 | |
|         $s->close();
 | |
|     };
 | |
|     if ($@ eq "") {
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     eval {
 | |
|         require IO::Socket::INET6;
 | |
|         my $s = IO::Socket::INET6->new(
 | |
|             LocalAddr => $listenaddress,
 | |
|             LocalPort => 0,
 | |
|             Listen=>1,
 | |
|             );
 | |
|         $s or die "\n";
 | |
|         $s->close();
 | |
|     };
 | |
|     if ($@ eq "") {
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     eval {
 | |
|         require IO::Socket::INET;
 | |
|         my $s = IO::Socket::INET->new(
 | |
|             LocalAddr => $listenaddress,
 | |
|             LocalPort => 0,
 | |
|             Listen=>1,
 | |
|             );
 | |
|         $s or die "\n";
 | |
|         $s->close();
 | |
|     };
 | |
|     if ($@ eq "") {
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| sub have_IPv4 {
 | |
|     if ($have_IPv4 < 0) {
 | |
|         $have_IPv4 = check_IP("127.0.0.1");
 | |
|     }
 | |
|     return $have_IPv4;
 | |
| }
 | |
| 
 | |
| sub have_IPv6 {
 | |
|     if ($have_IPv6 < 0) {
 | |
|         $have_IPv6 = check_IP("::1");
 | |
|     }
 | |
|     return $have_IPv6;
 | |
| }
 | |
| 
 | |
| 
 | |
| =head1 SEE ALSO
 | |
| 
 | |
| L<OpenSSL::Test>
 | |
| 
 | |
| =head1 AUTHORS
 | |
| 
 | |
| Stephen Henson E<lt>steve@openssl.orgE<gt> and
 | |
| Richard Levitte E<lt>levitte@openssl.orgE<gt>
 | |
| 
 | |
| =cut
 | |
| 
 | |
| 1;
 |