11package dev .braintrust ;
22
33import static org .junit .jupiter .api .Assertions .assertTrue ;
4- import static org .junit .jupiter .api .Assertions .fail ;
54
65import dev .braintrust .api .BraintrustApiClient ;
76import dev .braintrust .config .BraintrustConfig ;
1413import io .opentelemetry .sdk .OpenTelemetrySdk ;
1514import io .opentelemetry .sdk .logs .SdkLoggerProvider ;
1615import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
17- import io .opentelemetry .sdk .testing .exporter .InMemorySpanExporter ;
1816import io .opentelemetry .sdk .trace .SdkTracerProvider ;
1917import io .opentelemetry .sdk .trace .data .SpanData ;
2018import io .opentelemetry .sdk .trace .export .SimpleSpanProcessor ;
2725import lombok .experimental .Accessors ;
2826
2927public class TestHarness {
28+ private static final VCR vcr ;
29+
30+ static {
31+ vcr =
32+ new VCR (
33+ java .util .Map .of (
34+ "https://api.openai.com/v1" , "openai" ,
35+ "https://api.anthropic.com" , "anthropic" ,
36+ "https://generativelanguage.googleapis.com" , "google" ));
37+ vcr .start ();
38+ Runtime .getRuntime ().addShutdownHook (new Thread (vcr ::stop ));
39+ }
3040
3141 public static TestHarness setup () {
3242 return setup (createTestConfig ());
@@ -75,13 +85,12 @@ public static synchronized TestHarness setup(BraintrustConfig config) {
7585 @ Accessors (fluent = true )
7686 private final Braintrust braintrust ;
7787
78- private final @ Nonnull InMemorySpanExporter spanExporter ;
88+ private final @ Nonnull UnitTestSpanExporter spanExporter ;
7989
8090 private TestHarness (@ Nonnull Braintrust braintrust ) {
8191 this .braintrust = braintrust ;
82-
8392 var tracerBuilder = SdkTracerProvider .builder ();
84- this .spanExporter = InMemorySpanExporter . create ();
93+ this .spanExporter = new UnitTestSpanExporter ();
8594 var loggerBuilder = SdkLoggerProvider .builder ();
8695 var meterBuilder = SdkMeterProvider .builder ();
8796 braintrust .openTelemetryEnable (tracerBuilder , loggerBuilder , meterBuilder );
@@ -102,6 +111,30 @@ private TestHarness(@Nonnull Braintrust braintrust) {
102111 this .openTelemetry = openTelemetry ;
103112 }
104113
114+ public String openAiBaseUrl () {
115+ return vcr .getUrlForTargetBase ("https://api.openai.com/v1" );
116+ }
117+
118+ public String openAiApiKey () {
119+ return getEnv ("OPENAI_API_KEY" , "test-key" );
120+ }
121+
122+ public String anthropicBaseUrl () {
123+ return vcr .getUrlForTargetBase ("https://api.anthropic.com" );
124+ }
125+
126+ public String anthropicApiKey () {
127+ return getEnv ("ANTHROPIC_API_KEY" , "test-key" );
128+ }
129+
130+ public String googleBaseUrl () {
131+ return vcr .getUrlForTargetBase ("https://generativelanguage.googleapis.com" );
132+ }
133+
134+ public String googleApiKey () {
135+ return getEnv ("GOOGLE_API_KEY" , getEnv ("GEMINI_API_KEY" , "test-key" ));
136+ }
137+
105138 /** flush all pending spans and return all spans which have been exported so far */
106139 public List <SpanData > awaitExportedSpans () {
107140 assertTrue (
@@ -120,21 +153,7 @@ public List<SpanData> awaitExportedSpans() {
120153 */
121154 @ SneakyThrows
122155 public List <SpanData > awaitExportedSpans (int minSpanCount ) {
123- var spans = awaitExportedSpans ();
124- int attempts = 0 ;
125- while (spans .size () < minSpanCount ) {
126- attempts ++;
127- if (attempts > 30 ) {
128- fail (
129- String .format (
130- "Timeout waiting for spans: expected at least %d spans, but got %d"
131- + " after %d attempts" ,
132- minSpanCount , spans .size (), attempts ));
133- }
134- Thread .sleep (1000 );
135- spans = awaitExportedSpans ();
136- }
137- return spans ;
156+ return spanExporter .getFinishedSpanItems (minSpanCount );
138157 }
139158
140159 private static BraintrustApiClient .InMemoryImpl createApiClient () {
@@ -163,4 +182,9 @@ public static BraintrustConfig createTestConfig() {
163182 "BRAINTRUST_APP_URL" , "https://testhost:3000" ,
164183 "BRAINTRUST_DEFAULT_PROJECT_NAME" , defaultProjectName ());
165184 }
185+
186+ private static String getEnv (String envarName , String defaultValue ) {
187+ var envar = System .getenv (envarName );
188+ return envar == null ? defaultValue : envar ;
189+ }
166190}
0 commit comments