@Test(expected = InvalidFileFormatException.class)
  public void expect_exception_when_illegal_pipeline_stage_is_added() throws Exception {

    String xml =
        "<?xml version=\"1.0\"?>"
            + "<configuration>"
            + "<transferPipeline>"
            + "<stage id=\"stage1\">gil.core.test.AddStageStub</stage>"
            + "<stage id=\"stage2\">None_existing</stage>"
            + "</transferPipeline>"
            + "</configuration>";

    PrintWriter out = new PrintWriter(XML_TEST_DATA_FILE_NAME);
    out.print(xml);
    out.close();

    ConfigFile config = ConfigFile.read(XML_TEST_DATA_FILE_NAME);
    SignalMetadata[] smd = new SignalMetadata[0];

    TransferPipeline pipeline = TransferPipelineBuilder.buildPipeline(smd, config);
    assertTrue(pipeline.getStages().get(0) instanceof AddStageStub);
    assertTrue(pipeline.getStages().get(1) instanceof MultiplyStageStub);

    File file = new File(XML_TEST_DATA_FILE_NAME);
    file.delete();
  }
  @Test
  public void expect_transfer_pipeline_to_be_created() throws Exception {

    String xml =
        "<?xml version=\"1.0\"?>"
            + "<configuration>"
            + "<transferPipeline>"
            + "<stage id=\"stage1\">gil.core.test.AddStageStub</stage>"
            + "<stage id=\"stage2\">gil.core.test.MultiplyStageStub</stage>"
            + "</transferPipeline>"
            + "</configuration>";

    PrintWriter out = new PrintWriter(XML_TEST_DATA_FILE_NAME);
    out.print(xml);
    out.close();
    ConfigFile config = ConfigFile.read(XML_TEST_DATA_FILE_NAME);
    SignalMetadata[] smd = new SignalMetadata[0];

    TransferPipeline pipeline = TransferPipelineBuilder.buildPipeline(smd, config);

    assertTrue(pipeline.getStages().get(0) instanceof AddStageStub);
    assertEquals("stage1", pipeline.getStages().get(0).getId());
    assertTrue(pipeline.getStages().get(1) instanceof MultiplyStageStub);
    assertEquals("stage2", pipeline.getStages().get(1).getId());
  }
  @Test
  public void expect_stages_to_be_configured() throws Exception {
    SignalMetadata[] metadata =
        new SignalMetadata[] {
          new SignalMetadata(
              SignalMetadata.SignalType.Analog,
              SignalMetadata.SignalDataType.Float32,
              1,
              SignalMetadata.DataflowDirection.ToPM,
              null,
              null,
              null,
              null),
          new SignalMetadata(
              SignalMetadata.SignalType.Analog,
              SignalMetadata.SignalDataType.Float32,
              1,
              SignalMetadata.DataflowDirection.ToES,
              null,
              null,
              null,
              null),
          new SignalMetadata(
              SignalMetadata.SignalType.Analog,
              SignalMetadata.SignalDataType.Float32,
              1,
              SignalMetadata.DataflowDirection.ToPM,
              null,
              null,
              null,
              null)
        };

    String xml =
        "<?xml version=\"1.0\"?>"
            + "<configuration>"
            + "<transferPipeline>"
            + "<stage id=\"stage1\">gil.core.test.AddStageStub</stage>"
            + "<stage id=\"stage2\">gil.core.test.MultiplyStageStub</stage>"
            + "</transferPipeline>"
            + "<pipelineStageSettings>"
            + "<stage1>"
            + "<add key=\"param1\" value=\"value1\" />"
            + "<add key=\"param2\" value=\"value2\" />"
            + "</stage1>"
            + "<stage2>"
            + "<add key=\"param21\" value=\"value21\" />"
            + "</stage2>"
            + "</pipelineStageSettings>"
            + "</configuration>";

    PrintWriter out = new PrintWriter(XML_TEST_DATA_FILE_NAME);
    out.print(xml);
    out.close();
    ConfigFile config = ConfigFile.read(XML_TEST_DATA_FILE_NAME);

    TransferPipeline pipeline = TransferPipelineBuilder.buildPipeline(metadata, config);

    assertEquals(1, pipeline.getStages().get(0).getSignalsToES().length);
    assertEquals(2, pipeline.getStages().get(0).getSignalsToPM().length);
    assertEquals(2, pipeline.getStages().get(0).getConfig().getParameters().size());
    assertEquals("value2", pipeline.getStages().get(0).getConfig().getParam("param2"));
    assertEquals(1, pipeline.getStages().get(1).getConfig().getParameters().size());
    assertEquals("value21", pipeline.getStages().get(1).getConfig().getParam("param21"));
  }