private static EndPointAnalysis assertEndpointAnalysis(
      Trace trace, Frame grailsFrame, Frame httpFrame) {
    EndPointAnalysis ep = endPointAnalyzer.locateEndPoint(trace);
    assertNotNull("No analysis", ep);

    Operation operation = grailsFrame.getOperation();
    String resourceKey =
        GrailsControllerMethodEndPointAnalyzer.makeResourceKey(operation.getSourceCodeLocation());
    EndPointName epName = EndPointName.valueOf(resourceKey);
    assertEquals("Mismatched endpoint name", epName, ep.getEndPointName());

    assertEquals("Mismatched label", operation.getLabel(), ep.getResourceLabel());
    assertEquals(
        "Mismatched score",
        EndPointAnalysis.depth2score(FrameUtil.getDepth(grailsFrame)),
        ep.getScore());

    if (httpFrame == null) {
      assertEquals("Mismatched grails example", operation.getLabel(), ep.getExample());
    } else {
      String expected = EndPointAnalysis.createHttpExampleRequest(httpFrame);
      assertEquals("Mismatched http example", expected, ep.getExample());
    }

    return ep;
  }
 @Test
 public void locateEndPointNoGrails() {
   FrameBuilder b = new SimpleFrameBuilder();
   Operation httpOp = new Operation().type(OperationType.HTTP);
   b.enter(httpOp);
   b.enter(new Operation());
   Frame simpleFrame = b.exit();
   assertNotNull("No simple frame", simpleFrame);
   Frame httpFrame = b.exit();
   Trace trace = Trace.newInstance(app, TraceId.valueOf("0"), httpFrame);
   EndPointAnalysis ep = endPointAnalyzer.locateEndPoint(trace);
   assertNull("Unexpected result: " + ep, ep);
 }
public class GrailsControllerMethodEndPointAnalyzerTest extends Assert {
  private static final ApplicationName app = ApplicationName.valueOf("app");
  private static final GrailsControllerMethodEndPointAnalyzer endPointAnalyzer =
      GrailsControllerMethodEndPointAnalyzer.getInstance();
  private Operation grailsOp;

  public GrailsControllerMethodEndPointAnalyzerTest() {
    super();
  }

  @Before
  public void setUp() {
    grailsOp =
        new Operation()
            .type(GrailsControllerMethodEndPointAnalyzer.TYPE)
            .label("MyController#myAction")
            .sourceCodeLocation(new SourceCodeLocation("org.shortController", "myAction", 111));
  }

  @Test
  public void locateEndPointNoGrails() {
    FrameBuilder b = new SimpleFrameBuilder();
    Operation httpOp = new Operation().type(OperationType.HTTP);
    b.enter(httpOp);
    b.enter(new Operation());
    Frame simpleFrame = b.exit();
    assertNotNull("No simple frame", simpleFrame);
    Frame httpFrame = b.exit();
    Trace trace = Trace.newInstance(app, TraceId.valueOf("0"), httpFrame);
    EndPointAnalysis ep = endPointAnalyzer.locateEndPoint(trace);
    assertNull("Unexpected result: " + ep, ep);
  }

  @Test
  public void locateEndPointNoHttp() {
    FrameBuilder b = new SimpleFrameBuilder();
    b.enter(new Operation());
    b.enter(grailsOp);
    Frame grailsFrame = b.exit();
    assertNotNull("No grails frame", grailsFrame);
    Frame rootFrame = b.exit();
    Trace trace = Trace.newInstance(app, TraceId.valueOf("0"), rootFrame);
    assertEndpointAnalysis(trace, grailsFrame, null);
  }

  @Test
  public void locateEndPointHttpComesBeforeGrails() {
    FrameBuilder b = new SimpleFrameBuilder();
    b.enter(grailsOp);
    Operation httpOp = new Operation().type(OperationType.HTTP);
    b.enter(httpOp);
    Frame httpFrame = b.exit();
    assertNotNull("No http frame", httpFrame);
    Frame grailsFrame = b.exit();
    Trace trace = Trace.newInstance(app, TraceId.valueOf("0"), grailsFrame);
    assertEndpointAnalysis(trace, grailsFrame, null);
  }

  @Test
  public void locateEndPointHttpComesAfterGrails() {
    FrameBuilder b = new SimpleFrameBuilder();
    Operation httpOp = new Operation().type(OperationType.HTTP);
    b.enter(httpOp);
    b.enter(grailsOp);
    Frame grailsFrame = b.exit();
    assertNotNull("No grails frame", grailsFrame);
    Frame httpFrame = b.exit();
    Trace trace = Trace.newInstance(app, TraceId.valueOf("0"), httpFrame);
    assertEndpointAnalysis(trace, grailsFrame, httpFrame);
  }

  private static EndPointAnalysis assertEndpointAnalysis(
      Trace trace, Frame grailsFrame, Frame httpFrame) {
    EndPointAnalysis ep = endPointAnalyzer.locateEndPoint(trace);
    assertNotNull("No analysis", ep);

    Operation operation = grailsFrame.getOperation();
    String resourceKey =
        GrailsControllerMethodEndPointAnalyzer.makeResourceKey(operation.getSourceCodeLocation());
    EndPointName epName = EndPointName.valueOf(resourceKey);
    assertEquals("Mismatched endpoint name", epName, ep.getEndPointName());

    assertEquals("Mismatched label", operation.getLabel(), ep.getResourceLabel());
    assertEquals(
        "Mismatched score",
        EndPointAnalysis.depth2score(FrameUtil.getDepth(grailsFrame)),
        ep.getScore());

    if (httpFrame == null) {
      assertEquals("Mismatched grails example", operation.getLabel(), ep.getExample());
    } else {
      String expected = EndPointAnalysis.createHttpExampleRequest(httpFrame);
      assertEquals("Mismatched http example", expected, ep.getExample());
    }

    return ep;
  }
}