diff --git a/Modules/Core/Blueprints/include/elxBlueprint.h b/Modules/Core/Blueprints/include/elxBlueprint.h index 8b42694b8227d2e0881a67b086f7af79147c2090..f0a9d19df23ee68bb071f4b27439226cc546eff0 100644 --- a/Modules/Core/Blueprints/include/elxBlueprint.h +++ b/Modules/Core/Blueprints/include/elxBlueprint.h @@ -1,57 +1,101 @@ #ifndef __Blueprint_h #define __Blueprint_h +#include "boost/graph/graph_traits.hpp" +#include "boost/graph/directed_graph.hpp" + #include "itkObjectFactory.h" #include "itkDataObject.h" #include "elxMacro.h" -#include "elxComponentDescriptor.h" - -#include "boost/graph/graph_traits.hpp" -#include "boost/graph/directed_graph.hpp" namespace elx { -template< class TComponentDescriptor > class Blueprint : public itk::DataObject { public: elxNewMacro( Blueprint, itk::DataObject ); - typedef TComponentDescriptor ComponentDescriptorType; - typedef typename TComponentDescriptor::ComponentNameType ComponentNameType; + typedef std::string ParameterKeyType; + typedef std::vector< std::string > ParameterValueType; + typedef std::map< ParameterKeyType, ParameterValueType > ParameterMapType; + + // Component parameter map that sits on a node in the graph + // and holds component configuration settings + struct ComponentPropertyType { + ParameterMapType parameterMap; + }; + + // Component parameter map that sits on an edge in the graph + // and holds component configuration settings + struct ConnectionPropertyType { + ParameterMapType parameterMap; + }; typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, - ComponentDescriptorType > GraphType; - - typedef typename boost::graph_traits< GraphType >::vertex_descriptor ComponentType; - typedef typename boost::graph_traits< GraphType >::vertex_iterator ComponentIterator, ComponentIteratorEnd; - - typedef boost::vertex_index_t ComponentIndexType; - typedef typename boost::property_map< GraphType, ComponentIndexType >::type ComponentIndexMapType; - - typedef typename boost::graph_traits< GraphType >::edge_descriptor ConnectionDescriptorType; - typedef typename boost::graph_traits< GraphType >::edge_iterator ConnectionIterator, ConnectionIteratorEnd; - - typedef typename boost::graph_traits< GraphType >::in_edge_iterator InputIterator, InputIteratorEnd; - typedef typename boost::graph_traits< GraphType >::out_edge_iterator OutputIterator, OutputIteratorEnd; - - int TestFunction( void ); - bool AddComponent( ComponentDescriptorType component ); - bool SetComponent( ComponentIndexType componentIndex, ComponentDescriptorType component ); - ComponentDescriptorType GetComponent( ComponentIndexType componentIndex ); - bool RemoveComponent( ComponentDescriptorType component ); - - bool SetConnection( ComponentIndexType upstream, ComponentIndexType downstream ); - ConnectionDescriptorType GetConnection( ConnectionDescriptorType Connection ); - bool RemoveConnection( ConnectionDescriptorType connection ); - - void PrintGraph( void ); + ComponentPropertyType, + ConnectionPropertyType > GraphType; + + typedef boost::graph_traits< GraphType >::vertex_descriptor ComponentIndexType; + typedef boost::graph_traits< GraphType >::vertex_iterator ComponentIteratorType; + typedef std::pair< ComponentIteratorType, ComponentIteratorType > ComponentIteratorPairType; + + typedef boost::graph_traits< GraphType >::edge_descriptor ConnectionIndexType; + typedef boost::graph_traits< GraphType >::edge_iterator ConnectionIteratorType; + typedef std::pair< ConnectionIteratorType, ConnectionIteratorType > ConnectionIteratorPairType; + + typedef boost::graph_traits< GraphType >::in_edge_iterator InputIteratorType; + typedef std::pair< InputIteratorType, InputIteratorType > InputIteratorPairType; + + typedef boost::graph_traits< GraphType >::out_edge_iterator OutputIteratorType; + typedef std::pair< OutputIteratorType, OutputIteratorType > OutputIteratorPairType; + + // Interface for managing components + ComponentIndexType AddComponent( void ); + ComponentIndexType AddComponent( ParameterMapType parameterMap ); + ParameterMapType GetComponent( ComponentIndexType index ); + void SetComponent( ComponentIndexType, ParameterMapType parameterMap ); + + // TODO: Let user delete component. Before we do this, we need a proper way of + // checking that a vertex exist. Otherwise a call to GetComponent() on + // a deleted vertex will result in segfault. It is not really a in issue + // _before_ release since typically we (the developers) will use blueprint + // interface procedurally. + // void DeleteComponent( ComponentIndexType ); + + ComponentIteratorPairType GetComponentIterator( void ) { + return boost::vertices( this->m_Graph ); + } + + // Interface for managing connections between components in which we + // deliberately avoid using connection indexes, but instead force + // the user to think in terms of components (which is conceptually simpler) + bool AddConnection( ComponentIndexType upstream, ComponentIndexType downstream ); + bool AddConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap ); + ParameterMapType GetConnection( ComponentIndexType upstream, ComponentIndexType downstream ); + bool SetConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap ); + bool DeleteConnection( ComponentIndexType upstream, ComponentIndexType downstream ); + bool ConnectionExists( ComponentIndexType upstream, ComponentIndexType downstream ); + + // Returns iterator for all connections in the graph + ConnectionIteratorPairType GetConnectionIterator( void ) { + return boost::edges(this->m_Graph); + } + + // Returns the outgoing connections from a component in the graph, + // i.e. all components that reads data from given component + OutputIteratorPairType GetOutputIterator( const ComponentIndexType index ) { + return boost::out_edges( index, this->m_Graph ); + } + + void WriteBlueprint( const std::string filename ); private: + + ConnectionIndexType GetConnectionIndex( ComponentIndexType upsteam, ComponentIndexType downstream ); GraphType m_Graph; diff --git a/Modules/Core/Blueprints/include/elxComponentDescriptor.h b/Modules/Core/Blueprints/include/elxComponentDescriptor.h deleted file mode 100644 index 8f5402e4526532088cc8089d4af95d775a848b33..0000000000000000000000000000000000000000 --- a/Modules/Core/Blueprints/include/elxComponentDescriptor.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __ComponentDescriptor_h -#define __ComponentDescriptor_h - -#include "elxMacro.h" -#include "itkObjectFactory.h" -#include "itkDataObject.h" - -namespace elx { - -class ComponentDescriptor : public itk::DataObject -{ -public: - - elxNewMacro( ComponentDescriptor, itk::DataObject ); - - // Identifier to find component in the component database - typedef std::string ComponentNameType; - - ComponentDescriptor( void ) { this->SetComponentName( ComponentNameType() ); } - ComponentDescriptor( const ComponentNameType componentName ); - - // TODO: Setter should validate ComponentName exists in ComponentDatabase - itkSetMacro( ComponentName, ComponentNameType ); - itkGetMacro( ComponentName, ComponentNameType ); - -private: - - ComponentNameType m_ComponentName; - -}; - -} - -#endif // __ComponentDescriptor_h diff --git a/Modules/Core/Blueprints/src/elxBlueprint.cxx b/Modules/Core/Blueprints/src/elxBlueprint.cxx index b3319d01551325a82b0926f0f1a33fd4fd3f7abf..d78d2ce6882287d6a42176310b6afea3c2cb0ff4 100644 --- a/Modules/Core/Blueprints/src/elxBlueprint.cxx +++ b/Modules/Core/Blueprints/src/elxBlueprint.cxx @@ -1,77 +1,160 @@ -#ifndef __Blueprint_hxx -#define __Blueprint_hxx +#ifndef __Blueprint_cxx +#define __Blueprint_cxx -#include <boost/graph/graphviz.hpp> +#include "boost/graph/graphviz.hpp" #include "elxBlueprint.h" namespace elx { -/* -Blueprint< ComponentDescriptor >::ComponentDescriptorType -Blueprint< ComponentDescriptor > -::AddComponent( ComponentDescriptorType component ) +Blueprint::ComponentIndexType +Blueprint +::AddComponent( void ) { - // TODO: Check that the component is in the ComponentDatabase this->Modified(); - return this->m_Graph->add_vertex( component ); + + ComponentIndexType index = boost::add_vertex( this->m_Graph ); + + // Return component index so component can retrieved at a later time + return index; } -bool -Blueprint< ComponentDescriptor > -::SetComponent( ComponentDescriptorType component ) +Blueprint::ComponentIndexType +Blueprint +::AddComponent( ParameterMapType parameterMap ) +{ + this->Modified(); + + ComponentIndexType index = boost::add_vertex( this->m_Graph ); + this->m_Graph[index].parameterMap = parameterMap; + + // Return component index so component can retrieved at a later time + return index; +} + +Blueprint::ParameterMapType +Blueprint +::GetComponent( ComponentIndexType index ) { this->Modified(); - return this->m_Graph->remove_vertex( connection ); + + return this->m_Graph[ index ].parameterMap; +} + +void +Blueprint +::SetComponent( ComponentIndexType index, ParameterMapType parameterMap ) +{ + this->Modified(); + this->m_Graph[ index ].parameterMap = parameterMap; } +// TODO: See explanation in elxBlueprint.h +// void +// Blueprint +// ::DeleteComponent( const ComponentIndexType index ) +// { +// this->Modified(); +// +// clear_vertex( index, this->m_Graph ); +// remove_vertex( index, this->m_Graph ); +// } + bool -Blueprint< ComponentDescriptor > -::RemoveComponent( ComponentDescriptorType component ) +Blueprint +::AddConnection( ComponentIndexType upstream, ComponentIndexType downstream ) { this->Modified(); - return this->m_Graph->remove_vertex( connection ); + + if( this->ConnectionExists( upstream, downstream) ) { + return false; + } + + // Adds directed connection from upstream component to downstream component + return boost::add_edge( upstream, downstream, this->m_Graph ).second; } bool -Blueprint< ComponentDescriptor > -::AddConnection( ComponentDescriptorType upsteam, ComponentDescriptorType downstream ) +Blueprint +::AddConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap ) +{ + this->Modified(); + + if( !this->ConnectionExists( upstream, downstream ) ) { + ConnectionIndexType index = boost::add_edge( upstream, downstream, this->m_Graph ).first; + this->m_Graph[ index ].parameterMap = parameterMap; + return true; + } + + // If the connection does not exist don't do anything because previous settings + // will be overwritten. If the user do want to overwrite current settings, + // she should use SetConnection() instead where the intent is explicit. + return false; +} + +Blueprint::ParameterMapType +Blueprint +::GetConnection( ComponentIndexType upstream, ComponentIndexType downstream ) { this->Modified(); - return this->m_Graph->add_edge( upstream, downstream ); + + return this->m_Graph[ this->GetConnectionIndex( upstream, downstream ) ].parameterMap; } -ConnectionDescriptorType -Blueprint< ComponentDescriptor > -::GetConnection( ConnectionDescriptorType Connection ) +bool +Blueprint +::SetConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap ) { this->Modified(); + + if( !this->ConnectionExists( upstream, downstream ) ) { + return this->AddConnection( upstream, downstream, parameterMap ); + } else { + this->m_Graph[ this->GetConnectionIndex( upstream, downstream ) ].parameterMap = parameterMap; + return true; + } } -void -Blueprint< ComponentDescriptor > -::RemoveConnection( ConnectionType connection ) +bool +Blueprint +::DeleteConnection( ComponentIndexType upstream, ComponentIndexType downstream ) { this->Modified(); - this->m_Graph->remove_edge( connection ); + + if( this->ConnectionExists( upstream, downstream ) ) { + this->m_Graph.remove_edge( this->GetConnectionIndex( upstream, downstream ) ); + } + + return !this->ConnectionExists( upstream, downstream ); } -void -Blueprint< ComponentDescriptor > -::PrintGraph( void ) +bool +Blueprint +::ConnectionExists( ComponentIndexType upstream, ComponentIndexType downstream ) { - // TODO: Link to graphviz library - // boost::write_graphviz(std::cout, this->m_Graph); - std::cout << "Printed graph" << std::endl; + return boost::edge( upstream, downstream, this->m_Graph).second; } -*/ -template<> -int -Blueprint< ComponentDescriptor > -::TestFunction( void ) -{ return 0; } +Blueprint::ConnectionIndexType +Blueprint +::GetConnectionIndex( ComponentIndexType upstream, ComponentIndexType downstream ) +{ + // This function is part of the internal API and should fail hard if we use it incorrectly + if( !this->ConnectionExists( upstream, downstream ) ) { + itkExceptionMacro( "Blueprint does not contain connection from component " << upstream << " to " << downstream ); + } + + return boost::edge( upstream, downstream, this->m_Graph).first; +} + +void +Blueprint +::WriteBlueprint( const std::string filename ) +{ + std::ofstream dotfile( filename.c_str() ); + boost::write_graphviz( dotfile, this->m_Graph ); +} } // namespace elx -#endif // __Blueprint_hxx \ No newline at end of file +#endif // __Blueprint_cxx diff --git a/Modules/Core/Blueprints/src/elxComponentDescriptor.cxx b/Modules/Core/Blueprints/src/elxComponentDescriptor.cxx deleted file mode 100644 index 9589451733f5f3b2c14b45e990f70711bab241e5..0000000000000000000000000000000000000000 --- a/Modules/Core/Blueprints/src/elxComponentDescriptor.cxx +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __ComponentDescriptor_cxx -#define __ComponentDescriptor_cxx - -#include "elxComponentDescriptor.h" - -// TODO: Need enum for component name? - -namespace elx { - -ComponentDescriptor -::ComponentDescriptor( const ComponentNameType componentName ) -{ - this->SetComponentName( componentName ); -} - -} // namespace elx - -#endif // __ComponentDescriptor_cxx \ No newline at end of file diff --git a/Modules/Core/elxModuleCore.cmake b/Modules/Core/elxModuleCore.cmake index eaebd893405d56be9b9edeb671461538b04cca09..585fd509611ea8161fb2f1bc7eaf9b42afdce41f 100644 --- a/Modules/Core/elxModuleCore.cmake +++ b/Modules/Core/elxModuleCore.cmake @@ -4,10 +4,9 @@ set( ${MODULE}_INCLUDE_DIRS ) set( ${MODULE}_SOURCE_FILES - ${CMAKE_SOURCE_DIR}/${MODULE_PATH}/Blueprints/src/elxComponentDescriptor.cxx ${CMAKE_SOURCE_DIR}/${MODULE_PATH}/Blueprints/src/elxBlueprint.cxx ) set( ${MODULE}_LIBRARIES - elxModuleCore -) \ No newline at end of file + ${MODULE} +) diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt index 9598ac8c17113e6a582022ec82d0d1b53eef530e..925c9375c67da019bf48303e058074f4a111f2b6 100644 --- a/Testing/CMakeLists.txt +++ b/Testing/CMakeLists.txt @@ -68,12 +68,6 @@ set( TEST_LIBRARIES # Unit tests add_subdirectory( Unit ) -# Benchmarks -option( ELASTIX_BUILD_BENCHMARKING "Enable building benchmarks." OFF ) -if( ${ELASTIX_BUILD_BENCHMARKING} ) - add_subdirectory( Benchmark ) -endif() - # --------------------------------------------------------------------- # Configure dashboard mark_as_advanced( ELASTIX_BUILD_DASHBOARD ) diff --git a/Testing/Dashboard/CMakeLists.txt b/Testing/Dashboard/CMakeLists.txt index 202478325aeea62261d1c8dd11773e54eb1ba132..45902125adcd5c2d4ec3d116479335a5034ac430 100644 --- a/Testing/Dashboard/CMakeLists.txt +++ b/Testing/Dashboard/CMakeLists.txt @@ -15,10 +15,6 @@ set( ELASTIX_DASHBOARD_LOGSTASH_RSA_PRIVATE_KEY "elxLogstash.key" ) mark_as_advanced( ELASTIX_DASHBOARD_VOLUME ) if( NOT EXISTS "${ELASTIX_DASHBOARD_VOLUME}" ) - message( STATUS - "ELASTIX_DASHBOARD_VOLUME points to the folder ${CMAKE_BINARY_DIR}/Testing/Dashboard/Data in your build directory. In production you should point this variable to a safe directory outside the build tree." - ) - set( ELASTIX_DASHBOARD_VOLUME "${ELASTIX_DASHBOARD_BINARY_DIR}/Data" ) file( MAKE_DIRECTORY "${ELASTIX_DASHBOARD_VOLUME}" ) endif() @@ -46,4 +42,9 @@ configure_file( configure_file( ${ELASTIX_DASHBOARD_SOURCE_DIR}/elxLogstashForwarder.json.in ${ELASTIX_DASHBOARD_BINARY_DIR}/elxLogstashForwarder.json -) \ No newline at end of file +) + +# --------------------------------------------------------------------- +# SSL certificates +# Use the following OpenSSL command to generate a test certificate and key if needed +# openssl req -subj '/CN=*/' -x509 -batch -nodes -days 9999 -newkey rsa:2048 -keyout elxLogstash.key -out elxLogstash.crt diff --git a/Testing/Dashboard/elxLogstash.crt b/Testing/Dashboard/elxLogstash.crt index 56ef6e0dcf697be1be407db7ca75cf31112821d0..f677ecb5798ea52056694f954a80fa9a524ada80 100644 --- a/Testing/Dashboard/elxLogstash.crt +++ b/Testing/Dashboard/elxLogstash.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDGjCCAgKgAwIBAgIJAMF8GSVtnyB6MA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV -BAMTB2VsYXN0aXgwHhcNMTUwODEyMTQxNjE1WhcNMTUwOTExMTQxNjE1WjASMRAw -DgYDVQQDEwdlbGFzdGl4MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -01P404f+W/aBLxlQTFyHy1o7m07edUmFIjJuN9JjGTzZtlhAEc7dXJ8fUwr/hnLq -HUeaGRbNcpFDj+/Xq2W9jH7/VyxivA8Ib7ycLNxywgmheZVxXetPIeYmK+Rqovyd -GhMcU0WMv/3OslFjf92PLegFgRYbmJa7rEH+I0MD1hE1rn1AIJeU4nVCUrtQON6g -icDEZSNwVSuLfdiuHCMcAVWx+pQIyHji6EoyIBjNsF8LoBZoMY5N+qRph8tt9k1N -GemQoaZWd926jWgrsSSrAfgtMxw43TXwCFe8RiL8L+pZlN4xxYjQj1/PtTowqjzL -dYqWAT0o5zwlqkrNgjTuYwIDAQABo3MwcTAdBgNVHQ4EFgQU8onFqrecR/J81ZFi -gonexjVf8yAwQgYDVR0jBDswOYAU8onFqrecR/J81ZFigonexjVf8yChFqQUMBIx -EDAOBgNVBAMTB2VsYXN0aXiCCQDBfBklbZ8gejAMBgNVHRMEBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCYalhVZpN/F/Cux/KRBuOyyVxD+tOM7PDlXuuGMcxZ8PTH -sYK3MLBUvGnn90R6YIF+pmZC40hkau12xGRnlyNLa0EpnAd77SGlaB/y9Ix6RCDd -PRvdEZodknXzS5sDw+A9pA0JtZANrAXHrELPXjfp5vdf4EUH/o7TTh3XzTEIokwp -VY6557E17BYsTHHebWPSiDzCeS9y6PtdiZczuHrd7+K+vWgVcgmQ0fdudWwcMOEC -8s6O8uQGrc1v9nSyT93C9MPCWnuZ2McFX4JPSwaqAaKCTcnc8GAcqk4O5ruQ/8u/ -xSNQsoYpFi2BawOdPDqyMKn4khkREWTq0+T+7Kq2 +MIIDCDCCAfCgAwIBAgIJANZVoY3O+DQaMA0GCSqGSIb3DQEBBQUAMAwxCjAIBgNV +BAMUASowHhcNMTUxMDEzMjEyNzEwWhcNNDMwMjI3MjEyNzEwWjAMMQowCAYDVQQD +FAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtF4l3oqDRL/4m7C +kCnzE6colB1Ii7KHoRuFyyL7PrZiyrKelRVDr6yDB0lIJevOxuuSJlA+BNccyI0h +08/c3SRDkKb83MwQnABpDPS4/EhLGOJdTKutSo0FzCrn+uT470EYfCFvLLKMSnIO +ECf5st3EN+VJoSu80B9sZ4TEfdO4Gedy0vlL3iNGGDn1TqconTDjB5HKHteEjZ1Z +XzqBJUXITjzfD1VpYbSsj/wcFvurmaOMliqvsl1uFN7wXPjd1L8fAqcsAU5yBwLJ +88NFqJrlgqTXnuHeMCqhiVwOOFUeBbvEk/Faw3P3BKgppl7P01WXzUky0CVyegG7 +qagK7QIDAQABo20wazAdBgNVHQ4EFgQUtsodBU4f6bCvbrYc+ix21auh7mowPAYD +VR0jBDUwM4AUtsodBU4f6bCvbrYc+ix21auh7mqhEKQOMAwxCjAIBgNVBAMUASqC +CQDWVaGNzvg0GjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAOPEH1 +Otzm6Eu8FNQoppXKBuVW0kqRi6/CM7JxJ0f21YajEu1+vb0BdlNAoCpmcmxCY9Hf +cbmzeKyu/6wIXOOdqmTu/CGvEThtLNmrgjkj9sTe4i0C0H5fkOlkD6aSCHSVUwCv +9nOmPMsu9snEhU+UMXIDqFJzCpN3TSXu/J+V4xV5TYGj0SfbIZXLsw4QcB+iwind +oC1OorwxPsXVYnlMQeZAi7qaScOlq/82A3erXLKW7dRHIyXbgScs4VZ6kjg+YTH2 +YZW7y3xgUowj7xeWaoH9YciDfqV2SbxK4RoP2NeesuW0On0YebVQ5Z3qLeYb5fkV +CiA5NpyBDPdElzWW -----END CERTIFICATE----- diff --git a/Testing/Dashboard/elxLogstash.key b/Testing/Dashboard/elxLogstash.key index 9537cddd201e50e6d661444da8e85c5294b617c3..cebc457b0cc2589ab6d8ef08bd1980f88948a173 100644 --- a/Testing/Dashboard/elxLogstash.key +++ b/Testing/Dashboard/elxLogstash.key @@ -1,27 +1,27 @@ -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/Testing/Unit/elxBluePrintTest.cxx b/Testing/Unit/elxBluePrintTest.cxx index 8aa289fc4201a92af8d6c185905855bd58c5ab4e..15ffde06c38d85233944c28cf7bb837597e2f651 100644 --- a/Testing/Unit/elxBluePrintTest.cxx +++ b/Testing/Unit/elxBluePrintTest.cxx @@ -1,27 +1,174 @@ #include "elxBlueprint.h" -#include "elxComponentDescriptor.h" + #include "gtest/gtest.h" namespace elx { -TEST( Blueprint, Instantiation ) +class BlueprintTest : public ::testing::Test { +public: + + typedef Blueprint::Pointer BlueprintPointerType; + typedef Blueprint::ComponentIndexType ComponentIndexType; + typedef Blueprint::ParameterMapType ParameterMapType; + typedef Blueprint::ParameterValueType ParameterValueType; + + virtual void SetUp() { + parameterMap["ComponentName"] = ParameterValueType(1, "TestName"); + } + + ParameterMapType parameterMap; +}; + +TEST_F( BlueprintTest, AddComponent ) +{ + BlueprintPointerType blueprint; + EXPECT_NO_THROW( blueprint = Blueprint::New() ); + + ComponentIndexType index0; + EXPECT_NO_THROW( index0 = blueprint->AddComponent() ); + + ComponentIndexType index1; + EXPECT_NO_THROW( index1 = blueprint->AddComponent( parameterMap ) ); +} + +TEST_F( BlueprintTest, GetComponent ) +{ + BlueprintPointerType blueprint = Blueprint::New(); + ComponentIndexType index = blueprint->AddComponent( parameterMap ); + + ParameterMapType parameterMapTest; + EXPECT_NO_THROW( parameterMapTest = blueprint->GetComponent( index ) ); + EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest["ComponentName"] ); +} + +TEST_F( BlueprintTest, SetComponent ) +{ + BlueprintPointerType blueprint = Blueprint::New(); + ComponentIndexType index = blueprint->AddComponent( parameterMap ); + + ParameterMapType parameterMapTest; + EXPECT_NO_THROW( blueprint->SetComponent( index, parameterMap ) ); + EXPECT_NO_THROW( parameterMapTest = blueprint->GetComponent( index ) ); + EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest["ComponentName"] ); +} + +// TODO: The final line segfaults because GetComponent does not check that the index actually +// actually exist. How can we do that? See also explanation in elxBlueprint.h +// TEST_F( BlueprintTest, DeleteComponent ) +// { +// BlueprintPointerType blueprint = Blueprint::New(); +// ComponentIndexType index = blueprint->AddComponent( parameterMap ); +// +// ParameterMapType parameterMapTest; +// EXPECT_NO_THROW( parameterMapTest = blueprint->GetComponent( index ) ); +// EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest["ComponentName"] ); +// +// EXPECT_NO_THROW( blueprint->DeleteComponent( index ) ); +// EXPECT_ANY_THROW( parameterMapTest = blueprint->GetComponent( index ) ); +// } + +TEST_F( BlueprintTest, AddConnection ) +{ + BlueprintPointerType blueprint = Blueprint::New(); + + ComponentIndexType index0 = blueprint->AddComponent(); + ComponentIndexType index1 = blueprint->AddComponent(); + ComponentIndexType index2 = blueprint->AddComponent(); + + // Connection should not exist + EXPECT_FALSE( blueprint->ConnectionExists( index0, index1 ) ); + + // Connection should be added + EXPECT_TRUE( blueprint->AddConnection( index0, index1 ) ); + + // Connection should exist + EXPECT_TRUE( blueprint->ConnectionExists( index0, index1 ) ); + + // Another connection between same components should not be added + // (user should use SetComponent() instead) + EXPECT_FALSE( blueprint->AddConnection( index0, index1 ) ); + + // Connection should be empty + ParameterMapType parameterMapTest0; + EXPECT_NO_THROW( parameterMapTest0 = blueprint->GetConnection( index0, index1 ) ); + EXPECT_EQ( 0u, parameterMapTest0.size() ); + + // Connection with properties should be added. Testing if properties was + // properly set requires a call to GetConnection() which is the responsibility + // of the next test. + ParameterMapType parameterMapTest1; + EXPECT_TRUE( blueprint->AddConnection( index1, index2, parameterMap ) ); + + // It is not be possible to add connection between components that do not exist + // because you do not have necessary indexes +} + +TEST_F( BlueprintTest, GetConnection ) +{ + BlueprintPointerType blueprint = Blueprint::New(); + + ComponentIndexType index0 = blueprint->AddComponent(); + ComponentIndexType index1 = blueprint->AddComponent(); + + ParameterMapType parameterMapTest0; + EXPECT_TRUE( blueprint->AddConnection( index0, index1, parameterMap ) ); + EXPECT_NO_THROW( parameterMapTest0 = blueprint->GetConnection( index0, index1 ) ); + EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest0["ComponentName"] ); +} + +TEST_F( BlueprintTest, SetConnection ) +{ + BlueprintPointerType blueprint = Blueprint::New(); + + ComponentIndexType index0 = blueprint->AddComponent(); + ComponentIndexType index1 = blueprint->AddComponent(); + blueprint->AddConnection( index0, index1, parameterMap ); + + ParameterMapType parameterMapTest0; + parameterMapTest0 = blueprint->GetConnection( index0, index1 ); + EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest0["ComponentName"] ); + + ParameterMapType parameterMapTest1; + parameterMapTest1["ComponentName"] = ParameterValueType(1, "OtherName"); + EXPECT_TRUE( blueprint->SetConnection( index0, index1, parameterMapTest1 ) ); + + ParameterMapType parameterMapTest2; + EXPECT_NO_THROW( parameterMapTest2 = blueprint->GetConnection( index0, index1 ) ); + EXPECT_EQ( parameterMapTest1["ComponentName"], parameterMapTest2["ComponentName"] ); +} + +TEST_F( BlueprintTest, DeleteConnection ) { - typedef Blueprint< ComponentDescriptor > BlueprintType; - BlueprintType::Pointer blueprint; - EXPECT_NO_THROW( blueprint = BlueprintType::New() ); + BlueprintPointerType blueprint = Blueprint::New(); - typedef BlueprintType::ComponentDescriptorType ComponentDescriptorType; - ComponentDescriptorType::Pointer componentDescriptor; - EXPECT_NO_THROW( componentDescriptor = ComponentDescriptorType::New() ); + ComponentIndexType index0 = blueprint->AddComponent(); + ComponentIndexType index1 = blueprint->AddComponent(); + blueprint->AddConnection( index0, index1 ); + + // Connection should exist + EXPECT_TRUE( blueprint->ConnectionExists( index0, index1 ) ); + + // Connection be deleted + EXPECT_TRUE( blueprint->DeleteConnection( index0, index1 ) ); + + // Connection should not exist + EXPECT_FALSE( blueprint->ConnectionExists( index0, index1 ) ); +} + +TEST_F( BlueprintTest, WriteBlueprint ) +{ + BlueprintPointerType blueprint = Blueprint::New(); - typedef ComponentDescriptorType::ComponentNameType ComponentNameType; - ComponentNameType componentName; - EXPECT_NO_THROW( componentName = ComponentNameType("Metric") ); - EXPECT_NO_THROW( componentDescriptor->SetComponentName( componentName ) ); + ComponentIndexType index0 = blueprint->AddComponent(); + ComponentIndexType index1 = blueprint->AddComponent(); + ComponentIndexType index2 = blueprint->AddComponent(); + ComponentIndexType index3 = blueprint->AddComponent(); - EXPECT_NO_THROW( blueprint->TestFunction() ); + blueprint->AddConnection( index0, index1 ); + blueprint->AddConnection( index0, index2 ); + blueprint->AddConnection( index2, index3 ); - ASSERT_TRUE( true ); + EXPECT_NO_THROW( blueprint->WriteBlueprint( "blueprint.dot" ) ); } } // namespace elx