/* * ticket-433.sli * * This file is part of NEST. * * Copyright (C) 2004 The NEST Initiative * * NEST is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * NEST 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NEST. If not, see <http://www.gnu.org/licenses/>. * */ /* BeginDocumentation Name: testsuite::ticket-433 - Test against receptor_type mishandling in ht_neuron Synopsis: (ticket-433) run -> NEST exits if test fails Description: ht_neuron accepted incoming connections with invalid receptor type, leading to unpredictable errors. Additionally, the topology library did not seem to pass on the receptor_type when making connections. Reported by Jonathan Williford. Author: Hans Ekkehard Plesser, 2010-06-28 */ % This test should only run if we have GSL statusdict/have_gsl :: not {statusdict/exitcodes/success :: quit_i} if /unittest (8045) require /unittest using M_INFO setverbosity % the following the functions expect that the following variables % are defined: % ampa --- AMPA receptor ID % retina, retina_gen, Tp --- layers % Connection function using topology library % receptor_type erroneously placed in dictionary /connect_topo { retina Tp << /sources << /model /RetinaNode >> /targets << /model /ThalamicNeuron >> /connection_type (divergent) /receptor_type ampa /synapse_model /ht_synapse /mask << /circular << /radius 2.0 >> >> >> topology/ConnectLayers :: } bind def % Connection function using topology library % receptor_type correctly placed in synapse /connect_topo_syn { /ht_synapse /ht_syn_ampa << /receptor_type ampa >> CopyModel retina Tp << /sources << /model /RetinaNode >> /targets << /model /ThalamicNeuron >> /connection_type (divergent) /synapse_model /ht_syn_ampa /mask << /circular << /radius 2.0 >> >> >> topology/ConnectLayers :: } bind def % Connection function using explicit receptor type --- passes /connect_explicit_rt { [ retina_gen GetGlobalLeaves 100 Take Tp GetGlobalLeaves 100 Take ] { << /receptor_type ampa >> Connect true } MapThread ; } bind def % Connection function not giving receptor type --- fails /connect_implicit_rt { [ retina_gen GetGlobalLeaves 100 Take Tp GetGlobalLeaves 100 Take ] { Connect true } MapThread ; } bind def % Actual test function, expects connection function as input /test_connect { /connfun Set ResetKernel /ht_neuron /ThalamicNeuron CopyModel /poisson_generator /RetinaGen << /rate 10.0 >> CopyModel /parrot_neuron /RetinaNode CopyModel /ampa /ht_neuron GetDefaults /receptor_types get /AMPA get def /layerProps << /rows 10 /columns 10 /extent [8.0 8.0] >> def layerProps << /elements /RetinaGen >> join /retina_gen layerProps topology/CreateLayer :: def layerProps << /elements /RetinaNode >> join /retina layerProps topology/CreateLayer :: def layerProps << /elements /ThalamicNeuron >> join /Tp layerProps topology/CreateLayer :: def [retina_gen GetGlobalLeaves retina GetGlobalLeaves] { Connect true } MapThread ; connfun load exec 10. Simulate } bind def % first test: explicit receptor type, should pass { /connect_explicit_rt test_connect } pass_or_die % second test: implicit receptor type % this must raise an error, otherwise lacking receptor_type is not detected { /connect_implicit_rt test_connect } fail_or_die % third test: connect using topology::ConnectLayers % this must raise an error, otherwise lacking receptor_type is not detected { /connect_topo test_connect } fail_or_die % fourth test: connect using topology::ConnectLayers, but with % properly configured synapse model { /connect_topo_syn test_connect } pass_or_die % fifth test: assert that all models that have /receptor_types reject % connections with plain static_synapse { ResetKernel % need clean modeldict modeldict keys { /mod Set mod GetDefaults /dflts Set dflts /receptor_types known { % next condition avoids models with auto-generated % ports, such as iaf_cond_alpha_multisynapse % might be eliminated if #434 removes 0-port. dflts /receptor_types get cva length 0 gt { { ResetKernel mod 2 Create ; 1 2 /static_synapse Connect } fail_or_die } if } if } forall } pass_or_die % overall wrapper endusing