gitea源码

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package gtprof
  4. import (
  5. "context"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. // "vendor span" is a simple demo for a span from a vendor library
  10. var vendorContextKey any = "vendorContextKey"
  11. type vendorSpan struct {
  12. name string
  13. children []*vendorSpan
  14. }
  15. func vendorTraceStart(ctx context.Context, name string) (context.Context, *vendorSpan) {
  16. span := &vendorSpan{name: name}
  17. parentSpan, ok := ctx.Value(vendorContextKey).(*vendorSpan)
  18. if ok {
  19. parentSpan.children = append(parentSpan.children, span)
  20. }
  21. ctx = context.WithValue(ctx, vendorContextKey, span)
  22. return ctx, span
  23. }
  24. // below "testTrace*" integrate the vendor span into our trace system
  25. type testTraceSpan struct {
  26. vendorSpan *vendorSpan
  27. }
  28. func (t *testTraceSpan) addEvent(name string, cfg *EventConfig) {}
  29. func (t *testTraceSpan) recordError(err error, cfg *EventConfig) {}
  30. func (t *testTraceSpan) end() {}
  31. type testTraceStarter struct{}
  32. func (t *testTraceStarter) start(ctx context.Context, traceSpan *TraceSpan, internalSpanIdx int) (context.Context, traceSpanInternal) {
  33. ctx, span := vendorTraceStart(ctx, traceSpan.name)
  34. return ctx, &testTraceSpan{span}
  35. }
  36. func TestTraceStarter(t *testing.T) {
  37. globalTraceStarters = []traceStarter{&testTraceStarter{}}
  38. ctx := t.Context()
  39. ctx, span := GetTracer().Start(ctx, "root")
  40. defer span.End()
  41. func(ctx context.Context) {
  42. ctx, span := GetTracer().Start(ctx, "span1")
  43. defer span.End()
  44. func(ctx context.Context) {
  45. _, span := GetTracer().Start(ctx, "spanA")
  46. defer span.End()
  47. }(ctx)
  48. func(ctx context.Context) {
  49. _, span := GetTracer().Start(ctx, "spanB")
  50. defer span.End()
  51. }(ctx)
  52. }(ctx)
  53. func(ctx context.Context) {
  54. _, span := GetTracer().Start(ctx, "span2")
  55. defer span.End()
  56. }(ctx)
  57. var spanFullNames []string
  58. var collectSpanNames func(parentFullName string, s *vendorSpan)
  59. collectSpanNames = func(parentFullName string, s *vendorSpan) {
  60. fullName := parentFullName + "/" + s.name
  61. spanFullNames = append(spanFullNames, fullName)
  62. for _, c := range s.children {
  63. collectSpanNames(fullName, c)
  64. }
  65. }
  66. collectSpanNames("", span.internalSpans[0].(*testTraceSpan).vendorSpan)
  67. assert.Equal(t, []string{
  68. "/root",
  69. "/root/span1",
  70. "/root/span1/spanA",
  71. "/root/span1/spanB",
  72. "/root/span2",
  73. }, spanFullNames)
  74. }