@Test
  public void testLocateExternalResourceNameWhenEnabledWithSqlAndDisabledApp() {
    assertInitialState();

    // enable query external resources creation
    registry.set(CollectionSettingNames.CS_QUERY_EXRTERNAL_RESOURCE_NAME, Boolean.TRUE);

    Operation op = createJdbcOperation("jdbc:foobar://huh:8080");
    op.type(JdbcOperationExternalResourceAnalyzer.TYPE);

    Frame frame = createJdbcFrame(op);
    Trace trace = createJdbcTrace(frame);

    registry.set(
        CollectionSettingNames.createApplicationCollectionSettingName(trace.getAppName()),
        Boolean.FALSE);

    Collection<ExternalResourceDescriptor> resources = locateExternalResourceName(trace);

    // make sure that no query external resources were created
    assertNotNull("external resource descriptors list", resources);
    assertEquals("total external resource descriptors", 1, resources.size());

    ExternalResourceDescriptor firstDescriptor = ListUtil.getFirstMember(resources);
    ExternalResourceType type = ExternalResourceType.valueOf(firstDescriptor.getType());
    assertSame("first descriptor type", ExternalResourceType.DATABASE, type);
    assertFalse("first descriptor is a parent", firstDescriptor.isParent());

    assertTrue(
        trace.getAppName() + "is known", generator.isApplicationNameKnown(trace.getAppName()));
  }
  private void assertQueryDescriptor(ExternalResourceDescriptor desc, String oSql) {
    ExternalResourceDescriptor parent = desc.getParentDescriptor();
    assertNotNull("QUERY ExternalResourceDescriptor parent", parent);

    ExternalResourceType type = ExternalResourceType.valueOf(parent.getType());
    assertSame("QUERY ExternalResourceDescriptor parent type", ExternalResourceType.DATABASE, type);

    List<ExternalResourceDescriptor> children = parent.getChildren();
    assertNotNull("QUERY ExternalResourceDescriptor parent children", children);
    assertEquals("QUERY ExternalResourceDescriptor parent children size", 1, children.size());

    ExternalResourceDescriptor firstChild = children.get(0);
    assertNotNull("QUERY ExternalResourceDescriptor parent first child", firstChild);
    assertSame("QUERY ExternalResourceDescriptor parent first child", desc, firstChild);

    Frame frame = desc.getFrame();
    assertNotNull("QUERY ExternalResourceDescriptor frame", frame);

    Operation op = frame.getOperation();
    assertNotNull("QUERY ExternalResourceDescriptor frame operation", frame);

    String sql = oSql != null ? oSql : op.get("sql", String.class);
    assertEquals("QUERY ExternalResourceDescriptor label", sql, desc.getLabel());

    assertEquals("QUERY ExternalResourceDescriptor vendor", parent.getVendor(), desc.getVendor());
    assertEquals("QUERY ExternalResourceDescriptor host", parent.getHost(), desc.getHost());
    assertEquals("QUERY ExternalResourceDescriptor port", parent.getPort(), desc.getPort());
    assertEquals(
        "QUERY ExternalResourceDescriptor incoming", parent.isIncoming(), desc.isIncoming());
  }
  private void assertQueryExternalResources(Trace trace, String sql) {
    Collection<ExternalResourceDescriptor> resources = locateExternalResourceName(trace);

    assertNotNull("external resource descriptors list", resources);
    assertEquals("total external resource descriptors", 2, resources.size());

    assertTrue(
        trace.getAppName() + "is known", generator.isApplicationNameKnown(trace.getAppName()));

    int totalDbs = 0;
    int totalQuerys = 0;

    for (ExternalResourceDescriptor desc : resources) {
      ExternalResourceType type = ExternalResourceType.valueOf(desc.getType());

      switch (type) {
        case DATABASE:
          totalDbs++;
          break;
        case QUERY:
          assertQueryDescriptor(desc, sql);
          totalQuerys++;
          break;
        default:
          assertNotSame(
              "Unexpected external resource type (should be QUERY or DATABASE)",
              ExternalResourceType.OTHER,
              type);
      }
    }

    assertEquals("Total db external resource descriptors", 1, totalDbs);
    assertEquals("Total query external resource descriptors", 1, totalQuerys);
  }
  @Test
  public void testLocateExternalResourceNameWhenDisabled() {
    assertInitialState();

    Operation op = createJdbcOperation("jdbc:foobar://huh:8080");
    op.type(JdbcOperationExternalResourceAnalyzer.TYPE);

    Frame frame = createJdbcFrame(op);
    Trace trace = createJdbcTrace(frame);

    Collection<ExternalResourceDescriptor> resources = locateExternalResourceName(trace);

    // make sure that no query external resources were created
    assertNotNull("external resource descriptors list", resources);
    assertEquals("total external resource descriptors", 1, resources.size());

    ExternalResourceDescriptor firstDescriptor = ListUtil.getFirstMember(resources);
    ExternalResourceType type = ExternalResourceType.valueOf(firstDescriptor.getType());
    assertSame("first descriptor type", ExternalResourceType.DATABASE, type);
    assertFalse("first descriptor is a parent", firstDescriptor.isParent());

    assertTrue(
        trace.getAppName() + " is known", generator.isApplicationNameKnown(trace.getAppName()));
  }