001/*
002 * Copyright © 2025 CUI-OpenSource-Software (info@cuioss.de)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package de.cuioss.benchmarking.common.constants;
017
018import lombok.experimental.UtilityClass;
019
020/**
021 * Consolidated constants for benchmark modules.
022 * Organized using the DSL-Style Nested Constants Pattern with static imports.
023 */
024@SuppressWarnings("java:S1075")
025// False positive, no URL Parameter
026@UtilityClass
027public final class BenchmarkConstants {
028
029    /**
030     * Metrics-related constants for measurement and reporting.
031     */
032    @UtilityClass
033    public static final class Metrics {
034
035        /**
036         * The common prefix for all JWT metrics.
037         */
038        public static final String PREFIX = "sheriff.oauth";
039
040        /**
041         * Metrics related to bearer token operations.
042         */
043        @UtilityClass
044        public static final class BearerToken {
045            /**
046             * Base path for bearer token metrics.
047             */
048            public static final String BASE = PREFIX + ".bearer.token";
049
050            /**
051             * Metric identifier for bearer token validation duration.
052             */
053            public static final String VALIDATION = BASE + ".validation";
054        }
055
056        /**
057         * Benchmark modes.
058         */
059        @UtilityClass
060        public static final class Modes {
061            public static final String THROUGHPUT = "thrpt";
062            public static final String AVERAGE_TIME = "avgt";
063            public static final String SAMPLE = "sample";
064        }
065
066        /**
067         * Unit strings for benchmark measurements.
068         */
069        @UtilityClass
070        public static final class Units {
071            // Operations per time unit
072            public static final String OPS_PER_SEC = "ops/s";
073            public static final String OPS_PER_SEC_ALT = "ops/sec";
074            public static final String OPS_PER_MS = "ops/ms";
075            public static final String OPS_PER_US = "ops/us";
076            public static final String OPS_PER_NS = "ops/ns";
077            public static final String OPS = "ops";
078
079            // Time per operation
080            public static final String SEC_PER_OP = "s/op";
081            public static final String MS_PER_OP = "ms/op";
082            public static final String US_PER_OP = "us/op";
083            public static final String NS_PER_OP = "ns/op";
084
085            // Display suffixes
086            public static final String K_OPS_S = "K ops/s";
087            public static final String M_OPS_S = "M ops/s";
088            public static final String SPACE_OPS_S = " ops/s";
089            public static final String SUFFIX_S = "s";
090            public static final String SUFFIX_MS = "ms";
091            public static final String SUFFIX_OP = "/op";
092        }
093
094        /**
095         * Conversion factors between different units.
096         */
097        @UtilityClass
098        public static final class Conversions {
099            public static final double MILLIS_TO_SECONDS = 1000.0;
100            public static final double MICROS_TO_SECONDS = 1_000_000.0;
101            public static final double NANOS_TO_SECONDS = 1_000_000_000.0;
102            public static final double MICROS_TO_MILLIS = 1000.0;
103            public static final double NANOS_TO_MILLIS = 1_000_000.0;
104        }
105
106        /**
107         * Percentile-related constants.
108         */
109        @UtilityClass
110        public static final class Percentiles {
111            // Percentile keys
112            public static final String P_0 = "0.0";
113            public static final String P_50 = "50.0";
114            public static final String P_90 = "90.0";
115            public static final String P_95 = "95.0";
116            public static final String P_99 = "99.0";
117            public static final String P_99_9 = "99.9";
118            public static final String P_99_99 = "99.99";
119            public static final String P_100 = "100.0";
120
121            // Percentile labels
122            public static final String LABEL_P0 = "P0";
123            public static final String LABEL_P50 = "P50";
124            public static final String LABEL_P90 = "P90";
125            public static final String LABEL_P95 = "P95";
126            public static final String LABEL_P99 = "P99";
127            public static final String LABEL_P99_9 = "P99.9";
128            public static final String LABEL_P99_99 = "P99.99";
129            public static final String LABEL_P100 = "P100";
130
131            public static final String SUFFIX_TH = "th";
132        }
133    }
134
135    /**
136     * Report-related constants for benchmark report generation.
137     */
138    @UtilityClass
139    public static final class Report {
140
141        /**
142         * JSON field names used in benchmark data structures.
143         */
144        @UtilityClass
145        public static final class JsonFields {
146            // Primary fields
147            public static final String PRIMARY_METRIC = "primaryMetric";
148            public static final String SECONDARY_METRICS = "secondaryMetrics";
149            public static final String BENCHMARK = "benchmark";
150            public static final String MODE = "mode";
151            public static final String SCORE = "score";
152            public static final String SCORE_UNIT = "scoreUnit";
153            public static final String RAW_DATA = "rawData";
154            public static final String SCORE_PERCENTILES = "scorePercentiles";
155            public static final String SCORE_ERROR = "scoreError";
156            public static final String SCORE_CONFIDENCE = "scoreConfidence";
157            public static final String TIMESTAMP = "timestamp";
158            public static final String BENCHMARKS = "benchmarks";
159            public static final String SUMMARY = "summary";
160
161            // Report data fields
162            public static final String METADATA = "metadata";
163            public static final String OVERVIEW = "overview";
164            public static final String CHART_DATA = "chartData";
165            public static final String TRENDS = "trends";
166            public static final String DISPLAY_TIMESTAMP = "displayTimestamp";
167            public static final String BENCHMARK_TYPE = "benchmarkType";
168            public static final String REPORT_VERSION = "reportVersion";
169
170            // Metrics fields
171            public static final String THROUGHPUT = "throughput";
172            public static final String LATENCY = "latency";
173            public static final String THROUGHPUT_BENCHMARK_NAME = "throughputBenchmarkName";
174            public static final String LATENCY_BENCHMARK_NAME = "latencyBenchmarkName";
175            public static final String PERFORMANCE_SCORE = "performanceScore";
176            public static final String PERFORMANCE_GRADE = "performanceGrade";
177            public static final String PERFORMANCE_GRADE_CLASS = "performanceGradeClass";
178
179            // Result fields
180            public static final String NAME = "name";
181            public static final String FULL_NAME = "fullName";
182            public static final String ERROR = "error";
183            public static final String VARIABILITY_COEFFICIENT = "variabilityCoefficient";
184            public static final String CONFIDENCE_LOW = "confidenceLow";
185            public static final String CONFIDENCE_HIGH = "confidenceHigh";
186            public static final String PERCENTILES = "percentiles";
187
188            // Chart fields
189            public static final String LABELS = "labels";
190            public static final String PERCENTILES_DATA = "percentilesData";
191            public static final String PERCENTILE_LABELS = "percentileLabels";
192            public static final String DATA = "data";
193            public static final String DATASETS = "datasets";
194
195            // Status fields
196            public static final String STATUS = "status";
197            public static final String GENERATED = "generated";
198            public static final String LAST_RUN = "last_run";
199            public static final String SERVICES = "services";
200            public static final String LINKS = "links";
201            public static final String AVAILABLE = "available";
202
203            // Summary fields
204            public static final String TOTAL_BENCHMARKS = "total_benchmarks";
205            public static final String PERFORMANCE_GRADE_KEY = "performance_grade";
206            public static final String AVERAGE_THROUGHPUT = "average_throughput";
207        }
208
209        /**
210         * Badge-related constants for shields.io integration.
211         */
212        @UtilityClass
213        public static final class Badge {
214            public static final String SCHEMA_VERSION = "schemaVersion";
215            public static final String LABEL = "label";
216            public static final String MESSAGE = "message";
217            public static final String COLOR = "color";
218
219            /**
220             * Badge colors following shields.io color scheme.
221             */
222            @UtilityClass
223            public static final class Colors {
224                public static final String BRIGHT_GREEN = "brightgreen";
225                public static final String GREEN = "green";
226                public static final String YELLOW_GREEN = "yellowgreen";
227                public static final String YELLOW = "yellow";
228                public static final String ORANGE = "orange";
229                public static final String RED = "red";
230                public static final String BLUE = "blue";
231                public static final String LIGHT_GRAY = "lightgray";
232            }
233
234            /**
235             * Badge labels.
236             */
237            @UtilityClass
238            public static final class Labels {
239                public static final String PERFORMANCE = "Performance";
240                public static final String PERFORMANCE_TREND = "Performance Trend";
241                public static final String TREND = "Trend";
242                public static final String LAST_RUN = "Last Run";
243            }
244
245            /**
246             * Trend indicators.
247             */
248            @UtilityClass
249            public static final class Trends {
250                public static final String STABLE = "→ stable";
251                public static final String IMPROVING_FORMAT = "↑ +%.1f%%";
252                public static final String DEGRADING_FORMAT = "↓ %.1f%%";
253            }
254
255            /**
256             * Badge messages.
257             */
258            @UtilityClass
259            public static final class Messages {
260                public static final String NO_HISTORY = "No history";
261            }
262
263            /**
264             * Badge file names.
265             */
266            @UtilityClass
267            public static final class FileNames {
268                public static final String PERFORMANCE_BADGE_JSON = "performance-badge.json";
269                public static final String TREND_BADGE_JSON = "trend-badge.json";
270                public static final String LAST_RUN_BADGE_JSON = "last-run-badge.json";
271            }
272
273            /**
274             * Trend direction constants.
275             */
276            @UtilityClass
277            public static final class TrendDirection {
278                public static final String UP = "up";
279                public static final String DOWN = "down";
280                public static final String STABLE = "stable";
281            }
282
283            /**
284             * Arrow symbols for trends.
285             */
286            @UtilityClass
287            public static final class Arrows {
288                public static final String UP = "↑";
289                public static final String DOWN = "↓";
290                public static final String RIGHT = "→";
291                public static final String BULLET = "•";
292            }
293        }
294
295        /**
296         * Performance grade constants.
297         */
298        @UtilityClass
299        public static final class Grades {
300            public static final String A_PLUS = "A+";
301            public static final String A = "A";
302            public static final String B = "B";
303            public static final String C = "C";
304            public static final String D = "D";
305            public static final String F = "F";
306
307            /**
308             * CSS class names for grades.
309             */
310            @UtilityClass
311            public static final class CssClasses {
312                public static final String GRADE_A_PLUS = "grade-a-plus";
313                public static final String GRADE_A = "grade-a";
314                public static final String GRADE_B = "grade-b";
315                public static final String GRADE_C = "grade-c";
316                public static final String GRADE_D = "grade-d";
317                public static final String GRADE_F = "grade-f";
318                public static final String GRADE_UNKNOWN = "grade-unknown";
319            }
320        }
321
322        /**
323         * Default values for missing data.
324         */
325        @UtilityClass
326        public static final class Defaults {
327            public static final String N_A = "N/A";
328            public static final String NOT_AVAILABLE = "n/a";
329        }
330
331        /**
332         * Template paths and resources.
333         */
334        @UtilityClass
335        public static final class Templates {
336            public static final String PATH_PREFIX = "/templates/";
337            public static final String NOT_FOUND_FORMAT = "Template not found: %s";
338        }
339
340        /**
341         * Error messages.
342         */
343        @UtilityClass
344        public static final class Errors {
345            public static final String THROUGHPUT_NAME_REQUIRED = "Throughput benchmark name must be specified";
346            public static final String LATENCY_NAME_REQUIRED = "Latency benchmark name must be specified";
347            public static final String NO_RESULTS_PROVIDED = "No benchmark results provided";
348            public static final String THROUGHPUT_NOT_FOUND_FORMAT = "Required throughput benchmark '%s' not found in results";
349            public static final String LATENCY_NOT_FOUND_FORMAT = "Required latency benchmark '%s' not found in results";
350            public static final String THROUGHPUT_POSITIVE = "Throughput must be positive, got: ";
351            public static final String LATENCY_POSITIVE = "Latency must be positive, got: ";
352            public static final String SCORE_NON_NEGATIVE = "Performance score must be non-negative, got: ";
353        }
354
355        /**
356         * Messages for UI display.
357         */
358        @UtilityClass
359        public static final class Messages {
360            public static final String HISTORICAL_DATA_NOT_AVAILABLE = "Historical data not yet available";
361            public static final String PERFORMANCE_STABLE_FORMAT = "Performance is stable (%.1f%% change)";
362            public static final String PERFORMANCE_IMPROVED_FORMAT = "Performance improved by %.1f%%";
363            public static final String PERFORMANCE_DECREASED_FORMAT = "Performance decreased by %.1f%%";
364        }
365
366        /**
367         * Date/time format patterns.
368         */
369        @UtilityClass
370        public static final class DateFormats {
371            public static final String DISPLAY_TIMESTAMP_PATTERN = "yyyy-MM-dd HH:mm:ss 'UTC'";
372        }
373
374        /**
375         * Version information.
376         */
377        @UtilityClass
378        public static final class Versions {
379            public static final String REPORT_VERSION = "1.0";
380        }
381
382        /**
383         * API endpoint paths.
384         */
385        @UtilityClass
386        public static final class Api {
387            public static final String LATEST_JSON = "latest.json";
388            public static final String BENCHMARKS_JSON = "benchmarks.json";
389            public static final String STATUS_JSON = "status.json";
390
391            // API paths
392            public static final String API_BENCHMARKS_PATH = "/api/benchmarks.json";
393            public static final String BADGES_PATH = "/badges/";
394
395            // Status values
396            public static final String STATUS_OPERATIONAL = "operational";
397            public static final String STATUS_NO_DATA = "no_data";
398            public static final String STATUS_HEALTHY = "healthy";
399            public static final String STATUS_SUCCESS = "success";
400        }
401    }
402
403    /**
404     * Integration-related constants for configuration and setup.
405     */
406    @UtilityClass
407    public static final class Integration {
408
409        /**
410         * System properties for integration configuration.
411         */
412        @UtilityClass
413        public static final class Properties {
414            public static final String INTEGRATION_SERVICE_URL = "integration.service.url";
415            public static final String KEYCLOAK_URL = "keycloak.url";
416            public static final String METRICS_URL = "quarkus.metrics.url";
417        }
418
419        /**
420         * JMH configuration properties.
421         */
422        @UtilityClass
423        public static final class Jmh {
424            public static final String INCLUDE = "jmh.include";
425            public static final String FORKS = "jmh.forks";
426            public static final String WARMUP_ITERATIONS = "jmh.warmupIterations";
427            public static final String MEASUREMENT_ITERATIONS = "jmh.iterations";
428            public static final String MEASUREMENT_TIME = "jmh.time";
429            public static final String WARMUP_TIME = "jmh.warmupTime";
430            public static final String THREADS = "jmh.threads";
431            public static final String RESULT_FORMAT = "jmh.result.format";
432        }
433    }
434
435    /**
436     * File and directory constants for benchmark I/O operations.
437     */
438    @UtilityClass
439    public static final class Files {
440
441        /**
442         * Directory paths.
443         */
444        @UtilityClass
445        public static final class Directories {
446            public static final String RESULTS_DIR = "target/benchmark-results";
447            public static final String REPORTS_DIR = "reports";
448            public static final String BADGES_DIR = "badges";
449            public static final String DATA_DIR = "data";
450            public static final String API_DIR = "api";
451        }
452
453        /**
454         * HTML files.
455         */
456        @UtilityClass
457        public static final class Html {
458            public static final String INDEX = "index.html";
459            public static final String TRENDS = "trends.html";
460            public static final String DETAILED = "detailed.html";
461            public static final String ERROR_404 = "404.html";
462        }
463
464        /**
465         * Support files.
466         */
467        @UtilityClass
468        public static final class Support {
469            public static final String REPORT_STYLES_CSS = "report-styles.css";
470            public static final String DATA_LOADER_JS = "data-loader.js";
471            public static final String ROBOTS_TXT = "robots.txt";
472            public static final String SITEMAP_XML = "sitemap.xml";
473        }
474
475        /**
476         * Data files.
477         */
478        @UtilityClass
479        public static final class Data {
480            public static final String BENCHMARK_DATA_JSON = "benchmark-data.json";
481            public static final String BENCHMARK_SUMMARY_JSON = "data/benchmark-summary.json";
482            public static final String LAST_RUN_BADGE_JSON = "last-run-badge.json";
483            public static final String INTEGRATION_PERFORMANCE_BADGE_JSON = "integration-performance-badge.json";
484            public static final String PERFORMANCE_BADGE_JSON = "performance-badge.json";
485            public static final String INTEGRATION_TREND_BADGE_JSON = "integration-trend-badge.json";
486        }
487
488        /**
489         * File extensions.
490         */
491        @UtilityClass
492        public static final class Extensions {
493            public static final String HTML = ".html";
494            public static final String JSON = ".json";
495        }
496    }
497}