@JsonProperty(PROP_ROWS) private void setRowsList(List<Row> rows) { _rows = new Rows(); if (rows == null) { _rowsList = new LinkedList<>(); } else { _rowsList = rows; } _rowsList.forEach(_rows::add); } }
@JsonCreator public ExcludedRows(@Nonnull @JsonProperty(PROP_EXCLUSION_NAME) String exclusionName) { _exclusionName = exclusionName; _rows = new Rows(); _rowsList = new LinkedList<>(); }
@JsonProperty(PROP_ROWS) private void setRowsList(List<Row> rows) { _rows = new Rows(); if (rows == null) { _rowsList = new LinkedList<>(); } else { _rowsList = rows; } _rowsList.forEach(_rows::add); }
@JsonCreator public TableAnswerElement(@Nonnull @JsonProperty(PROP_METADATA) TableMetadata tableMetadata) { _tableMetadata = tableMetadata; _rows = new Rows(); _rowsList = new LinkedList<>(); _excludedRows = new LinkedList<>(); }
@Test public void buildMapNoKeyColumn() { // Column metadata has no keys; so all rows should match List<ColumnMetadata> columns = ImmutableList.of(new ColumnMetadata("k1", Schema.STRING, "desc", false, true)); // empty maps is returned when there are no Rows assertThat(TableDiff.buildMap(new Rows(), columns), equalTo(ImmutableMap.of())); assertThat( TableDiff.buildMap(new Rows().add(Row.of("k1", "a")), columns), equalTo(ImmutableMap.of(new LinkedList<>(), ImmutableList.of(Row.of("k1", "a"))))); }
@Override public TableAnswerElement answer() { ParseVendorConfigurationAnswerElement pvcae = _batfish.loadParseVendorConfigurationAnswerElement(); Map<String, ParseStatus> statusMap = pvcae.getParseStatus(); Rows rows = new Rows(); Multimap<String, String> fileToHost = TreeMultimap.create(); pvcae.getFileMap().forEach((hostname, filename) -> fileToHost.put(filename, hostname)); statusMap.forEach( (filename, status) -> rows.add(getRow(filename, status, fileToHost.get(filename)))); TableAnswerElement answerElement = new TableAnswerElement(TABLE_METADATA); answerElement.postProcessAnswer(_question, rows.getData()); return answerElement; }
@Test public void buildMapMixKeyValueColumns() { List<ColumnMetadata> columns = ImmutableList.of( new ColumnMetadata("key", Schema.STRING, "desc", true, false), new ColumnMetadata("both", Schema.STRING, "desc", true, true), new ColumnMetadata("value", Schema.STRING, "desc", false, true)); Row row1 = Row.of("key", "key1", "both", "both1", "value", "value1"); Row row2 = Row.of("key", "key2", "both", "both2", "value", "value2"); Rows rows = new Rows().add(row1).add(row2); Map<List<Object>, List<Row>> map = TableDiff.buildMap(rows, columns); // row1 should be returned assertThat(map.get(ImmutableList.of("key1", "both1")), equalTo(ImmutableList.of(row1))); // nothing should be returned since the key is "partial" assertNull(map.get(ImmutableList.of("key1"))); // nothing should be returned since there is no matching key assertNull(map.get(ImmutableList.of("key1", "both2"))); }
@Override public TableAnswerElement answer() { ConvertConfigurationAnswerElement ccae = _batfish.loadConvertConfigurationAnswerElementOrReparse(); Rows rows = new Rows(); ccae.getConvertStatus() .forEach( (nodeName, nodeStatus) -> { rows.add(getRow(nodeName, nodeStatus)); }); TableAnswerElement answerElement = new TableAnswerElement(TABLE_METADATA); answerElement.postProcessAnswer(_question, rows.getData()); return answerElement; }
@Override public TableAnswerElement answer() { ConvertConfigurationAnswerElement ccae = _batfish.loadConvertConfigurationAnswerElementOrReparse(); Map<String, Warnings> warnings = ccae.getWarnings(); Rows rows = new Rows(); warnings.forEach( (nodeName, nodeWarnings) -> { for (Warning w : nodeWarnings.getRedFlagWarnings()) { rows.add(getRow(nodeName, w)); } for (Warning w : nodeWarnings.getUnimplementedWarnings()) { rows.add(getRow(nodeName, w)); } }); TableAnswerElement answerElement = new TableAnswerElement(TABLE_METADATA); answerElement.postProcessAnswer(_question, rows.getData()); return answerElement; }
@Override public TableAnswerElement answer() { ParseWarningQuestion question = (ParseWarningQuestion) _question; TableMetadata metadata = createMetadata(question); Map<String, ColumnMetadata> columnMetadataMap = metadata.toColumnMap(); ParseVendorConfigurationAnswerElement pvcae = _batfish.loadParseVendorConfigurationAnswerElement(); Map<String, Warnings> fileWarnings = pvcae.getWarnings(); Rows rows = new Rows(); if (question.getAggregateDuplicates()) { aggregateDuplicateWarnings(fileWarnings) .forEach( (triplet, filelines) -> rows.add(getAggregateRow(triplet, filelines, columnMetadataMap))); } else { fileWarnings.forEach( (filename, warnings) -> { for (ParseWarning w : warnings.getParseWarnings()) { rows.add(getRow(filename, w, columnMetadataMap)); } }); } TableAnswerElement answerElement = new TableAnswerElement(createMetadata(question)); answerElement.postProcessAnswer(_question, rows.getData()); return answerElement; }
@Test public void testAnswererFlow() { UndefinedReferencesAnswerer answerer = new UndefinedReferencesAnswerer(new UndefinedReferencesQuestion(), new TestBatfish()); TableAnswerElement answer = answerer.answer(); assertThat(answer.getRows(), equalTo(new Rows().add(BASIC_ROW))); }
@Test public void testAnswererFlow() { UnusedStructuresAnswerer answerer = new UnusedStructuresAnswerer(new UnusedStructuresQuestion(), new TestBatfish()); TableAnswerElement answer = answerer.answer(); assertThat(answer.getRows(), equalTo(new Rows().add(BASIC_ROW))); }
@Test public void testAnswererFlow() { FileParseStatusAnswerer answerer = new FileParseStatusAnswerer(new FileParseStatusQuestion(), new TestBatfish()); TableAnswerElement answer = answerer.answer(); assertThat( answer.getRows(), equalTo( new Rows() .add( Row.of( COL_FILENAME, "f", COL_PARSE_STATUS, ParseStatus.PASSED, COL_NODES, ImmutableList.of(new Node("h")))))); }
@Test public void testAnswer() { ConversionWarningAnswerer answerer = new ConversionWarningAnswerer(new ConversionWarningQuestion(), new TestBatfish()); TableAnswerElement answer = answerer.answer(); assertThat( answer.getRows(), equalTo( new Rows() .add( Row.of( COL_NODE, new Node("node1"), COL_TYPE, ImmutableList.of(Warnings.TAG_UNIMPLEMENTED), COL_COMMENT, "unimplemented1")) .add( Row.of( COL_NODE, new Node("node2"), COL_TYPE, ImmutableList.of(Warnings.TAG_RED_FLAG), COL_COMMENT, "redflag2")))); }
@Test public void testAnswererFlow() { ParseWarningAnswerer answerer = new ParseWarningAnswerer(new ParseWarningQuestion(), new TestBatfish()); TableAnswerElement answer = answerer.answer(); assertThat( answer.getRows(), equalTo( new Rows() .add( Row.of( COL_FILENAME, "f", COL_LINE, 3, COL_TEXT, "text", COL_PARSER_CONTEXT, "ctx", COL_COMMENT, "comment")))); }
@Test public void testAnswer() { ConversionStatusAnswerer answerer = new ConversionStatusAnswerer(new ConversionStatusQuestion(), new TestBatfish()); TableAnswerElement answer = answerer.answer(); assertThat( answer.getRows(), equalTo( new Rows() .add(Row.of(COL_NODE, "n1", COL_CONVERT_STATUS, ConvertStatus.PASSED)) .add(Row.of(COL_NODE, "n2", COL_CONVERT_STATUS, ConvertStatus.WARNINGS)) .add(Row.of(COL_NODE, "n3", COL_CONVERT_STATUS, ConvertStatus.FAILED)))); }
/** Checks if we properly handle tables that have no key columns */ @Test public void diffTablesTestNoKeys() { TableMetadata noKeys = new TableMetadata( ImmutableList.of(new ColumnMetadata("value", Schema.STRING, "value", false, true)), "desc"); Row row1 = Row.of("value", "value1"); Row row2 = Row.of("value", "value2"); TableAnswerElement table1 = new TableAnswerElement(noKeys).addRow(row1); TableAnswerElement table2 = new TableAnswerElement(noKeys).addRow(row2); Rows expectedRows = new Rows() .add( Row.builder() .put(TableDiff.COL_KEY_PRESENCE, TableDiff.COL_KEY_STATUS_BOTH) .put(TableDiff.baseColumnName("value"), "value1") .put(TableDiff.deltaColumnName("value"), "value2") .build()); assertThat(TableDiff.diffTables(table1, table2, true).getRows(), equalTo(expectedRows)); }
@Test public void testSpecifyNodes() { VxlanVniPropertiesAnswerer answerer = new VxlanVniPropertiesAnswerer( new VxlanVniPropertiesQuestion("minimal", VxlanVniPropertySpecifier.ALL), new VxlanVniPropertiesAnswererTest.TestBatfish()); TableAnswerElement answer = answerer.answer(); // Should have only the one VNI from the specified node assertThat( answer.getRows(), equalTo( new Rows() .add( Row.builder() .put(COL_NODE, "minimal") .put(COL_VNI, 1) .put(LOCAL_VTEP_IP, null) .put(MULTICAST_GROUP, null) .put(VLAN, null) .put(VTEP_FLOOD_LIST, null) .put(VXLAN_PORT, 1234) .build()))); }
/** Checks if the content of the Rows we get back after diffing tables is what we expect */ @Test public void diffTablesTestRowContent() { List<ColumnMetadata> columns = mixColumns(); TableMetadata metadata = new TableMetadata(columns, "desc"); Row row1 = mixRow("key1", "both1", "value1", "neither1"); Row row2 = mixRow("key1", "both1", "value2", "neither2"); TableAnswerElement table1 = new TableAnswerElement(metadata).addRow(row1); TableAnswerElement table2 = new TableAnswerElement(metadata).addRow(row2); Rows expectedRows = new Rows() .add( Row.builder() .put("key", "key1") .put("both", "both1") .put(TableDiff.COL_KEY_PRESENCE, TableDiff.COL_KEY_STATUS_BOTH) .put(TableDiff.baseColumnName("value"), "value1") .put(TableDiff.deltaColumnName("value"), "value2") .put(TableDiff.baseColumnName("neither"), "neither1") .put(TableDiff.deltaColumnName("neither"), "neither2") .build()); assertThat(TableDiff.diffTables(table1, table2, true).getRows(), equalTo(expectedRows)); }
@Test public void filterRows() { Filter filter = new Filter("col >= 42"); Rows rows = new Rows(); rows.add(Row.builder().put("col", null).build()); rows.add(Row.builder().put("col", 41).build()); rows.add(Row.builder().put("col", 42).build()); rows.add(Row.builder().put("col", 43).build()); Multiset<Row> filteredRows = FilterTableAnswerer.filterRows(filter, rows.getData()); // we should have the two rows with values >= 42 assertThat( filteredRows, equalTo( new ImmutableMultiset.Builder<Row>() .add(Row.builder().put("col", 42).build()) .add(Row.builder().put("col", 43).build()) .build())); }