diff --git a/.github/workflows/test-makefile.yml b/.github/workflows/test-makefile.yml index f75f0452a..7d6ef551f 100644 --- a/.github/workflows/test-makefile.yml +++ b/.github/workflows/test-makefile.yml @@ -12,8 +12,6 @@ jobs: project: - name: lib path: ./lib/ - - name: flakeguard - path: ./tools/flakeguard/ runs-on: ubuntu-latest name: ${{ matrix.project.name }} unit tests steps: diff --git a/_typos.toml b/_typos.toml index e3edcbedc..b8af7449e 100644 --- a/_typos.toml +++ b/_typos.toml @@ -4,8 +4,6 @@ extend-exclude = [ "**/go-cache", "framework/examples/myproject_cll/README.md", "framework/components/blockchain/tron.go", - "tools/flakeguard/e2e-flaky-test-guide.md", - "tools/flakeguard/runner/**", "infra/**", "book/**", "**/go.mod", @@ -16,5 +14,5 @@ extend-exclude = [ "wasp/HOW_IT_WORKS.md", "wasp/dashboard/**", "seth/*_test.go", - "seth/dot_graph.go" -] \ No newline at end of file + "seth/dot_graph.go", +] diff --git a/tools/flakeguard/.gitignore b/tools/flakeguard/.gitignore deleted file mode 100644 index d49dd208c..000000000 --- a/tools/flakeguard/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -tmp_test_flaky* -test_results_*.json -debug_outputs -example_results/ -example_flakeguard_report/ -example*.json -example*.md -test-output-*.json -transformed-output-*.json -flakeguard_raw_output/ -flakeguard_raw_output_transformed/ -.envrc diff --git a/tools/flakeguard/.tool-versions b/tools/flakeguard/.tool-versions deleted file mode 100644 index 0ae8f2965..000000000 --- a/tools/flakeguard/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -golang 1.24.0 diff --git a/tools/flakeguard/Makefile b/tools/flakeguard/Makefile deleted file mode 100644 index 118584b58..000000000 --- a/tools/flakeguard/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -.PHONY: test_unit -test_unit: - go test ./... -timeout 5m -json -cover -covermode=count -coverprofile=unit-test-coverage.out 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci - -.PHONY: test -test: - gotestsum -- -cover ./... - -.PHONY: test-package -test-package: - gotestsum -- -cover ./$(PKG) - -.PHONY: test-race -test-race: - gotestsum -- -cover -count=1 -race - -.PHONY: bench -bench: - go test -run=^$$ -bench=. -benchmem ./... diff --git a/tools/flakeguard/README.md b/tools/flakeguard/README.md deleted file mode 100644 index 2150839a6..000000000 --- a/tools/flakeguard/README.md +++ /dev/null @@ -1,167 +0,0 @@ -# Flakeguard - -**Flakeguard** is a tool designed to help identify flaky tests within a Go project. Flaky tests are tests that intermittently fail without changes to the code, often due to race conditions or other non-deterministic behavior. Flakeguard assists by analyzing the impact of code changes on test packages and by running tests multiple times to determine stability. - -In addition to detecting flaky tests, Flakeguard can also integrate with Jira to track known flaky tests. It maintains a local database of tests and their associated Jira tickets, allowing you to create and manage these tickets directly from the command line. - -## Features - -* **Identify Impacted Tests:** Detects test packages that may be affected by changes in your Go project files. -* **Run Tests for Flakiness:** Runs tests multiple times to determine their flakiness. -* **Output Results in JSON:** Allows easy integration with CI pipelines and custom reporting. -* **Supports Exclusion Lists:** Configurable to exclude specified packages or paths from the analysis. -* **Recursive Dependency Analysis:** Detects all impacted packages through dependency levels. -* **Jira Integration (Optional):** Create, review, and manage flaky test tickets in Jira. -* **Local Database:** Store known flaky tests and their associated Jira tickets for easy reference. - -## Prerequisites - -1. **Go:** Version 1.21 or later recommended. -2. **Jira API Access (optional):** Required only if you want to use the Jira-related commands (`create-tickets`, `review-tickets`, `sync-jira`): - * `JIRA_DOMAIN`: Your Jira instance domain (e.g. _your-company.atlassian.net_). - * `JIRA_EMAIL`: The email address associated with your Jira account used for API access. - * `JIRA_API_KEY`: Your Jira API token (generate one in your Jira account settings). - * `JIRA_PROJECT_KEY`: (Optional) The default Jira project key to use if `--jira-project` is not specified for `create-tickets`. - -## Installation - -To install the `flakeguard` CLI, ensure you have Go installed. Then run: - -```sh -go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@latest -``` - -You can also clone the repository and build from source: - -```sh -git clone https://github.com/smartcontractkit/chainlink-testing-framework.git -cd chainlink-testing-framework/tools/flakeguard - -go build -o flakeguard main.go -``` - -## Usage (Flaky Test Detection) - -Flakeguard provides two primary commands for local detection of flaky tests without involving Jira: `find` and `run`. - -### `flakeguard find` - -The `find` command scans your Go project to determine which test packages may be impacted by recent file changes. It conducts a dependency analysis to see which test packages depend on the changed files, helping you focus your testing efforts on the most relevant areas. - - -### `flakeguard run` - -After identifying packages of interest (via `flakeguard find` or otherwise), use the `run` command to execute tests multiple times to detect flakiness. - - -## Configuration Files (for Jira Integration) - -When using Flakeguard’s Jira integration and local database features, you may need these configuration files: - -1. ### Local Database (`flaky_tests_db.json `) - - * **Purpose:** Stores mappings between test definitions (package + name) and their Jira tickets, along with the assignee ID. - * **Location:** By default, stored as `flaky_tests_db.json ` in your user home directory (~). This path is determined by `localdb.DefaultDBPath()`. - * **Override:** Use `--test-db-path` with any command to specify a different location. - * **Format:** Internal JSON structure managed by the tool (_localdb/localdb.go_). -2. ### User Mapping (`user_mapping.json`) - - * **Purpose:** Maps Jira User Account IDs to Pillar Names or team/group identifiers. Used by: - * `create-tickets`: To set the Pillar Name custom field when creating a new Jira ticket if an assignee is determined. - * `review-tickets`: To allow setting the Pillar Name (\[i\] action) based on the ticket's assignee stored in the local DB. - * **Format:** A JSON array of objects. - - * **Flag:** Use `--user-mapping-path` (default: `user_mapping.json`) when needed. -3. ### User Test Mapping (`user_test_mapping.json`) - - * **Purpose:** Defines regex patterns to match test packages (or full test paths) to suggest an assignee (Jira User Account ID) for new tickets created by `create-tickets`. The first pattern match determines the suggested assignee. - * **Format:** A JSON array of objects. The `.*` pattern can be used as a fallback. - - * **Flag:** Use `--user-test-mapping-path` (default: `user_test_mapping.json`) when creating tickets. - - -## Usage (Jira Integration) - -If you only need to identify flaky tests locally (via `find` and `run`) and do not intend to create or manage Jira tickets, you can skip these commands. - -### `flakeguard create-tickets` - -Interactively process a CSV file of flaky tests, suggest assignees based on patterns, check for existing Jira tickets, and create new tickets if needed. - -* **Key Features:** - * Reads test details from CSV. - * Suggests assignee using `user_test_mapping.json`. - * Checks local DB and Jira for existing tickets. - * Sets Pillar Name from `user_mapping.json` when creating new tickets. - * Provides a text-based UI for review and confirmation. - * Updates the local DB with created/manually assigned ticket keys. - * Outputs tests that were not confirmed for ticket creation to a _\_remaining.csv_ file. -* **Flags:** - * `--csv-path` (required): Path to the input CSV file of flaky tests. - * `--jira-project`: Jira project key for new tickets (required if `JIRA_PROJECT_KEY` is not set). - * `--jira-issue-type`: Jira issue type for new tickets (default: _Task_). - * `--jira-search-label`: Label used to search for existing tickets (default: _flaky\_test_). - * `--test-db-path`: Local database file path (default: `~/flaky_tests_db.json `). - * `--user-mapping-path`: Path to user mapping JSON (default: `user_mapping.json`). - * `--user-test-mapping-path`: Path to user-test mapping JSON (default: `user_test_mapping.json`). - * `--skip-existing`: If set, automatically skips tests that already have a known Jira key. - * `--dry-run`: Simulates actions without creating Jira tickets or modifying the DB. - -**Example:** - -```sh - go run main.go create-tickets \ - --jira-project=DX \ - --test-db-path=flaky_test_db.json \ - --user-mapping-path=user_mapping.json \ - --user-test-mapping-path=user_test_mapping.json \ - --skip-existing \ - --dry-run=false \ - --csv-path '1744018947_31163.csv' -``` - -### `flakeguard review-tickets` - -Interactively review tickets in the local database. Fetches current status and Pillar Name from Jira, and lets you set the Pillar Name in Jira. - -* **Key Features:** - * Reads test data from the local DB. - * Fetches current Status and Pillar Name from Jira. - * Displays Test Info, Assignee, Pillar Name, and Jira Status. - * Allows setting the Pillar Name in Jira using the **\[i\]** action, based on `user_mapping.json`. -* **TUI Actions:** - * **\[i\]** Set Pillar Name in Jira if it’s empty (and if prerequisites are met). - * **\[p\]** View previous ticket. - * **\[n\]** View next ticket. - * **\[q\]** Quit the TUI. -* **Flags:** - * `--test-db-path`: Local DB path (default: `~/flaky_tests_db.json `). - * `--user-mapping-path`: Path to user mapping JSON (default: `user_mapping.json`). - * `--user-test-mapping-path`: Path to user-test mapping JSON (default: `user_test_mapping.json`). - * `--missing-pillars`: Only show tickets missing a Pillar Name. - * `--dry-run`: Prevents the **\[i\]** action from actually updating Jira. - -**Examples:** - -```sh -go run main.go review-tickets --test-db-path ".flaky_test_db.json" --dry-run=false --user-mapping-path "user_mapping.json" -``` - -### `flakeguard sync-jira` - -Scans Jira for all tickets matching a specific label and ensures they exist in the local database. Updates local assignees based on Jira's current assignee. - -* **Key Features:** - * Fetches all Jira tickets - * Adds missing tickets to the local DB (where the test package/name might be unknown). - * Updates the _AssigneeID_ in the local DB if it differs from the current Jira assignee. -* **Flags:** - * `--test-db-path`: Local DB file path (default: `~/flaky_tests_db.json `). - * `--jira-search-label`: Label used to find relevant tickets (default: _flaky\_test_). - * `--dry-run`: Shows what would be updated without modifying the DB. - -**Example:** - -```sh -go run main.go sync-jira --test-db-path=.flaky_test_db.json -``` \ No newline at end of file diff --git a/tools/flakeguard/cmd/check_test_owners.go b/tools/flakeguard/cmd/check_test_owners.go deleted file mode 100644 index 4a4caeea0..000000000 --- a/tools/flakeguard/cmd/check_test_owners.go +++ /dev/null @@ -1,86 +0,0 @@ -package cmd - -import ( - "os" - "path/filepath" - - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/codeowners" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/spf13/cobra" -) - -var ( - codeownersPath string - printTestFunctions bool -) - -// CheckTestOwnersCmd checks which tests lack code owners -var CheckTestOwnersCmd = &cobra.Command{ - Use: "check-test-owners", - Short: "Check which tests in the project do not have code owners", - Run: func(cmd *cobra.Command, args []string) { - projectPath, _ := cmd.Flags().GetString("project-path") - - // Scan project for test functions - testFileMap, err := reports.ScanTestFiles(projectPath) - if err != nil { - log.Error().Err(err).Msg("Error scanning test files") - os.Exit(ErrorExitCode) - } - - // Parse CODEOWNERS file - codeOwnerPatterns, err := codeowners.Parse(codeownersPath) - if err != nil { - log.Error().Err(err).Msg("Error parsing CODEOWNERS file") - os.Exit(ErrorExitCode) - } - - // Check for tests without code owners - testsWithoutOwners := make(map[string]string) // Map of test names to their relative paths - for testName, filePath := range testFileMap { - relFilePath, err := filepath.Rel(projectPath, filePath) - if err != nil { - log.Error().Err(err).Msgf("Error getting relative path for test %s", testName) - continue - } - // Convert to Unix-style path for matching - relFilePath = filepath.ToSlash(relFilePath) - - owners := codeowners.FindOwners(relFilePath, codeOwnerPatterns) - if len(owners) == 0 { - testsWithoutOwners[testName] = relFilePath - } - } - - // Calculate percentages - totalTests := len(testFileMap) - totalWithoutOwners := len(testsWithoutOwners) - totalWithOwners := totalTests - totalWithoutOwners - - percentageWithOwners := float64(totalWithOwners) / float64(totalTests) * 100 - percentageWithoutOwners := float64(totalWithoutOwners) / float64(totalTests) * 100 - - // Report results - log.Info().Msgf("Total Test functions found: %d", totalTests) - log.Info().Msgf("Test functions with owners: %d (%.2f%%)", totalWithOwners, percentageWithOwners) - log.Info().Msgf("Test functions without owners: %d (%.2f%%)", totalWithoutOwners, percentageWithoutOwners) - - if printTestFunctions { - if totalWithoutOwners > 0 { - log.Debug().Msg("Test functions without owners:") - for testName, relPath := range testsWithoutOwners { - log.Debug().Msgf("- %s (%s)", testName, relPath) - } - } else { - log.Debug().Msg("All Test functions have code owners!") - } - } - }, -} - -func init() { - CheckTestOwnersCmd.Flags().StringP("project-path", "p", ".", "Path to the root of the project") - CheckTestOwnersCmd.Flags().StringVarP(&codeownersPath, "codeowners-path", "c", ".github/CODEOWNERS", "Path to the CODEOWNERS file") - CheckTestOwnersCmd.Flags().BoolVarP(&printTestFunctions, "print-test-functions", "t", false, "Print all test functions without owners") -} diff --git a/tools/flakeguard/cmd/create_tickets.go b/tools/flakeguard/cmd/create_tickets.go deleted file mode 100644 index 2f607d3cd..000000000 --- a/tools/flakeguard/cmd/create_tickets.go +++ /dev/null @@ -1,1141 +0,0 @@ -package cmd - -import ( - "context" - "encoding/csv" - "fmt" - "os" - "regexp" - "strconv" - "strings" - "time" - - "github.com/andygrunwald/go-jira" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - "github.com/rs/zerolog/log" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/jirautils" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/localdb" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/mapping" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/model" - "github.com/spf13/cobra" -) - -// Flags for create-tickets -var ( - csvPath string - dryRun bool - jiraProject string - jiraIssueType string - jiraSearchLabel string // defaults to "flaky_test" if empty - testDBPath string - skipExisting bool - userMappingPathCT string - userTestMappingPathCT string -) - -var CreateTicketsCmd = &cobra.Command{ - Use: "create-tickets", - Short: "Interactive TUI to confirm and create Jira tickets from CSV", - Long: `Reads a CSV describing flaky tests, attempts to assign owners based on patterns, -searches for existing tickets, and presents each for confirmation/action in a TUI. - -Actions: - [c] confirm & create ticket (if none exists) - [n] skip this test - [e] enter/edit existing Jira key for this test - [d] delete associated Jira ticket (use with caution!) - [q] quit - -Features: -- Assigns owners based on 'user_test_mapping.json' if no owner is found otherwise. -- Searches Jira (label=flaky_test or --jira-search-label) for existing tickets matching test name. -- Uses local DB (--test-db-path) to remember existing ticket associations. -- Creates tickets in Jira (--dry-run=false) using JIRA_* env vars for auth. -- Includes Pillar Name (from 'user_mapping.json') when creating tickets if assignee is known. -- Outputs remaining unhandled tests to a new CSV file ('remaining_.csv'). -`, - RunE: func(cmd *cobra.Command, args []string) error { - // 1) Validate input & Set Defaults - if csvPath == "" { - return fmt.Errorf("CSV path is required (--csv-path)") - } - if jiraProject == "" { - jiraProject = os.Getenv("JIRA_PROJECT_KEY") - } - if jiraProject == "" { - return fmt.Errorf("Jira project key is required (set --jira-project or JIRA_PROJECT_KEY env)") - } - if jiraSearchLabel == "" { - jiraSearchLabel = "flaky_test" - } - - db, err := localdb.LoadDBWithPath(testDBPath) - if err != nil { - log.Warn().Err(err).Str("path", testDBPath).Msg("Failed to load local DB; continuing with empty DB.") - db = localdb.NewDBWithPath(testDBPath) - } - - userMap, err := mapping.LoadUserMappings(userMappingPathCT) - if err != nil { - log.Error().Err(err).Msg("Failed to load user mappings. Pillar names won't be set.") - userMap = make(map[string]mapping.UserMapping) // Ensure userMap is not nil - } - userTestMappings, err := mapping.LoadUserTestMappings(userTestMappingPathCT) - if err != nil { - log.Error().Err(err).Msg("Failed to load user test mappings. Assignees won't be set automatically from patterns.") - userTestMappings = []mapping.UserTestMappingWithRegex{} // Ensure not nil - } - - records, err := readFlakyTestsCSV(csvPath) - if err != nil { - return fmt.Errorf("error reading CSV file '%s': %w", csvPath, err) - } - if len(records) <= 1 { - log.Warn().Msg("CSV has no data rows.") - return nil - } - originalRecords := records - dataRows := records[1:] - - var tickets []model.FlakyTicket - log.Info().Int("rows", len(dataRows)).Msg("Processing CSV data rows...") - for i, row := range dataRows { - if len(row) < 10 { - log.Warn().Int("row_index", i+2).Int("columns", len(row)).Msg("Skipping row: not enough columns.") - continue - } - - ft := rowToFlakyTicket(row) - ft.RowIndex = i + 2 - - if !ft.Valid { - log.Warn().Str("test", ft.TestName).Str("reason", ft.InvalidReason).Int("row", ft.RowIndex).Msg("Skipping invalid ticket from CSV") - continue - } - - // Check local DB first for existing ticket - if entry, found := db.GetEntry(ft.TestPackage, ft.TestName); found { - log.Debug(). - Str("test", ft.TestName). - Str("db_ticket", entry.JiraTicket). - Str("db_assignee", entry.AssigneeID). - Time("db_skipped_at", entry.SkippedAt). - Msg("Found existing entry in local DB") - - ft.RelatedJiraTickets = entry.PastJiraTickets - ft.ExistingJiraKey = entry.JiraTicket - ft.ExistingTicketSource = "localdb" - // Always assign SkippedAt and AssigneeID from the DB entry if found - ft.SkippedAt = entry.SkippedAt - if entry.AssigneeID != "" { - ft.AssigneeId = entry.AssigneeID - } - } - - // If assignee wasn't found in DB, try pattern matching - if ft.AssigneeId == "" && len(userTestMappings) > 0 { - testPath := ft.TestPackage - assigneeID, matchErr := mapping.FindAssigneeIDForTest(testPath, userTestMappings) - if matchErr != nil { - log.Warn().Err(matchErr).Str("testPath", testPath).Msg("Error during assignee pattern matching") - } else if assigneeID != "" { - log.Debug().Str("test", testPath).Str("assignee", assigneeID).Msg("Assignee found via pattern matching") - ft.AssigneeId = assigneeID - } - } - - // Check if the final AssigneeId has a mapping (for Pillar Name later) - if ft.AssigneeId != "" { - if _, exists := userMap[ft.AssigneeId]; !exists { - ft.MissingUserMapping = true - log.Warn().Str("test", ft.TestName).Str("assignee", ft.AssigneeId).Msg("Assignee ID is set, but not found in user_mapping.json") - } - } - - // Decide whether to skip processing based on flag and existing key - if skipExisting && ft.ExistingJiraKey != "" { - log.Info().Str("test", ft.TestName).Str("jira_key", ft.ExistingJiraKey).Msg("Skipping test due to --skip-existing flag.") - continue - } - - tickets = append(tickets, ft) - } - - if len(tickets) == 0 { - log.Warn().Msg("No new tickets to create found after filtering and validation.") - return nil - } - - client, clientErr := jirautils.GetJiraClient() - if clientErr != nil { - log.Warn().Msgf("No valid Jira client: %v\nWill skip searching or creating tickets in Jira.", clientErr) - client = nil - } - - m := initialCreateModel(tickets, userMap) - m.DryRun = dryRun - m.JiraProject = jiraProject - m.JiraIssueType = jiraIssueType - m.JiraClient = client - m.originalRecords = originalRecords - m.LocalDB = db - - finalModel, err := tea.NewProgram(m).Run() - if err != nil { - log.Error().Err(err).Msg("Error running Bubble Tea program") - } - - fm, ok := finalModel.(createModel) - if !ok { - log.Error().Msg("TUI returned unexpected model type") - if db != nil && !dryRun { - if errDb := db.Save(); errDb != nil { - log.Error().Err(errDb).Msg("Failed to save local DB after TUI error") - } - } - return fmt.Errorf("TUI model error") - } - - if !fm.DryRun { - if db == nil { - log.Error().Msg("Cannot save DB: DB instance is nil") - } else if err := db.Save(); err != nil { - log.Error().Err(err).Msg("Failed to save local DB") - } else { - fmt.Printf("Local DB updated: %s\n", db.FilePath()) - } - } else { - log.Info().Msg("Dry Run: Local DB changes were not saved.") - } - - remainingFilePath := generateRemainingCSVPath(csvPath) - err = writeRemainingCSV(remainingFilePath, fm.originalRecords, fm.tickets, fm.processedIndices) - if err != nil { - log.Error().Err(err).Str("path", remainingFilePath).Msg("Failed to write remaining tests CSV") - } else { - log.Info().Str("path", remainingFilePath).Msg("Remaining/skipped tests CSV generated.") - } - - fmt.Printf("TUI Summary: %d confirmed, %d skipped/existing, %d total processed.\n", fm.confirmed, fm.skipped, fm.confirmed+fm.skipped) - - return nil - }, -} - -func init() { - CreateTicketsCmd.Flags().StringVar(&csvPath, "csv-path", "", "Path to CSV file with flaky tests (Required)") - CreateTicketsCmd.Flags().BoolVar(&dryRun, "dry-run", false, "If true, do not create/modify Jira tickets or save DB changes") - CreateTicketsCmd.Flags().StringVar(&jiraProject, "jira-project", "", "Jira project key (default: JIRA_PROJECT_KEY env)") - CreateTicketsCmd.Flags().StringVar(&jiraIssueType, "jira-issue-type", "Task", "Jira issue type for new tickets") - CreateTicketsCmd.Flags().StringVar(&jiraSearchLabel, "jira-search-label", "flaky_test", "Jira label to filter existing tickets during search") // Default added here - CreateTicketsCmd.Flags().StringVar(&testDBPath, "test-db-path", localdb.DefaultDBPath(), "Path to the flaky test JSON database") - CreateTicketsCmd.Flags().BoolVar(&skipExisting, "skip-existing", false, "Skip processing rows in TUI if a Jira ticket is already known (from DB or Jira search)") - CreateTicketsCmd.Flags().StringVar(&userMappingPathCT, "user-mapping-path", "user_mapping.json", "Path to the user mapping JSON (JiraUserID -> PillarName)") - CreateTicketsCmd.Flags().StringVar(&userTestMappingPathCT, "user-test-mapping-path", "user_test_mapping.json", "Path to the user test mapping JSON (Pattern -> JiraUserID)") -} - -// ------------------------------------------------------------------------------------- -// Helper Functions (Need implementations or adjustments) -// ------------------------------------------------------------------------------------- - -func readFlakyTestsCSV(path string) ([][]string, error) { - f, err := os.Open(path) - if err != nil { - return nil, fmt.Errorf("failed to open csv file '%s': %w", path, err) - } - defer f.Close() - r := csv.NewReader(f) - records, err := r.ReadAll() - if err != nil { - return nil, fmt.Errorf("failed to read csv data from '%s': %w", path, err) - } - return records, nil -} - -// rowToFlakyTicket: Converts a CSV row to a FlakyTicket model. -func rowToFlakyTicket(row []string) model.FlakyTicket { - // Indices: pkg=0, testName=2, flakeRate=7, logs=9 (as per original code) - const ( - pkgIndex = 0 - nameIndex = 2 - flakeRateIndex = 7 - logsIndex = 9 - ) - - if len(row) <= logsIndex { - log.Error().Int("num_cols", len(row)).Msg("Row has fewer columns than expected in rowToFlakyTicket") - return model.FlakyTicket{Valid: false, InvalidReason: "Incorrect number of columns"} - } - - pkg := strings.TrimSpace(row[pkgIndex]) - testName := strings.TrimSpace(row[nameIndex]) - flakeRateStr := strings.TrimSpace(row[flakeRateIndex]) - logs := strings.TrimSpace(row[logsIndex]) - - t := model.FlakyTicket{ - TestPackage: pkg, - TestName: testName, - Valid: true, - } - - var flakeRate float64 - var parseErr error - if flakeRateStr == "" || flakeRateStr == "%" { - log.Warn().Str("test", testName).Str("package", pkg).Msg("Missing Flake Rate. Defaulting to Low priority.") - t.Priority = "Low" - flakeRateStr = "0" - } else { - // Remove '%' before parsing if necessary - flakeRateValStr := strings.TrimSuffix(flakeRateStr, "%") - flakeRate, parseErr = strconv.ParseFloat(flakeRateValStr, 64) - if parseErr != nil { - log.Error().Err(parseErr).Str("flake_rate", flakeRateStr).Str("test", testName).Msg("Invalid Flake Rate format.") - t.Valid = false - t.InvalidReason = fmt.Sprintf("Invalid Flake Rate: %s", flakeRateStr) - t.Priority = "Low" // Default priority on error - } else { - t.FlakeRate = flakeRate - switch { - case flakeRate < 1.0: - t.Priority = "Low" - case flakeRate < 3.0: - t.Priority = "Medium" - case flakeRate < 5.0: - t.Priority = "High" - default: - t.Priority = "Very High" // >= 5.0 - } - } - } - displayFlakeRate := strings.TrimSuffix(flakeRateStr, "%") - - t.Summary = fmt.Sprintf("Fix Flaky Test: %s (%s%% flake rate)", testName, displayFlakeRate) - - var logSection strings.Builder - if logs == "" { - logSection.WriteString("(Logs not available in source data)") - } else { - runNumber := 1 - hasLinks := false - for _, link := range strings.Split(logs, ",") { - link = strings.TrimSpace(link) - if link == "" { - continue - } - if strings.HasPrefix(link, "http://") || strings.HasPrefix(link, "https://") { - logSection.WriteString(fmt.Sprintf("* [Run %d|%s]\n", runNumber, link)) - hasLinks = true - } else { - logSection.WriteString(fmt.Sprintf("* Run %d Log Info: %s\n", runNumber, link)) - } - runNumber++ - } - if !hasLinks && runNumber == 1 { - logSection.Reset() - logSection.WriteString("(No valid log links found in source data)") - } - } - - pkgDisplay := pkg - if pkgDisplay == "" { - pkgDisplay = "(Package Not Provided)" - } - testNameDisplay := testName - if testNameDisplay == "" { - testNameDisplay = "(Test Name Not Provided)" - } - - t.Description = fmt.Sprintf(`h2. Flaky Test Details -* *Test Package:* %s -* *Test Name:* %s -* *Detected Flake Rate:* %s%% (in monitored period) -* *Priority:* %s - -h3. Recent Failing Test Run Logs -%s - -h3. Action Items -# *Investigate:* Review logs and test code to identify the root cause of the flakiness. -# *Fix:* Implement the necessary code changes or infrastructure adjustments. -# *Verify:* Run the test locally multiple times and monitor in CI to confirm stability. -# *Unskip:* Once confirmed stable, remove any test skip markers to re-enable the test in the CI pipeline. -# *Close Ticket:* Close this ticket once the test is confirmed stable. -# *Guidance:* Refer to the team's [Flaky Test Guide|https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/tools/flakeguard/e2e-flaky-test-guide.md]. -`, - pkgDisplay, - testNameDisplay, - displayFlakeRate, - t.Priority, - logSection.String(), - ) - - var missing []string - if pkg == "" { - missing = append(missing, "Package") - } - if testName == "" { - missing = append(missing, "Test Name") - } - - if t.Valid && len(missing) > 0 { - t.Valid = false - if t.InvalidReason != "" { - t.InvalidReason += "; " - } - t.InvalidReason += fmt.Sprintf("Missing required fields: %s", strings.Join(missing, ", ")) - } - - return t -} - -// findExistingTicket: Searches Jira for a ticket based on label and summary match. -func findExistingTicket(client *jira.Client, label string, ticket model.FlakyTicket) (string, error) { - safeTestName := strings.ReplaceAll(ticket.TestName, `"`, `\"`) - - jql := fmt.Sprintf(`project = "%s" AND labels = "%s" AND summary ~ "\"%s\"" ORDER BY created DESC`, jiraProject, label, safeTestName) - log.Debug().Str("jql", jql).Msg("Executing Jira search JQL") - - issues, resp, err := client.Issue.SearchWithContext(context.Background(), jql, &jira.SearchOptions{MaxResults: 5}) - if err != nil { - errMsg := jirautils.ReadJiraErrorResponse(resp) - log.Error().Err(err).Str("jql", jql).Str("response", errMsg).Msg("Error searching Jira") - return "", fmt.Errorf("error searching Jira: %w (response: %s)", err, errMsg) - } - - if len(issues) == 0 { - log.Debug().Str("testName", ticket.TestName).Str("label", label).Msg("No existing tickets found in Jira via search.") - return "", nil - } - - log.Info().Str("testName", ticket.TestName).Str("foundKey", issues[0].Key).Msg("Found potentially matching ticket in Jira.") - return issues[0].Key, nil -} - -// generateRemainingCSVPath creates a path for the output CSV. -func generateRemainingCSVPath(originalPath string) string { - dir := "" - filename := originalPath - lastSlash := strings.LastIndex(originalPath, "/") - if lastSlash != -1 { - dir = originalPath[:lastSlash+1] - filename = originalPath[lastSlash+1:] - } - // Handle potential extension - ext := "" - lastDot := strings.LastIndex(filename, ".") - if lastDot > 0 { - ext = filename[lastDot:] - filename = filename[:lastDot] - } - return fmt.Sprintf("%s%s_remaining%s", dir, filename, ext) -} - -// writeRemainingCSV writes the tests that were not confirmed/processed successfully. -func writeRemainingCSV(path string, originalRecords [][]string, processedTickets []model.FlakyTicket, processedIndices map[int]bool) error { - f, err := os.Create(path) - if err != nil { - return fmt.Errorf("failed to create remaining CSV file '%s': %w", path, err) - } - defer f.Close() - - w := csv.NewWriter(f) - defer w.Flush() - - // Write header (first row of original records) - if len(originalRecords) > 0 { - if err := w.Write(originalRecords[0]); err != nil { - return fmt.Errorf("failed to write header to remaining CSV '%s': %w", path, err) - } - } - - processedTicketMap := make(map[int]model.FlakyTicket) - for _, t := range processedTickets { - processedTicketMap[t.RowIndex] = t - } - - writtenCount := 0 - for i, originalRow := range originalRecords { - if i == 0 { - continue - } - rowIndex := i + 1 - writeRow := true - - // Check if this row index was processed by the TUI - if _, wasProcessed := processedIndices[rowIndex]; wasProcessed { - if ticket, exists := processedTicketMap[rowIndex]; exists && ticket.Confirmed { - log.Debug().Int("rowIndex", rowIndex).Str("test", ticket.TestName).Msg("Skipping confirmed ticket from remaining CSV output") - writeRow = false // Do not write confirmed rows - } - } else { - log.Debug().Int("rowIndex", rowIndex).Msg("Including unprocessed row in remaining CSV output") - } - - if writeRow { - if err := w.Write(originalRow); err != nil { - log.Error().Err(err).Int("rowIndex", rowIndex).Msg("Failed to write row to remaining CSV") - } else { - writtenCount++ - } - } - } - log.Info().Int("count", writtenCount).Str("path", path).Msg("Wrote remaining/unconfirmed tests to CSV.") - - return w.Error() -} - -// ------------------------------------------------------------------------------------- -// Bubble Tea Model for create-tickets (createModel) -// ------------------------------------------------------------------------------------- - -// createModel holds the state for the create-tickets TUI. -type createModel struct { - tickets []model.FlakyTicket // The filtered list of tickets to process in TUI - index int // Current ticket being viewed - processedIndices map[int]bool // Tracks RowIndex of tickets user interacted with (confirmed, skipped, edited, deleted) - confirmed int // Count of confirmed tickets - skipped int // Count of skipped/existing tickets - quitting bool - DryRun bool - JiraProject string - JiraIssueType string - JiraClient *jira.Client - originalRecords [][]string // Needed for writing remaining CSV - LocalDB *localdb.DB // Use pointer type consistent with RunE - userMap map[string]mapping.UserMapping // For Pillar lookup - mode string // "normal", "promptExisting", "ticketCreated", "confirmDelete" - inputValue string // For prompt mode - infoMessage string // Feedback to user - errorMessage string // Error feedback -} - -func initialCreateModel(tickets []model.FlakyTicket, userMap map[string]mapping.UserMapping) createModel { - idx := 0 - if len(tickets) == 0 { - idx = -1 - } - return createModel{ - tickets: tickets, - index: idx, - processedIndices: make(map[int]bool), - mode: "normal", - userMap: userMap, - } -} - -func (m createModel) Init() tea.Cmd { - return nil -} - -// Main Update routing based on mode -func (m createModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - if m.index == -1 { - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.String() { - case "q", "esc", "ctrl+c": - m.quitting = true - return m, tea.Quit - } - } - return m, nil - } - - // Always handle quit globally, regardless of mode - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - case "ctrl+c": - m.quitting = true - return m, tea.Quit - } - } - - switch m.mode { - case "promptExisting": - return updatePromptExisting(m, msg) - case "ticketCreated": - return updateTicketCreated(m, msg) - case "confirmDelete": - return updateConfirmDelete(m, msg) - case "normal": - fallthrough - default: - return updateNormalMode(m, msg) - } -} - -// updateNormalMode handles keypresses in the default view. -func updateNormalMode(m createModel, msg tea.Msg) (tea.Model, tea.Cmd) { - if m.index >= len(m.tickets) || m.index < 0 { - log.Error().Int("index", m.index).Int("len", len(m.tickets)).Msg("Invalid index in updateNormalMode") - m.quitting = true - return m, tea.Quit - } - - t := &m.tickets[m.index] - - switch msg := msg.(type) { - case tea.KeyMsg: - m.infoMessage = "" - m.errorMessage = "" - - switch msg.String() { - case "q", "esc": - m.quitting = true - return m, tea.Quit - - case "e": // Enter/Edit Existing Ticket ID - m.mode = "promptExisting" - m.inputValue = t.ExistingJiraKey // Pre-fill - return m, nil - - case "d": // Delete existing ticket (transition to confirm) - if t.ExistingJiraKey != "" && m.JiraClient != nil && !m.DryRun { - m.mode = "confirmDelete" - m.errorMessage = fmt.Sprintf("Confirm delete %s? This cannot be undone.", jirautils.GetJiraLink(t.ExistingJiraKey)) - } else if t.ExistingJiraKey == "" { - m.errorMessage = "No Jira ticket associated to delete." - } else if m.DryRun { - m.errorMessage = "Cannot delete tickets in Dry Run mode." - } else { - m.errorMessage = "Cannot delete tickets: Jira client unavailable." - } - return m, nil - - case "c": // Confirm/Create Ticket - if !t.Valid { - m.errorMessage = "Cannot create: Invalid data. Press [n] to skip." - return m, nil - } - if t.ExistingJiraKey != "" { - m.errorMessage = fmt.Sprintf("Cannot create: Ticket %s exists. Press [n] skip/[e] edit.", t.ExistingJiraKey) - return m, nil - } - return updateConfirm(m) - - case "n": // Skip / Next - return updateSkip(m) - - default: // Ignore other keys - return m, nil - } - } - return m, nil -} - -// updatePromptExisting handles the mode where user enters a Jira key. -func updatePromptExisting(m createModel, msg tea.Msg) (tea.Model, tea.Cmd) { - if m.index < 0 || m.index >= len(m.tickets) { - log.Warn().Int("index", m.index).Int("len", len(m.tickets)).Msg("Invalid index in updatePromptExisting") - m.errorMessage = "Internal error: invalid index" - m.mode = "normal" - return m, tea.ClearScreen - } - t := &m.tickets[m.index] - - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.Type { - case tea.KeyEnter: - newKey := strings.TrimSpace(m.inputValue) - if newKey != "" && !regexp.MustCompile(`^[A-Z][A-Z0-9]+-\d+$`).MatchString(newKey) { - m.errorMessage = "Invalid Jira key format (e.g., PROJ-123). Press Esc or Enter empty key to cancel." - m.infoMessage = "" - return m, nil - } - - err := m.LocalDB.UpsertEntry(t.TestPackage, t.TestName, newKey, t.SkippedAt, t.AssigneeId) - if err != nil { - log.Error().Err(err).Str("test", t.TestName).Msg("Failed to update local DB entry from prompt") - m.errorMessage = fmt.Sprintf("Error saving to local DB: %v", err) - m.infoMessage = "" - return m, nil - } - - if newKey == "" { - log.Debug().Str("test", t.TestName).Msg("Cleared Jira association for test.") - t.ExistingJiraKey = "" - t.ExistingTicketSource = "" - } else { - log.Debug().Str("test", t.TestName).Str("newKey", newKey).Msg("Manually set Jira key for test.") - t.ExistingJiraKey = newKey - t.ExistingTicketSource = "manual" - } - - m.processedIndices[t.RowIndex] = true - m.skipped++ - m.mode = "normal" - m.inputValue = "" - m.index++ - if m.index >= len(m.tickets) { - m.quitting = true - } - - m.infoMessage = "" - m.errorMessage = "" - - var cmd tea.Cmd - if m.quitting { - cmd = tea.Quit - } else { - cmd = tea.ClearScreen - } - return m, cmd - - case tea.KeyEsc: // Cancel prompt - m.mode = "normal" - m.inputValue = "" - m.errorMessage = "" - m.infoMessage = "Edit cancelled." - return m, tea.ClearScreen - - case tea.KeyBackspace: - if len(m.inputValue) > 0 { - m.inputValue = m.inputValue[:len(m.inputValue)-1] - } - return m, nil - - case tea.KeyRunes: - if !strings.ContainsAny(string(msg.Runes), "\n\t\r") { - m.inputValue += string(msg.Runes) - } - return m, nil - } - } - - return m, nil -} - -// updateConfirm handles the 'c' key press: creates ticket and changes mode. -func updateConfirm(m createModel) (tea.Model, tea.Cmd) { - i := m.index - t := &m.tickets[i] - - if !t.Valid || t.ExistingJiraKey != "" { - m.errorMessage = "Cannot create ticket (invalid or already exists)." - m.mode = "normal" - return m, nil - } - - m.processedIndices[t.RowIndex] = true - - pillarName := "" - assigneeForJira := "" - if t.AssigneeId != "" { - assigneeForJira = t.AssigneeId - if userMapping, exists := m.userMap[t.AssigneeId]; exists { - pillarName = userMapping.PillarName - } else { - log.Warn().Str("assignee", t.AssigneeId).Msg("Assignee ID present but no matching entry in user_mapping.json found.") - } - } - - // Create Jira ticket - if !m.DryRun && m.JiraClient != nil { - log.Info().Str("summary", t.Summary).Str("project", m.JiraProject).Str("assignee", assigneeForJira).Str("pillar", pillarName).Msg("Attempting to create Jira ticket...") - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - issueKey, err := jirautils.CreateTicketInJira( - ctx, - m.JiraClient, - t.Summary, - t.Description, - m.JiraProject, - m.JiraIssueType, - assigneeForJira, - t.Priority, - t.RelatedJiraTickets, - []string{}, - pillarName, - ) - - if err != nil { - errMsg := fmt.Sprintf("Failed to create Jira ticket for %q", t.Summary) - log.Error().Err(err).Msg(errMsg) - m.errorMessage = fmt.Sprintf("%s: %v", errMsg, err) - m.mode = "normal" - m.infoMessage = "" - return m, tea.ClearScreen - } - log.Info().Str("key", issueKey).Str("summary", t.Summary).Msg("Successfully created Jira ticket") - t.Confirmed = true - t.ExistingJiraKey = issueKey - t.ExistingTicketSource = "jira-created" - errDb := m.LocalDB.UpsertEntry(t.TestPackage, t.TestName, issueKey, t.SkippedAt, t.AssigneeId) - if errDb != nil { - log.Error().Err(errDb).Str("key", issueKey).Msg("Failed to update local DB after Jira creation!") - m.errorMessage = "WARN: Jira ticket created but failed to update local DB!" - } - m.confirmed++ - m.mode = "ticketCreated" - m.errorMessage = "" - m.infoMessage = "" - return m, tea.ClearScreen - } else { - // --- Dry Run or No Client Case --- - t.Confirmed = true - t.ExistingJiraKey = "DRYRUN-" + strconv.Itoa(1000+i) - t.ExistingTicketSource = "dryrun-created" - m.confirmed++ - m.mode = "ticketCreated" - m.errorMessage = "" - m.infoMessage = "" - return m, tea.ClearScreen - } -} - -// updateTicketCreated handles the confirmation screen after a ticket is made. -func updateTicketCreated(m createModel, msg tea.Msg) (tea.Model, tea.Cmd) { - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.String() { - case "q", "esc", "ctrl+c": - m.quitting = true - return m, tea.Quit - default: - m.mode = "normal" - m.index++ - if m.index >= len(m.tickets) { - m.quitting = true - } - m.infoMessage = "" - m.errorMessage = "" - - var cmd tea.Cmd - if m.quitting { - cmd = tea.Quit - } else { - cmd = tea.ClearScreen - } - return m, cmd - } - } - return m, nil -} - -// updateSkip handles the 'n' key press: increments skip count and advances. -func updateSkip(m createModel) (tea.Model, tea.Cmd) { - if m.index < 0 || m.index >= len(m.tickets) { - log.Warn().Int("index", m.index).Int("len", len(m.tickets)).Msg("Invalid index in updateSkip") - m.errorMessage = "Internal error: invalid index" - return m, nil - } - - t := &m.tickets[m.index] - m.processedIndices[t.RowIndex] = true - - m.skipped++ - m.index++ - m.errorMessage = "" - m.infoMessage = "" - - if m.index >= len(m.tickets) { - m.quitting = true - return m, tea.Quit - } - return m, nil -} - -// updateConfirmDelete handles the confirmation prompt for deleting a ticket. -func updateConfirmDelete(m createModel, msg tea.Msg) (tea.Model, tea.Cmd) { - if m.index < 0 || m.index >= len(m.tickets) { - m.mode = "normal" - return m, tea.ClearScreen - } - t := &m.tickets[m.index] // Use pointer - - switch msg := msg.(type) { - case tea.KeyMsg: - switch strings.ToLower(msg.String()) { - case "y": // Yes, delete the ticket - originalKey := t.ExistingJiraKey - m.infoMessage = fmt.Sprintf("Attempting to delete Jira ticket %s...", originalKey) - m.errorMessage = "" - - err := jirautils.DeleteTicketInJira(m.JiraClient, originalKey) - - if err != nil { - errMsg := fmt.Sprintf("Failed to delete Jira ticket %s", originalKey) - log.Error().Err(err).Str("key", originalKey).Msg(errMsg) - m.errorMessage = fmt.Sprintf("%s: %v", errMsg, err) - m.infoMessage = "" - } else { - log.Info().Str("key", originalKey).Msg("Successfully deleted Jira ticket") - m.infoMessage = fmt.Sprintf("Deleted Jira ticket %s.", originalKey) - t.ExistingJiraKey = "" - t.ExistingTicketSource = "" - errDb := m.LocalDB.UpsertEntry(t.TestPackage, t.TestName, "", t.SkippedAt, t.AssigneeId) - if errDb != nil { - log.Error().Err(errDb).Str("test", t.TestName).Msg("Failed to update local DB after deleting Jira key") - m.errorMessage = fmt.Sprintf("WARN: Jira ticket deleted but failed to update local DB! Error: %v", errDb) - } - m.processedIndices[t.RowIndex] = true - } - m.mode = "normal" - return m, tea.ClearScreen - - case "n", "esc": - m.infoMessage = "Delete cancelled." - m.errorMessage = "" - m.mode = "normal" - return m, tea.ClearScreen - - default: - return m, nil - } - } - return m, nil -} - -// View logic for create-tickets TUI -func (m createModel) View() string { - // Handle quitting state - if m.quitting { - return "Processing complete. Exiting...\n" - } - - // Handle empty state - if m.index == -1 || len(m.tickets) == 0 { - return "No tickets to process.\n\n[q] quit\n" - } - - // Handle potential out-of-bounds index defensively - if m.index >= len(m.tickets) { - return "Processing complete. Exiting...\n" - } - - // Render based on current mode - switch m.mode { - case "ticketCreated": - return viewTicketCreated(m) - case "promptExisting": - return viewPromptExisting(m) - case "confirmDelete": - return viewConfirmDelete(m) - case "normal": - fallthrough - default: - return viewNormal(m) - } -} - -// viewNormal renders the main ticket display. -func viewNormal(m createModel) string { - t := m.tickets[m.index] // Get current ticket - - // --- Styles --- - bodyStyle := lipgloss.NewStyle().PaddingBottom(1) - headerStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("63")).PaddingBottom(1) // Purple - labelStyle := lipgloss.NewStyle().Bold(true).Width(15).Foreground(lipgloss.Color("39")) // Blue - valueStyle := lipgloss.NewStyle() - summaryStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("10")) // Green (for summary label) - descHeaderStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("11")) // Yellow (for desc label) - descBodyStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("248")).PaddingLeft(2) // Light grey, indented - faintStyle := lipgloss.NewStyle().Faint(true) - errorStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("196")) // Red - warningStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("208")) // Orange - existingStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("40")).Bold(true) // Green Bold (for existing key) - dryRunStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("208")).Background(lipgloss.Color("235")).Padding(0, 1) - helpStyle := lipgloss.NewStyle().Faint(true).PaddingTop(1) - infoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("81")) // Cyan/Blueish (for info messages) - - // --- Build View --- - var sb strings.Builder - - // Dry Run Banner - if m.DryRun { - sb.WriteString(dryRunStyle.Render("DRY RUN MODE") + "\n\n") - } - - // Error Message Area (Top) - if m.errorMessage != "" { - sb.WriteString(errorStyle.Render("Error: "+m.errorMessage) + "\n\n") - } - // Info Message Area (Top, below error) - if m.infoMessage != "" { - sb.WriteString(infoStyle.Render(m.infoMessage) + "\n\n") - } - - // Header - validStatus := "" - if !t.Valid { - validStatus = errorStyle.Render(" (Invalid Data!)") - } - sb.WriteString(headerStyle.Render(fmt.Sprintf("Review Ticket [%d / %d]%s", m.index+1, len(m.tickets), validStatus))) - sb.WriteString("\n") - - // Details Section - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Test Name:"), valueStyle.Render(t.TestName))) - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Package:"), valueStyle.Render(t.TestPackage))) - - // Priority - priorityVal := t.Priority - if priorityVal == "" { - priorityVal = "(Not Set)" - } - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Priority:"), valueStyle.Render(priorityVal))) - - // Assignee & Pillar - assigneeVal := "-" - pillarVal := "-" - if t.AssigneeId != "" { - assigneeVal = t.AssigneeId - if t.MissingUserMapping { - assigneeVal += warningStyle.Render(" (Mapping Missing!)") - pillarVal = warningStyle.Render("(Mapping Missing!)") - } else if userMapEntry, exists := m.userMap[t.AssigneeId]; exists { - pillarVal = userMapEntry.PillarName - if pillarVal == "" { - pillarVal = "(Pillar Not Set in Map)" - } - } else { - pillarVal = errorStyle.Render("(Error: Map Lookup Failed)") - } - } else { - assigneeVal = faintStyle.Render("(Not Assigned)") - pillarVal = faintStyle.Render("(N/A - No Assignee)") - } - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Assigned To:"), valueStyle.Render(assigneeVal))) - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Pillar Name:"), valueStyle.Render(pillarVal))) - - // Existing Jira Key - existingLine := faintStyle.Render("(None Found)") - if t.ExistingJiraKey != "" { - sourceInfo := "" - if t.ExistingTicketSource != "" { - sourceInfo = fmt.Sprintf(" (from %s)", t.ExistingTicketSource) - } - link := jirautils.GetJiraLink(t.ExistingJiraKey) - existingLine = existingStyle.Render(fmt.Sprintf("%s%s", link, sourceInfo)) - } - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Existing Jira:"), existingLine)) - - // Summary & Description (Collapsible or truncated?) - sb.WriteString("\n") - sb.WriteString(summaryStyle.Render("Proposed Summary:") + "\n") - sb.WriteString(valueStyle.Render(t.Summary) + "\n\n") - - sb.WriteString(descHeaderStyle.Render("Proposed Description:") + "\n") - sb.WriteString(descBodyStyle.Render(t.Description) + "\n") - - if len(t.RelatedJiraTickets) > 0 { - sb.WriteString(descHeaderStyle.Render("Related Jira Tickets:") + "\n") - sb.WriteString(descBodyStyle.Render(strings.Join(t.RelatedJiraTickets, ", ")) + "\n") - } - - // Help Line / Actions - sb.WriteString(helpStyle.Render(buildHelpLine(m))) - - return bodyStyle.Render(sb.String()) -} - -// viewTicketCreated renders the confirmation screen after creating a ticket. -func viewTicketCreated(m createModel) string { - if m.index < 0 || m.index >= len(m.tickets) { - return "Error: Invalid index for ticket confirmation.\n" - } - t := m.tickets[m.index] - ticketStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("82")).Bold(true) // Green Bold - urlStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("39")).Underline(true) // Blue Underline - helpStyle := lipgloss.NewStyle().Faint(true).PaddingTop(1) - labelStyle := lipgloss.NewStyle().Width(10) - - var sb strings.Builder - - sb.WriteString(ticketStyle.Render("Ticket processed successfully!")) - sb.WriteString("\n\n") - sb.WriteString(fmt.Sprintf("%s%s\n", labelStyle.Render("Summary:"), t.Summary)) - sb.WriteString(fmt.Sprintf("%s%s\n", labelStyle.Render("Jira Key:"), urlStyle.Render(jirautils.GetJiraLink(t.ExistingJiraKey)))) - if t.AssigneeId != "" { - sb.WriteString(fmt.Sprintf("%s%s\n", labelStyle.Render("Assignee:"), t.AssigneeId)) - } - if pillar, ok := m.userMap[t.AssigneeId]; ok && pillar.PillarName != "" { - sb.WriteString(fmt.Sprintf("%s%s\n", labelStyle.Render("Pillar:"), pillar.PillarName)) - } else if t.AssigneeId != "" { - sb.WriteString(fmt.Sprintf("%s%s\n", labelStyle.Render("Pillar:"), "(Not Set)")) - } - - sb.WriteString(helpStyle.Render("\nPress any key to continue to the next test, or [q] to quit.")) - - return sb.String() -} - -// viewPromptExisting renders the input prompt for the Jira key. -func viewPromptExisting(m createModel) string { - if m.index < 0 || m.index >= len(m.tickets) { - return "Error: Invalid index for prompt.\n" - } - t := m.tickets[m.index] - promptStyle := lipgloss.NewStyle().Bold(true) - inputStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("82")).BorderStyle(lipgloss.NormalBorder()).Padding(0, 1).Width(40) // Added width - helpStyle := lipgloss.NewStyle().Faint(true).PaddingTop(1) - errorStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("196")).PaddingBottom(1) // Red - - var sb strings.Builder - - if m.errorMessage != "" { - sb.WriteString(errorStyle.Render("Error: "+m.errorMessage) + "\n") - } - - sb.WriteString(promptStyle.Render(fmt.Sprintf("Enter existing Jira Key for: %s", t.TestName))) - sb.WriteString("\n\n") - sb.WriteString(inputStyle.Render(m.inputValue + "_")) // Show cursor - sb.WriteString("\n") - sb.WriteString(helpStyle.Render("(Press Enter to confirm, Esc to cancel)")) - - return sb.String() -} - -// viewConfirmDelete renders the 'Are you sure?' prompt for deletion. -func viewConfirmDelete(m createModel) string { - if m.index < 0 || m.index >= len(m.tickets) { - return "Error: Invalid index for delete confirmation.\n" - } - t := m.tickets[m.index] - promptStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("196")) // Red Bold - warningStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("208")).PaddingBottom(1) // Orange warning - helpStyle := lipgloss.NewStyle().Faint(true).PaddingTop(1) - - var sb strings.Builder - - sb.WriteString(promptStyle.Render(fmt.Sprintf("Permanently delete Jira ticket %s associated with test %s?", t.ExistingJiraKey, t.TestName))) - sb.WriteString("\n\n") - if m.errorMessage != "" { - sb.WriteString(warningStyle.Render(m.errorMessage) + "\n") - } - - sb.WriteString(helpStyle.Render("[y] Yes, delete ticket | [n/esc] No, cancel")) - - return sb.String() -} - -// buildHelpLine generates the dynamic help text based on the ticket state. -func buildHelpLine(m createModel) string { - if m.index < 0 || m.index >= len(m.tickets) { - return "[q] Quit" - } - t := m.tickets[m.index] - var actions []string - - if t.Valid && t.ExistingJiraKey == "" { - createLabel := "[c] Create" - if m.DryRun || m.JiraClient == nil { - createLabel += " (DryRun/Offline)" - } - actions = append(actions, createLabel) - } - - actions = append(actions, "[n] Skip") - actions = append(actions, "[e] Edit/Set Key") - - if t.ExistingJiraKey != "" && !m.DryRun && m.JiraClient != nil { - actions = append(actions, lipgloss.NewStyle().Foreground(lipgloss.Color("196")).Render("[d] Delete Key")) // Red 'd' - } - - actions = append(actions, "[q] Quit") - - return "Actions: " + strings.Join(actions, " | ") -} diff --git a/tools/flakeguard/cmd/find.go b/tools/flakeguard/cmd/find.go deleted file mode 100644 index 5a1b5ee0c..000000000 --- a/tools/flakeguard/cmd/find.go +++ /dev/null @@ -1,173 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "os" - - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/git" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/golang" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/utils" - "github.com/spf13/cobra" -) - -var FindTestsCmd = &cobra.Command{ - Use: "find", - Long: "Analyzes Golang project repository for changed files against a specified base reference and determines the test packages that are potentially impacted", - Short: "Find test packages that may be affected by changes", - Run: func(cmd *cobra.Command, args []string) { - projectPath, _ := cmd.Flags().GetString("project-path") - verbose, _ := cmd.Flags().GetBool("verbose") - jsonOutput, _ := cmd.Flags().GetBool("json") - filterEmptyTests, _ := cmd.Flags().GetBool("filter-empty-tests") - baseRef, _ := cmd.Flags().GetString("base-ref") - excludes, _ := cmd.Flags().GetStringSlice("excludes") - levels, _ := cmd.Flags().GetInt("levels") - findByTestFilesDiff, _ := cmd.Flags().GetBool("find-by-test-files-diff") - findByAffected, _ := cmd.Flags().GetBool("find-by-affected-packages") - onlyShowChangedTestFiles, _ := cmd.Flags().GetBool("only-show-changed-test-files") - - // Find all changes in test files and get their package names - var changedTestPkgs []string - if findByTestFilesDiff { - changedTestFiles, err := git.FindChangedFiles(projectPath, baseRef, "grep '_test\\.go$'") - if err != nil { - log.Error().Err(err).Msg("Error finding changed test files") - os.Exit(ErrorExitCode) - } - if onlyShowChangedTestFiles { - outputResults(changedTestFiles, jsonOutput) - return - } - if verbose { - log.Debug().Strs("files", changedTestFiles).Msg("Found changed test files") - } - changedTestPkgs, err = golang.GetFilePackages(changedTestFiles) - if err != nil { - log.Error().Err(err).Msg("Error getting package names for test files") - os.Exit(ErrorExitCode) - } - } - - // Find all affected test packages - var affectedTestPkgs []string - if findByAffected { - if verbose { - log.Debug().Msg("Finding affected packages...") - } - affectedTestPkgs = findAffectedPackages(baseRef, projectPath, excludes, levels) - } - - // Combine and deduplicate test package names - testPkgs := append(changedTestPkgs, affectedTestPkgs...) - testPkgs = utils.Deduplicate(testPkgs) - - // Filter out packages that do not have tests - if filterEmptyTests { - if verbose { - log.Debug().Msg("Filtering packages without tests...") - } - testPkgs = golang.FilterPackagesWithTests(testPkgs) - } - - outputResults(testPkgs, jsonOutput) - }, -} - -func init() { - FindTestsCmd.Flags().StringP("project-path", "r", ".", "The path to the Go project. Default is the current directory. Useful for subprojects.") - FindTestsCmd.Flags().String("base-ref", "", "Git base reference (branch, tag, commit) for comparing changes. Required.") - FindTestsCmd.Flags().BoolP("verbose", "v", false, "Enable verbose mode") - FindTestsCmd.Flags().Bool("json", false, "Output the results in JSON format") - FindTestsCmd.Flags().Bool("filter-empty-tests", false, "Filter out test packages with no actual test functions. Can be very slow for large projects.") - FindTestsCmd.Flags().StringSlice("excludes", []string{}, "List of paths to exclude. Useful for repositories with multiple Go projects within.") - FindTestsCmd.Flags().IntP("levels", "l", 2, "The number of levels of recursion to search for affected packages. Default is 2. 0 is unlimited.") - FindTestsCmd.Flags().Bool("find-by-test-files-diff", true, "Enable the mode to find test packages by changes in test files.") - FindTestsCmd.Flags().Bool("find-by-affected-packages", true, "Enable the mode to find test packages that may be affected by changes in any of the project packages.") - FindTestsCmd.Flags().Bool("only-show-changed-test-files", false, "Only show the changed test files and exit") - - if err := FindTestsCmd.MarkFlagRequired("base-ref"); err != nil { - log.Error().Err(err).Msg("Error marking base-ref as required") - os.Exit(ErrorExitCode) - } -} - -func findAffectedPackages(baseRef, projectPath string, excludes []string, levels int) []string { - gitDiff, err := git.Diff(baseRef) - if err != nil { - log.Error().Err(err).Msg("Error getting the git diff") - os.Exit(ErrorExitCode) - } - gitModDiff, err := git.ModDiff(baseRef, projectPath) - if err != nil { - log.Error().Err(err).Msg("Error getting the git mod diff") - os.Exit(ErrorExitCode) - } - - packages, err := golang.Packages(projectPath) - if err != nil { - log.Error().Err(err).Msg("Error parsing packages") - os.Exit(ErrorExitCode) - } - - fileMap := golang.GetGoFileMap(packages, true) - - var changedPackages []string - changedPackages, err = git.GetChangedGoPackagesFromDiff(gitDiff.Stdout, projectPath, excludes, fileMap) - if err != nil { - log.Error().Err(err).Msg("Error getting changed packages") - os.Exit(ErrorExitCode) - } - - changedModPackages, err := git.GetGoModChangesFromDiff(gitModDiff.Stdout) - if err != nil { - log.Error().Err(err).Msg("Error getting go.mod changes") - os.Exit(ErrorExitCode) - } - - depMap := golang.GetGoDepMap(packages) - - // Find affected packages - // use map to make handling duplicates simpler - affectedPkgs := map[string]bool{} - - // loop through packages changed via file changes - for _, pkg := range changedPackages { - p := golang.FindAffectedPackages(pkg, depMap, false, levels) - for _, p := range p { - affectedPkgs[p] = true - } - } - - // loop through packages changed via go.mod changes - for _, pkg := range changedModPackages { - p := golang.FindAffectedPackages(pkg, depMap, true, levels) - for _, p := range p { - affectedPkgs[p] = true - } - } - - // convert map to array - pkgs := []string{} - for k := range affectedPkgs { - pkgs = append(pkgs, k) - } - - return pkgs -} - -func outputResults(packages []string, jsonOutput bool) { - if jsonOutput { - data, err := json.Marshal(packages) - if err != nil { - log.Error().Err(err).Msg("Error marshaling test packages to JSON") - os.Exit(ErrorExitCode) - } - log.Debug().Str("output", string(data)).Msg("JSON") - } else { - for _, pkg := range packages { - fmt.Print(pkg, " ") - } - } -} diff --git a/tools/flakeguard/cmd/generate_github_report.go b/tools/flakeguard/cmd/generate_github_report.go deleted file mode 100644 index f99f0174d..000000000 --- a/tools/flakeguard/cmd/generate_github_report.go +++ /dev/null @@ -1,197 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/spf13/cobra" -) - -var GenerateReportCmd = &cobra.Command{ - Use: "generate-github-report", - Short: "Generate Github reports from Flakeguard test report", - Run: func(cmd *cobra.Command, args []string) { - fs := reports.OSFileSystem{} - - // Get flag values - flakeguardReportPath, _ := cmd.Flags().GetString("flakeguard-report") - summaryReportPath, _ := cmd.Flags().GetString("summary-report-md-path") - prCommentPath, _ := cmd.Flags().GetString("pr-comment-md-path") - maxPassRatio, _ := cmd.Flags().GetFloat64("max-pass-ratio") - failedLogsURL, _ := cmd.Flags().GetString("failed-logs-url") - - failedLogsArtifactName := "failed-test-results-with-logs.json" - - // Load the test report from file - testReport := &reports.TestReport{} - reportFile, err := os.Open(flakeguardReportPath) - if err != nil { - fmt.Println() - log.Error().Err(err).Msg("Error opening aggregated test report") - os.Exit(ErrorExitCode) - } - defer reportFile.Close() - - if err := json.NewDecoder(reportFile).Decode(testReport); err != nil { - fmt.Println() - log.Error().Err(err).Msg("Error decoding aggregated test report") - os.Exit(ErrorExitCode) - } - fmt.Println() - log.Info().Msg("Successfully loaded aggregated test report") - - // Create directory for summary markdown if needed - summaryDir := filepath.Dir(summaryReportPath) - if err := fs.MkdirAll(summaryDir, 0755); err != nil { - log.Error().Err(err).Msg("Error creating directory for summary report markdown") - os.Exit(ErrorExitCode) - } - - // Generate GitHub summary markdown - err = generateGitHubSummaryMarkdown(*testReport, summaryReportPath, failedLogsURL, failedLogsArtifactName) - if err != nil { - fmt.Println() - log.Error().Err(err).Msg("Error generating GitHub summary markdown") - os.Exit(ErrorExitCode) - } - fmt.Println() - log.Info(). - Str("path", summaryReportPath). - Msg("GitHub summary markdown generated successfully") - - // Generate PR comment markdown if prCommentPath is provided - if prCommentPath != "" { - // Retrieve required flags for PR comment - currentBranch, _ := cmd.Flags().GetString("current-branch") - currentCommitSHA, _ := cmd.Flags().GetString("current-commit-sha") - baseBranch, _ := cmd.Flags().GetString("base-branch") - repoURL, _ := cmd.Flags().GetString("repo-url") - actionRunID, _ := cmd.Flags().GetString("action-run-id") - - // Validate that required flags are provided - missingFlags := []string{} - if currentBranch == "" { - missingFlags = append(missingFlags, "--current-branch") - } - if currentCommitSHA == "" { - missingFlags = append(missingFlags, "--current-commit-sha") - } - if repoURL == "" { - missingFlags = append(missingFlags, "--repo-url") - } - if actionRunID == "" { - missingFlags = append(missingFlags, "--action-run-id") - } - if len(missingFlags) > 0 { - log.Error().Strs("missing flags", missingFlags).Msg("Not all required flags are provided for PR comment generation") - os.Exit(ErrorExitCode) - } - - // Create directory for PR comment markdown if needed - prCommentDir := filepath.Dir(prCommentPath) - if err := fs.MkdirAll(prCommentDir, 0755); err != nil { - log.Error().Err(err).Msg("Error creating directory for PR comment markdown") - os.Exit(ErrorExitCode) - } - - err = generatePRCommentMarkdown( - *testReport, - prCommentPath, - baseBranch, - currentBranch, - currentCommitSHA, - repoURL, - actionRunID, - failedLogsArtifactName, - failedLogsURL, - maxPassRatio, - ) - if err != nil { - fmt.Println() - log.Error().Err(err).Msg("Error generating PR comment markdown") - os.Exit(ErrorExitCode) - } - fmt.Println() - log.Info(). - Str("path", prCommentPath). - Msg("PR comment markdown generated successfully") - } - }, -} - -func init() { - GenerateReportCmd.Flags().StringP("flakeguard-report", "i", "", "Path to the flakeguard test report JSON file (required)") - GenerateReportCmd.Flags().String("summary-report-md-path", "", "Path to output the generated summary markdown file (required)") - GenerateReportCmd.Flags().String("pr-comment-md-path", "", "Path to output the generated PR comment markdown file (optional)") - GenerateReportCmd.Flags().Float64P("max-pass-ratio", "", 1.0, "The maximum pass ratio threshold for a test to be considered flaky") - GenerateReportCmd.Flags().String("base-branch", "develop", "The base branch to compare against (used in PR comment)") - GenerateReportCmd.Flags().String("current-branch", "", "The current branch name (required if pr-comment-md-path is provided)") - GenerateReportCmd.Flags().String("current-commit-sha", "", "The current commit SHA (required if pr-comment-md-path is provided)") - GenerateReportCmd.Flags().String("repo-url", "", "The repository URL (required if pr-comment-md-path is provided)") - GenerateReportCmd.Flags().String("action-run-id", "", "The GitHub Actions run ID (required if pr-comment-md-path is provided)") - GenerateReportCmd.Flags().String("github-repository", "", "The GitHub repository in the format owner/repo (required)") - GenerateReportCmd.Flags().Int64("github-run-id", 0, "The GitHub Actions run ID (required)") - GenerateReportCmd.Flags().String("failed-logs-url", "", "Optional URL linking to additional logs for failed tests") - - if err := GenerateReportCmd.MarkFlagRequired("flakeguard-report"); err != nil { - log.Error().Err(err).Msg("Error marking flag as required") - os.Exit(ErrorExitCode) - } - if err := GenerateReportCmd.MarkFlagRequired("summary-report-md-path"); err != nil { - log.Error().Err(err).Msg("Error marking flag as required") - os.Exit(ErrorExitCode) - } -} - -func generateGitHubSummaryMarkdown(report reports.TestReport, outputPath, artifactLink, artifactName string) error { - fs := reports.OSFileSystem{} - mdFile, err := fs.Create(outputPath) - if err != nil { - return fmt.Errorf("error creating GitHub summary markdown file: %w", err) - } - defer mdFile.Close() - - // Generate the summary markdown - reports.GenerateGitHubSummaryMarkdown(mdFile, report, 1.0, artifactName, artifactLink) - - return nil -} - -func generatePRCommentMarkdown( - report reports.TestReport, - outputPath, - baseBranch, - currentBranch, - currentCommitSHA, - repoURL, - actionRunID, - artifactName, - artifactLink string, - maxPassRatio float64, -) error { - fs := reports.OSFileSystem{} - mdFile, err := fs.Create(outputPath) - if err != nil { - return fmt.Errorf("error creating PR comment markdown file: %w", err) - } - defer mdFile.Close() - - reports.GeneratePRCommentMarkdown( - mdFile, - report, - maxPassRatio, - baseBranch, - currentBranch, - currentCommitSHA, - repoURL, - actionRunID, - artifactName, - artifactLink, - ) - - return nil -} diff --git a/tools/flakeguard/cmd/generate_test_report.go b/tools/flakeguard/cmd/generate_test_report.go deleted file mode 100644 index d7ad53a94..000000000 --- a/tools/flakeguard/cmd/generate_test_report.go +++ /dev/null @@ -1,232 +0,0 @@ -package cmd - -import ( - "fmt" - "os" - "path/filepath" - "time" - - "github.com/briandowns/spinner" - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/utils" - "github.com/spf13/cobra" -) - -var GenerateTestReportCmd = &cobra.Command{ - Use: "generate-test-report", - Short: "Generate test report based on test results", - Run: func(cmd *cobra.Command, args []string) { - fs := reports.OSFileSystem{} - - // Get flag values - testResultsDir, _ := cmd.Flags().GetString("test-results-dir") - outputDir, _ := cmd.Flags().GetString("output-path") - maxPassRatio, _ := cmd.Flags().GetFloat64("max-pass-ratio") - projectPath, _ := cmd.Flags().GetString("project-path") - repoPath, _ := cmd.Flags().GetString("repo-path") - codeOwnersPath, _ := cmd.Flags().GetString("codeowners-path") - useRace, _ := cmd.Flags().GetBool("race") - repoURL, _ := cmd.Flags().GetString("repo-url") - branchName, _ := cmd.Flags().GetString("branch-name") - headSHA, _ := cmd.Flags().GetString("head-sha") - baseSHA, _ := cmd.Flags().GetString("base-sha") - githubWorkflowName, _ := cmd.Flags().GetString("github-workflow-name") - githubWorkflowRunURL, _ := cmd.Flags().GetString("github-workflow-run-url") - reportID, _ := cmd.Flags().GetString("report-id") - rerunOfReportID, _ := cmd.Flags().GetString("rerun-of-report-id") - genReportID, _ := cmd.Flags().GetBool("gen-report-id") - - goProject, err := utils.GetGoProjectName(projectPath) - if err != nil { - log.Warn().Err(err).Str("projectPath", goProject).Msg("Failed to get pretty project path") - } - - initialDirSize, err := getDirSize(testResultsDir) - if err != nil { - log.Error().Err(err).Str("path", testResultsDir).Msg("Error getting initial directory size") - // intentionally don't exit here, as we can still proceed with the aggregation - } - - // Ensure the output directory exists - if err := fs.MkdirAll(outputDir, 0755); err != nil { - log.Error().Err(err).Str("path", outputDir).Msg("Error creating output directory") - os.Exit(ErrorExitCode) - } - - // Start spinner for loading test results - s := spinner.New(spinner.CharSets[11], 100*time.Millisecond) - s.Suffix = " Aggregating test results..." - s.Start() - fmt.Println() - - // Load test results from JSON files and aggregate them - aggregatedResults, err := reports.LoadAndAggregate(testResultsDir) - if err != nil { - s.Stop() - log.Error().Err(err).Stack().Msg("Error aggregating test results") - os.Exit(ErrorExitCode) - } - s.Stop() - log.Debug().Msg("Successfully loaded and aggregated test results") - - // Start spinner for mapping test results to paths - s = spinner.New(spinner.CharSets[11], 100*time.Millisecond) - s.Suffix = " Filter failed tests..." - s.Start() - - failedTests := reports.FilterTests(aggregatedResults, func(tr reports.TestResult) bool { - return !tr.Skipped && tr.PassRatio < maxPassRatio - }) - s.Stop() - - // Check if there are any failed tests - if len(failedTests) > 0 { - log.Info().Int("count", len(failedTests)).Msg("Found failed tests") - - // Create a new report for failed tests with logs - failedReportWithLogs, err := reports.NewTestReport(failedTests, - reports.WithGoProject(goProject), - reports.WithProjectPath(projectPath), - reports.WithRepoPath(repoPath), - reports.WithCodeOwnersPath(codeOwnersPath), - reports.WithRerunOfReportID(rerunOfReportID), - reports.WithReportID(reportID), - reports.WithGeneratedReportID(genReportID), - reports.WithGoRaceDetection(useRace), - reports.WithBranchName(branchName), - reports.WithBaseSha(baseSHA), - reports.WithHeadSha(headSHA), - reports.WithRepoURL(repoURL), - reports.WithGitHubWorkflowName(githubWorkflowName), - reports.WithGitHubWorkflowRunURL(githubWorkflowRunURL), - ) - if err != nil { - log.Error().Stack().Err(err).Msg("Error creating failed tests report with logs") - os.Exit(ErrorExitCode) - } - - // Save the failed tests report with logs - failedTestsReportWithLogsPath := filepath.Join(outputDir, "failed-test-report-with-logs.json") - if err := reports.SaveReport(fs, failedTestsReportWithLogsPath, failedReportWithLogs); err != nil { - log.Error().Stack().Err(err).Msg("Error saving failed tests report with logs") - os.Exit(ErrorExitCode) - } - log.Info().Str("path", failedTestsReportWithLogsPath).Msg("Failed tests report with logs saved") - - // Remove logs from test results for the report without logs - for i := range failedReportWithLogs.Results { - failedReportWithLogs.Results[i].PassedOutputs = nil - failedReportWithLogs.Results[i].FailedOutputs = nil - failedReportWithLogs.Results[i].PackageOutputs = nil - } - - // Save the failed tests report without logs - failedTestsReportNoLogsPath := filepath.Join(outputDir, "failed-test-report.json") - if err := reports.SaveReport(fs, failedTestsReportNoLogsPath, failedReportWithLogs); err != nil { - log.Error().Stack().Err(err).Msg("Error saving failed tests report without logs") - os.Exit(ErrorExitCode) - } - log.Info().Str("path", failedTestsReportNoLogsPath).Msg("Failed tests report without logs saved") - } else { - log.Info().Msg("No failed tests found. Skipping generation of failed tests reports") - } - - // Remove logs from test results for the aggregated report - for i := range aggregatedResults { - aggregatedResults[i].PassedOutputs = nil - aggregatedResults[i].FailedOutputs = nil - aggregatedResults[i].PackageOutputs = nil - } - - aggregatedReport, err := reports.NewTestReport(aggregatedResults, - reports.WithGoProject(goProject), - reports.WithProjectPath(projectPath), - reports.WithRepoPath(repoPath), - reports.WithCodeOwnersPath(codeOwnersPath), - reports.WithRerunOfReportID(rerunOfReportID), - reports.WithReportID(reportID), - reports.WithGeneratedReportID(genReportID), - reports.WithGoRaceDetection(useRace), - reports.WithBranchName(branchName), - reports.WithBaseSha(baseSHA), - reports.WithHeadSha(headSHA), - reports.WithRepoURL(repoURL), - reports.WithGitHubWorkflowName(githubWorkflowName), - reports.WithGitHubWorkflowRunURL(githubWorkflowRunURL), - ) - if err != nil { - log.Error().Stack().Err(err).Msg("Error creating aggregated test report") - os.Exit(ErrorExitCode) - } - - // Save the aggregated report to the output directory - aggregatedReportPath := filepath.Join(outputDir, "all-test-report.json") - if err := reports.SaveReport(fs, aggregatedReportPath, aggregatedReport); err != nil { - log.Error().Stack().Err(err).Msg("Error saving aggregated test report") - os.Exit(ErrorExitCode) - } - log.Info().Str("path", aggregatedReportPath).Msg("All tests report without logs saved") - - finalDirSize, err := getDirSize(testResultsDir) - if err != nil { - log.Error().Err(err).Str("path", testResultsDir).Msg("Error getting final directory size") - // intentionally don't exit here, as we can still proceed with the aggregation - } - diskSpaceUsed := byteCountSI(finalDirSize - initialDirSize) - log.Info().Str("disk space used", diskSpaceUsed).Msg("Aggregation complete") - }, -} - -func init() { - GenerateTestReportCmd.Flags().StringP("test-results-dir", "p", "", "Path to the folder containing JSON test result files (required)") - GenerateTestReportCmd.Flags().StringP("project-path", "r", ".", "The path to the Go project. Default is the current directory. Useful for subprojects") - GenerateTestReportCmd.Flags().StringP("output-path", "o", "./report", "Path to output the aggregated results (directory)") - GenerateTestReportCmd.Flags().Float64P("max-pass-ratio", "", 1.0, "The maximum pass ratio threshold for a test to be considered flaky") - GenerateTestReportCmd.Flags().StringP("codeowners-path", "", "", "Path to the CODEOWNERS file") - GenerateTestReportCmd.Flags().StringP("repo-path", "", ".", "The path to the root of the repository/project") - GenerateTestReportCmd.Flags().String("repo-url", "", "The repository URL") - GenerateTestReportCmd.Flags().String("branch-name", "", "Branch name for the test report") - GenerateTestReportCmd.Flags().String("head-sha", "", "Head commit SHA for the test report") - GenerateTestReportCmd.Flags().String("base-sha", "", "Base commit SHA for the test report") - GenerateTestReportCmd.Flags().String("github-workflow-name", "", "GitHub workflow name for the test report") - GenerateTestReportCmd.Flags().String("github-workflow-run-url", "", "GitHub workflow run URL for the test report") - GenerateTestReportCmd.Flags().String("report-id", "", "Optional identifier for the test report. Will be generated if not provided") - GenerateTestReportCmd.Flags().Bool("gen-report-id", false, "Generate a random report ID") - GenerateTestReportCmd.Flags().String("rerun-of-report-id", "", "Optional identifier for the report this is a rerun of") - GenerateTestReportCmd.Flags().Bool("race", false, "Enable the race detector") - - if err := GenerateTestReportCmd.MarkFlagRequired("test-results-dir"); err != nil { - log.Fatal().Err(err).Msg("Error marking flag as required") - } -} - -// getDirSize returns the size of a directory in bytes -// helpful for tracking how much data is being produced on disk -func getDirSize(path string) (int64, error) { - var size int64 - err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() { - size += info.Size() - } - return nil - }) - return size, err -} - -// byteCountSI returns a human-readable byte count (decimal SI units) -func byteCountSI(b int64) string { - const unit = 1000 - if b < unit { - return fmt.Sprintf("%d B", b) - } - div, exp := int64(unit), 0 - for n := b / unit; n >= unit; n /= unit { - div *= unit - exp++ - } - return fmt.Sprintf("%.1f %cB", float64(b)/float64(div), "kMGTPE"[exp]) -} diff --git a/tools/flakeguard/cmd/get_gh_artifact_link.go b/tools/flakeguard/cmd/get_gh_artifact_link.go deleted file mode 100644 index fdc1ed322..000000000 --- a/tools/flakeguard/cmd/get_gh_artifact_link.go +++ /dev/null @@ -1,123 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "os" - "strings" - "time" - - "github.com/google/go-github/v70/github" - "github.com/rs/zerolog/log" - "github.com/spf13/cobra" - "golang.org/x/oauth2" -) - -// GetGHArtifactLinkCmd fetches the artifact link from GitHub API. -var GetGHArtifactLinkCmd = &cobra.Command{ - Use: "get-gh-artifact", - Short: "Get artifact link from GitHub API", - Run: func(cmd *cobra.Command, args []string) { - // Get flag values - githubRepo, _ := cmd.Flags().GetString("github-repository") - githubRunID, _ := cmd.Flags().GetInt64("github-run-id") - artifactName, _ := cmd.Flags().GetString("failed-tests-artifact-name") - - // Get the GitHub token from environment variable - githubToken := os.Getenv("GITHUB_TOKEN") - if githubToken == "" { - log.Error().Msg("GITHUB_TOKEN environment variable is not set") - os.Exit(ErrorExitCode) - } - - // Fetch artifact link from GitHub API with retry logic - artifactLink, err := fetchArtifactLinkWithRetry(githubToken, githubRepo, githubRunID, artifactName, 5, 5*time.Second) - if err != nil { - log.Error().Err(err).Msg("Error fetching artifact link") - os.Exit(ErrorExitCode) - } - - fmt.Println(artifactLink) - }, -} - -func init() { - GetGHArtifactLinkCmd.Flags().String("github-repository", "", "The GitHub repository in the format owner/repo (required)") - GetGHArtifactLinkCmd.Flags().Int64("github-run-id", 0, "The GitHub Actions run ID (required)") - GetGHArtifactLinkCmd.Flags().String("failed-tests-artifact-name", "failed-test-results-with-logs.json", "The name of the failed tests artifact (default 'failed-test-results-with-logs.json')") - - if err := GetGHArtifactLinkCmd.MarkFlagRequired("github-repository"); err != nil { - log.Error().Err(err).Msg("Error marking github-repository flag as required") - os.Exit(ErrorExitCode) - } - if err := GetGHArtifactLinkCmd.MarkFlagRequired("github-run-id"); err != nil { - log.Error().Err(err).Msg("Error marking github-run-id flag as required") - os.Exit(ErrorExitCode) - } -} - -// fetchArtifactLink uses the GitHub API to retrieve the artifact link. -func fetchArtifactLink(githubToken, githubRepo string, githubRunID int64, artifactName string) (string, error) { - ctx := context.Background() - ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: githubToken}) - tc := oauth2.NewClient(ctx, ts) - client := github.NewClient(tc) - - // Split owner and repo from the provided repository string. - repoParts := strings.SplitN(githubRepo, "/", 2) - if len(repoParts) != 2 { - return "", fmt.Errorf("invalid format for --github-repository, expected owner/repo") - } - owner, repo := repoParts[0], repoParts[1] - - opts := &github.ListOptions{PerPage: 100} // maximum per page allowed by GitHub - var allArtifacts []*github.Artifact - - // Paginate through all artifacts. - for { - artifacts, resp, err := client.Actions.ListWorkflowRunArtifacts(ctx, owner, repo, githubRunID, opts) - if err != nil { - return "", fmt.Errorf("error listing artifacts: %w", err) - } - - allArtifacts = append(allArtifacts, artifacts.Artifacts...) - - if resp.NextPage == 0 { - break - } - opts.Page = resp.NextPage - } - - // Search for the artifact by name. - for _, artifact := range allArtifacts { - if artifact.GetName() == artifactName { - artifactID := artifact.GetID() - artifactURL := fmt.Sprintf("https://github.com/%s/%s/actions/runs/%d/artifacts/%d", - owner, repo, githubRunID, artifactID) - return artifactURL, nil - } - } - - return "", fmt.Errorf("artifact '%s' not found in the workflow run", artifactName) -} - -// fetchArtifactLinkWithRetry attempts to fetch the artifact link with retry logic. -func fetchArtifactLinkWithRetry(githubToken, githubRepo string, githubRunID int64, artifactName string, maxRetries int, delay time.Duration) (string, error) { - var lastErr error - for attempt := 1; attempt <= maxRetries; attempt++ { - link, err := fetchArtifactLink(githubToken, githubRepo, githubRunID, artifactName) - if err == nil { - return link, nil - } - - lastErr = err - if attempt == maxRetries { - break - } - - log.Printf("[Attempt %d/%d] Artifact not yet available. Retrying in %s...", attempt, maxRetries, delay) - time.Sleep(delay) - } - - return "", fmt.Errorf("failed to fetch artifact link after %d retries: %w", maxRetries, lastErr) -} diff --git a/tools/flakeguard/cmd/make_pr.go b/tools/flakeguard/cmd/make_pr.go deleted file mode 100644 index f9283a2a4..000000000 --- a/tools/flakeguard/cmd/make_pr.go +++ /dev/null @@ -1,224 +0,0 @@ -package cmd - -import ( - "context" - "errors" - "fmt" - "io" - "os" - "strings" - "time" - - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/google/go-github/v72/github" - "github.com/spf13/cobra" - "golang.org/x/oauth2" - - flake_git "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/git" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/golang" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/localdb" -) - -var ( - repoPath string - localDBPath string -) - -var MakePRCmd = &cobra.Command{ - Use: "make-pr", - Short: "Make a PR to skip identified flaky tests", - RunE: makePR, -} - -func makePR(cmd *cobra.Command, args []string) error { - repo, err := git.PlainOpen(repoPath) - if err != nil { - return fmt.Errorf("failed to open repo: %w", err) - } - - db, err := localdb.LoadDBWithPath(localDBPath) - if err != nil { - return fmt.Errorf("failed to load local db: %w", err) - } - - currentlyFlakyEntries := db.GetAllCurrentlyFlakyEntries() - - owner, repoName, defaultBranch, err := flake_git.GetOwnerRepoDefaultBranchFromLocalRepo(repoPath) - if err != nil { - return fmt.Errorf("failed to get repo info: %w", err) - } - - targetRepoWorktree, err := repo.Worktree() - if err != nil { - return fmt.Errorf("failed to open repo's worktree: %w", err) - } - - // First checkout default branch and pull latest - err = targetRepoWorktree.Checkout(&git.CheckoutOptions{ - Branch: plumbing.NewBranchReferenceName(defaultBranch), - }) - if err != nil { - if errors.Is(err, git.ErrUnstagedChanges) { - fmt.Println("Local repo has unstaged changes, please commit or stash them before running this command") - } - return fmt.Errorf("failed to checkout default branch %s: %w", defaultBranch, err) - } - - fmt.Printf("Fetching latest changes from default branch '%s', tap your yubikey if it's blinking...", defaultBranch) - err = repo.Fetch(&git.FetchOptions{}) - if err != nil && err != git.NoErrAlreadyUpToDate { - return fmt.Errorf("failed to fetch latest: %w", err) - } - fmt.Println(" ✅") - - fmt.Printf("Pulling latest changes from default branch '%s', tap your yubikey if it's blinking...", defaultBranch) - err = targetRepoWorktree.Pull(&git.PullOptions{}) - if err != nil && err != git.NoErrAlreadyUpToDate { - return fmt.Errorf("failed to pull latest changes: %w", err) - } - fmt.Println(" ✅") - - // Create and checkout new branch - branchName := fmt.Sprintf("flakeguard-skip-%s", time.Now().Format("20060102150405")) - err = targetRepoWorktree.Checkout(&git.CheckoutOptions{ - Branch: plumbing.NewBranchReferenceName(branchName), - Create: true, - }) - if err != nil { - return fmt.Errorf("failed to checkout new branch: %w", err) - } - - cleanUpBranch := true - defer func() { - if cleanUpBranch { - fmt.Printf("Cleaning up branch %s...", branchName) - err = targetRepoWorktree.Checkout(&git.CheckoutOptions{ - Branch: plumbing.NewBranchReferenceName(defaultBranch), - }) - if err != nil { - fmt.Printf("Failed to clean up branch: %v\n", err) - } - err = repo.Storer.RemoveReference(plumbing.NewBranchReferenceName(branchName)) - if err != nil { - fmt.Printf("Failed to remove branch: %v\n", err) - } - fmt.Println(" ✅") - } - }() - - if len(currentlyFlakyEntries) == 0 { - fmt.Println("No flaky tests found!") - return nil - } - - jiraTickets := []string{} - testsToSkip := []*golang.SkipTest{} - for _, entry := range currentlyFlakyEntries { - testsToSkip = append(testsToSkip, &golang.SkipTest{ - Package: entry.TestPackage, - Name: entry.TestName, - JiraTicket: entry.JiraTicket, - }) - jiraTickets = append(jiraTickets, entry.JiraTicket) - } - - err = golang.SkipTests(repoPath, testsToSkip) - if err != nil { - return fmt.Errorf("failed to modify code to skip tests: %w", err) - } - - _, err = targetRepoWorktree.Add(".") - if err != nil { - return fmt.Errorf("failed to add changes: %w", err) - } - - fmt.Print("Committing changes, tap your yubikey if it's blinking...") - commitHash, err := targetRepoWorktree.Commit(fmt.Sprintf("Skips flaky %d tests", len(testsToSkip)), &git.CommitOptions{}) - if err != nil { - return fmt.Errorf("failed to commit changes: %w", err) - } - fmt.Println(" ✅") - - fmt.Print("Pushing changes to remote, tap your yubikey if it's blinking...") - err = repo.Push(&git.PushOptions{}) - if err != nil { - return fmt.Errorf("failed to push changes: %w", err) - } - fmt.Println(" ✅") - - ctx := context.Background() - ts := oauth2.StaticTokenSource( - &oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")}, - ) - tc := oauth2.NewClient(ctx, ts) - client := github.NewClient(tc) - - var ( - skippedTestsPRBody strings.Builder - alreadySkippedTestsPRBody strings.Builder - ) - - for _, test := range testsToSkip { - if test.NewlySkipped { - skippedTestsPRBody.WriteString(fmt.Sprintf("- Package: `%s`\n", test.Package)) - skippedTestsPRBody.WriteString(fmt.Sprintf(" Test: `%s`\n", test.Name)) - skippedTestsPRBody.WriteString(fmt.Sprintf(" Ticket: [%s](https://%s/browse/%s)\n", test.JiraTicket, os.Getenv("JIRA_DOMAIN"), test.JiraTicket)) - skippedTestsPRBody.WriteString(fmt.Sprintf(" [View skip in PR](https://github.com/%s/%s/pull/%s/files#diff-%sL%d)\n\n", owner, repoName, branchName, commitHash, test.Line)) - } else if test.AlreadySkipped { - alreadySkippedTestsPRBody.WriteString(fmt.Sprintf("- Package: `%s`\n", test.Package)) - alreadySkippedTestsPRBody.WriteString(fmt.Sprintf(" Test: `%s`\n", test.Name)) - alreadySkippedTestsPRBody.WriteString(fmt.Sprintf(" Ticket: [%s](https://%s/browse/%s)\n", test.JiraTicket, os.Getenv("JIRA_DOMAIN"), test.JiraTicket)) - } - } - - pr := &github.NewPullRequest{ - Title: github.Ptr(fmt.Sprintf("[%s] Flakeguard: Skip flaky tests", strings.Join(jiraTickets, "] ["))), - Head: github.Ptr(branchName), - Base: github.Ptr(defaultBranch), - Body: github.Ptr(fmt.Sprintf("## Tests Skipped\n\n%s\n\n## Tests That Were Already Skipped\n\n%s", skippedTestsPRBody.String(), alreadySkippedTestsPRBody.String())), - MaintainerCanModify: github.Ptr(true), - } - - fmt.Println("PR Preview:") - fmt.Println("================================================") - fmt.Println(pr.Title) - fmt.Println("--------------------------------") - fmt.Printf("Merging '%s' into '%s'\n", branchName, defaultBranch) - fmt.Println(pr.Body) - fmt.Println("================================================") - - fmt.Printf("To preview the code changes in the GitHub UI, visit: https://github.com/%s/%s/compare/%s...%s\n", owner, repoName, defaultBranch, branchName) - fmt.Print("Would you like to create the PR automatically from the CLI? (y/N): ") - - var confirm string - _, err = fmt.Scanln(&confirm) - if err != nil { - return err - } - - if strings.ToLower(confirm) != "y" { - fmt.Println("Exiting. Please use the GitHub UI to create the PR.") - return nil - } - - createdPR, resp, err := client.PullRequests.Create(ctx, owner, repoName, pr) - if err != nil { - return err - } - if resp.StatusCode != 201 { - body, err := io.ReadAll(resp.Body) - if err != nil { - return fmt.Errorf("failed to read github response body while trying to create PR: %s\n%w", resp.Status, err) - } - return fmt.Errorf("failed to create PR, got bad status: %s\n%s", resp.Status, string(body)) - } - - cleanUpBranch = false - fmt.Printf("PR created! https://github.com/%s/%s/pull/%d\n", owner, repoName, createdPR.GetNumber()) - return nil -} - -func init() { - MakePRCmd.Flags().StringVarP(&repoPath, "repoPath", "r", ".", "Local path to the repository to make the PR for") -} diff --git a/tools/flakeguard/cmd/review_tickets.go b/tools/flakeguard/cmd/review_tickets.go deleted file mode 100644 index a9d4ea371..000000000 --- a/tools/flakeguard/cmd/review_tickets.go +++ /dev/null @@ -1,487 +0,0 @@ -package cmd - -import ( - "fmt" - "strings" - - "github.com/andygrunwald/go-jira" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - "github.com/rs/zerolog/log" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/jirautils" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/localdb" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/mapping" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/model" - "github.com/spf13/cobra" -) - -// Command flags -var ( - ticketsJSONPath string - ticketsDryRun bool - missingPillars bool - userMappingPath string - userTestMappingPath string -) - -// Renamed from TicketsCmd to ReviewTicketsCmd -var ReviewTicketsCmd = &cobra.Command{ - Use: "review-tickets", - Short: "Review tickets from the local database and sync Jira status", - Long: `Interactively review tickets stored in the local database (--test-db-path). - -Fetches current Pillar Name and Status from associated Jira tickets. -Allows setting the Pillar Name in Jira based on assignee mappings. - -Data Source: Reads from the JSON file specified by --test-db-path. -Jira Interaction: Requires JIRA_* environment variables for fetching status/pillar and pillar updates. - -Actions: - [i] set Jira pillar name based on assignee mapping (updates Jira) - [p] previous ticket - [n] next ticket - [q] quit`, - RunE: func(cmd *cobra.Command, args []string) error { - db, err := localdb.LoadDBWithPath(ticketsJSONPath) - if err != nil { - log.Error().Err(err).Str("path", ticketsJSONPath).Msg("Failed to load local DB") - return fmt.Errorf("failed to load local DB: %w", err) - } - - userMap, err := mapping.LoadUserMappings(userMappingPath) - if err != nil { - log.Error().Err(err).Msg("Failed to load user mappings") - return err - } - _, err = mapping.LoadUserTestMappings(userTestMappingPath) - if err != nil { - log.Warn().Err(err).Msg("Failed to load user test mappings, continuing...") - } - - entries := db.GetAllEntries() - if len(entries) == 0 { - log.Info().Msg("No tickets found in local DB") - return nil - } - log.Info().Int("count", len(entries)).Msg("Loaded entries from local DB.") - - tickets := make([]model.FlakyTicket, 0, len(entries)) - for _, entry := range entries { - ticket := model.FlakyTicket{ - TestPackage: entry.TestPackage, - TestName: entry.TestName, - ExistingJiraKey: entry.JiraTicket, - AssigneeId: entry.AssigneeID, - } - if entry.AssigneeID != "" { - if _, exists := userMap[entry.AssigneeID]; !exists { - ticket.MissingUserMapping = true - log.Debug().Str("assignee", entry.AssigneeID).Str("test", entry.TestName).Msg("Assignee from DB not found in user_mapping.json") - } - } - tickets = append(tickets, ticket) - } - - jiraClient, clientErr := jirautils.GetJiraClient() - if clientErr != nil { - log.Warn().Msgf("Jira client not available: %v. Running in offline mode (cannot fetch status/pillar or update).", clientErr) - jiraClient = nil - } - - // 6) Fetch pillar names AND STATUS from Jira (if client available and tickets exist) - if jiraClient != nil && len(tickets) > 0 { - log.Info().Msg("Attempting to fetch Pillar Names & Status from Jira...") - - var jiraKeysToFetch []string - keyToIndexMap := make(map[string][]int) - for i, t := range tickets { - // Fetch if ticket has a key and we haven't already got Pillar OR Status - if t.ExistingJiraKey != "" && (t.PillarName == "" || t.JiraStatus == "") { - if _, exists := keyToIndexMap[t.ExistingJiraKey]; !exists { - jiraKeysToFetch = append(jiraKeysToFetch, t.ExistingJiraKey) - } - keyToIndexMap[t.ExistingJiraKey] = append(keyToIndexMap[t.ExistingJiraKey], i) - } - } - - if len(jiraKeysToFetch) > 0 { - log.Debug().Int("count", len(jiraKeysToFetch)).Msg("Fetching Pillar/Status for unique Jira keys.") - batchSize := 50 - processedCount := 0 // Track keys processed for spinner - for i := 0; i < len(jiraKeysToFetch); i += batchSize { - end := i + batchSize - if end > len(jiraKeysToFetch) { - end = len(jiraKeysToFetch) - } - batch := jiraKeysToFetch[i:end] - jql := fmt.Sprintf("key IN (%s)", strings.Join(batch, ",")) - - // Request Status field in addition to Pillar Name field - issues, _, searchErr := jiraClient.Issue.Search(jql, &jira.SearchOptions{ - Fields: []string{"key", jirautils.PillarCustomFieldID, "status"}, - MaxResults: batchSize, - }) - - if searchErr != nil { - log.Warn().Err(searchErr).Msgf("Failed to fetch Jira data batch (JQL: %s)", jql) - continue - } - - // Update tickets with pillar names and status - for _, issue := range issues { - processedCount++ - if indices, found := keyToIndexMap[issue.Key]; found { - pillarValue := jirautils.ExtractPillarValue(issue) // Use helper - jiraStatus := "" - if issue.Fields != nil && issue.Fields.Status != nil { - jiraStatus = issue.Fields.Status.Name // Get status name - } - - log.Debug().Str("ticket", issue.Key).Str("pillar", pillarValue).Str("status", jiraStatus).Msg("Data retrieved from Jira.") - - for _, ticketIdx := range indices { - if ticketIdx < len(tickets) { // Bounds check - tickets[ticketIdx].PillarName = pillarValue - tickets[ticketIdx].JiraStatus = jiraStatus - } - } - } - } - } - log.Info().Int("count", processedCount).Msg("Finished fetching Jira data.") - } else { - log.Info().Msg("No tickets required fetching data from Jira.") - } - fmt.Println() - } - - if missingPillars { - filtered := make([]model.FlakyTicket, 0, len(tickets)) - for _, t := range tickets { - if t.ExistingJiraKey != "" && t.PillarName == "" { - filtered = append(filtered, t) - } - } - tickets = filtered - if len(tickets) == 0 { - log.Info().Msg("No tickets found with missing pillar names after filtering.") - return nil - } - log.Info().Int("count", len(tickets)).Msg("Filtered view to show only tickets missing pillar names.") - } - - if len(tickets) == 0 { - log.Info().Msg("No tickets remaining after applying all filters.") - return nil - } - - m := initialTicketsModel(tickets, userMap) - m.JiraClient = jiraClient - m.LocalDB = db - m.DryRun = ticketsDryRun - - program := tea.NewProgram(m) - finalModel, err := program.Run() - if err != nil { - log.Error().Err(err).Msg("Error running tickets TUI") - return fmt.Errorf("error running TUI: %w", err) - } - _ = finalModel - - if !ticketsDryRun { - if db == nil { - log.Error().Msg("Cannot save DB: DB instance is nil") - } else if err := db.Save(); err != nil { - log.Error().Err(err).Msg("Failed to save local DB") - } else { - log.Info().Str("path", db.FilePath()).Msg("Local DB saved.") - } - } else { - log.Info().Msg("Dry Run: Skipping save of local DB.") - } - - log.Info().Msg("Review Tickets command finished.") - return nil - }, -} - -func uniqueStrings(input []string) []string { - seen := make(map[string]struct{}, len(input)) - j := 0 - for _, v := range input { - if _, ok := seen[v]; ok { - continue - } - seen[v] = struct{}{} - input[j] = v - j++ - } - return input[:j] -} - -func init() { - ReviewTicketsCmd.Flags().StringVar(&ticketsJSONPath, "test-db-path", localdb.DefaultDBPath(), "Path to the JSON file for the flaky test database") - ReviewTicketsCmd.Flags().BoolVar(&ticketsDryRun, "dry-run", false, "Prevent changes to Jira (e.g., pillar updates)") - ReviewTicketsCmd.Flags().BoolVar(&missingPillars, "missing-pillars", false, "Only show tickets with a Jira Key but no Pillar Name") - ReviewTicketsCmd.Flags().StringVar(&userMappingPath, "user-mapping-path", "user_mapping.json", "Path to the user mapping JSON (JiraUserID -> PillarName)") - ReviewTicketsCmd.Flags().StringVar(&userTestMappingPath, "user-test-mapping-path", "user_test_mapping.json", "Path to the user test mapping JSON (Pattern -> JiraUserID)") -} - -// ------------------------- -// TUI Model and Functions -// ------------------------- - -type ticketModel struct { - tickets []model.FlakyTicket - index int - JiraClient *jira.Client - LocalDB *localdb.DB - DryRun bool - quitting bool - infoMessage string - errorMessage string - userMap map[string]mapping.UserMapping -} - -func initialTicketsModel(tickets []model.FlakyTicket, userMap map[string]mapping.UserMapping) ticketModel { - idx := 0 - if len(tickets) == 0 { - idx = -1 - } - return ticketModel{ - tickets: tickets, - index: idx, - userMap: userMap, - } -} - -func (m ticketModel) Init() tea.Cmd { - return nil -} - -func (m ticketModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - if m.index == -1 { - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - case "q", "esc", "ctrl+c": - m.quitting = true - return m, tea.Quit - } - } - return m, nil - } - if m.quitting { - return m, tea.Quit - } - - switch msg := msg.(type) { - case tea.KeyMsg: - m.infoMessage = "" - m.errorMessage = "" - - key := msg.String() - - switch key { - case "q", "esc", "ctrl+c": - m.quitting = true - log.Info().Msg("Quit signal received.") - return m, tea.Quit - - case "p": // Previous - if m.index > 0 { - m.index-- - } else { - m.infoMessage = "Already at the first ticket." - } - return m, nil - - case "n": // Next - if m.index < len(m.tickets)-1 { - m.index++ - } else { - m.infoMessage = "Already at the last ticket." - } - return m, nil - - case "i": // Set Pillar Name based on mapping - if m.index < 0 || m.index >= len(m.tickets) { - m.errorMessage = "Internal error: Invalid index for 'i' action." - return m, nil - } - t := &m.tickets[m.index] // Use pointer - - if t.ExistingJiraKey == "" { - m.errorMessage = "Cannot set pillar: No associated Jira key." - return m, nil - } - if t.AssigneeId == "" { - m.errorMessage = "Cannot set pillar: Assignee ID not set." - return m, nil - } - if m.JiraClient == nil { - m.errorMessage = "Cannot set pillar: Jira client unavailable." - return m, nil - } - if m.DryRun { - m.errorMessage = "Cannot set pillar: Dry Run mode enabled." - return m, nil - } - - // Find mapping and target pillar name - userMapping, exists := m.userMap[t.AssigneeId] - if !exists { - m.errorMessage = fmt.Sprintf("Cannot set pillar: No mapping for assignee %s.", t.AssigneeId) - return m, nil - } - targetPillar := userMapping.PillarName - if targetPillar == "" { - m.errorMessage = fmt.Sprintf("Cannot set pillar: Pillar name empty in mapping for %s.", t.AssigneeId) - return m, nil - } - - // Prevent setting if already set to target? Optional. - if t.PillarName == targetPillar { - m.infoMessage = fmt.Sprintf("Pillar name is already '%s'.", targetPillar) - return m, nil - } - - // Perform Jira Update (synchronously for immediate feedback) - m.infoMessage = fmt.Sprintf("Attempting to set Pillar Name to '%s' for %s...", targetPillar, jirautils.GetJiraLink(t.ExistingJiraKey)) - updateErr := jirautils.UpdatePillarName(m.JiraClient, t.ExistingJiraKey, targetPillar) - - if updateErr != nil { - errMsg := fmt.Sprintf("Failed to update pillar for %s", t.ExistingJiraKey) - log.Error().Err(updateErr).Str("ticket", t.ExistingJiraKey).Str("pillar", targetPillar).Msg(errMsg) - m.errorMessage = fmt.Sprintf("%s: %v", errMsg, updateErr) - m.infoMessage = "" // Clear "Attempting..." - } else { - log.Info().Str("ticket", t.ExistingJiraKey).Str("pillar", targetPillar).Msg("Pillar name updated successfully in Jira.") - m.infoMessage = fmt.Sprintf("Pillar name set to '%s' for %s", targetPillar, jirautils.GetJiraLink(t.ExistingJiraKey)) - // Update the local model state as well so the view refreshes correctly - t.PillarName = targetPillar - m.errorMessage = "" - } - return m, nil - } - } - - return m, nil -} - -// View function: Displays Jira Status instead of SkippedAt -func (m ticketModel) View() string { - if m.quitting { - return "Exiting review...\n" - } - if m.index == -1 || len(m.tickets) == 0 { - return "No tickets loaded or matching filters.\n\n[q] quit\n" - } - if m.index >= len(m.tickets) { - return "Error: Invalid ticket index.\n\n[q] quit\n" - } - - t := m.tickets[m.index] - - headerStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("63")).PaddingBottom(1) - infoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("81")) - errorStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("196")).PaddingBottom(1) // Red - labelStyle := lipgloss.NewStyle().Bold(true).Width(12).Foreground(lipgloss.Color("39")) - valueStyle := lipgloss.NewStyle() - statusStyle := lipgloss.NewStyle() - switch strings.ToLower(t.JiraStatus) { - case "done", "resolved", "closed": - statusStyle = statusStyle.Foreground(lipgloss.Color("40")) // Green - case "in progress", "in review": - statusStyle = statusStyle.Foreground(lipgloss.Color("208")) // Orange - case "to do", "backlog", "open": - statusStyle = statusStyle.Foreground(lipgloss.Color("245")) // Grey - } - - warningStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("208")) // Orange for warnings like missing mapping - dryRunStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("208")).Background(lipgloss.Color("235")).Padding(0, 1) - actionHelpStyle := lipgloss.NewStyle().Faint(true).PaddingTop(1) - - var sb strings.Builder - - // Dry Run Banner - if m.DryRun { - sb.WriteString(dryRunStyle.Render("DRY RUN MODE") + "\n\n") - } - - // Error Message Area - if m.errorMessage != "" { - sb.WriteString(errorStyle.Render("Error: "+m.errorMessage) + "\n") - } - // Info Message Area - if m.infoMessage != "" { - sb.WriteString(infoStyle.Render(m.infoMessage) + "\n\n") - } - - // Header - sb.WriteString(headerStyle.Render(fmt.Sprintf("Review Ticket [%d / %d]", m.index+1, len(m.tickets))) + "\n") - - // Details Table - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Test Name:"), valueStyle.Render(t.TestName))) - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Package:"), valueStyle.Render(t.TestPackage))) - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Jira Key:"), valueStyle.Render(jirautils.GetJiraLink(t.ExistingJiraKey)))) - - // Assignee Info - assigneeVal := "-" - if t.AssigneeId != "" { - assigneeVal = t.AssigneeId - if t.MissingUserMapping { - assigneeVal += warningStyle.Render(" (Mapping Missing!)") - } - } else { - assigneeVal = lipgloss.NewStyle().Faint(true).Render("(Not Set)") - } - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Assignee ID:"), valueStyle.Render(assigneeVal))) - - // Pillar Name - pillarVal := "-" - if t.PillarName != "" { - pillarVal = t.PillarName - } else if t.ExistingJiraKey != "" { - // Indicate if fetched or just not set - if m.JiraClient != nil { // Check if client was available to fetch - pillarVal = infoStyle.Render("(Not set in Jira)") - } else { - pillarVal = infoStyle.Render("(Jira unavailable)") - } - } - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Pillar Name:"), valueStyle.Render(pillarVal))) - - // Jira Status - statusVal := t.JiraStatus - if statusVal == "" { - if t.ExistingJiraKey != "" { - if m.JiraClient != nil { - statusVal = infoStyle.Render("(Status not fetched)") - } else { - statusVal = infoStyle.Render("(Jira unavailable)") - } - } else { - statusVal = "-" - } - } - sb.WriteString(fmt.Sprintf("%s %s\n", labelStyle.Render("Jira Status:"), statusStyle.Render(statusVal))) - - // Actions Help Text - actions := []string{ - "[p]prev", "[n]next", - } - if t.ExistingJiraKey != "" && - t.AssigneeId != "" && - m.JiraClient != nil && - !m.DryRun && - t.PillarName == "" { - actions = append(actions, "[i]set_pillar") - } - - actions = append(actions, "[q]quit") - - sb.WriteString("\n" + lipgloss.NewStyle().Bold(true).Render("Actions:") + "\n" + actionHelpStyle.Render(strings.Join(actions, " "))) - - return sb.String() -} diff --git a/tools/flakeguard/cmd/run.go b/tools/flakeguard/cmd/run.go deleted file mode 100644 index 1eebb5604..000000000 --- a/tools/flakeguard/cmd/run.go +++ /dev/null @@ -1,604 +0,0 @@ -package cmd - -import ( - "bytes" - "encoding/json" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "github.com/spf13/cobra" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/utils" -) - -const ( - FlakyTestsExitCode = 1 - ErrorExitCode = 2 - RawOutputDir = "./flakeguard_raw_output" -) - -// runState holds the configuration and results throughout the run process. -type runState struct { - cfg *runConfig - goProject string - testRunner *runner.Runner - mainResults []reports.TestResult - mainReport *reports.TestReport -} - -type runConfig struct { - ProjectPath string - CodeownersPath string - TestPackagesJson string - TestPackages []string - TestCmds []string - RunCount int - RerunFailedCount int - Tags []string - UseRace bool - MainResultsPath string - RerunResultsPath string - MinPassRatio float64 - SkipTests []string - SelectTests []string - UseShuffle bool - ShuffleSeed string - IgnoreParentFailuresOnSubtests bool - FailFast bool - GoTestTimeout string - GoTestCount *int -} - -// outputManager manages the final output buffer and exit code. -type outputManager struct { - buffer bytes.Buffer - code int -} - -// flush prints the buffered output and exits with the stored code. -func (o *outputManager) flush() { - fmt.Print(o.buffer.String()) - os.Exit(o.code) -} - -// logErrorAndExit logs an error, sets the exit code to ErrorExitCode, and flushes. -func (o *outputManager) logErrorAndExit(err error, msg string, fields ...map[string]interface{}) { - l := log.Error().Err(err) - if len(fields) > 0 { - l = l.Fields(fields[0]) - } - l.Msg(msg) - fmt.Fprintf(&o.buffer, "[ERROR] %s: %v\n", msg, err) - o.code = ErrorExitCode - o.flush() -} - -// logMsgAndExit logs a message at a specific level, sets the exit code, and flushes. -func (o *outputManager) logMsgAndExit(level zerolog.Level, msg string, code int, fields ...map[string]interface{}) { - l := log.WithLevel(level) - if len(fields) > 0 { - l = l.Fields(fields[0]) - } - l.Msg(msg) - fmt.Fprintf(&o.buffer, "[%s] %s\n", level.String(), msg) - o.code = code - o.flush() -} - -// info logs an informational message to zerolog and the output buffer. -func (o *outputManager) info(step, totalSteps int, msg string) { - stepMsg := fmt.Sprintf("(%d/%d) %s", step, totalSteps, msg) - log.Info().Msg(stepMsg) - fmt.Fprintf(&o.buffer, "\n[INFO] %s\n", stepMsg) - fmt.Fprintf(&o.buffer, "%s\n", strings.Repeat("-", len(stepMsg)+7)) -} - -// detail adds a detail line under the current step in the buffer. -func (o *outputManager) detail(msg string, args ...interface{}) { - formattedMsg := fmt.Sprintf(msg, args...) - fmt.Fprintf(&o.buffer, " %s\n", formattedMsg) - log.Debug().Msg(formattedMsg) -} - -// finalStatus adds final status messages (ERROR, WARNING, FAIL) to the buffer. -func (o *outputManager) finalStatus(level zerolog.Level, msg string) { - log.WithLevel(level).Msg(msg) - levelStr := strings.ToUpper(level.String()) - if level == zerolog.WarnLevel { - levelStr = "WARN" - } - fmt.Fprintf(&o.buffer, "[%s] %s\n", levelStr, msg) -} - -var RunTestsCmd = &cobra.Command{ - Use: "run", - Short: "Run tests potentially multiple times, check for flakiness, and report results.", - Long: `Runs tests using 'go test -json'. -Can run tests multiple times and rerun failed tests to detect flakiness. -Provides a structured summary of the execution flow and final results, -followed by detailed logs for all executed tests. - -Exit Codes: - 0: Success (all tests passed stability requirements) - 1: Flaky tests found or tests failed persistently after reruns - 2: Error during execution (e.g., setup failure, command error)`, - Run: func(cmd *cobra.Command, args []string) { - outputMgr := &outputManager{code: 0} // Default success - state := &runState{} - var err error - - // Configuration & Setup - state.cfg, err = parseAndValidateFlags(cmd) - if err != nil { - outputMgr.logErrorAndExit(err, "Failed to parse or validate flags") - } - - state.goProject, err = utils.GetGoProjectName(state.cfg.ProjectPath) - if err != nil { - log.Warn().Err(err).Str("projectPath", state.cfg.ProjectPath).Msg("Failed to get pretty project path for report metadata") - } - - state.testRunner = initializeRunner(state.cfg) - - totalSteps := 3 // Prep, Initial Run, Final Summary - if state.cfg.RerunFailedCount > 0 { - totalSteps++ // Add Retry step - } - - // Preparation - outputMgr.info(1, totalSteps, "Preparing environment...") - if err := checkDependencies(state.cfg.ProjectPath); err != nil { - outputMgr.detail("Warning: Dependency check ('go mod tidy') failed: %v", err) - } else { - outputMgr.detail("Dependency check ('go mod tidy'): OK") - } - outputMgr.detail("Preparation complete.") - - // Initial Test Run - outputMgr.info(2, totalSteps, "Running initial tests...") - - var runErr error - testPackages, determineErr := determineTestPackages(state.cfg) - if determineErr != nil { - outputMgr.logErrorAndExit(determineErr, "Failed to determine test packages") - } - - if len(state.cfg.TestCmds) > 0 { - outputMgr.detail("Using custom test command(s)...") - state.mainResults, runErr = state.testRunner.RunTestCmd(state.cfg.TestCmds) - } else { - outputMgr.detail("Running test packages: %s", strings.Join(testPackages, ", ")) - state.mainResults, runErr = state.testRunner.RunTestPackages(testPackages) - } - - if runErr != nil { - outputMgr.logErrorAndExit(runErr, "Error running initial tests") - } - if len(state.mainResults) == 0 { - outputMgr.logMsgAndExit(zerolog.ErrorLevel, "No tests were run.", ErrorExitCode) - } - - state.mainReport, err = generateInitialReport(state.mainResults, state.cfg, state.goProject) - if err != nil { - outputMgr.logErrorAndExit(err, "Error creating initial test report") - } - - if state.cfg.MainResultsPath != "" { - if err := reports.SaveTestResultsToFile(state.mainResults, state.cfg.MainResultsPath); err != nil { - log.Error().Err(err).Str("path", state.cfg.MainResultsPath).Msg("Error saving main test results to file") - outputMgr.detail("Warning: Failed to save initial results to %s", state.cfg.MainResultsPath) - } else { - log.Info().Str("path", state.cfg.MainResultsPath).Msg("Main test report saved") - outputMgr.detail("Initial results saved to: %s", state.cfg.MainResultsPath) - } - } - - initialPassed, initialFailed, initialSkipped := countResults(state.mainResults) - totalInitial := len(state.mainResults) - initialSkipped - outputMgr.detail("Initial run completed:") - outputMgr.detail(" - %d total tests run (excluding skipped)", totalInitial) - outputMgr.detail(" - %d passed", initialPassed) - outputMgr.detail(" - %d failed", initialFailed) - if initialSkipped > 0 { - outputMgr.detail(" - %d skipped", initialSkipped) - } - - initialFailedTests := reports.FilterTests(state.mainResults, func(tr reports.TestResult) bool { - return !tr.Skipped && tr.Failures > 0 - }) - - // Retry Failed Tests - persistentlyFailingTests := initialFailedTests - flakyTests := []reports.TestResult{} - var rerunReport *reports.TestReport - - if state.cfg.RerunFailedCount > 0 && len(initialFailedTests) > 0 { - outputMgr.info(3, totalSteps, "Retrying failed tests...") - - if handleCmdLineArgsEdgeCase(outputMgr, initialFailedTests, state.cfg) { - persistentlyFailingTests = initialFailedTests - } else { - suffix := fmt.Sprintf(" Rerunning %d failed test(s) up to %d times...", len(initialFailedTests), state.cfg.RerunFailedCount) - log.Info().Msg(suffix) - - rerunResults, rerunJSONPaths, rerunErr := state.testRunner.RerunFailedTests(initialFailedTests, state.cfg.RerunFailedCount) - - if rerunErr != nil { - outputMgr.logErrorAndExit(rerunErr, "Error rerunning failed tests") - } - - rerunReportVal, err := reports.NewTestReport(rerunResults, - reports.WithGoProject(state.goProject), - reports.WithCodeOwnersPath(state.cfg.CodeownersPath), - reports.WithMaxPassRatio(1), - reports.WithExcludedTests(state.cfg.SkipTests), - reports.WithSelectedTests(state.cfg.SelectTests), - reports.WithJSONOutputPaths(rerunJSONPaths), - ) - if err != nil { - outputMgr.logErrorAndExit(err, "Error creating rerun test report") - } - rerunReport = &rerunReportVal - - if state.cfg.RerunResultsPath != "" && len(rerunResults) > 0 { - if err := reports.SaveTestResultsToFile(rerunResults, state.cfg.RerunResultsPath); err != nil { - log.Error().Err(err).Str("path", state.cfg.RerunResultsPath).Msg("Error saving rerun test results to file") - outputMgr.detail("Warning: Failed to save rerun results to %s", state.cfg.RerunResultsPath) - } else { - log.Info().Str("path", state.cfg.RerunResultsPath).Msg("Rerun test report saved") - outputMgr.detail("Rerun results saved to: %s", state.cfg.RerunResultsPath) - } - } - - persistentlyFailingTests = []reports.TestResult{} - outputMgr.detail("Retry results:") - for _, result := range rerunResults { - if !result.Skipped && result.Successes == 0 { - persistentlyFailingTests = append(persistentlyFailingTests, result) - outputMgr.detail(" - %s: still FAIL", result.TestName) - } else if !result.Skipped && result.Successes > 0 && result.Runs > result.Successes { - flakyTests = append(flakyTests, result) - outputMgr.detail(" - %s: now PASS (flaky)", result.TestName) - } else if !result.Skipped { - outputMgr.detail(" - %s: now PASS", result.TestName) - } - } - } - } else if len(initialFailedTests) > 0 { - outputMgr.detail("No reruns configured or no initial failures to retry.") - if state.cfg.MinPassRatio < 1.0 { - for _, test := range initialFailedTests { - if test.PassRatio >= state.cfg.MinPassRatio { - flakyTests = append(flakyTests, test) - persistentlyFailingTests = reports.FilterTests(persistentlyFailingTests, func(pt reports.TestResult) bool { - return !(pt.TestPackage == test.TestPackage && pt.TestName == test.TestName) - }) - } - } - } - } - - // Final Summary - finalStepNum := 3 - if state.cfg.RerunFailedCount > 0 { - finalStepNum = 4 - } - outputMgr.info(finalStepNum, totalSteps, "Final summary") - - finalFailCount := len(persistentlyFailingTests) - finalFlakyCount := len(flakyTests) - finalPassCount := totalInitial - finalFailCount - finalFlakyCount - - outputMgr.detail("Total tests run: %d", totalInitial) - outputMgr.detail(" - Final PASS: %d", finalPassCount) - outputMgr.detail(" - Final FAIL: %d", finalFailCount) - outputMgr.detail(" - FLAKY: %d", finalFlakyCount) - - fmt.Fprintln(&outputMgr.buffer) - - if finalFailCount > 0 { - outputMgr.finalStatus(zerolog.ErrorLevel, fmt.Sprintf("%d stable failing test(s) found", finalFailCount)) - outputMgr.code = FlakyTestsExitCode - } - if finalFlakyCount > 0 { - outputMgr.finalStatus(zerolog.WarnLevel, fmt.Sprintf("%d flaky test(s) found", finalFlakyCount)) - if outputMgr.code == 0 { - outputMgr.code = FlakyTestsExitCode - } - } - - if outputMgr.code == 0 { - outputMgr.finalStatus(zerolog.InfoLevel, "All tests passed stability requirements.") - } - - if outputMgr.code == FlakyTestsExitCode { - outputMgr.finalStatus(zerolog.ErrorLevel, fmt.Sprintf("Exit code = %d (failures or flaky tests detected)", outputMgr.code)) - } - - // Detailed Logs - - fmt.Fprintf(&outputMgr.buffer, "\n%s\n", strings.Repeat("=", 60)) - initialRunHeader := fmt.Sprintf("=== DETAILED LOGS FOR INITIAL RUN (Initial run count: %d) ===", state.cfg.RunCount) - fmt.Fprintf(&outputMgr.buffer, "%s\n", initialRunHeader) - fmt.Fprintf(&outputMgr.buffer, "%s\n\n", strings.Repeat("=", len(initialRunHeader))) - - reportToLog := state.mainReport - if reportToLog != nil && len(reportToLog.Results) > 0 { - err = reportToLog.PrintGotestsumOutput(&outputMgr.buffer, "testname") - if err != nil { - log.Error().Err(err).Msg("Error printing initial run gotestsum output") - fmt.Fprintf(&outputMgr.buffer, "\n[ERROR] Failed to print detailed initial run logs: %v\n", err) - } - } else { - fmt.Fprintf(&outputMgr.buffer, "No test execution data available for initial run logs.\n") - } - - if rerunReport != nil && len(rerunReport.Results) > 0 { - retryHeader := fmt.Sprintf("=== DETAILED LOGS FOR RETRY ATTEMPTS (%d retries per test) ===", state.cfg.RerunFailedCount) - fmt.Fprintf(&outputMgr.buffer, "\n%s\n", strings.Repeat("=", len(retryHeader))) - fmt.Fprintf(&outputMgr.buffer, "%s\n", retryHeader) - fmt.Fprintf(&outputMgr.buffer, "%s\n\n", strings.Repeat("=", len(retryHeader))) - err = rerunReport.PrintGotestsumOutput(&outputMgr.buffer, "testname") - if err != nil { - log.Error().Err(err).Msg("Error printing retry gotestsum output") - fmt.Fprintf(&outputMgr.buffer, "\n[ERROR] Failed to print detailed retry logs: %v\n", err) - } - } - - outputMgr.flush() - }, -} - -// parseAndValidateFlags parses flags from the cobra command, validates them, and returns a runConfig. -func parseAndValidateFlags(cmd *cobra.Command) (*runConfig, error) { - cfg := &runConfig{} - var err error - - cfg.ProjectPath, _ = cmd.Flags().GetString("project-path") - cfg.CodeownersPath, _ = cmd.Flags().GetString("codeowners-path") - cfg.TestPackagesJson, _ = cmd.Flags().GetString("test-packages-json") - cfg.TestPackages, _ = cmd.Flags().GetStringSlice("test-packages") - cfg.TestCmds, _ = cmd.Flags().GetStringArray("test-cmd") - cfg.RunCount, _ = cmd.Flags().GetInt("run-count") - cfg.RerunFailedCount, _ = cmd.Flags().GetInt("rerun-failed-count") - cfg.Tags, _ = cmd.Flags().GetStringArray("tags") - cfg.UseRace, _ = cmd.Flags().GetBool("race") - cfg.MainResultsPath, _ = cmd.Flags().GetString("main-results-path") - cfg.RerunResultsPath, _ = cmd.Flags().GetString("rerun-results-path") - cfg.SkipTests, _ = cmd.Flags().GetStringSlice("skip-tests") - cfg.SelectTests, _ = cmd.Flags().GetStringSlice("select-tests") - cfg.UseShuffle, _ = cmd.Flags().GetBool("shuffle") - cfg.ShuffleSeed, _ = cmd.Flags().GetString("shuffle-seed") - cfg.IgnoreParentFailuresOnSubtests, _ = cmd.Flags().GetBool("ignore-parent-failures-on-subtests") - cfg.FailFast, _ = cmd.Flags().GetBool("fail-fast") - cfg.GoTestTimeout, _ = cmd.Flags().GetString("go-test-timeout") - - cfg.ProjectPath, err = utils.ResolveFullPath(cfg.ProjectPath) - if err != nil { - return nil, fmt.Errorf("failed to resolve full path for project path '%s': %w", cfg.ProjectPath, err) - } - if cfg.MainResultsPath != "" { - cfg.MainResultsPath, err = utils.ResolveFullPath(cfg.MainResultsPath) - if err != nil { - return nil, fmt.Errorf("failed to resolve full path for main results path '%s': %w", cfg.MainResultsPath, err) - } - } - if cfg.RerunResultsPath != "" { - cfg.RerunResultsPath, err = utils.ResolveFullPath(cfg.RerunResultsPath) - if err != nil { - return nil, fmt.Errorf("failed to resolve full path for rerun results path '%s': %w", cfg.RerunResultsPath, err) - } - } - - if cmd.Flags().Changed("go-test-count") { - v, err := cmd.Flags().GetInt("go-test-count") - if err != nil { - return nil, fmt.Errorf("error retrieving flag go-test-count: %w", err) - } - cfg.GoTestCount = &v - } - - minPassRatio, _ := cmd.Flags().GetFloat64("min-pass-ratio") - maxPassRatio, _ := cmd.Flags().GetFloat64("max-pass-ratio") - maxPassRatioSpecified := cmd.Flags().Changed("max-pass-ratio") - - cfg.MinPassRatio = minPassRatio - if maxPassRatioSpecified && maxPassRatio != 1.0 { - log.Warn().Msg("--max-pass-ratio is deprecated, please use --min-pass-ratio instead. Using max-pass-ratio value for now.") - cfg.MinPassRatio = maxPassRatio // Use the deprecated value if specified - } - - if cfg.MinPassRatio < 0 || cfg.MinPassRatio > 1 { - return nil, fmt.Errorf("pass ratio must be between 0 and 1, got: %.2f", cfg.MinPassRatio) - } - - return cfg, nil -} - -// determineTestPackages decides which test packages to run based on the config. -func determineTestPackages(cfg *runConfig) ([]string, error) { - if len(cfg.TestCmds) > 0 { - return nil, nil - } - - var testPackages []string - if cfg.TestPackagesJson != "" { - if err := json.Unmarshal([]byte(cfg.TestPackagesJson), &testPackages); err != nil { - return nil, fmt.Errorf("error decoding test packages JSON: %w", err) - } - } else if len(cfg.TestPackages) > 0 { - testPackages = cfg.TestPackages - } else { - return nil, fmt.Errorf("must specify either --test-packages-json, --test-packages, or --test-cmd") - } - return testPackages, nil -} - -// initializeRunner creates and configures a new test runner. -func initializeRunner(cfg *runConfig) *runner.Runner { - // Force OmitOutputsOnSuccess to false because we are printing all logs at the end - omitOutputs := false - return runner.NewRunner( - cfg.ProjectPath, - true, - cfg.RunCount, - cfg.GoTestCount, - cfg.UseRace, - cfg.GoTestTimeout, - cfg.Tags, - cfg.UseShuffle, - cfg.ShuffleSeed, - cfg.FailFast, - cfg.SkipTests, - cfg.SelectTests, - cfg.IgnoreParentFailuresOnSubtests, - omitOutputs, - RawOutputDir, - nil, // exec - nil, // parser - ) -} - -// generateInitialReport creates the initial test report from the main run results. -func generateInitialReport(results []reports.TestResult, cfg *runConfig, goProject string) (*reports.TestReport, error) { - // Get the JSON output paths from the raw output directory - jsonOutputPaths, err := getJSONOutputPaths(RawOutputDir) - if err != nil { - log.Warn().Err(err).Msg("Failed to get JSON output paths for initial report") - } - - reportVal, err := reports.NewTestReport(results, - reports.WithGoProject(goProject), - reports.WithCodeOwnersPath(cfg.CodeownersPath), - reports.WithMaxPassRatio(cfg.MinPassRatio), - reports.WithGoRaceDetection(cfg.UseRace), - reports.WithExcludedTests(cfg.SkipTests), - reports.WithSelectedTests(cfg.SelectTests), - reports.WithJSONOutputPaths(jsonOutputPaths), - ) - if err != nil { - return nil, fmt.Errorf("error creating main test report: %w", err) - } - return &reportVal, nil -} - -// getJSONOutputPaths returns a list of absolute paths for JSON output files from the given directory. -func getJSONOutputPaths(dir string) ([]string, error) { - files, err := os.ReadDir(dir) - if err != nil { - if os.IsNotExist(err) { - return nil, nil - } - return nil, fmt.Errorf("failed to read directory %s: %w", dir, err) - } - - var paths []string - for _, file := range files { - if !file.IsDir() && strings.HasSuffix(file.Name(), ".json") { - absPath, err := filepath.Abs(filepath.Join(dir, file.Name())) - if err != nil { - log.Warn().Err(err).Str("file", file.Name()).Msg("Failed to get absolute path for JSON output file") - continue - } - paths = append(paths, absPath) - } - } - return paths, nil -} - -// countResults counts the number of passed, failed, and skipped tests. -func countResults(results []reports.TestResult) (passed, failed, skipped int) { - for _, r := range results { - if r.Skipped { - skipped++ - } else if r.Failures == 0 && r.Runs > 0 { - passed++ - } else if r.Failures > 0 { - failed++ - } - } - return -} - -// handleCmdLineArgsEdgeCase checks for and handles the 'go test file.go' edge case. -// Returns true if the edge case was detected and handled, false otherwise. -func handleCmdLineArgsEdgeCase(outputMgr *outputManager, failedTests []reports.TestResult, cfg *runConfig) bool { - foundCommandLineArgs := false - if len(cfg.TestCmds) > 0 { - for _, test := range failedTests { - if test.TestPackage == "command-line-arguments" { - foundCommandLineArgs = true - break - } - } - } - - if foundCommandLineArgs { - warningMsg := "WARNING: Skipping reruns because 'go test ' was detected within --test-cmd. " + - "Flakeguard cannot reliably rerun these tests. " + - "Final results will be based on the initial run only. " + - "To enable reruns, use 'go test . -run TestPattern' instead of 'go test ' within your --test-cmd." - log.Warn().Msg(warningMsg) - outputMgr.detail("%s", warningMsg) - return true - } - return false -} - -// init sets up the cobra command flags. -func init() { - RunTestsCmd.Flags().StringP("project-path", "r", ".", "The path to the Go project. Default is the current directory. Useful for subprojects") - RunTestsCmd.Flags().StringP("codeowners-path", "", "", "Path to the CODEOWNERS file") - RunTestsCmd.Flags().String("test-packages-json", "", "JSON-encoded string of test packages") - RunTestsCmd.Flags().StringSlice("test-packages", nil, "Comma-separated list of test packages to run") - RunTestsCmd.Flags().StringArray("test-cmd", nil, - "Optional custom test command(s) (e.g. 'go test -json ./... -v'), which must produce 'go test -json' output. "+ - "Avoid 'go test ' syntax as it prevents reliable reruns. Use 'go test . -run TestName' instead. "+ - "Can be specified multiple times.", - ) - RunTestsCmd.Flags().StringSlice("skip-tests", nil, "Comma-separated list of test names (regex supported by `go test -skip`) to skip") - RunTestsCmd.Flags().StringSlice("select-tests", nil, "Comma-separated list of test names (regex supported by `go test -run`) to specifically run") - RunTestsCmd.Flags().IntP("run-count", "c", 1, "Number of times to run the tests (for main run)") - RunTestsCmd.Flags().Int("rerun-failed-count", 0, "Number of times to rerun tests that failed the main run (0 disables reruns)") - RunTestsCmd.Flags().StringArray("tags", nil, "Passed on to the 'go test' command as the -tags flag") - RunTestsCmd.Flags().String("go-test-timeout", "", "Passed on to the 'go test' command as the -timeout flag (e.g., '30m')") - RunTestsCmd.Flags().Int("go-test-count", -1, "Passes the '-count' flag directly to 'go test'. Default (-1) omits the flag.") - RunTestsCmd.Flags().Bool("race", false, "Enable the race detector (-race flag for 'go test')") - RunTestsCmd.Flags().Bool("shuffle", false, "Enable test shuffling ('go test -shuffle=on')") - RunTestsCmd.Flags().String("shuffle-seed", "", "Set seed for test shuffling. Requires --shuffle. ('go test -shuffle=on -shuffle.seed=...')") - RunTestsCmd.Flags().Bool("fail-fast", false, "Stop test execution on the first failure (-failfast flag for 'go test')") - RunTestsCmd.Flags().String("main-results-path", "", "Path to save the main test results (JSON format)") - RunTestsCmd.Flags().String("rerun-results-path", "", "Path to save the rerun test results (JSON format)") - RunTestsCmd.Flags().Bool("omit-test-outputs-on-success", true, "DEPRECATED: No longer used, as all logs are shown at the end.") - _ = RunTestsCmd.Flags().MarkDeprecated("omit-test-outputs-on-success", "no longer used, as all logs are shown at the end.") - RunTestsCmd.Flags().Bool("ignore-parent-failures-on-subtests", false, "Ignore failures in parent tests when only subtests fail (affects parsing)") - RunTestsCmd.Flags().Float64("min-pass-ratio", 1.0, "The minimum pass ratio (0.0-1.0) required for a test in the main run to be considered stable (relevant only if reruns are disabled).") - RunTestsCmd.Flags().Float64("max-pass-ratio", 1.0, "DEPRECATED: Use --min-pass-ratio instead. This flag will be removed in a future version.") - _ = RunTestsCmd.Flags().MarkDeprecated("max-pass-ratio", "use --min-pass-ratio instead") -} - -// checkDependencies runs 'go mod tidy' to ensure dependencies are correct. -func checkDependencies(projectPath string) error { - log.Debug().Str("path", projectPath).Msg("Running 'go mod tidy' to check dependencies...") - cmd := exec.Command("go", "mod", "tidy") - cmd.Dir = projectPath - - var out bytes.Buffer - cmd.Stdout = &out - cmd.Stderr = &out - - if err := cmd.Run(); err != nil { - log.Warn().Err(err).Str("output", out.String()).Msg("Dependency check ('go mod tidy') failed. Continuing execution, but dependencies might be inconsistent.") - return fmt.Errorf("dependency check ('go mod tidy') failed: %w - %s", err, out.String()) - } else { - log.Debug().Msg("'go mod tidy' completed successfully.") - } - return nil -} diff --git a/tools/flakeguard/cmd/send_to_splunk.go b/tools/flakeguard/cmd/send_to_splunk.go deleted file mode 100644 index 63ab3e115..000000000 --- a/tools/flakeguard/cmd/send_to_splunk.go +++ /dev/null @@ -1,70 +0,0 @@ -package cmd - -import ( - "encoding/json" - "os" - - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/spf13/cobra" -) - -// SendToSplunkCmd sends a TestReport to a Splunk. -var SendToSplunkCmd = &cobra.Command{ - Use: "send-to-splunk", - Short: "Send TestReport data to Splunk", - Run: func(cmd *cobra.Command, args []string) { - reportPath, _ := cmd.Flags().GetString("report-path") - splunkURL, _ := cmd.Flags().GetString("splunk-url") - splunkToken, _ := cmd.Flags().GetString("splunk-token") - splunkEvent, _ := cmd.Flags().GetString("splunk-event") - failLogsURL, _ := cmd.Flags().GetString("failed-logs-url") - - // Read the report file. - data, err := os.ReadFile(reportPath) - if err != nil { - log.Error().Err(err).Str("path", reportPath).Msg("Error reading report file") - os.Exit(1) - } - - // Unmarshal JSON data into the TestReport struct. - var testReport reports.TestReport - if err := json.Unmarshal(data, &testReport); err != nil { - log.Error().Err(err).Msg("Error unmarshalling report JSON") - os.Exit(1) - } - - if failLogsURL != "" { - testReport.FailedLogsURL = failLogsURL - } - - // Send the test report to Splunk. - err = reports.SendTestReportToSplunk(splunkURL, splunkToken, splunkEvent, testReport) - if err != nil { - log.Error().Err(err).Msg("Error sending test report to Splunk") - os.Exit(1) - } - - log.Info().Msg("Successfully sent test report to Splunk") - }, -} - -func init() { - // Define flags for the new command. - SendToSplunkCmd.Flags().String("report-path", "", "Path to the test report JSON file (required)") - SendToSplunkCmd.Flags().String("failed-logs-url", "", "Optional URL linking to additional logs for failed tests") - SendToSplunkCmd.Flags().String("splunk-url", "", "Optional URL to send the test results to Splunk") - SendToSplunkCmd.Flags().String("splunk-token", "", "Optional Splunk HEC token to send the test results") - SendToSplunkCmd.Flags().String("splunk-event", "", "Optional Splunk event to send as the triggering event for the test results") - - // Mark required flags. - if err := SendToSplunkCmd.MarkFlagRequired("report-path"); err != nil { - log.Fatal().Err(err).Msg("Error marking report-path flag as required") - } - if err := SendToSplunkCmd.MarkFlagRequired("splunk-url"); err != nil { - log.Fatal().Err(err).Msg("Error marking splunk-url flag as required") - } - if err := SendToSplunkCmd.MarkFlagRequired("splunk-token"); err != nil { - log.Fatal().Err(err).Msg("Error marking splunk-token flag as required") - } -} diff --git a/tools/flakeguard/cmd/sync_jira.go b/tools/flakeguard/cmd/sync_jira.go deleted file mode 100644 index 665a5dc21..000000000 --- a/tools/flakeguard/cmd/sync_jira.go +++ /dev/null @@ -1,252 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "net/http" - "regexp" - "strings" - "time" // Import time package - - "github.com/andygrunwald/go-jira" - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/jirautils" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/localdb" // Use updated localdb - "github.com/spf13/cobra" -) - -// Flags specific to sync-jira command -var ( - syncJiraSearchLabels []string - syncTestDBPath string - syncDryRun bool -) - -var SyncJiraCmd = &cobra.Command{ - Use: "sync-jira", - Short: "Sync Jira tickets with local database", - Long: `Scans Jira for flaky test tickets and ensures they exist in the local database. - -This command performs the following actions: -1. Searches Jira for all tickets matching the specified labels (default: flakey_test, flaky_test). -2. Fetches ticket summary and assignee information. -3. Compares the found Jira tickets against the local database (by Jira Key). -4. Adds entries to the local database for any Jira tickets not found locally. - - Note: TestPackage will be empty for newly added entries as it cannot be reliably determined from Jira. -5. Updates the Assignee ID in the local database if it differs from the one in Jira. -6. Use --dry-run to preview changes without modifying the local database.`, - RunE: func(cmd *cobra.Command, args []string) error { - log.Info().Strs("labels", syncJiraSearchLabels).Msg("Using Jira search labels") - - db, err := localdb.LoadDBWithPath(syncTestDBPath) - if err != nil { - log.Error().Err(err).Str("path", syncTestDBPath).Msg("Failed to load or decode local DB") - return fmt.Errorf("failed to load local DB from %s: %w", syncTestDBPath, err) - } - - client, err := jirautils.GetJiraClient() - if err != nil { - log.Error().Err(err).Msg("Failed to create Jira client") - return err - } - log.Info().Msg("Jira client created successfully.") - - var ( - jql = fmt.Sprintf(`labels IN (%s) ORDER BY created DESC`, strings.Join(syncJiraSearchLabels, ",")) - startAt int - allIssues []jira.Issue - totalTicketsInJira int - ) - - log.Info().Str("jql", jql).Msg("Searching Jira for tickets...") - for { - issues, resp, searchErr := client.Issue.SearchWithContext(context.Background(), jql, &jira.SearchOptions{ - StartAt: startAt, - MaxResults: 50, // Fetch in batches - Fields: []string{"summary", "assignee", "status", "created", "description"}, - }) - if searchErr != nil || resp.StatusCode != http.StatusOK { - errMsg := jirautils.ReadJiraErrorResponse(resp) - log.Error(). - Err(searchErr). - Int("status", resp.StatusCode). - Str("jql", jql). - Str("response", errMsg). - Msg("Error searching Jira") - return fmt.Errorf("error searching Jira: %w (response: %s)", searchErr, errMsg) - } - totalTicketsInJira = resp.Total - - if len(issues) == 0 { - break - } - allIssues = append(allIssues, issues...) - startAt += len(issues) - log.Debug().Int("fetched", len(issues)).Int("total_fetched", startAt).Int("jira_total", totalTicketsInJira).Msg("Fetched batch of issues from Jira") - - if totalTicketsInJira > 0 && startAt >= totalTicketsInJira { - break - } - } - if len(allIssues) == 0 { - log.Warn().Msg("No matching Jira tickets found") - } else { - log.Info().Int("count", len(allIssues)).Msg("Fetched all matching Jira tickets") - } - - var ( - addedCount int - updatedCount int - closedCount int - skippedCount int - assigneeUpdatedCount int - dbModified bool - ) - - // Get all current DB entries for efficient lookup by Jira Key - // Note: This map uses JiraKey as the map key, NOT the internal pkg::name key. - // This is specific to this command's logic for comparing against Jira search results. - existingEntries := db.GetAllEntries() - entryMapByJiraKey := make(map[string]localdb.Entry, len(existingEntries)) - for _, entry := range existingEntries { - if entry.JiraTicket != "" { - entryMapByJiraKey[entry.JiraTicket] = entry - } - } - log.Debug().Int("count", len(entryMapByJiraKey)).Msg("Read existing DB entries by Jira Key") - - for _, issue := range allIssues { - summary := issue.Fields.Summary - testName, testPackage := extractTestNameAndPackage(summary, issue.Fields.Description) - if testName == "" { - log.Warn().Str("summary", summary).Str("key", issue.Key).Msg("Could not extract test name from summary, skipping.") - skippedCount++ - continue - } - - // Get assignee ID from Jira issue fields - var assigneeID string - if issue.Fields.Assignee != nil { - assigneeID = issue.Fields.Assignee.AccountID // Use AccountID - if assigneeID == "" { - log.Warn().Str("key", issue.Key).Str("assigneeName", issue.Fields.Assignee.Name).Msg("Assignee found but AccountID is empty, trying Name.") - assigneeID = issue.Fields.Assignee.Name // Fallback? Check what Jira requires. AccountID is preferred. - } - } - - issueClosed := issue.Fields.Status.Name == "Closed" - // Check if this ticket (by Jira Key) is already in our local DB map - if entry, exists := entryMapByJiraKey[issue.Key]; exists { // Ticket exists in DB - // Check if the ticket is closed and remove it as an active entry - if issueClosed && entry.JiraTicket != "" { - closedCount++ - log.Info().Str("key", issue.Key).Str("jira_ticket", entry.JiraTicket).Msg("Ticket is closed, marking as inactive.") - if !syncDryRun { - err := db.UpsertEntry(entry.TestPackage, entry.TestName, "", entry.SkippedAt, entry.AssigneeID) - if err != nil { - log.Error().Err(err).Str("key", issue.Key).Str("jira_ticket", entry.JiraTicket).Msg("Failed to mark ticket as inactive in local DB") - } else { - dbModified = true - log.Info().Str("key", issue.Key).Str("jira_ticket", entry.JiraTicket).Msg("Successfully marked ticket as inactive in local DB.") - } - } else { - log.Info().Str("key", issue.Key).Str("jira_ticket", entry.JiraTicket).Msg("[Dry Run] Would mark ticket as inactive.") - } - continue - } - - updatedCount++ - // Check if the assignee needs updating - if entry.AssigneeID != assigneeID { - log.Info().Str("key", issue.Key).Str("old_assignee", entry.AssigneeID).Str("new_assignee", assigneeID).Msg("Assignee mismatch found.") - if !syncDryRun { - errUpsert := db.UpsertEntry(entry.TestPackage, entry.TestName, entry.JiraTicket, entry.SkippedAt, assigneeID) // Pass new assigneeID - if errUpsert != nil { - log.Error().Err(errUpsert).Str("key", issue.Key).Msg("Failed to update assignee in local DB") - } else { - assigneeUpdatedCount++ - dbModified = true - log.Info().Str("key", issue.Key).Str("new_assignee", assigneeID).Msg("Successfully updated assignee in local DB.") - } - } else { - // In dry run, just log the potential update and increment counter - assigneeUpdatedCount++ - log.Info().Str("key", issue.Key).Str("new_assignee", assigneeID).Msg("[Dry Run] Would update assignee.") - } - } else { - log.Debug().Str("key", issue.Key).Msg("Existing ticket found in DB, assignee matches.") - } - } else if !issueClosed { - // Ticket NOT found in DB, add it - log.Info().Str("key", issue.Key).Str("test", testName).Str("assignee", assigneeID).Msg("New ticket found in Jira, adding to DB.") - if !syncDryRun { - errUpsert := db.UpsertEntry(testPackage, testName, issue.Key, time.Time(issue.Fields.Created), assigneeID) - if errUpsert != nil { - log.Error().Err(errUpsert).Str("key", issue.Key).Msg("Failed to add new ticket to local DB") - } else { - addedCount++ - dbModified = true - log.Info().Str("key", issue.Key).Msg("Successfully added new ticket to local DB.") - } - } else { - addedCount++ - log.Info().Str("key", issue.Key).Str("test", testName).Str("assignee", assigneeID).Msg("[Dry Run] Would add new ticket.") - } - } - } - - if !syncDryRun && dbModified { - if err := db.Save(); err != nil { - log.Error().Err(err).Msg("Failed to save updated local DB") - return fmt.Errorf("failed to save local DB changes: %w", err) - } - log.Info().Str("path", db.FilePath()).Msg("Local DB saved with updates.") - } else if syncDryRun { - log.Info().Msg("Dry run finished. No changes saved to local DB.") - } else { - log.Info().Msg("No changes detected requiring DB save.") - } - - fmt.Printf("\n--- Sync Summary ---\n") - fmt.Printf("Total Jira tickets scanned: %d\n", len(allIssues)) - fmt.Printf("Tickets added to local DB: %d\n", addedCount) - fmt.Printf("Tickets already in local DB: %d\n", updatedCount) - fmt.Printf("Tickets found closed: %d\n", closedCount) - fmt.Printf("Assignees updated in local DB: %d\n", assigneeUpdatedCount) - fmt.Printf("Tickets skipped (parse error): %d\n", skippedCount) - if syncDryRun { - fmt.Printf("\n** Dry Run Mode: No changes were saved to the local database. **\n") - } else if dbModified { - fmt.Printf("\nLocal database updated: %s\n", db.FilePath()) - } else { - fmt.Printf("\nLocal database is already up-to-date.\n") - } - - return nil - }, -} - -func init() { - SyncJiraCmd.Flags().StringVar(&syncTestDBPath, "test-db-path", localdb.DefaultDBPath(), "Path to the flaky test JSON database") - SyncJiraCmd.Flags().StringSliceVar(&syncJiraSearchLabels, "jira-search-labels", []string{"flaky_test", "flakey_test"}, "Jira labels used to find flaky test tickets") - SyncJiraCmd.Flags().BoolVar(&syncDryRun, "dry-run", false, "If true, only show what would be changed without saving") -} - -var ( - testNameRegex = regexp.MustCompile(`(Test[^\s]+)`) - testPackageRegex = regexp.MustCompile(`([a-zA-Z0-9.-]+(?:/[a-zA-Z0-9._-]+)+)`) -) - -func extractTestNameAndPackage(summary, description string) (testName, testPackage string) { - summary = strings.TrimSpace(summary) - summary = strings.TrimPrefix(summary, "Fix Flaky Test:") - testName = testNameRegex.FindString(summary) - if testName == "" { - testName = testNameRegex.FindString(description) - } - testPackage = testPackageRegex.FindString(description) - if testPackage == "" { - testPackage = testPackageRegex.FindString(summary) - } - return strings.TrimSpace(testName), strings.TrimSpace(testPackage) -} diff --git a/tools/flakeguard/codeowners/parser.go b/tools/flakeguard/codeowners/parser.go deleted file mode 100644 index 540a7e4be..000000000 --- a/tools/flakeguard/codeowners/parser.go +++ /dev/null @@ -1,86 +0,0 @@ -package codeowners - -import ( - "bufio" - "os" - "path" - "path/filepath" - "regexp" - "strings" - - "github.com/rs/zerolog/log" -) - -// PatternOwner maps a file pattern to its owners -type PatternOwner struct { - Pattern string - Owners []string -} - -// Parse reads the CODEOWNERS file and returns a list of PatternOwner -func Parse(filePath string) ([]PatternOwner, error) { - file, err := os.Open(filePath) - if err != nil { - return nil, err - } - defer file.Close() - - var patterns []PatternOwner - scanner := bufio.NewScanner(file) - commentPattern := regexp.MustCompile(`^\s*#`) - - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if line == "" || commentPattern.MatchString(line) { - continue - } - - fields := strings.Fields(line) - if len(fields) > 1 { - patterns = append(patterns, PatternOwner{ - Pattern: filepath.ToSlash(fields[0]), // Normalize to Unix-style - Owners: fields[1:], - }) - } - } - return patterns, scanner.Err() -} - -func IsWildcardPattern(pattern string) bool { - return strings.ContainsAny(pattern, "*?[") -} - -// FindOwners finds the owners of a file based on the CODEOWNERS patterns -func FindOwners(filePath string, patterns []PatternOwner) []string { - // Normalize the file path to Unix-style - relFilePath := filepath.ToSlash(filePath) - - var matchedOwners []string - for _, pattern := range patterns { - // Normalize the pattern to Unix-style and remove leading and trailing slashes - normalizedPattern := filepath.ToSlash(strings.TrimPrefix(pattern.Pattern, "/")) - normalizedPattern = strings.TrimSuffix(normalizedPattern, "/") - - if IsWildcardPattern(normalizedPattern) { - matched, err := path.Match(normalizedPattern, relFilePath) - if err != nil { - log.Error().Str("file", relFilePath).Str("pattern", normalizedPattern).Err(err).Msgf("Error matching pattern") - continue - } - - if matched { - matchedOwners = pattern.Owners - } - } else { - if relFilePath == normalizedPattern { - // Exact file or directory match - matchedOwners = pattern.Owners - } else if strings.HasPrefix(relFilePath, normalizedPattern+"/") { - // File is under the directory pattern - matchedOwners = pattern.Owners - } - } - } - - return matchedOwners -} diff --git a/tools/flakeguard/codeowners/parser_test.go b/tools/flakeguard/codeowners/parser_test.go deleted file mode 100644 index 5d4568645..000000000 --- a/tools/flakeguard/codeowners/parser_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package codeowners - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestFindOwners(t *testing.T) { - tests := []struct { - name string - filePath string - patterns []PatternOwner - expectedOwners []string - }{ - { - name: "Exact match", - filePath: "core/services/job/job_test.go", - patterns: []PatternOwner{ - {Pattern: "/core/services/job", Owners: []string{"@team1", "@team2"}}, // Leading / - }, - expectedOwners: []string{"@team1", "@team2"}, - }, - { - name: "Wildcard match", - filePath: "core/services/ocr_test.go", - patterns: []PatternOwner{ - {Pattern: "/core/services/ocr*", Owners: []string{"@ocr-team"}}, // Leading / - }, - expectedOwners: []string{"@ocr-team"}, - }, - { - name: "No match", - filePath: "core/services/unknown/unknown_test.go", - patterns: []PatternOwner{ - {Pattern: "/core/services/job", Owners: []string{"@team1"}}, // Leading / - {Pattern: "/core/services/ocr*", Owners: []string{"@ocr-team"}}, // Leading / - }, - expectedOwners: nil, - }, - { - name: "Multiple matches, last wins", - filePath: "core/services/ocr_test.go", - patterns: []PatternOwner{ - {Pattern: "/core/services/*", Owners: []string{"@general-team"}}, // Leading / - {Pattern: "/core/services/ocr*", Owners: []string{"@ocr-team"}}, // Leading / - }, - expectedOwners: []string{"@ocr-team"}, - }, - { - name: "Directory match", - filePath: "core/services/job/subdir/job_test.go", - patterns: []PatternOwner{ - {Pattern: "/core/services/job", Owners: []string{"@team1"}}, // Leading / - }, - expectedOwners: []string{"@team1"}, - }, - { - name: "Leading slash directory match", - filePath: "core/capabilities/compute/compute_test.go", - patterns: []PatternOwner{ - { - Pattern: "/core/capabilities/", - Owners: []string{"@smartcontractkit/keystone", "@smartcontractkit/capabilities-team"}, - }, - }, - expectedOwners: []string{"@smartcontractkit/keystone", "@smartcontractkit/capabilities-team"}, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - owners := FindOwners(test.filePath, test.patterns) - assert.Equal(t, test.expectedOwners, owners) - }) - } -} diff --git a/tools/flakeguard/e2e-flaky-test-guide.md b/tools/flakeguard/e2e-flaky-test-guide.md deleted file mode 100644 index b5b40957f..000000000 --- a/tools/flakeguard/e2e-flaky-test-guide.md +++ /dev/null @@ -1,179 +0,0 @@ -# Finding the Root Cause of Test Flakes in Go - -Flaky tests can arise from many sources and can be frustrating to fix. Here's a non-exhaustive guide to help you find and resolve common causes for flakes in Go. But first, to answer a common question... - -## The Test Only Flakes 0.xx% of the Time, Why Bother Fixing It? - -You bother fixing it because of **MATH!** - -Let's imagine a large repo with 10,000 tests, and let's imagine only 100 (1%) of them are flaky. Let's further imagine that each of those flaky tests has a chance of flaking 1% of the time. If you are a responsible dev that requires all of your tests to pass in CI before you merge, flaky tests have now become a massive headache. - -$$P(\text{at least one flaky test}) = 1 - (1 - 0.01)^{100}$$ - -$$P(\text{at least one flaky test}) \approx 63.40\%$$ - -Even a small percentage of tests with a small chance of flaking can cause massive damage to dev velocity. - -## General Tips - -Ideally, if you're dealing with a flaky test, you'll already have some examples of it flaking in front of you so you can dig through logs and stack traces and figure it out that way. If that's not the case, or you'd like some more evidence, or you're just stumped, try reproducing the flake. How you reproduce the flake is often the best clue as to why its flaking. - -For repos that have [flakeguard](https://github.com/smartcontractkit/chainlink-testing-framework/tree/main/tools/flakeguard) configured (like chainlink), you can try running it locally. - -```sh -make run_flakeguard_validate_unit_tests -``` - -You can also try some more precise configurations below. - -### 1. Run the Test in Isolation - -As we saw above, flaky tests become issues even when their chance of flaking is tiny. You might be hunting down a flake that only happens 0.5% of the time, so you're only real solution is to run the test over and over. - -```sh -# Run just that test 1,000 times, stopping after the first failure -go test ./package -run TestName -count 1000 -failfast -``` - -### 2. Run the Test Package - -Tests rarely run in isolation in the real world. If you can't get the flake to happen when isolated, try running the whole package on repeat. - -```sh -# Run all tests in the package over and over. -go test ./package -count 1000 -failfast -``` - -If you get the test to fail here, but not independently, it's likely that it depends on the execution of other tests in the package. Look for global resources your test could be sharing with others, and do your best to isolate all of your unit tests. - -### 3. Randomize Test Order - -If that's still not doing the job, or you're still scratching your head, try randomizing the test order. Go runs tests in a deterministic order by default, but Go's idea of "deterministic" is pretty liberal. - -```sh -# -shuffle randomizes test order -go test ./package -shuffle on -count 1000 -failfast -# You can supply your own int value to shuffle as a seed -go test ./package -shuffle 15 -count 1000 -failfast -``` - -### 4. Check for Races - -If your test is failing in a situation like this, it's possible there's a race condition it's getting caught on. Go's `-race` flag isn't guaranteed to catch all races every time. Just like flakes, you sometimes just need to get lucky (unlucky?). - -```sh -# Tests with -race detection take longer to run, and aren't always going to catch issues, especially in large test suites. -go test ./package -race -shuffle on -count 100 -failfast -``` - -### 5. Emulate Your Target System - -Tests will often fail in CI, but not locally. You can try re-running the test in CI, but this might take a long time, cost a lot of money, or generally be annoying. There are a few tricks you can do to emulate CI environments locally. - -#### 5.1 Play with -cpu and -parallel - -You can artificially constrain or expand parallel execution directly in go. [GOMAXPROCS](https://pkg.go.dev/runtime#hdr-Environment_Variables) is set to the amount of CPUs your system has by default, and controls how many OS threads can run Go code at once. You can manipulate this value, or otherwise play with how many tests can run at once easily. This can help you figure out if resource constraints are hurting your tests. - -```sh -# Use -cpu to change GOMAXPROCS. You can supply a list of values to try out different values at once -go test ./package -shuffle 15 -count 1000 -failfast -cpu 1,2,4 -# Use -parallel to set the max amount of tests allowed to run in parallel at once -go test ./package -shuffle 15 -count 1000 -failfast -parallel 4 -``` - -#### 5.2 Use Docker - -Docker can help you emulate your CI environment a little better. You can lookup what type of GitHub Actions runner your CI workflow uses by matching to the lists [here](https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories) and [here](https://docs.github.com/en/actions/using-github-hosted-runners/using-larger-runners/about-larger-runners#specifications-for-general-larger-runners). You can then package your Go tests in a Docker container, and run them with varying resources. - -```sh -# Run the default 4-core-16GB ubuntu-latest image used for public GitHub repos -docker run -it --cpus=4 --memory="16g" ubuntu-24.04 -``` - -You can also try using [dockexec](https://github.com/mvdan/dockexec) for convenience, but I've never personally tried it. - -#### 5.3 Use act - -[act](https://github.com/nektos/act) is a project that lets you emulate your GitHub Actions workflows locally. It's not perfect, and can be tricky to setup for more complex workflows, but it is a nice option for if you suspect issues are further back in the workflow, and don't want to run the full CI process. - -### 6. Use Your Target System - -Sometimes you can only discover the truth by going directly to the source. Before you do so, please double check what `runs_on` systems your workflows use. If you're only using `ubuntu-latest` runners, these runs should be free, or at least very cheap. `8-core`, `16-core`, and `32-core` workflows can become very expensive, very quickly. Please use caution and discretion when running these workflows repeatedly. - -#### 6.1 CI Resource Constraints - -It is sometimes the case that tests only fail in CI environments because those environments are underpowered. **This is more rare than you think, be cautious of [System 1 thinking](https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow) here.** You can diagnose this with [this excellent GitHub workflow telemetry action](https://github.com/catchpoint/workflow-telemetry-action) that can give you detailed stats on how many resources your tests are consuming. (This is also handy if you're looking to optimize your CI runtimes or costs.) If your tests are flaking due to low resources, consider other options before just increasing the power of the CI runners. [Increasing the power of a GitHub Actions workflow by a single tier doubles its cost](https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions#per-minute-rates-for-x64-powered-larger-runners). If your workflow runs often, you can burn a lot of cash quickly. You can otherwise try strategies like: - -* Splitting the tests into different workflows, each running on `ubuntu-latest` -* Moving more resource-hungry tests to run only on nightly cadences -* Try removing `t.Parallel()` from subtests, as too many tests trying to run at once will often hurt stability and runtimes on smaller machines - -### 7. Fix It! - -Maybe you've found the source of the flake and are now drilling down into the reasons why. Whatever those reasons might be, I urge you to, at least briefly, reframe the problem and ask if the test is actually working as intended, and it is revealing flaky behavior in your application instead. Consider that you might have found a rare bug, rather than a rare flake. - -### 8. Give Up - -It's not my favorite answer, but sometimes this truly is the solution. It's hard to know exactly when you should abandon hope, but maybe the below steps can help you figure it out. - -#### 8.1 Evaluate the Importance of the Test - -Ask yourself these questions to help figure out if it's worth working on this flake further, and to help you figure out what to do next. - -* What does the test actually check? Is it a critical path? -* Is the test flaking because it's a bad test? Or it's trying to test behavior that shouldn't or can't be tested? -* Can you write a new test that checks the same behavior, but doesn't fall to the same issues? -* Can you come back to this later? Maybe in a week or two you'll have new ideas, or maybe the underlying system will change in ways that this flake is no longer an issue? - -#### 8.2 Turn it Off - -Assuming you're ready to declare defeat, it's time to turn off the test. How you do this depends on the test, your team, and the answers to the questions above. If you've determined the test isn't particularly important and isn't worth running anymore, you should just delete it. - -If the test does check crucial behavior and you'd like to return to it, please consider this general flow: - -1. Make a ticket noting the flake, and write down as much as you've figured out so far. Ideally have the ticket setup to remind you or your team in a couple of weeks that it's still there. -2. Mark the test with `t.Skip("Flaky:")` so that Flakeguard can properly identify tests that are being skipped for flaky issues. - -## Chainlink E2E Tests - -At CLL, we have specially designed E2E tests that run in Docker and Kubernetes environments. They're more thorough validations of our systems, and much more complex than typical unit tests. - -### 1. Find Flakes - -If you don't already have some Flakeguard results to work with, you can run flakeguard on E2E tests easily with the following command from the `chainlink-core/` directory: - -```sh -cd chainlink-core/ -make run_flakeguard_validate_e2e_tests -``` - -You’ll be prompted to provide: -- **Test IDs** (e.g., `smoke/forwarders_ocr2_test.go:*,smoke/vrf_test.go:*`) - - *Note: Test IDs can be taken from the `e2e-tests.yml` file.* - -- **Number of runs** (default: 5) -- **Chainlink version** (default: develop) -- **Branch name** (default: develop) - -### 2. Explore Logs and Debug - -E2E tests are complex beasts, orchestrating many systems together at once. As such, the best strategy is usually to mark the time of the test failure, and get busy cross-referencing that timestamp across the logs of each component so you can see what was happening in each component in the test. The [CTF Debug Docs](https://smartcontractkit.github.io/chainlink-testing-framework/framework/components/debug.html) can help increase the logs you're collecting, and help use more traditional debugging tools like [Delve](https://github.com/go-delve/delve). - -### 3. Remember You're (Sort of) in the Real World - -E2E tests are meant to closely simulate real-world situations and deployments, so causes that never pop up in unit tests become common hazards: - -* **Networking issues**: A blip in networking connections can throw off timings, and make expected test states happen in an unexpected order. -* **Timing issues**: Many E2E tests are set to fail after not receiving an expected result after x seconds. It's possible blips in infrastructure and networking slow it down, and expanding this timeout can help stabilize things. -* **GitHub Actions degraded performance**: This is a common scapegoat for when you're frustrated, but it's worth [checking GitHub's status page](https://www.githubstatus.com/) for any incidents that might have occurred while your test was running. - -### 4. Check the Test's Resources - -E2E tests are much more resource hungry than your typical unit test suite. Much of what I mentioned in our general tips for [CI resources](####-6.1-ci-resource-constraints) applies here. You can turn on CI telemetry easily in most of our E2E tests by setting [collect_test_telemetry](https://github.com/smartcontractkit/.github/blob/main/.github/workflows/run-e2e-tests.yml#L174), like so: - -```yaml -uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@version -with: - collect_test_telemetry: true -``` \ No newline at end of file diff --git a/tools/flakeguard/flaky_tests_db.json b/tools/flakeguard/flaky_tests_db.json deleted file mode 100644 index 4af21479d..000000000 --- a/tools/flakeguard/flaky_tests_db.json +++ /dev/null @@ -1,1150 +0,0 @@ -{ - "github.com/smartcontractkit/chainlink/blob/develop/core/services/relay/evm/capabilities/workflows/syncer::Test_SecretsWorker": { - "test_package": "github.com/smartcontractkit/chainlink/blob/develop/core/services/relay/evm/capabilities/workflows/syncer", - "test_name": "Test_SecretsWorker", - "jira_ticket": "DX-732", - "jira_assignee_id": "610c6e93ae72b2006f798c06", - "skipped_at": "2025-05-07T16:57:09.753Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/crossfamily/v1_6::TestAddEVMSolanaLaneBidirectional/MCMS_disabled": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/crossfamily/v1_6", - "test_name": "TestAddEVMSolanaLaneBidirectional/MCMS_disabled", - "past_jira_tickets": [ - "DX-759" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/crossfamily/v1_6::TestAddEVMSolanaLaneBidirectional/MCMS_enabled": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/crossfamily/v1_6", - "test_name": "TestAddEVMSolanaLaneBidirectional/MCMS_enabled", - "past_jira_tickets": [ - "DX-758" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana::TestAddTokenPool": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana", - "test_name": "TestAddTokenPool", - "jira_ticket": "DX-580", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana::TestGenericOps": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana", - "test_name": "TestGenericOps", - "jira_ticket": "DX-433", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana::TestGenericOps/with_mcms": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana", - "test_name": "TestGenericOps/with_mcms", - "jira_ticket": "DX-437", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1::TestSyncUSDCDomainsWithChainsChangeset/Sync_domains_without_MCMS": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1", - "test_name": "TestSyncUSDCDomainsWithChainsChangeset/Sync_domains_without_MCMS", - "jira_ticket": "DX-112", - "jira_assignee_id": "620a6e93bba9ca0070c98e8f", - "skipped_at": "2025-03-10T11:11:41.184Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1::TestValidateSyncUSDCDomainsWithChainsConfig": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1", - "test_name": "TestValidateSyncUSDCDomainsWithChainsConfig", - "jira_ticket": "DX-195", - "jira_assignee_id": "620a6e93bba9ca0070c98e8f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1::TestValidateSyncUSDCDomainsWithChainsConfig/#00": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1", - "test_name": "TestValidateSyncUSDCDomainsWithChainsConfig/#00", - "jira_ticket": "DX-195", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1::TestValidateSyncUSDCDomainsWithChainsConfig/Domain_mapping_not_defined": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1", - "test_name": "TestValidateSyncUSDCDomainsWithChainsConfig/Domain_mapping_not_defined", - "jira_ticket": "DX-113", - "jira_assignee_id": "620a6e93bba9ca0070c98e8f", - "skipped_at": "2025-03-10T11:12:38.074Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6::TestUpdateBidirectionalLanesChangeset": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6", - "test_name": "TestUpdateBidirectionalLanesChangeset", - "jira_ticket": "DX-434", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6::TestUpdateBidirectionalLanesChangeset/Use_production_router_(with_MCMS)_\u0026_disable_afterwards": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6", - "test_name": "TestUpdateBidirectionalLanesChangeset/Use_production_router_(with_MCMS)_\u0026_disable_afterwards", - "jira_ticket": "DX-434", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset::TestDeployerGroupMCMS": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset", - "test_name": "TestDeployerGroupMCMS", - "jira_ticket": "DX-405", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset::TestDeployerGroupMCMS/happy_path": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/ccip/changeset", - "test_name": "TestDeployerGroupMCMS/happy_path", - "jira_ticket": "DX-405", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana::TestFundMCMSignersChangeset_Apply": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana", - "test_name": "TestFundMCMSignersChangeset_Apply", - "jira_ticket": "DX-403", - "jira_assignee_id": "712020:afdd2caf-8a45-4527-837e-537dc355ed2b", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana::TestTransferToMCMSToTimelockSolana": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana", - "test_name": "TestTransferToMCMSToTimelockSolana", - "jira_ticket": "DX-524", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana::TestUpdateTimelockDelaySolana_Apply": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana", - "test_name": "TestUpdateTimelockDelaySolana_Apply", - "jira_ticket": "DX-762", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state::TestMCMSWithTimelockState_GenerateMCMSWithTimelockViewSolana": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset/state", - "test_name": "TestMCMSWithTimelockState_GenerateMCMSWithTimelockViewSolana", - "jira_ticket": "DX-404", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset::TestDeployMCMSWithTimelockV2SkipInitSolana": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset", - "test_name": "TestDeployMCMSWithTimelockV2SkipInitSolana", - "jira_ticket": "DX-438", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset::TestRenounceTimelockDeployerConfigValidate": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset", - "test_name": "TestRenounceTimelockDeployerConfigValidate", - "jira_ticket": "DX-724", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/changeset::TestValidateV2": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/changeset", - "test_name": "TestValidateV2", - "jira_ticket": "DX-439", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/common/proposalutils::TestBuildProposalFromBatchesV2": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/common/proposalutils", - "test_name": "TestBuildProposalFromBatchesV2", - "jira_ticket": "DX-526", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset::TestAcceptOwnership": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset", - "test_name": "TestAcceptOwnership", - "jira_ticket": "DX-627", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset::TestUpdateDataIDProxyMap": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset", - "test_name": "TestUpdateDataIDProxyMap", - "past_jira_tickets": [ - "DX-576" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/data-streams/changeset/verifier-proxy/v0.5.0::TestInitializeVerifier": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/data-streams/changeset/verifier-proxy/v0.5.0", - "test_name": "TestInitializeVerifier", - "jira_ticket": "DX-260", - "jira_assignee_id": "641949fb1273131f2ae1dd4e", - "skipped_at": "2025-03-19T15:46:29.979Z" - }, - "github.com/smartcontractkit/chainlink/deployment/data-streams/changeset::TestDistributeBootstrapJobSpecs": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/data-streams/changeset", - "test_name": "TestDistributeBootstrapJobSpecs", - "past_jira_tickets": [ - "DX-196" - ], - "jira_assignee_id": "641949fb1273131f2ae1dd4e", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/data-streams/changeset::TestDistributeLLOJobSpecs": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/data-streams/changeset", - "test_name": "TestDistributeLLOJobSpecs", - "past_jira_tickets": [ - "DX-577" - ], - "jira_assignee_id": "641949fb1273131f2ae1dd4e", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/environment/crib::TestShouldProvideEnvironmentConfig": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/environment/crib", - "test_name": "TestShouldProvideEnvironmentConfig", - "jira_ticket": "DX-291", - "skipped_at": "2025-03-24T16:13:41.618985Z" - }, - "github.com/smartcontractkit/chainlink/deployment/environment/memory::TestJobClientJobAPI": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/environment/memory", - "test_name": "TestJobClientJobAPI", - "past_jira_tickets": [ - "DX-402" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/environment/memory::TestJobClientProposeJob": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/environment/memory", - "test_name": "TestJobClientProposeJob", - "past_jira_tickets": [ - "DX-432" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/keystone/changeset::TestAcceptAllOwnership": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/keystone/changeset", - "test_name": "TestAcceptAllOwnership", - "past_jira_tickets": [ - "DX-578" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/keystone/changeset::TestDeployFeedsConsumer": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/keystone/changeset", - "test_name": "TestDeployFeedsConsumer", - "past_jira_tickets": [ - "DX-579" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/keystone/changeset::TestKeystoneView": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/keystone/changeset", - "test_name": "TestKeystoneView", - "past_jira_tickets": [ - "DX-757" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/deployment/keystone/changeset::TestKeystoneView/successfully_generates_a_view_of_the_keystone_state_with_multiple_contracts_of_the_same_type_per_chain": { - "test_package": "github.com/smartcontractkit/chainlink/deployment/keystone/changeset", - "test_name": "TestKeystoneView/successfully_generates_a_view_of_the_keystone_state_with_multiple_contracts_of_the_same_type_per_chain", - "past_jira_tickets": [ - "DX-756" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/smoke::TestSmokeCCIPMulticall": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/smoke", - "test_name": "TestSmokeCCIPMulticall", - "past_jira_tickets": [ - "DX-760" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/smoke::TestSmokeCCIPOnRampLimits": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/smoke", - "test_name": "TestSmokeCCIPOnRampLimits", - "jira_ticket": "DX-124", - "jira_assignee_id": "712020:0403445b-a590-4e71-944c-e5b3c681dafb", - "skipped_at": "2025-03-10T11:40:18.329Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestDeleteCCIPJobs": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestDeleteCCIPJobs", - "past_jira_tickets": [ - "DX-717" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_DifferentRmnNodesForDifferentChains": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_DifferentRmnNodesForDifferentChains", - "past_jira_tickets": [ - "DX-202" - ], - "jira_assignee_id": "712020:97d1a977-ba60-4d03-a15e-369daf238718", - "skipped_at": "2025-03-24T16:08:45.515288Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_DifferentSigners": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_DifferentSigners", - "past_jira_tickets": [ - "DX-200" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_GlobalCurseTwoMessagesOnTwoLanes": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_GlobalCurseTwoMessagesOnTwoLanes", - "jira_ticket": "DX-294", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "2025-03-24T16:08:45.515288Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_IncorrectSig": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_IncorrectSig", - "jira_ticket": "DX-396", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_MultipleMessagesOnOneLaneNoWaitForExec": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_MultipleMessagesOnOneLaneNoWaitForExec", - "jira_ticket": "DX-201", - "jira_assignee_id": "712020:97d1a977-ba60-4d03-a15e-369daf238718", - "skipped_at": "2025-03-24T16:08:45.515288Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_NotEnoughObservers": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_NotEnoughObservers", - "jira_ticket": "DX-295", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "2025-03-24T16:05:20.79639Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_NotEnoughSigners": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_NotEnoughSigners", - "jira_ticket": "DX-296", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "2025-03-24T16:07:58.289626Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_TwoMessagesOnTwoLanesIncludingBatching": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_TwoMessagesOnTwoLanesIncludingBatching", - "past_jira_tickets": [ - "DX-199" - ], - "jira_assignee_id": "712020:97d1a977-ba60-4d03-a15e-369daf238718", - "skipped_at": "2025-03-24T16:07:10.367387Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_TwoMessagesOnTwoLanesIncludingBatchingWithTemporaryPause": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_TwoMessagesOnTwoLanesIncludingBatchingWithTemporaryPause", - "past_jira_tickets": [ - "DX-123" - ], - "jira_assignee_id": "712020:97d1a977-ba60-4d03-a15e-369daf238718", - "skipped_at": "2025-03-24T16:09:29.306211Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRMN_TwoMessagesOneSourceChainCursed": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRMN_TwoMessagesOneSourceChainCursed", - "jira_ticket": "DX-297", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "2025-03-24T16:13:24.263916Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestRevokeJobs": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestRevokeJobs", - "jira_ticket": "DX-566", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::TestV1_5_Message_RMNRemote_Curse_Uncurse": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "TestV1_5_Message_RMNRemote_Curse_Uncurse", - "jira_ticket": "DX-293", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "2025-03-24T16:06:00.975793Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::Test_CCIPGasPriceUpdatesDeviation": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "Test_CCIPGasPriceUpdatesDeviation", - "jira_ticket": "DX-567", - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::Test_CCIPGasPriceUpdatesWriteFrequency": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "Test_CCIPGasPriceUpdatesWriteFrequency", - "past_jira_tickets": [ - "DX-722" - ], - "jira_assignee_id": "6175d3e016119e0069fdd14f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip::Test_CCIPTokenPriceUpdates": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke/ccip", - "test_name": "Test_CCIPTokenPriceUpdates", - "past_jira_tickets": [ - "CCIP-4582" - ], - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationBasic/registry_2_2_with_logtrigger_and_mercury_v02": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationBasic/registry_2_2_with_logtrigger_and_mercury_v02", - "jira_ticket": "DX-522", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationBasic/registry_2_2_with_mercury_v03": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationBasic/registry_2_2_with_mercury_v03", - "jira_ticket": "DX-523", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_0": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_0", - "jira_ticket": "DX-618", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_1_conditional": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_1_conditional", - "jira_ticket": "DX-619", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_1_logtrigger": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_1_logtrigger", - "jira_ticket": "DX-620", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_1_with_logtrigger_and_mercury_v02": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_1_with_logtrigger_and_mercury_v02", - "jira_ticket": "DX-621", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_1_with_mercury_v02": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_1_with_mercury_v02", - "jira_ticket": "DX-622", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_1_with_mercury_v03": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_1_with_mercury_v03", - "jira_ticket": "DX-623", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_2_conditional": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_2_conditional", - "jira_ticket": "DX-613", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_2_logtrigger": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_2_logtrigger", - "jira_ticket": "DX-614", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_2_with_logtrigger_and_mercury_v02": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_2_with_logtrigger_and_mercury_v02", - "jira_ticket": "DX-615", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_2_with_mercury_v02": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_2_with_mercury_v02", - "jira_ticket": "DX-616", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestAutomationNodeUpgrade/registry_2_2_with_mercury_v03": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestAutomationNodeUpgrade/registry_2_2_with_mercury_v03", - "jira_ticket": "DX-617", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestForwarderOCR2Basic": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestForwarderOCR2Basic", - "past_jira_tickets": [ - "DX-561" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestForwarderOCRBasic": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestForwarderOCRBasic", - "past_jira_tickets": [ - "DX-564" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestKeeperBlockCountPerTurn/registry_1_2": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestKeeperBlockCountPerTurn/registry_1_2", - "jira_ticket": "DX-556", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestKeeperJobReplacement": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestKeeperJobReplacement", - "jira_ticket": "DX-624", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestKeeperNodeDown/registry_1_3": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestKeeperNodeDown/registry_1_3", - "jira_ticket": "DX-398", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestKeeperRemove/registry_1_1": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestKeeperRemove/registry_1_1", - "jira_ticket": "DX-521", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestKeeperRemove/registry_1_2": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestKeeperRemove/registry_1_2", - "jira_ticket": "DX-435", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestKeeperRemove/registry_1_3": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestKeeperRemove/registry_1_3", - "jira_ticket": "DX-557", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerFewFiltersFinalityTag": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerFewFiltersFinalityTag", - "past_jira_tickets": [ - "DX-718" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerFewFiltersFixedDepth": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerFewFiltersFixedDepth", - "past_jira_tickets": [ - "DX-704" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerReplayFinalityTag": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerReplayFinalityTag", - "past_jira_tickets": [ - "DX-719" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerReplayFixedDepth": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerReplayFixedDepth", - "past_jira_tickets": [ - "DX-720" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerWithChaosFinalityTag": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerWithChaosFinalityTag", - "past_jira_tickets": [ - "DX-562" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerWithChaosFixedDepth": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerWithChaosFixedDepth", - "past_jira_tickets": [ - "DX-705" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerWithChaosPostgresFinalityTag": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerWithChaosPostgresFinalityTag", - "past_jira_tickets": [ - "DX-563" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestLogPollerWithChaosPostgresFixedDepth": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestLogPollerWithChaosPostgresFixedDepth", - "past_jira_tickets": [ - "DX-721" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRBasic": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRBasic", - "past_jira_tickets": [ - "DX-706" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRJobReplacement": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRJobReplacement", - "past_jira_tickets": [ - "DX-528" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRv2Basic/legacy": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRv2Basic/legacy", - "past_jira_tickets": [ - "DX-701" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRv2Basic/legacy-chain-reader": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRv2Basic/legacy-chain-reader", - "past_jira_tickets": [ - "DX-702" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRv2Basic/plugins": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRv2Basic/plugins", - "past_jira_tickets": [ - "DX-700" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRv2Basic/plugins-chain-reader": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRv2Basic/plugins-chain-reader", - "past_jira_tickets": [ - "DX-703" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRv2JobReplacement": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRv2JobReplacement", - "past_jira_tickets": [ - "DX-723" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestOCRv2Request": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestOCRv2Request", - "past_jira_tickets": [ - "DX-699" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFBasic": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFBasic", - "past_jira_tickets": [ - "DX-707" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFJobReplacement": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFJobReplacement", - "past_jira_tickets": [ - "DX-708" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFOwner": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFOwner", - "jira_ticket": "DX-565", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFV2WithBHS": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFV2WithBHS", - "past_jira_tickets": [ - "DX-709" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2Basic": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2Basic", - "past_jira_tickets": [ - "DX-710" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2Basic/Oracle_Withdraw": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2Basic/Oracle_Withdraw", - "jira_ticket": "DX-527", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2Plus": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2Plus", - "past_jira_tickets": [ - "DX-711" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2PlusBatchFulfillmentEnabledDisabled": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2PlusBatchFulfillmentEnabledDisabled", - "past_jira_tickets": [ - "DX-712" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2PlusMigration": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2PlusMigration", - "past_jira_tickets": [ - "DX-713" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2PlusMultipleSendingKeys": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2PlusMultipleSendingKeys", - "past_jira_tickets": [ - "DX-714" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2PlusPendingBlockSimulationAndZeroConfirmationDelays": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2PlusPendingBlockSimulationAndZeroConfirmationDelays", - "past_jira_tickets": [ - "DX-715" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/integration-tests/smoke::TestVRFv2PlusReplayAfterTimeout": { - "test_package": "github.com/smartcontractkit/chainlink/integration-tests/smoke", - "test_name": "TestVRFv2PlusReplayAfterTimeout", - "past_jira_tickets": [ - "DX-716" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/system-tests/tests/smoke/cre::TestCRE_OCR3_PoR_Workflow_GatewayDon_MockedPrice": { - "test_package": "github.com/smartcontractkit/chainlink/system-tests/tests/smoke/cre", - "test_name": "TestCRE_OCR3_PoR_Workflow_GatewayDon_MockedPrice", - "jira_ticket": "DX-625", - "jira_assignee_id": "61b2b168744c4d006994b84c", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCache": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCache", - "jira_ticket": "DX-558", - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCache_AddDuplicatedModule": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCache_AddDuplicatedModule", - "jira_ticket": "DX-574", - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestComputeExecute": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestComputeExecute", - "jira_ticket": "DX-560", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestComputeFetchMaxResponseSizeBytes": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestComputeFetchMaxResponseSizeBytes", - "jira_ticket": "DX-626", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCompute_SpendValueRelativeToComputeTime": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCompute_SpendValueRelativeToComputeTime", - "jira_ticket": "DX-568", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCompute_SpendValueRelativeToComputeTime/0s": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCompute_SpendValueRelativeToComputeTime/0s", - "jira_ticket": "DX-569", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCompute_SpendValueRelativeToComputeTime/1s": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCompute_SpendValueRelativeToComputeTime/1s", - "jira_ticket": "DX-570", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCompute_SpendValueRelativeToComputeTime/2.5s": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCompute_SpendValueRelativeToComputeTime/2.5s", - "jira_ticket": "DX-571", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCompute_SpendValueRelativeToComputeTime/2s": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCompute_SpendValueRelativeToComputeTime/2s", - "jira_ticket": "DX-572", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute::TestCompute_SpendValueRelativeToComputeTime/3s": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/compute", - "test_name": "TestCompute_SpendValueRelativeToComputeTime/3s", - "jira_ticket": "DX-573", - "jira_assignee_id": "62ccc214c537f460d44519b6", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/integration_tests/keystone::Test_OneAtATimeTransmissionSchedule": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/integration_tests/keystone", - "test_name": "Test_OneAtATimeTransmissionSchedule", - "past_jira_tickets": [ - "DX-399" - ], - "jira_assignee_id": "63beffc42a526608c5501530", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/executable::Test_Client_TransmissionSchedules": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/executable", - "test_name": "Test_Client_TransmissionSchedules", - "jira_ticket": "DX-104", - "jira_assignee_id": "712020:255a47f2-cfd0-4186-b8b3-9c502314f726", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/executable::Test_RemoteExecutableCapability_TransmissionSchedules": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/executable", - "test_name": "Test_RemoteExecutableCapability_TransmissionSchedules", - "jira_ticket": "DX-108", - "jira_assignee_id": "712020:255a47f2-cfd0-4186-b8b3-9c502314f726", - "skipped_at": "2025-03-10T11:05:05.442Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders::TestFwdMgr_InvalidForwarderForOCR2FeedsStates": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders", - "test_name": "TestFwdMgr_InvalidForwarderForOCR2FeedsStates", - "past_jira_tickets": [ - "DX-525" - ], - "jira_assignee_id": "638f597c3e79f12e57253913", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr::TestEthBroadcaster_HederaBroadcastValidation": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr", - "test_name": "TestEthBroadcaster_HederaBroadcastValidation", - "jira_ticket": "DX-203", - "jira_assignee_id": "61452c1eeaef340069a02d4a", - "skipped_at": "2025-03-17T12:38:32.368Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/keeper::TestKeeperEthIntegration": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/keeper", - "test_name": "TestKeeperEthIntegration", - "jira_ticket": "DX-400", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/keeper::TestKeeperEthIntegration/eip1559_registry1_2": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/keeper", - "test_name": "TestKeeperEthIntegration/eip1559_registry1_2", - "jira_ticket": "DX-400", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/starkkey::TestStarknetKeyring_Marshal": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/starkkey", - "test_name": "TestStarknetKeyring_Marshal", - "past_jira_tickets": [ - "DX-559" - ], - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/llo/evm::TestReportCodecEVMStreamlined/Pack": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/llo/evm", - "test_name": "TestReportCodecEVMStreamlined/Pack", - "jira_ticket": "DX-257", - "jira_assignee_id": "610c6ea1ec92ab0070ec5c07", - "skipped_at": "2025-03-19T15:37:45.758Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/llo/evm::TestReportCodecEVMStreamlined/Verify": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/llo/evm", - "test_name": "TestReportCodecEVMStreamlined/Verify", - "jira_ticket": "DX-256", - "jira_assignee_id": "610c6ea1ec92ab0070ec5c07", - "skipped_at": "2025-03-19T15:19:49.294Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/llo::TestIntegration_LLO_multi_formats/offchainConfig={ProtocolVersion:1_DefaultMinReportIntervalNanoseconds:1}/generates_reports_using_multiple_formats": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/llo", - "test_name": "TestIntegration_LLO_multi_formats/offchainConfig={ProtocolVersion:1_DefaultMinReportIntervalNanoseconds:1}/generates_reports_using_multiple_formats", - "jira_ticket": "DX-258", - "jira_assignee_id": "610c6ea1ec92ab0070ec5c07", - "skipped_at": "2025-03-19T15:40:59.203Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider::TestIntegration_LogRecoverer_Backfill": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider", - "test_name": "TestIntegration_LogRecoverer_Backfill", - "past_jira_tickets": [ - "DX-121" - ], - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper::TestIntegration_KeeperPluginLogUpkeep_Retry": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper", - "test_name": "TestIntegration_KeeperPluginLogUpkeep_Retry", - "jira_ticket": "DX-575", - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon::TestArbitrumBlockTranslator_BinarySearch": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon", - "test_name": "TestArbitrumBlockTranslator_BinarySearch", - "jira_ticket": "DX-204", - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "2025-03-17T12:40:21.377Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon::Test_SingletonPeerWrapper_Close": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon", - "test_name": "Test_SingletonPeerWrapper_Close", - "jira_ticket": "DX-761", - "jira_assignee_id": "63beffc42a526608c5501530", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM#01": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM#01", - "jira_ticket": "DX-41", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM#01/Dynamically_typed_topics_can_be_used_to_filter_and_have_type_correct_in_return": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM#01/Dynamically_typed_topics_can_be_used_to_filter_and_have_type_correct_in_return", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM#01/Filtering_can_be_done_on_indexed_topics_that_get_hashed": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM#01/Filtering_can_be_done_on_indexed_topics_that_get_hashed", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM#01/Multiple_topics_can_filter_together": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM#01/Multiple_topics_can_filter_together", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM/QueryKeys": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM/QueryKeys", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM/QueryKeys/EVM": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM/QueryKeys/EVM", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsEvmTests/EVM/QueryKeys/EVM/QueryKeys_can_limit_results_with_cursor": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsEvmTests/EVM/QueryKeys/EVM/QueryKeys_can_limit_results_with_cursor", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparator": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparator", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparator_on_a_nested_field": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparator_on_a_nested_field", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparator_on_field_that_follows_a_dynamic_field": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparator_on_field_that_follows_a_dynamic_field", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparators_on_fields_that_require_manual_index_input": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop#01/Filtering_can_be_done_on_data_words_using_value_comparators_on_fields_that_require_manual_index_input", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop/QueryKeys": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop/QueryKeys", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop/QueryKeys/EVM_on_loop": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop/QueryKeys/EVM_on_loop", - "jira_ticket": "DX-401", - "jira_assignee_id": "61c3bc0d68926d0068ad903d", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm::TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop/QueryKeys/EVM_on_loop/QueryKeys_can_limit_results_with_cursor": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm", - "test_name": "TestChainComponents/RunChainComponentsInLoopEvmTests/EVM_on_loop/QueryKeys/EVM_on_loop/QueryKeys_can_limit_results_with_cursor", - "jira_ticket": "DX-401", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/vrf/v2::TestVRFV2PlusIntegration_CancelSubscription": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/vrf/v2", - "test_name": "TestVRFV2PlusIntegration_CancelSubscription", - "jira_ticket": "DX-205", - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "2025-03-17T12:41:53.241Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer::TestEngineRegistry": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer", - "test_name": "TestEngineRegistry", - "past_jira_tickets": [ - "DX-588" - ], - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2/core/services/workflows::TestEngine_ConcurrentExecutions": { - "test_package": "github.com/smartcontractkit/chainlink/v2/core/services/workflows", - "test_name": "TestEngine_ConcurrentExecutions", - "jira_ticket": "DX-397", - "jira_assignee_id": "712020:0f7e9a75-6933-4dcb-91fd-b6bf1c903d6f", - "skipped_at": "0001-01-01T00:00:00Z" - }, - "github.com/smartcontractkit/chainlink/v2::TestScripts/health/default": { - "test_package": "github.com/smartcontractkit/chainlink/v2", - "test_name": "TestScripts/health/default", - "past_jira_tickets": [ - "DX-109" - ], - "jira_assignee_id": "6115c23730fe4500702c1301", - "skipped_at": "2025-03-24T16:08:31.91215Z" - } -} diff --git a/tools/flakeguard/git/git.go b/tools/flakeguard/git/git.go deleted file mode 100644 index 9a3022a5f..000000000 --- a/tools/flakeguard/git/git.go +++ /dev/null @@ -1,263 +0,0 @@ -package git - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - "syscall" - - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/utils" -) - -// FindChangedFiles executes a git diff against a specified base reference and pipes the output through a user-defined grep command or sequence. -// The baseRef parameter specifies the base git reference for comparison (e.g., "main", "develop"). -// The filterCmd parameter should include the full command to be executed after git diff, such as "grep '_test.go$'" or "grep -v '_test.go$' | sort". -func FindChangedFiles(rootGoModPath, baseRef, filterCmd string) ([]string, error) { - // Find directories containing a go.mod file and build an exclusion string - excludeStr, err := buildExcludeStringForGoModDirs(rootGoModPath) - if err != nil { - return nil, fmt.Errorf("error finding go.mod directories: %w", err) - } - - // First command to list files changed between the baseRef and HEAD, excluding specified paths - diffCmdStr := fmt.Sprintf("git diff --name-only --diff-filter=AM %s...HEAD -- %s %s", baseRef, rootGoModPath, excludeStr) - diffCmd := exec.Command("bash", "-c", diffCmdStr) - - // Using a buffer to capture stdout and a separate buffer for stderr - var out bytes.Buffer - var errBuf bytes.Buffer - diffCmd.Stdout = &out - diffCmd.Stderr = &errBuf - - // Running the diff command - if err := diffCmd.Run(); err != nil { - return nil, fmt.Errorf("error executing git diff command: %s; error: %w; stderr: %s", diffCmdStr, err, errBuf.String()) - } - - // Check if there are any files listed; if not, return an empty slice - diffOutput := strings.TrimSpace(out.String()) - if diffOutput == "" { - return []string{}, nil - } - - // Second command to filter files using grepCmd - grepCmdStr := fmt.Sprintf("echo '%s' | %s", diffOutput, filterCmd) - grepCmd := exec.Command("bash", "-c", grepCmdStr) - - // Reset buffers for reuse - out.Reset() - errBuf.Reset() - grepCmd.Stdout = &out - grepCmd.Stderr = &errBuf - - // Running the grep command - if err := grepCmd.Run(); err != nil { - if exiterr, ok := err.(*exec.ExitError); ok { - if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { - if status.ExitStatus() == 1 { - // Exit status 1 for grep means no lines matched, which is not an error in this context - return []string{}, nil - } - } - } - return nil, fmt.Errorf("error executing grep command: %s; error: %w; stderr: %s", grepCmdStr, err, errBuf.String()) - } - - // Preparing the final list of files - files := strings.Split(strings.TrimSpace(out.String()), "\n") - if len(files) == 1 && files[0] == "" { - return []string{}, nil - } - - return files, nil -} - -// buildExcludeStringForGoModDirs searches the given root directory for subdirectories -// containing a go.mod file and returns a formatted string to exclude those directories -// (except the root directory if it contains a go.mod file) from git diff. -func buildExcludeStringForGoModDirs(rootGoModPath string) (string, error) { - var excludeStr string - - err := filepath.Walk(rootGoModPath, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.Name() == "go.mod" { - dir := filepath.Dir(path) - // Skip excluding the root directory if go.mod is found there - if dir != rootGoModPath { - excludeStr += fmt.Sprintf("':(exclude)%s/**' ", dir) - } - } - return nil - }) - if err != nil { - return "", err - } - - return excludeStr, nil -} - -func Diff(baseBranch string) (*utils.CmdOutput, error) { - return utils.ExecuteCmd("git", "diff", "--name-only", baseBranch) -} - -func ModDiff(baseBranch, projectPath string) (*utils.CmdOutput, error) { - return utils.ExecuteCmd("git", "diff", baseBranch, "--unified=0", "--", filepath.Join(projectPath, "go.mod")) -} - -func GetGoModChangesFromDiff(lines bytes.Buffer) ([]string, error) { - changedLines := strings.Split(lines.String(), "\n") - - // Filter out lines that do not indicate package changes - var packages []string - for _, line := range changedLines { - if strings.HasPrefix(line, "+") { - // ignore comments or empty lines (e.g., not relevant) - if strings.HasPrefix(line, "+ ") || strings.HasPrefix(line, "+++ ") { - continue - } - - fields := strings.Fields(line) - if len(fields) > 1 { - // The second field should contains the module path - packages = append(packages, fields[1]) - } - } - } - - return packages, nil -} - -// GetChangedGoPackagesFromDiff identifies the Go packages affected by changes in a Git diff output. -// It analyzes a buffer containing the output of a 'git diff' command, filtering the list of changed -// files to determine which Go packages have been affected based on the project's file map. -// -// Parameters: -// - out: A bytes.Buffer containing the 'git diff' command output. This output should list the -// changed files, one per line. -// - projectPath: The root directory of the project within the repository. This parameter is -// used to filter files based on their paths. [Note: This functionality is currently commented out, -// ensure to uncomment the related line if you decide to use it.] -// - excludes: A slice of strings representing paths to exclude from the analysis. This can be useful -// to ignore changes in certain directories or files that are not relevant to the package analysis. -// - fileMap: A map where the key is a file path and the value is a slice of strings representing the -// Go import paths of the packages that file belongs to. This map is used to map changed files -// to their respective packages. -// -// Returns: -// - A slice of strings representing the unique Go packages that have changes. These packages are -// identified by their import paths. -// - An error, which is nil in the current implementation but can be used to return errors encountered -// during the execution of the function. -func GetChangedGoPackagesFromDiff(out bytes.Buffer, projectPath string, excludes []string, fileMap map[string][]string) ([]string, error) { - changedFiles := strings.Split(out.String(), "\n") - - // Filter out non-Go files and directories and embeds - changedPackages := make(map[string]bool) - for _, file := range changedFiles { - if file == "" || shouldExclude(excludes, file) { - continue - } - - // if the changed file is in the fileMap then we add it to the changed packages - for _, importPath := range fileMap[file] { - changedPackages[importPath] = true - } - } - - // Convert map keys to slice - var packages []string - for pkg := range changedPackages { - packages = append(packages, pkg) - } - - return packages, nil -} - -func shouldExclude(excludes []string, item string) bool { - for _, v := range excludes { - if strings.HasPrefix(item, v) { - return true - } - } - return false -} - -// GetOwnerRepoDefaultBranchFromLocalRepo returns the owner, repo name, and default branch of a local git repository. -// It uses the origin remote URL to determine the owner and repo name, and the default branch is determined from the -// refs/remotes/origin/HEAD reference. -func GetOwnerRepoDefaultBranchFromLocalRepo(repoPath string) (owner, repoName, defaultBranch string, err error) { - repo, err := git.PlainOpen(repoPath) - if err != nil { - return "", "", "", err - } - - // Get remote URL (origin) - remotes, err := repo.Remotes() - if err != nil { - return "", "", "", err - } - var originURL string - for _, remote := range remotes { - if remote.Config().Name == "origin" && len(remote.Config().URLs) > 0 { - originURL = remote.Config().URLs[0] - break - } - } - if originURL == "" { - return "", "", "", fmt.Errorf("origin remote not found") - } - - // Parse owner and repo from URL - originURL = strings.TrimSuffix(originURL, ".git") - var path string - if strings.Contains(originURL, "@github.com:") { - parts := strings.SplitN(originURL, ":", 2) - if len(parts) == 2 { - path = parts[1] - } - } else if strings.HasPrefix(originURL, "https://") { - parts := strings.SplitN(originURL, "github.com/", 2) - if len(parts) == 2 { - path = parts[1] - } - } - if path == "" { - return "", "", "", fmt.Errorf("could not parse remote URL: %s", originURL) - } - segments := strings.Split(path, "/") - if len(segments) != 2 { - return "", "", "", fmt.Errorf("unexpected path format: %s", path) - } - owner, repoName = segments[0], segments[1] - - // Find default branch from refs/remotes/origin/HEAD - refs, err := repo.References() - if err != nil { - return "", "", "", err - } - err = refs.ForEach(func(ref *plumbing.Reference) error { - if ref.Name().IsRemote() && ref.Name().String() == "refs/remotes/origin/HEAD" { - target := ref.Target().String() - parts := strings.Split(target, "/") - if len(parts) > 0 { - defaultBranch = parts[len(parts)-1] - } - } - return nil - }) - if err != nil { - return "", "", "", err - } - if defaultBranch == "" { - return "", "", "", fmt.Errorf("could not determine default branch") - } - - return owner, repoName, defaultBranch, nil -} diff --git a/tools/flakeguard/git/git_test.go b/tools/flakeguard/git/git_test.go deleted file mode 100644 index 6a93a225e..000000000 --- a/tools/flakeguard/git/git_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package git - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGetChangedGoPackagesFromDiff(t *testing.T) { - t.Parallel() - - tests := []struct { - name string - out string - projectPath string - excludes []string - fileMap map[string][]string - expected []string - expectError bool - }{ - { - name: "Basic Case", - out: "pkg1/file1.go\npkg2/file2.go\n", - excludes: []string{}, - fileMap: map[string][]string{ - "pkg1/file1.go": {"pkg1"}, - "pkg2/file2.go": {"pkg2"}, - }, - expected: []string{"pkg1", "pkg2"}, - expectError: false, - }, - { - name: "Empty Input", - out: "", - excludes: []string{}, - fileMap: map[string][]string{}, - expected: []string{}, - expectError: false, - }, - { - name: "Non-Go Files Ignored", - out: "pkg1/file1.txt\npkg2/file2.go\n", - excludes: []string{}, - fileMap: map[string][]string{ - "pkg2/file2.go": {"pkg2"}, - }, - expected: []string{"pkg2"}, - expectError: false, - }, - { - name: "Exclusions Applied", - out: "pkg1/file1.go\npkg2/file2.go\npkg3/file3.go\n", - excludes: []string{"pkg2"}, - fileMap: map[string][]string{ - "pkg1/file1.go": {"pkg1"}, - "pkg2/file2.go": {"pkg2"}, - "pkg3/file3.go": {"pkg3"}, - }, - expected: []string{"pkg1", "pkg3"}, - expectError: false, - }, - { - name: "Multiple Imports", - out: "pkg1/file1.go\n", - excludes: []string{}, - fileMap: map[string][]string{ - "pkg1/file1.go": {"pkg1", "pkg1/subpkg"}, - }, - expected: []string{"pkg1", "pkg1/subpkg"}, - expectError: false, - }, - { - name: "Duplicate Packages", - out: "pkg1/file1.go\npkg1/file1.go\n", - excludes: []string{}, - fileMap: map[string][]string{ - "pkg1/file1.go": {"pkg1"}, - }, - expected: []string{"pkg1"}, - expectError: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - outBuffer := bytes.Buffer{} - outBuffer.WriteString(tt.out) - result, err := GetChangedGoPackagesFromDiff(outBuffer, tt.projectPath, tt.excludes, tt.fileMap) - if tt.expectError { - assert.Error(t, err) - } else { - assert.NoError(t, err) - assert.ElementsMatch(t, tt.expected, result) - } - }) - } -} diff --git a/tools/flakeguard/go-test-transform/README.md b/tools/flakeguard/go-test-transform/README.md deleted file mode 100644 index cd338f301..000000000 --- a/tools/flakeguard/go-test-transform/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Go Test Transform - -This utility transforms the output of Go's test JSON format to handle subtest failures more intelligently. It prevents parent tests from failing when only their subtests fail, while preserving the original test structure and output format. - -## Features - -- Transforms Go test JSON output to modify how test failures propagate -- Parent tests won't fail if they only have failing subtests but no direct failures -- Maintains the original JSON format for compatibility with other tools - -## Key Behavior - -- **Subtest Failure Handling**: When a subtest fails, the parent test will not be marked as failed unless the parent itself has a direct failure -- **Important Note**: If a parent test has both log messages (`t.Log()`) and failing subtests, it will still be marked as failed, as seen in the `TestLogMessagesNotDirectFailures` test - -## Usage - -```bash -go test -json ./... | go-test-transform -ignore-all -``` - -This will transform the test output to prevent parent tests from failing when only their subtests fail. - -## Options - -- `-ignore-all`: Ignore all subtest failures -- `-input`: Input file (default: stdin) -- `-output`: Output file (default: stdout) - -## Example - -For a test structure like: - -```go -func TestParent(t *testing.T) { - t.Run("Subtest1", func(t *testing.T) { - t.Error("Subtest 1 failed") - }) -} -``` - -The transformed output will be: - -```json -{"Time":"2023-05-10T15:04:05.123Z","Action":"run","Package":"example/pkg","Test":"TestParent"} -{"Time":"2023-05-10T15:04:05.124Z","Action":"run","Package":"example/pkg","Test":"TestParent/Subtest1"} -{"Time":"2023-05-10T15:04:05.125Z","Action":"output","Package":"example/pkg","Test":"TestParent/Subtest1","Output":" subtest1_test.go:12: Subtest 1 failed\n"} -{"Time":"2023-05-10T15:04:05.126Z","Action":"fail","Package":"example/pkg","Test":"TestParent/Subtest1","Elapsed":0.001} -{"Time":"2023-05-10T15:04:05.127Z","Action":"pass","Package":"example/pkg","Test":"TestParent","Elapsed":0.004} -{"Time":"2023-05-10T15:04:05.128Z","Action":"output","Package":"example/pkg","Output":"FAIL\texample/pkg\t0.004s\n"} -{"Time":"2023-05-10T15:04:05.129Z","Action":"fail","Package":"example/pkg","Elapsed":0.005} -``` - -Note that in the original output, both `TestParent/Subtest1` and `TestParent` would be marked as failed. After transformation, `TestParent/Subtest1` remains failed, but `TestParent` is changed to pass since it doesn't have a direct failure. diff --git a/tools/flakeguard/go-test-transform/cmd/main.go b/tools/flakeguard/go-test-transform/cmd/main.go deleted file mode 100644 index 22ccbdd02..000000000 --- a/tools/flakeguard/go-test-transform/cmd/main.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "io" - "os" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/go-test-transform/pkg/transformer" -) - -func main() { - // Parse command-line flags - var ( - ignoreAll bool - inputFile string - outputFile string - ) - - flag.BoolVar(&ignoreAll, "ignore-all", false, "Ignore all subtest failures") - flag.StringVar(&inputFile, "input", "", "Input JSON file (if not provided, reads from stdin)") - flag.StringVar(&outputFile, "output", "", "File to write the report to (default: stdout)") - flag.Parse() - - // Set up options - opts := transformer.NewOptions(ignoreAll) - - // Determine input source - var input io.Reader - if inputFile != "" { - // Read from file - file, err := os.Open(inputFile) - if err != nil { - fmt.Fprintf(os.Stderr, "Error opening input file: %v\n", err) - os.Exit(1) - } - defer file.Close() - input = file - } else { - // Read from stdin - input = os.Stdin - } - - // Determine output destination - var output io.Writer - if outputFile != "" { - // Write to file - file, err := os.Create(outputFile) - if err != nil { - fmt.Fprintf(os.Stderr, "Error creating output file: %v\n", err) - os.Exit(1) - } - defer file.Close() - output = file - } else { - // Write to stdout - output = os.Stdout - } - - // Transform the output - err := transformer.TransformJSON(input, output, opts) - if err != nil { - fmt.Fprintf(os.Stderr, "Error transforming JSON: %v\n", err) - os.Exit(1) - } - - // Exit with the appropriate code - os.Exit(0) -} diff --git a/tools/flakeguard/go-test-transform/pkg/transformer/options.go b/tools/flakeguard/go-test-transform/pkg/transformer/options.go deleted file mode 100644 index cf263f780..000000000 --- a/tools/flakeguard/go-test-transform/pkg/transformer/options.go +++ /dev/null @@ -1,21 +0,0 @@ -package transformer - -// Options defines configuration options for the test transformer -type Options struct { - // IgnoreAllSubtestFailures determines if all subtest failures should be ignored - IgnoreAllSubtestFailures bool -} - -// DefaultOptions returns a new Options with default values -func DefaultOptions() *Options { - return &Options{ - IgnoreAllSubtestFailures: false, - } -} - -// NewOptions creates a new Options with the specified parameters -func NewOptions(ignoreAll bool) *Options { - return &Options{ - IgnoreAllSubtestFailures: ignoreAll, - } -} diff --git a/tools/flakeguard/go-test-transform/pkg/transformer/transformer.go b/tools/flakeguard/go-test-transform/pkg/transformer/transformer.go deleted file mode 100644 index 88b8881c5..000000000 --- a/tools/flakeguard/go-test-transform/pkg/transformer/transformer.go +++ /dev/null @@ -1,370 +0,0 @@ -package transformer - -import ( - "bufio" - "encoding/json" - "fmt" - "io" - "strings" - "time" -) - -// TestEvent represents a single event from go test -json -type TestEvent struct { - Time time.Time `json:"Time"` - Action string `json:"Action"` - Package string `json:"Package"` - Test string `json:"Test,omitempty"` - Elapsed float64 `json:"Elapsed,omitempty"` - Output string `json:"Output,omitempty"` -} - -// TestNode represents a node in the test tree -type TestNode struct { - Name string // Test name - Package string // Package name - IsPackage bool // Is this a package node - Failed bool // Did this test fail - Skipped bool // Is this test skipped - Ignored bool // Should this failure be ignored - Children map[string]*TestNode // Child tests - Parent *TestNode // Parent test - IsSubtest bool // Is this a subtest - // Store output messages for direct failure detection - OutputMessages []string - // Flag to track if this node has any failing subtests - HasFailingSubtests bool -} - -// TransformJSON transforms go test -json output according to the options -func TransformJSON(input io.Reader, output io.Writer, opts *Options) error { - // Create scanner for JSON input - scanner := bufio.NewScanner(input) - scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024) // 10MB max buffer - - // First pass: collect all events - var events []TestEvent - for scanner.Scan() { - var event TestEvent - if err := json.Unmarshal(scanner.Bytes(), &event); err != nil { - return fmt.Errorf("failed to parse JSON: %v", err) - } - events = append(events, event) - } - - if err := scanner.Err(); err != nil { - return fmt.Errorf("error reading input: %v", err) - } - - // Build test tree - testTree := buildTestTree(events) - - // Track output messages for direct failure detection - captureOutputMessages(events, testTree) - - // Mark parents with failing subtests - markParentsWithFailingSubtests(testTree) - - // Identify which tests should be passed - identifyTestsToIgnore(testTree, opts) - - // Transform events - transformedEvents, _ := transformEvents(events, testTree) - - // Output transformed events - for _, event := range transformedEvents { - eventJSON, err := json.Marshal(event) - if err != nil { - return fmt.Errorf("failed to marshal JSON: %v", err) - } - fmt.Fprintln(output, string(eventJSON)) - } - - return nil -} - -// buildTestTree builds a tree of tests from the events -func buildTestTree(events []TestEvent) map[string]*TestNode { - tree := make(map[string]*TestNode) - - // First create nodes for all packages and tests - for _, event := range events { - if event.Package != "" { - // Create package node if it doesn't exist - if _, exists := tree[event.Package]; !exists { - tree[event.Package] = &TestNode{ - Name: event.Package, - Package: event.Package, - IsPackage: true, - Children: make(map[string]*TestNode), - } - } - - // Create test node if applicable and it doesn't exist - if event.Test != "" { - packageNode := tree[event.Package] - - // Initialize current to packageNode to start traversal - current := packageNode - - // Split test path into components - components := strings.Split(event.Test, "/") - - // Build path component by component - path := "" - for i, component := range components { - if i > 0 { - path += "/" - } - path += component - - if _, exists := current.Children[component]; !exists { - // Create new node - newNode := &TestNode{ - Name: path, - Package: event.Package, - IsSubtest: i > 0, // First level is not a subtest - Children: make(map[string]*TestNode), - Parent: current, - OutputMessages: []string{}, - } - current.Children[component] = newNode - } - - // Move to next level - current = current.Children[component] - } - } - } - } - - // Now mark failing tests - for _, event := range events { - if event.Action == "fail" { - if event.Test == "" { - // Package failure - if node, exists := tree[event.Package]; exists { - node.Failed = true - } - } else { - // Test failure - need to find the node - if packageNode, exists := tree[event.Package]; exists { - // Traverse to find the test node - current := packageNode - components := strings.Split(event.Test, "/") - - found := true - for i, component := range components { - if child, exists := current.Children[component]; exists { - current = child - - // If this is the last component, mark as failed - if i == len(components)-1 { - current.Failed = true - } - } else { - found = false - break - } - } - - if !found { - fmt.Printf("Warning: Could not find node for test %s\n", event.Test) - } - } - } - } - } - - return tree -} - -// captureOutputMessages captures output messages for each test -func captureOutputMessages(events []TestEvent, tree map[string]*TestNode) { - for _, event := range events { - if event.Action == "output" && event.Output != "" { - // Find the node - var node *TestNode - if event.Test == "" { - node = tree[event.Package] - } else { - packageNode := tree[event.Package] - if packageNode == nil { - continue - } - - components := strings.Split(event.Test, "/") - current := packageNode - - found := true - for i, component := range components { - if child, exists := current.Children[component]; exists { - current = child - - // If this is the last component, we found the node - if i == len(components)-1 { - node = current - } - } else { - found = false - break - } - } - - if !found { - continue - } - } - - // Store the output message - if node != nil { - node.OutputMessages = append(node.OutputMessages, event.Output) - } - } - } -} - -// markParentsWithFailingSubtests marks parent nodes that have any failing subtests -func markParentsWithFailingSubtests(tree map[string]*TestNode) { - // Process each package - for _, pkgNode := range tree { - // Bottom-up traversal to mark parents with failing subtests - var markParents func(*TestNode) bool - markParents = func(node *TestNode) bool { - // Check if any child is failing or has failing subtests - hasFailingSubtests := false - - for _, child := range node.Children { - // Process child first (depth-first) - childHasFailingSubtests := markParents(child) - - // Check if child is failing or has failing subtests - if child.Failed || childHasFailingSubtests { - hasFailingSubtests = true - } - } - - // Update the node's status - node.HasFailingSubtests = hasFailingSubtests - - // Return whether this node has failing subtests - return hasFailingSubtests - } - - markParents(pkgNode) - } -} - -// identifyTestsToIgnore identifies which tests should be converted to pass -func identifyTestsToIgnore(tree map[string]*TestNode, opts *Options) { - // Process each package - for _, pkgNode := range tree { - // Process all nodes in the tree and set ignore status - var processNode func(*TestNode) - processNode = func(node *TestNode) { - // Process children first - for _, child := range node.Children { - processNode(child) - } - - // If this node has failing subtests and it's failing itself, - // mark it as ignored (so it will be converted to PASS) - if node.HasFailingSubtests && node.Failed { - node.Ignored = true - } - } - - processNode(pkgNode) - } -} - -// transformEvents applies transformations to events based on the test tree -func transformEvents(events []TestEvent, tree map[string]*TestNode) ([]TestEvent, bool) { - transformedEvents := make([]TestEvent, len(events)) - anyRemainingFailures := false - - // Helper function to find a node - findNode := func(pkg, test string) *TestNode { - if test == "" { - // This is a package event - return tree[pkg] - } - - // Find the node for this test - packageNode := tree[pkg] - if packageNode == nil { - return nil - } - - if test == "" { - return packageNode - } - - // Traverse to find the test node - current := packageNode - components := strings.Split(test, "/") - - for i, component := range components { - if child, exists := current.Children[component]; exists { - current = child - // If this is the last component, we found the node - if i == len(components)-1 { - return current - } - } else { - return nil - } - } - - return nil - } - - for i, event := range events { - // Make a copy of the event - transformedEvents[i] = event - - // Check if we need to transform this event - if event.Action == "fail" { - node := findNode(event.Package, event.Test) - if node != nil && node.Ignored { - // Convert this fail to a pass - transformedEvents[i].Action = "pass" - } else { - // We're keeping this as a failure - anyRemainingFailures = true - } - } else if event.Action == "skip" { - // Preserve skip events without transformation - // This ensures skipped tests remain in the output - } else if event.Action == "output" { - node := findNode(event.Package, event.Test) - if node != nil && node.Failed && node.Ignored { - // Transform output text for passed tests - transformedEvents[i].Output = transformOutputText(event.Output) - } - } - } - - return transformedEvents, anyRemainingFailures -} - -// transformOutputText transforms failure text in output to success text -func transformOutputText(output string) string { - // Replace === FAIL with === PASS - output = strings.Replace(output, "=== FAIL", "=== PASS", -1) - - // Replace --- FAIL with --- PASS - output = strings.Replace(output, "--- FAIL", "--- PASS", -1) - - // Handle standalone FAIL appropriately - if output == "FAIL\n" { - return "PASS\n" - } - - // Replace other forms of FAIL - output = strings.Replace(output, "\nFAIL\n", "\nPASS\n", -1) - output = strings.Replace(output, "\nFAIL ", "\nPASS ", -1) - output = strings.Replace(output, " FAIL\n", " PASS\n", -1) - - return output -} diff --git a/tools/flakeguard/go-test-transform/pkg/transformer/transformer_test.go b/tools/flakeguard/go-test-transform/pkg/transformer/transformer_test.go deleted file mode 100644 index e4d5852eb..000000000 --- a/tools/flakeguard/go-test-transform/pkg/transformer/transformer_test.go +++ /dev/null @@ -1,791 +0,0 @@ -package transformer - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "strings" - "testing" - "time" -) - -// TestEvent alias for readability in tests -type testEvent = TestEvent - -// createEvent is a helper to create test events -func createEvent(action, pkg, test string, elapsed float64, output string) testEvent { - return testEvent{ - Time: time.Now(), - Action: action, - Package: pkg, - Test: test, - Elapsed: elapsed, - Output: output, - } -} - -// transformAndVerify is a helper function to transform events and verify the results -func transformAndVerify(t *testing.T, events []testEvent, opts *Options, expectedActions map[string]string) { - // Convert test events to JSON - var input bytes.Buffer - for _, event := range events { - eventJSON, err := json.Marshal(event) - if err != nil { - t.Fatalf("Failed to marshal event: %v", err) - } - input.WriteString(string(eventJSON) + "\n") - } - - // Transform the events - var output bytes.Buffer - err := TransformJSON(&input, &output, opts) - if err != nil { - t.Fatalf("Failed to transform JSON: %v", err) - } - - // Parse the output - scanner := bufio.NewScanner(&output) - var resultEvents []TestEvent - for scanner.Scan() { - var event TestEvent - if err := json.Unmarshal([]byte(scanner.Text()), &event); err != nil { - t.Fatalf("Failed to unmarshal result event: %v", err) - } - resultEvents = append(resultEvents, event) - } - - // Extract final actions for each test - finalActions := make(map[string]string) - for _, event := range resultEvents { - if event.Action == "pass" || event.Action == "fail" || event.Action == "skip" { - testID := fmt.Sprintf("%s/%s", event.Package, event.Test) - finalActions[testID] = event.Action - } - } - - // Verify expected actions - for testID, expectedAction := range expectedActions { - actualAction, found := finalActions[testID] - if !found { - t.Errorf("Test %q not found in output", testID) - } else if actualAction != expectedAction { - t.Errorf("Expected action %q for test %q, got %q", expectedAction, testID, actualAction) - } - } -} - -// TestIgnoreAllSubtests tests ignoring all subtests -func TestIgnoreAllSubtests(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParent", 0, ""), - createEvent("run", "example", "TestParent/SubTest1", 0, ""), - createEvent("pass", "example", "TestParent/SubTest1", 0.001, ""), - createEvent("run", "example", "TestParent/SubTest2", 0, ""), - createEvent("output", "example", "TestParent/SubTest2", 0, " test.go:10: SubTest2 failed\n"), - createEvent("fail", "example", "TestParent/SubTest2", 0.001, ""), - createEvent("output", "example", "TestParent", 0, "=== FAIL: TestParent (0.002s)\n"), - createEvent("fail", "example", "TestParent", 0.002, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.003, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - expectedActions := map[string]string{ - "example/TestParent/SubTest2": "fail", - "example/TestParent": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestNestedSubtests tests handling nested subtests -func TestNestedSubtests(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParent", 0, ""), - createEvent("run", "example", "TestParent/SubTest1", 0, ""), - createEvent("pass", "example", "TestParent/SubTest1", 0.001, ""), - createEvent("run", "example", "TestParent/SubTest2", 0, ""), - createEvent("run", "example", "TestParent/SubTest2/NestedPass", 0, ""), - createEvent("pass", "example", "TestParent/SubTest2/NestedPass", 0.001, ""), - createEvent("run", "example", "TestParent/SubTest2/NestedFail", 0, ""), - createEvent("output", "example", "TestParent/SubTest2/NestedFail", 0, " test.go:20: NestedFail failed\n"), - createEvent("fail", "example", "TestParent/SubTest2/NestedFail", 0.001, ""), - createEvent("output", "example", "TestParent/SubTest2", 0, "=== FAIL: TestParent/SubTest2 (0.002s)\n"), - createEvent("fail", "example", "TestParent/SubTest2", 0.002, ""), - createEvent("output", "example", "TestParent", 0, "=== FAIL: TestParent (0.003s)\n"), - createEvent("fail", "example", "TestParent", 0.003, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.004, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - expectedActions := map[string]string{ - "example/TestParent/SubTest2/NestedFail": "fail", - "example/TestParent/SubTest2": "pass", - "example/TestParent": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestParallelTestsEventOrdering tests handling of parallel tests -func TestParallelTestsEventOrdering(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParallel", 0, ""), - createEvent("run", "example", "TestParallel/Sub1", 0, ""), - createEvent("output", "example", "TestParallel/Sub1", 0, "=== PAUSE TestParallel/Sub1\n"), - createEvent("run", "example", "TestParallel/Sub2", 0, ""), - createEvent("output", "example", "TestParallel/Sub2", 0, "=== PAUSE TestParallel/Sub2\n"), - createEvent("output", "example", "TestParallel/Sub1", 0, "=== CONT TestParallel/Sub1\n"), - createEvent("pass", "example", "TestParallel/Sub1", 0.001, ""), - createEvent("output", "example", "TestParallel/Sub2", 0, "=== CONT TestParallel/Sub2\n"), - createEvent("output", "example", "TestParallel/Sub2", 0, " test.go:15: Sub2 failed\n"), - createEvent("fail", "example", "TestParallel/Sub2", 0.001, ""), - createEvent("output", "example", "TestParallel", 0, "=== FAIL: TestParallel (0.002s)\n"), - createEvent("fail", "example", "TestParallel", 0.002, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.003, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - expectedActions := map[string]string{ - "example/TestParallel/Sub2": "fail", - "example/TestParallel": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestOutputTransformation tests transformation of output text -func TestOutputTransformation(t *testing.T) { - input := "=== FAIL: TestSomething (0.001s)\nFAIL\n--- FAIL: TestSomething/SubTest (0.001s)\n" - expected := "=== PASS: TestSomething (0.001s)\nPASS\n--- PASS: TestSomething/SubTest (0.001s)\n" - - actual := transformOutputText(input) - - if actual != expected { - t.Errorf("Expected transformed output:\n%s\nGot:\n%s", expected, actual) - } -} - -// TestEmptyInput tests handling empty input -func TestEmptyInput(t *testing.T) { - opts := DefaultOptions() - - var input, output bytes.Buffer - err := TransformJSON(&input, &output, opts) - - if err != nil { - t.Errorf("Expected no error for empty input, got: %v", err) - } - - if output.Len() != 0 { - t.Errorf("Expected empty output for empty input, got: %s", output.String()) - } -} - -// TestMalformedJSON tests handling malformed JSON input -func TestMalformedJSON(t *testing.T) { - opts := DefaultOptions() - - input := strings.NewReader("This is not JSON\n{\"Action\":\"fail\"") - var output bytes.Buffer - - err := TransformJSON(input, &output, opts) - - if err == nil { - t.Error("Expected error for malformed JSON, got nil") - } -} - -func TestParentWithDirectFailureAndFailingSubtest(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParent", 0, ""), - createEvent("run", "example", "TestParent/SubTest1", 0, ""), - createEvent("pass", "example", "TestParent/SubTest1", 0.001, ""), - createEvent("run", "example", "TestParent/SubTest2", 0, ""), - // SubTest2 has both a direct failure and a failing subtest - createEvent("run", "example", "TestParent/SubTest2/NestedTest", 0, ""), - createEvent("output", "example", "TestParent/SubTest2/NestedTest", 0, " test.go:15: NestedTest failed\n"), - createEvent("fail", "example", "TestParent/SubTest2/NestedTest", 0.001, ""), - // Direct failure in SubTest2 - createEvent("output", "example", "TestParent/SubTest2", 0, " test.go:20: SubTest2 has a direct failure\n"), - createEvent("output", "example", "TestParent/SubTest2", 0, "=== FAIL: TestParent/SubTest2 (0.002s)\n"), - createEvent("fail", "example", "TestParent/SubTest2", 0.002, ""), - createEvent("output", "example", "TestParent", 0, "=== FAIL: TestParent (0.003s)\n"), - createEvent("fail", "example", "TestParent", 0.003, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.004, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With the updated behavior: - // - The leaf subtest (NestedTest) should remain as "fail" - // - The parent subtest (SubTest2) should be changed to "pass" because it has a failing subtest, - // even though it also has a direct failure - // - The top-level test (TestParent) should be changed to "pass" because it has a failing subtest - // - The package should be changed to "pass" - expectedActions := map[string]string{ - "example/TestParent/SubTest2/NestedTest": "fail", - "example/TestParent/SubTest2": "pass", - "example/TestParent": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -func TestParentWithOnlyDirectFailure(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParent", 0, ""), - createEvent("run", "example", "TestParent/SubTest1", 0, ""), - createEvent("pass", "example", "TestParent/SubTest1", 0.001, ""), - createEvent("run", "example", "TestParent/SubTest2", 0, ""), - createEvent("pass", "example", "TestParent/SubTest2", 0.001, ""), - // Direct failure in the parent test - createEvent("output", "example", "TestParent", 0, " test.go:20: TestParent has a direct failure\n"), - createEvent("output", "example", "TestParent", 0, "=== FAIL: TestParent (0.003s)\n"), - createEvent("fail", "example", "TestParent", 0.003, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.004, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // In this case: - // - All subtests pass - // - The parent test has a direct failure but no failing subtests, so it should remain as "fail" - // - The package should remain as "fail" because the parent test fails - expectedActions := map[string]string{ - "example/TestParent/SubTest1": "pass", - "example/TestParent/SubTest2": "pass", - "example/TestParent": "fail", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestMultiLevelNestedFailures tests multiple levels of nested failures -func TestMultiLevelNestedFailures(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParent", 0, ""), - createEvent("run", "example", "TestParent/Level1", 0, ""), - createEvent("run", "example", "TestParent/Level1/Level2A", 0, ""), - createEvent("pass", "example", "TestParent/Level1/Level2A", 0.001, ""), - createEvent("run", "example", "TestParent/Level1/Level2B", 0, ""), - createEvent("run", "example", "TestParent/Level1/Level2B/Level3A_Flaky", 0, ""), - createEvent("output", "example", "TestParent/Level1/Level2B/Level3A_Flaky", 0, " test.go:25: Level3A_Flaky test failed\n"), - createEvent("fail", "example", "TestParent/Level1/Level2B/Level3A_Flaky", 0.001, ""), - createEvent("run", "example", "TestParent/Level1/Level2B/Level3B", 0, ""), - createEvent("pass", "example", "TestParent/Level1/Level2B/Level3B", 0.001, ""), - // Direct failure in Level2B - createEvent("output", "example", "TestParent/Level1/Level2B", 0, " test.go:30: Level2B has a direct failure\n"), - createEvent("output", "example", "TestParent/Level1/Level2B", 0, "=== FAIL: TestParent/Level1/Level2B (0.002s)\n"), - createEvent("fail", "example", "TestParent/Level1/Level2B", 0.002, ""), - createEvent("output", "example", "TestParent/Level1", 0, "=== FAIL: TestParent/Level1 (0.003s)\n"), - createEvent("fail", "example", "TestParent/Level1", 0.003, ""), - createEvent("output", "example", "TestParent", 0, "=== FAIL: TestParent (0.004s)\n"), - createEvent("fail", "example", "TestParent", 0.004, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.005, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The leaf subtest (Level3A_Flaky) should remain as "fail" - // - All parent tests should be changed to "pass" - expectedActions := map[string]string{ - "example/TestParent/Level1/Level2B/Level3A_Flaky": "fail", - "example/TestParent/Level1/Level2B": "pass", - "example/TestParent/Level1": "pass", - "example/TestParent": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestOnlyDirectFailures tests a scenario where there are no failing subtests, only direct failures -func TestOnlyDirectFailures(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestParent", 0, ""), - createEvent("run", "example", "TestParent/Level1", 0, ""), - createEvent("run", "example", "TestParent/Level1/Level2A", 0, ""), - createEvent("pass", "example", "TestParent/Level1/Level2A", 0.001, ""), - createEvent("run", "example", "TestParent/Level1/Level2B", 0, ""), - createEvent("run", "example", "TestParent/Level1/Level2B/Level3A", 0, ""), - createEvent("pass", "example", "TestParent/Level1/Level2B/Level3A", 0.001, ""), - createEvent("run", "example", "TestParent/Level1/Level2B/Level3B", 0, ""), - createEvent("pass", "example", "TestParent/Level1/Level2B/Level3B", 0.001, ""), - // Direct failure in Level2B (no subtest failures) - createEvent("output", "example", "TestParent/Level1/Level2B", 0, " test.go:30: Level2B has a direct failure\n"), - createEvent("output", "example", "TestParent/Level1/Level2B", 0, "=== FAIL: TestParent/Level1/Level2B (0.002s)\n"), - createEvent("fail", "example", "TestParent/Level1/Level2B", 0.002, ""), - createEvent("output", "example", "TestParent/Level1", 0, "=== FAIL: TestParent/Level1 (0.003s)\n"), - createEvent("fail", "example", "TestParent/Level1", 0.003, ""), - createEvent("output", "example", "TestParent", 0, "=== FAIL: TestParent (0.004s)\n"), - createEvent("fail", "example", "TestParent", 0.004, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.005, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - Level2B should remain as "fail" because it has a direct failure - // - Level1 should be changed to "pass" because it only fails due to Level2B - // - TestParent should be changed to "pass" because it only fails due to Level1 - // - The package should remain as "fail" because there are still failing tests - expectedActions := map[string]string{ - "example/TestParent/Level1/Level2B": "fail", // Direct failure, should remain fail - "example/TestParent/Level1": "pass", // Only fails because of Level2B - "example/TestParent": "pass", // Only fails because of Level1 - "example/": "pass", // Still fails because Level2B has a direct failure - } - - // Exit code should be 1 because there are still failing tests - transformAndVerify(t, events, opts, expectedActions) -} - -// TestLogMessagesNotDirectFailures tests that log messages are not treated as direct failures -func TestLogMessagesNotDirectFailures(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestWithLogs", 0, ""), - createEvent("run", "example", "TestWithLogs/Parent", 0, ""), - // Log message in parent test - should not be treated as a direct failure - createEvent("output", "example", "TestWithLogs/Parent", 0, " test.go:10: This is just a log message, not an error\n"), - createEvent("run", "example", "TestWithLogs/Parent/Child", 0, ""), - // Error in child test - createEvent("output", "example", "TestWithLogs/Parent/Child", 0, " test.go:15: Child test failed\n"), - createEvent("output", "example", "TestWithLogs/Parent/Child", 0, "--- FAIL: TestWithLogs/Parent/Child (0.001s)\n"), - createEvent("fail", "example", "TestWithLogs/Parent/Child", 0.001, ""), - // Parent fails because child failed - createEvent("output", "example", "TestWithLogs/Parent", 0, "--- FAIL: TestWithLogs/Parent (0.002s)\n"), - createEvent("fail", "example", "TestWithLogs/Parent", 0.002, ""), - createEvent("output", "example", "TestWithLogs", 0, "--- FAIL: TestWithLogs (0.003s)\n"), - createEvent("fail", "example", "TestWithLogs", 0.003, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.004, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The child test should remain as "fail" - // - The parent test should be changed to "pass" because it only has a log message, not a direct failure - // - The top-level test should be changed to "pass" - // - The package should be changed to "pass" - expectedActions := map[string]string{ - "example/TestWithLogs/Parent/Child": "fail", - "example/TestWithLogs/Parent": "pass", - "example/TestWithLogs": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestNestedLogsAllPassing tests that log messages in passing tests are handled correctly -func TestNestedLogsAllPassing(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestWithPassingLogs", 0, ""), - createEvent("run", "example", "TestWithPassingLogs/Parent", 0, ""), - // Log message in parent test - createEvent("output", "example", "TestWithPassingLogs/Parent", 0, " test.go:10: This is just a log message in parent, not an error\n"), - createEvent("run", "example", "TestWithPassingLogs/Parent/Child", 0, ""), - // Log message in child test - createEvent("output", "example", "TestWithPassingLogs/Parent/Child", 0, " test.go:15: This is just a log message in child, not an error\n"), - createEvent("output", "example", "TestWithPassingLogs/Parent/Child", 0, "--- PASS: TestWithPassingLogs/Parent/Child (0.001s)\n"), - createEvent("pass", "example", "TestWithPassingLogs/Parent/Child", 0.001, ""), - // Parent passes - createEvent("output", "example", "TestWithPassingLogs/Parent", 0, "--- PASS: TestWithPassingLogs/Parent (0.002s)\n"), - createEvent("pass", "example", "TestWithPassingLogs/Parent", 0.002, ""), - createEvent("output", "example", "TestWithPassingLogs", 0, "--- PASS: TestWithPassingLogs (0.003s)\n"), - createEvent("pass", "example", "TestWithPassingLogs", 0.003, ""), - createEvent("output", "example", "", 0, "PASS\n"), - createEvent("pass", "example", "", 0.004, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // All tests should remain as "pass" - expectedActions := map[string]string{ - "example/TestWithPassingLogs/Parent/Child": "pass", - "example/TestWithPassingLogs/Parent": "pass", - "example/TestWithPassingLogs": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestSkippedTests tests handling of skipped tests -func TestSkippedTests(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestSkippedTests", 0, ""), - createEvent("output", "example", "TestSkippedTests", 0, "=== RUN TestSkippedTests\n"), - createEvent("run", "example", "TestSkippedTests/SkippedTest", 0, ""), - createEvent("output", "example", "TestSkippedTests/SkippedTest", 0, "=== RUN TestSkippedTests/SkippedTest\n"), - createEvent("output", "example", "TestSkippedTests/SkippedTest", 0, " example_test.go:163: This test is skipped intentionally\n"), - createEvent("output", "example", "TestSkippedTests/SkippedTest", 0, "--- SKIP: TestSkippedTests/SkippedTest (0.00s)\n"), - createEvent("skip", "example", "TestSkippedTests/SkippedTest", 0, ""), - createEvent("run", "example", "TestSkippedTests/ConditionallySkipped", 0, ""), - createEvent("output", "example", "TestSkippedTests/ConditionallySkipped", 0, "=== RUN TestSkippedTests/ConditionallySkipped\n"), - createEvent("output", "example", "TestSkippedTests/ConditionallySkipped", 0, "--- PASS: TestSkippedTests/ConditionallySkipped (0.00s)\n"), - createEvent("pass", "example", "TestSkippedTests/ConditionallySkipped", 0, ""), - createEvent("output", "example", "TestSkippedTests", 0, "--- PASS: TestSkippedTests (0.00s)\n"), - createEvent("pass", "example", "TestSkippedTests", 0, ""), - } - - opts := &Options{} // Use default options - - // The transformer should preserve the original actions - expectedActions := map[string]string{ - "example/TestSkippedTests/SkippedTest": "skip", - "example/TestSkippedTests/ConditionallySkipped": "pass", - "example/TestSkippedTests": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestDeepNesting tests handling of deeply nested test hierarchies -func TestDeepNesting(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestDeepNesting", 0, ""), - createEvent("run", "example", "TestDeepNesting/Level1", 0, ""), - createEvent("run", "example", "TestDeepNesting/Level1/Level2", 0, ""), - createEvent("run", "example", "TestDeepNesting/Level1/Level2/Level3", 0, ""), - createEvent("run", "example", "TestDeepNesting/Level1/Level2/Level3/Level4", 0, ""), - createEvent("run", "example", "TestDeepNesting/Level1/Level2/Level3/Level4/Level5", 0, ""), - createEvent("output", "example", "TestDeepNesting/Level1/Level2/Level3/Level4/Level5", 0, " example_test.go:65: Deep nested test failed\n"), - createEvent("output", "example", "TestDeepNesting/Level1/Level2/Level3/Level4/Level5", 0, "--- FAIL: TestDeepNesting/Level1/Level2/Level3/Level4/Level5 (0.001s)\n"), - createEvent("fail", "example", "TestDeepNesting/Level1/Level2/Level3/Level4/Level5", 0.001, ""), - createEvent("output", "example", "TestDeepNesting/Level1/Level2/Level3/Level4", 0, "--- FAIL: TestDeepNesting/Level1/Level2/Level3/Level4 (0.001s)\n"), - createEvent("fail", "example", "TestDeepNesting/Level1/Level2/Level3/Level4", 0.001, ""), - createEvent("output", "example", "TestDeepNesting/Level1/Level2/Level3", 0, "--- FAIL: TestDeepNesting/Level1/Level2/Level3 (0.001s)\n"), - createEvent("fail", "example", "TestDeepNesting/Level1/Level2/Level3", 0.001, ""), - createEvent("output", "example", "TestDeepNesting/Level1/Level2", 0, "--- FAIL: TestDeepNesting/Level1/Level2 (0.001s)\n"), - createEvent("fail", "example", "TestDeepNesting/Level1/Level2", 0.001, ""), - createEvent("output", "example", "TestDeepNesting/Level1", 0, "--- FAIL: TestDeepNesting/Level1 (0.001s)\n"), - createEvent("fail", "example", "TestDeepNesting/Level1", 0.001, ""), - createEvent("output", "example", "TestDeepNesting", 0, "--- FAIL: TestDeepNesting (0.001s)\n"), - createEvent("fail", "example", "TestDeepNesting", 0.001, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.002, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The leaf test should remain as "fail" - // - All parent tests should be changed to "pass" - expectedActions := map[string]string{ - "example/TestDeepNesting/Level1/Level2/Level3/Level4/Level5": "fail", - "example/TestDeepNesting/Level1/Level2/Level3/Level4": "pass", - "example/TestDeepNesting/Level1/Level2/Level3": "pass", - "example/TestDeepNesting/Level1/Level2": "pass", - "example/TestDeepNesting/Level1": "pass", - "example/TestDeepNesting": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestConcurrentTests tests handling of concurrent test execution -func TestConcurrentTests(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestWithConcurrency", 0, ""), - // First subtest starts - createEvent("run", "example", "TestWithConcurrency/ConcurrentTest0", 0, ""), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest0", 0, "=== RUN TestWithConcurrency/ConcurrentTest0\n"), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest0", 0, "=== PAUSE TestWithConcurrency/ConcurrentTest0\n"), - createEvent("pause", "example", "TestWithConcurrency/ConcurrentTest0", 0, ""), - // Second subtest starts - createEvent("run", "example", "TestWithConcurrency/ConcurrentTest1", 0, ""), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest1", 0, "=== RUN TestWithConcurrency/ConcurrentTest1\n"), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest1", 0, "=== PAUSE TestWithConcurrency/ConcurrentTest1\n"), - createEvent("pause", "example", "TestWithConcurrency/ConcurrentTest1", 0, ""), - // Continue tests - createEvent("cont", "example", "TestWithConcurrency/ConcurrentTest0", 0, ""), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest0", 0, "=== CONT TestWithConcurrency/ConcurrentTest0\n"), - createEvent("cont", "example", "TestWithConcurrency/ConcurrentTest1", 0, ""), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest1", 0, "=== CONT TestWithConcurrency/ConcurrentTest1\n"), - // Test 0 fails - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest0", 0, " example_test.go:303: Concurrent test 0 failed\n"), - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest0", 0, "--- FAIL: TestWithConcurrency/ConcurrentTest0 (0.05s)\n"), - createEvent("fail", "example", "TestWithConcurrency/ConcurrentTest0", 0.05, ""), - // Test 1 passes - createEvent("output", "example", "TestWithConcurrency/ConcurrentTest1", 0, "--- PASS: TestWithConcurrency/ConcurrentTest1 (0.02s)\n"), - createEvent("pass", "example", "TestWithConcurrency/ConcurrentTest1", 0.02, ""), - // Parent test fails - createEvent("output", "example", "TestWithConcurrency", 0, "--- FAIL: TestWithConcurrency (0.00s)\n"), - createEvent("fail", "example", "TestWithConcurrency", 0, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.07, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The failing subtest should remain as "fail" - // - The passing subtest should remain as "pass" - // - The parent test should be changed to "pass" - expectedActions := map[string]string{ - "example/TestWithConcurrency/ConcurrentTest0": "fail", - "example/TestWithConcurrency/ConcurrentTest1": "pass", - "example/TestWithConcurrency": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestTableDrivenTests tests handling of table-driven tests -func TestTableDrivenTests(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestWithTableDrivenTests", 0, ""), - // First case passes - createEvent("run", "example", "TestWithTableDrivenTests/Zero", 0, ""), - createEvent("output", "example", "TestWithTableDrivenTests/Zero", 0, "--- PASS: TestWithTableDrivenTests/Zero (0.00s)\n"), - createEvent("pass", "example", "TestWithTableDrivenTests/Zero", 0, ""), - // Second case passes - createEvent("run", "example", "TestWithTableDrivenTests/Positive", 0, ""), - createEvent("output", "example", "TestWithTableDrivenTests/Positive", 0, "--- PASS: TestWithTableDrivenTests/Positive (0.00s)\n"), - createEvent("pass", "example", "TestWithTableDrivenTests/Positive", 0, ""), - // Third case passes - createEvent("run", "example", "TestWithTableDrivenTests/Negative", 0, ""), - createEvent("output", "example", "TestWithTableDrivenTests/Negative", 0, "--- PASS: TestWithTableDrivenTests/Negative (0.00s)\n"), - createEvent("pass", "example", "TestWithTableDrivenTests/Negative", 0, ""), - // Fourth case fails - createEvent("run", "example", "TestWithTableDrivenTests/FailingCase", 0, ""), - createEvent("output", "example", "TestWithTableDrivenTests/FailingCase", 0, " example_test.go:328: Test FailingCase failed: got true, want true\n"), - createEvent("output", "example", "TestWithTableDrivenTests/FailingCase", 0, "--- FAIL: TestWithTableDrivenTests/FailingCase (0.00s)\n"), - createEvent("fail", "example", "TestWithTableDrivenTests/FailingCase", 0, ""), - // Parent test fails - createEvent("output", "example", "TestWithTableDrivenTests", 0, "--- FAIL: TestWithTableDrivenTests (0.00s)\n"), - createEvent("fail", "example", "TestWithTableDrivenTests", 0, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.001, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The failing case should remain as "fail" - // - The passing cases should remain as "pass" - // - The parent test should be changed to "pass" - expectedActions := map[string]string{ - "example/TestWithTableDrivenTests/Zero": "pass", - "example/TestWithTableDrivenTests/Positive": "pass", - "example/TestWithTableDrivenTests/Negative": "pass", - "example/TestWithTableDrivenTests/FailingCase": "fail", - "example/TestWithTableDrivenTests": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestSubtestReuse tests handling of tests that reuse the same subtest function -func TestSubtestReuse(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestWithSubtestReuse", 0, ""), - // First subtest passes - createEvent("run", "example", "TestWithSubtestReuse/First", 0, ""), - createEvent("output", "example", "TestWithSubtestReuse/First", 0, "--- PASS: TestWithSubtestReuse/First (0.00s)\n"), - createEvent("pass", "example", "TestWithSubtestReuse/First", 0, ""), - // Second subtest fails - createEvent("run", "example", "TestWithSubtestReuse/Second", 0, ""), - createEvent("output", "example", "TestWithSubtestReuse/Second", 0, " example_test.go:339: Subtest Second intentionally failed\n"), - createEvent("output", "example", "TestWithSubtestReuse/Second", 0, "--- FAIL: TestWithSubtestReuse/Second (0.00s)\n"), - createEvent("fail", "example", "TestWithSubtestReuse/Second", 0, ""), - // Third subtest passes - createEvent("run", "example", "TestWithSubtestReuse/Third", 0, ""), - createEvent("output", "example", "TestWithSubtestReuse/Third", 0, "--- PASS: TestWithSubtestReuse/Third (0.00s)\n"), - createEvent("pass", "example", "TestWithSubtestReuse/Third", 0, ""), - // Fourth subtest fails - createEvent("run", "example", "TestWithSubtestReuse/Fourth", 0, ""), - createEvent("output", "example", "TestWithSubtestReuse/Fourth", 0, " example_test.go:339: Subtest Fourth intentionally failed\n"), - createEvent("output", "example", "TestWithSubtestReuse/Fourth", 0, "--- FAIL: TestWithSubtestReuse/Fourth (0.00s)\n"), - createEvent("fail", "example", "TestWithSubtestReuse/Fourth", 0, ""), - // Parent test fails - createEvent("output", "example", "TestWithSubtestReuse", 0, "--- FAIL: TestWithSubtestReuse (0.00s)\n"), - createEvent("fail", "example", "TestWithSubtestReuse", 0, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.001, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The failing subtests should remain as "fail" - // - The passing subtests should remain as "pass" - // - The parent test should be changed to "pass" - expectedActions := map[string]string{ - "example/TestWithSubtestReuse/First": "pass", - "example/TestWithSubtestReuse/Second": "fail", - "example/TestWithSubtestReuse/Third": "pass", - "example/TestWithSubtestReuse/Fourth": "fail", - "example/TestWithSubtestReuse": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -// TestSpecialCharactersInTestNames tests handling of tests with special characters in names -func TestSpecialCharactersInTestNames(t *testing.T) { - events := []testEvent{ - createEvent("run", "example", "TestWithSpecialNames", 0, ""), - // Test with spaces - createEvent("run", "example", "TestWithSpecialNames/Test with spaces", 0, ""), - createEvent("output", "example", "TestWithSpecialNames/Test with spaces", 0, "--- PASS: TestWithSpecialNames/Test with spaces (0.00s)\n"), - createEvent("pass", "example", "TestWithSpecialNames/Test with spaces", 0, ""), - // Test with symbols - createEvent("run", "example", "TestWithSpecialNames/Test-with-hyphens", 0, ""), - createEvent("output", "example", "TestWithSpecialNames/Test-with-hyphens", 0, " example_test.go:250: Test with hyphens failed\n"), - createEvent("output", "example", "TestWithSpecialNames/Test-with-hyphens", 0, "--- FAIL: TestWithSpecialNames/Test-with-hyphens (0.00s)\n"), - createEvent("fail", "example", "TestWithSpecialNames/Test-with-hyphens", 0, ""), - // Test with braces - createEvent("run", "example", "TestWithSpecialNames/Test with {braces}", 0, ""), - createEvent("output", "example", "TestWithSpecialNames/Test with {braces}", 0, "--- PASS: TestWithSpecialNames/Test with {braces} (0.00s)\n"), - createEvent("pass", "example", "TestWithSpecialNames/Test with {braces}", 0, ""), - // Parent test fails - createEvent("output", "example", "TestWithSpecialNames", 0, "--- FAIL: TestWithSpecialNames (0.00s)\n"), - createEvent("fail", "example", "TestWithSpecialNames", 0, ""), - createEvent("output", "example", "", 0, "FAIL\n"), - createEvent("fail", "example", "", 0.001, ""), - } - - opts := &Options{ - IgnoreAllSubtestFailures: true, - } - - // With IgnoreAllSubtestFailures=true: - // - The failing subtest should remain as "fail" - // - The passing subtests should remain as "pass" - // - The parent test should be changed to "pass" - expectedActions := map[string]string{ - "example/TestWithSpecialNames/Test with spaces": "pass", - "example/TestWithSpecialNames/Test-with-hyphens": "fail", - "example/TestWithSpecialNames/Test with {braces}": "pass", - "example/TestWithSpecialNames": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -func TestSubTestNameWithSlashes(t *testing.T) { - opts := &Options{ - IgnoreAllSubtestFailures: false, - } - - events := []testEvent{ - createEvent("start", "example", "", 0.0, ""), - createEvent("run", "example", "TestSubTestNameWithSlashes", 0.0, "=== RUN TestSubTestNameWithSlashes\n"), - createEvent("output", "example", "TestSubTestNameWithSlashes", 0.0, "=== PAUSE TestSubTestNameWithSlashes\n"), - createEvent("pause", "example", "TestSubTestNameWithSlashes", 0.0, ""), - createEvent("cont", "example", "TestSubTestNameWithSlashes", 0.0, "=== CONT TestSubTestNameWithSlashes\n"), - createEvent("run", "example", "TestSubTestNameWithSlashes/sub/test/name/with/slashes", 0.0, "=== RUN TestSubTestNameWithSlashes/sub/test/name/with/slashes\n"), - createEvent("output", "example", "TestSubTestNameWithSlashes/sub/test/name/with/slashes", 0.0, " example_test.go:356: This subtest always passes\n"), - createEvent("output", "example", "TestSubTestNameWithSlashes/sub/test/name/with/slashes", 0.0, "--- PASS: TestSubTestNameWithSlashes/sub/test/name/with/slashes (0.00s)\n"), - createEvent("pass", "example", "TestSubTestNameWithSlashes/sub/test/name/with/slashes", 0.0, ""), - createEvent("output", "example", "TestSubTestNameWithSlashes", 0.0, "--- PASS: TestSubTestNameWithSlashes (0.00s)\n"), - createEvent("pass", "example", "TestSubTestNameWithSlashes", 0.0, ""), - createEvent("output", "example", "", 0.0, "PASS\n"), - createEvent("output", "example", "", 0.0, "ok \texample\t0.188s\n"), - createEvent("pass", "example", "", 0.188, ""), - } - - expectedActions := map[string]string{ - "example/TestSubTestNameWithSlashes/sub/test/name/with/slashes": "pass", - "example/TestSubTestNameWithSlashes": "pass", - "example/": "pass", - } - - transformAndVerify(t, events, opts, expectedActions) -} - -func TestFuzzTestWithCorpus(t *testing.T) { - opts := &Options{ - IgnoreAllSubtestFailures: false, - } - - events := []testEvent{ - createEvent("start", "example", "", 0.0, ""), - createEvent("run", "example", "FuzzTestWithCorpus", 0.0, "=== RUN FuzzTestWithCorpus\n"), - - createEvent("run", "example", "FuzzTestWithCorpus/seed#0", 0.0, "=== RUN FuzzTestWithCorpus/seed#0\n"), - createEvent("output", "example", "FuzzTestWithCorpus/seed#0", 0.0, " example_test.go:367: Fuzzing with input: some\n"), - createEvent("output", "example", "FuzzTestWithCorpus/seed#0", 0.0, "--- PASS: FuzzTestWithCorpus/seed#0 (0.00s)\n"), - createEvent("pass", "example", "FuzzTestWithCorpus/seed#0", 0.0, ""), - - createEvent("run", "example", "FuzzTestWithCorpus/seed#1", 0.0, "=== RUN FuzzTestWithCorpus/seed#1\n"), - createEvent("output", "example", "FuzzTestWithCorpus/seed#1", 0.0, " example_test.go:367: Fuzzing with input: corpus\n"), - createEvent("output", "example", "FuzzTestWithCorpus/seed#1", 0.0, "--- PASS: FuzzTestWithCorpus/seed#1 (0.00s)\n"), - createEvent("pass", "example", "FuzzTestWithCorpus/seed#1", 0.0, ""), - - createEvent("run", "example", "FuzzTestWithCorpus/seed#2", 0.0, "=== RUN FuzzTestWithCorpus/seed#2\n"), - createEvent("output", "example", "FuzzTestWithCorpus/seed#2", 0.0, " example_test.go:367: Fuzzing with input: values\n"), - createEvent("output", "example", "FuzzTestWithCorpus/seed#2", 0.0, "--- PASS: FuzzTestWithCorpus/seed#2 (0.00s)\n"), - createEvent("pass", "example", "FuzzTestWithCorpus/seed#2", 0.0, ""), - - createEvent("output", "example", "FuzzTestWithCorpus", 0.0, "--- PASS: FuzzTestWithCorpus (0.00s)\n"), - createEvent("pass", "example", "FuzzTestWithCorpus", 0.0, ""), - - createEvent("output", "example", "", 0.0, "PASS\n"), - createEvent("output", "example", "", 0.0, "ok \texample\t0.231s\n"), - createEvent("pass", "example", "", 0.231, ""), - } - - // All fuzz seeds pass, so the fuzz test and package pass as well - expectedActions := map[string]string{ - "example/FuzzTestWithCorpus/seed#0": "pass", - "example/FuzzTestWithCorpus/seed#1": "pass", - "example/FuzzTestWithCorpus/seed#2": "pass", - "example/FuzzTestWithCorpus": "pass", - "example/": "pass", - } - - // transformAndVerify should yield exit code 0 since everything passes - transformAndVerify(t, events, opts, expectedActions) -} diff --git a/tools/flakeguard/go.mod b/tools/flakeguard/go.mod deleted file mode 100644 index e62e3d7b8..000000000 --- a/tools/flakeguard/go.mod +++ /dev/null @@ -1,71 +0,0 @@ -module github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard - -go 1.24.3 - -require ( - github.com/andygrunwald/go-jira v1.16.0 - github.com/briandowns/spinner v1.23.2 - github.com/charmbracelet/bubbletea v1.3.4 - github.com/charmbracelet/lipgloss v1.1.0 - github.com/go-git/go-git/v5 v5.16.0 - github.com/go-resty/resty/v2 v2.16.5 - github.com/google/go-github/v70 v70.0.0 - github.com/google/go-github/v72 v72.0.0 - github.com/google/uuid v1.6.0 - github.com/rs/zerolog v1.34.0 - github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.10.0 - golang.org/x/oauth2 v0.28.0 - golang.org/x/text v0.24.0 -) - -require ( - dario.cat/mergo v1.0.0 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.1.6 // indirect - github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect - github.com/charmbracelet/x/ansi v0.8.0 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect - github.com/charmbracelet/x/term v0.2.1 // indirect - github.com/cloudflare/circl v1.6.1 // indirect - github.com/cyphar/filepath-securejoin v0.4.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emirpasic/gods v1.18.1 // indirect - github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect - github.com/fatih/color v1.7.0 // indirect - github.com/fatih/structs v1.1.0 // indirect - github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.6.2 // indirect - github.com/golang-jwt/jwt/v4 v4.4.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect - github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/termenv v0.16.0 // indirect - github.com/pjbgf/sha1cd v0.3.2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rivo/uniseg v0.4.7 // indirect - github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/skeema/knownhosts v1.3.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect - github.com/trivago/tgo v1.0.7 // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/tools/flakeguard/go.sum b/tools/flakeguard/go.sum deleted file mode 100644 index d75cc2aee..000000000 --- a/tools/flakeguard/go.sum +++ /dev/null @@ -1,191 +0,0 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= -github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= -github.com/andygrunwald/go-jira v1.16.0 h1:PU7C7Fkk5L96JvPc6vDVIrd99vdPnYudHu4ju2c2ikQ= -github.com/andygrunwald/go-jira v1.16.0/go.mod h1:UQH4IBVxIYWbgagc0LF/k9FRs9xjIiQ8hIcC6HfLwFU= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/briandowns/spinner v1.23.2 h1:Zc6ecUnI+YzLmJniCfDNaMbW0Wid1d5+qcTq4L2FW8w= -github.com/briandowns/spinner v1.23.2/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= -github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= -github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= -github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= -github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= -github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= -github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= -github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= -github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= -github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= -github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= -github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= -github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.0 h1:k3kuOEpkc0DeY7xlL6NaaNg39xdgQbtH5mwCafHO9AQ= -github.com/go-git/go-git/v5 v5.16.0/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= -github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= -github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-github/v70 v70.0.0 h1:/tqCp5KPrcvqCc7vIvYyFYTiCGrYvaWoYMGHSQbo55o= -github.com/google/go-github/v70 v70.0.0/go.mod h1:xBUZgo8MI3lUL/hwxl3hlceJW1U8MVnXP3zUyI+rhQY= -github.com/google/go-github/v72 v72.0.0 h1:FcIO37BLoVPBO9igQQ6tStsv2asG4IPcYFi655PPvBM= -github.com/google/go-github/v72 v72.0.0/go.mod h1:WWtw8GMRiL62mvIquf1kO3onRHeWWKmK01qdCY8c5fg= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= -github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= -github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= -github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= -github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= -github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= -github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= -github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= -github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= -github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tools/flakeguard/golang/golang.go b/tools/flakeguard/golang/golang.go deleted file mode 100644 index ca1360de8..000000000 --- a/tools/flakeguard/golang/golang.go +++ /dev/null @@ -1,362 +0,0 @@ -package golang - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/utils" -) - -type Package struct { - Dir string `json:"Dir"` - ImportPath string `json:"ImportPath"` - Root string `json:"Root"` - Deps []string `json:"Deps"` - TestImports []string `json:"TestImports"` - XTestImports []string `json:"XTestImports"` - GoFiles []string `json:"GoFiles"` - TestGoFiles []string `json:"TestGoFiles"` - XTestGoFiles []string `json:"XTestGoFiles"` - EmbedFiles []string `json:"EmbedFiles"` -} - -type DepMap map[string][]string - -// List returns the output of `go list -json ./...` -// Deprecated: Use Packages instead -func List() (*utils.CmdOutput, error) { - return utils.ExecuteCmd("go", "list", "-json", "./...") -} - -// Packages finds all packages in the repository -func Packages(repoPath string) ([]Package, error) { - var packages []Package - - // Find all go.mod files and run go list -json ./... in the directory of each go.mod file - // This is necessary because go list -json ./... only returns packages that are associated with the current go.mod file - err := filepath.Walk(repoPath, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.Name() == "go.mod" { - cmd := exec.Command("go", "list", "-json", "./...") - cmd.Dir = filepath.Dir(path) - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("error getting packages: %w\nOutput:\n%s", err, string(out)) - } - scanner := bufio.NewScanner(bytes.NewReader(out)) - var buffer bytes.Buffer - - for scanner.Scan() { - line := scanner.Text() - line = strings.TrimSpace(line) - buffer.WriteString(line) - - if line == "}" { - var pkg Package - if err := json.Unmarshal(buffer.Bytes(), &pkg); err != nil { - return err - } - packages = append(packages, pkg) - buffer.Reset() - } - } - - if err := scanner.Err(); err != nil { - return err - } - return nil - } - return nil - }) - - return packages, err -} - -func GetGoDepMap(packages []Package) DepMap { - depMap := make(map[string][]string) - for _, pkg := range packages { - for _, dep := range pkg.Deps { - depMap[dep] = append(depMap[dep], pkg.ImportPath) - } - for _, dep := range pkg.TestImports { - depMap[dep] = append(depMap[dep], pkg.ImportPath) - } - for _, dep := range pkg.XTestImports { - depMap[dep] = append(depMap[dep], pkg.ImportPath) - } - } - return depMap -} - -// GetGoFileMap returns a map of go files to the packages that embed them -func GetGoFileMap(packages []Package, includeTestFiles bool) map[string][]string { - // Build dependency map - fileMap := make(map[string][]string) - for _, pkg := range packages { - addToMap(pkg, pkg.GoFiles, fileMap) - addToMap(pkg, pkg.EmbedFiles, fileMap) - if includeTestFiles { - addToMap(pkg, pkg.TestGoFiles, fileMap) - addToMap(pkg, pkg.XTestGoFiles, fileMap) - } - - } - return fileMap -} - -func GetPackageNames(dirs []string) []string { - var packageNames []string - for _, dir := range dirs { - cmd := exec.Command("go", "list", "-f", "{{.ImportPath}}", ".") - cmd.Dir = dir - out, err := cmd.Output() - if err != nil { - log.Error().Str("directory", dir).Err(err).Msg("Error getting package name") - continue - } - packageName := strings.TrimSpace(string(out)) - if packageName != "" { - packageNames = append(packageNames, packageName) - } - } - return packageNames -} - -func addToMap(pkg Package, files []string, fileMap map[string][]string) { - for _, file := range files { - separator := "/" - if strings.Contains(pkg.Root, "\\") { - // windows path replace - separator = "\\" - } - path := strings.Replace(pkg.Dir, fmt.Sprintf("%s%s", pkg.Root, separator), "", 1) - key := fmt.Sprintf("%s/%s", path, file) - if pkg.Dir == pkg.Root { - key = file - } - // Multiple packages can embed the same file so we need to take that into account - if keys, exists := fileMap[key]; exists { - fileMap[key] = append(keys, pkg.ImportPath) - } else { - keys := []string{ - pkg.ImportPath, - } - fileMap[key] = keys - } - } -} - -//nolint:revive -func FindAffectedPackages(pkg string, depMap DepMap, externalPackage bool, maxDepth int) []string { - visited := make(map[string]bool) - var affected []string - - var dfs func(string, int) - dfs = func(p string, depthLeft int) { - if visited[p] { - return - } - - visited[p] = true - // exclude the package itself if it is an external package - if !(externalPackage && p == pkg) { - affected = append(affected, p) - } - d := depthLeft - 1 - if d != 0 { - for _, dep := range depMap[p] { - dfs(dep, d) - } - } - } - - depth := maxDepth - // depth is zero then we want infinite recursion, set this to -1 to enable this - if depth <= 0 { - depth = -1 - } - dfs(pkg, depth) - return affected -} - -func GetFilePackages(files []string) ([]string, error) { - uniqueDirs := utils.UniqueDirectories(files) - return GetPackageNames(uniqueDirs), nil -} - -// Function to check if a package contains any test functions -var hasTests = func(pkgName string) (bool, error) { - cmd := exec.Command("go", "test", pkgName, "-run=^$", "-list", ".") - - var out bytes.Buffer - cmd.Stdout = &out - if err := cmd.Run(); err != nil { - return false, err - } - - // Parse the output to find test names, excluding the "no test files" message - output := strings.TrimSpace(out.String()) - return output != "" && !strings.Contains(output, "no test files"), nil -} - -// Filter out test packages with no actual test functions -func FilterPackagesWithTests(pkgs []string) []string { - testPkgs := []string{} - for _, pkg := range pkgs { - hasT, err := hasTests(pkg) - if err != nil { - log.Error().Err(err).Str("package", pkg).Msg("Error checking for tests") - } - if hasT { - testPkgs = append(testPkgs, pkg) - } - } - return testPkgs -} - -// SkipTest is a struct that contains the package and name of the test to skip -type SkipTest struct { - Package string - Name string - JiraTicket string - - // Set by SkipTests - // These values might be useless info, but for now we'll keep them - NewlySkipped bool // If the test was newly skipped after calling SkipTests - AlreadySkipped bool // If the test was already skipped before calling SkipTests - File string - Line int -} - -// SkipTests finds all package/test pairs provided and skips them -func SkipTests(repoPath string, testsToSkip []*SkipTest) error { - packages, err := Packages(repoPath) - if err != nil { - return err - } - - for _, testToSkip := range testsToSkip { - var ( - packageDir string - packageImportPath = testToSkip.Package - ) - for _, pkg := range packages { - if pkg.ImportPath == packageImportPath { - packageDir = pkg.Dir - break - } - } - if packageDir == "" { - return fmt.Errorf("directory for package '%s' not found", packageImportPath) - } - - log.Debug(). - Str("package_dir", packageDir). - Str("test", testToSkip.Name). - Str("package", packageImportPath). - Msg("Skipping test") - - err := filepath.Walk(packageDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.IsDir() || !strings.HasSuffix(info.Name(), "_test.go") { - return nil - } - - fset := token.NewFileSet() - fileAst, err := parser.ParseFile(fset, path, nil, parser.ParseComments) - if err != nil { - return err - } - - found := false - ast.Inspect(fileAst, func(n ast.Node) bool { - fn, ok := n.(*ast.FuncDecl) - if !ok || fn.Name.Name != testToSkip.Name { - return true - } - // Check if first parameter is *testing.T - if fn.Type.Params != nil && len(fn.Type.Params.List) > 0 { - param := fn.Type.Params.List[0] - if starExpr, ok := param.Type.(*ast.StarExpr); ok { - if sel, ok := starExpr.X.(*ast.SelectorExpr); ok && sel.Sel.Name == "T" { - // Check if test is already skipped - for _, stmt := range fn.Body.List { - if exprStmt, ok := stmt.(*ast.ExprStmt); ok { - if callExpr, ok := exprStmt.X.(*ast.CallExpr); ok { - if selExpr, ok := callExpr.Fun.(*ast.SelectorExpr); ok { - if selExpr.Sel.Name == "Skip" { - // Test is already skipped, don't modify it - found = true - testToSkip.AlreadySkipped = true - return false - } - } - } - } - } - - // Test is not skipped, add skip statement - skipStmt := &ast.ExprStmt{ - X: &ast.CallExpr{ - Fun: &ast.SelectorExpr{ - X: ast.NewIdent(param.Names[0].Name), - Sel: ast.NewIdent("Skip"), - }, - Args: []ast.Expr{ - &ast.BasicLit{ - Kind: token.STRING, - Value: fmt.Sprintf( - "\"Skipped by flakeguard: https://%s/issues/%s\"", - os.Getenv("JIRA_DOMAIN"), - testToSkip.JiraTicket, - ), - }, - }, - }, - } - testToSkip.File = path - testToSkip.Line = fset.Position(fn.Pos()).Line - testToSkip.NewlySkipped = true - fn.Body.List = append([]ast.Stmt{skipStmt}, fn.Body.List...) - found = true - return false - } - } - } - return true - }) - - if found { - // Write back the file - var out strings.Builder - if err := printer.Fprint(&out, fset, fileAst); err != nil { - return err - } - if err := os.WriteFile(path, []byte(out.String()), info.Mode()); err != nil { - return err - } - return filepath.SkipDir // stop walking - } - return fmt.Errorf("test function %s not found in package %s", testToSkip.Name, testToSkip.Package) - }) - if err != nil { - return err - } - } - return nil -} diff --git a/tools/flakeguard/golang/golang_test.go b/tools/flakeguard/golang/golang_test.go deleted file mode 100644 index 17de45c3f..000000000 --- a/tools/flakeguard/golang/golang_test.go +++ /dev/null @@ -1,176 +0,0 @@ -package golang - -import ( - "bufio" - "encoding/json" - "errors" - "os" - "os/exec" - "path/filepath" - "slices" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// Mock version of hasTests function to simulate various scenarios -func mockHasTests(pkgName string) (bool, error) { - switch pkgName { - case "pkgWithTests": - return true, nil - case "pkgWithoutTests": - return false, nil - case "pkgWithError": - return false, errors.New("test error") - default: - return false, nil - } -} - -func TestFilterPackagesWithTests(t *testing.T) { - t.Parallel() - - // Replace hasTests with mock function - originalHasTests := hasTests - hasTests = mockHasTests - defer func() { hasTests = originalHasTests }() // Restore original function after test - - t.Run("should return packages that contain tests", func(t *testing.T) { - pkgs := []string{"pkgWithTests", "pkgWithoutTests", "pkgWithError"} - expected := []string{"pkgWithTests"} - - result := FilterPackagesWithTests(pkgs) - - assert.Equal(t, expected, result, "Expected packages with tests only") - }) - - t.Run("should return an empty slice when all packages have no tests", func(t *testing.T) { - pkgs := []string{"pkgWithoutTests"} - expected := []string{} - - result := FilterPackagesWithTests(pkgs) - - assert.Equal(t, expected, result, "Expected empty slice for packages without tests") - }) - - t.Run("should handle error scenarios gracefully", func(t *testing.T) { - pkgs := []string{"pkgWithError"} - expected := []string{} - - result := FilterPackagesWithTests(pkgs) - - assert.Equal(t, expected, result, "Expected empty slice for packages with errors") - }) -} - -func TestSkipTests(t *testing.T) { - t.Parallel() - - // Create a temp dir copying over the testdata directory - tempDir, err := os.MkdirTemp("./", "testdata-*") - require.NoError(t, err, "Failed to create temp dir") - t.Cleanup(func() { - if !t.Failed() { - if err := os.RemoveAll(tempDir); err != nil { - t.Fatalf("Failed to remove temp dir: %v", err) - } - return - } - t.Logf("Skipping cleanup of temp dir %s because test failed, leaving it for debugging", tempDir) - }) - - // Copy the testdata directory to the temp dir for running the test on - err = os.CopyFS(tempDir, os.DirFS("testdata")) - require.NoError(t, err, "Error copying testdata to temp dir") - - var ( - expectedRan = []string{"TestPackAFail", "TestPackBFail", "TestPackAPass", "TestPackBPass", "TestPackAFailTrick", "TestPackBFailTrick", "TestPackAAlreadySkipped", "TestPackBAlreadySkipped"} - expectedPassed = []string{"TestPackAPass", "TestPackBPass", "TestPackAFailTrick", "TestPackBFailTrick"} - expectedSkipped = []string{"TestPackAFail", "TestPackBFail", "TestPackAAlreadySkipped", "TestPackBAlreadySkipped"} - testsToSkip = []*SkipTest{ - {Package: "github.com/owner/repo/testdata/package_a", Name: "TestPackAFail"}, - {Package: "github.com/owner/repo/testdata/package_b", Name: "TestPackBFail"}, - } - ) - slices.Sort(expectedRan) - slices.Sort(expectedPassed) - slices.Sort(expectedSkipped) - - err = SkipTests(tempDir, testsToSkip) - assert.NoError(t, err) - - for _, test := range testsToSkip { - if test.Name == "TestPackAFail" || test.Name == "TestPackBFail" { - assert.True(t, test.NewlySkipped, "Expected flaky test to be skipped") - assert.False(t, test.AlreadySkipped, "Expected flaky test to not be skipped again") - } else if test.Name == "TestPackAAlreadySkipped" || test.Name == "TestPackBAlreadySkipped" { - assert.True(t, test.AlreadySkipped, "Expected already skipped test to not be skipped again") - assert.False(t, test.NewlySkipped, "Expected already skipped test to not be skipped again") - } - } - - // Run the tests to make sure only the tests that should be skipped are skipped - cmd := exec.Command("go", "test", "-json", "-v", "./...") - cmd.Dir = tempDir - out, err := cmd.CombinedOutput() - require.NoError(t, err, "Error running tests after modifying test files") - err = os.WriteFile(filepath.Join(tempDir, "test_output.json"), out, 0644) - require.NoError(t, err, "Error writing test output to file") - - ran, passed, skipped, err := parseTestOutput(t, filepath.Join(tempDir, "test_output.json")) - require.NoError(t, err, "Error parsing test output") - - assert.EqualValues(t, expectedRan, ran, "Expected certain tests to be run") - assert.EqualValues(t, expectedPassed, passed, "Expected certain tests to pass") - assert.EqualValues(t, expectedSkipped, skipped, "Expected certain tests to be skipped") -} - -type goTestOutput struct { - Package string `json:"package"` - Test string `json:"test"` - Action string `json:"action"` - Output string `json:"output"` -} - -// Don't use the other flakeguard parsing as they're too complex for this, and we shouldn't test them here -func parseTestOutput(t *testing.T, jsonFile string) (ran, passed, skipped []string, err error) { - t.Helper() - - f, err := os.Open(jsonFile) - if err != nil { - return nil, nil, nil, err - } - defer f.Close() - - seen := make(map[string]bool) - scanner := bufio.NewScanner(f) - for scanner.Scan() { - var event goTestOutput - line := scanner.Bytes() - if err := json.Unmarshal(line, &event); err != nil { - continue // skip lines that aren't test events - } - if event.Test == "" { - continue - } - switch event.Action { - case "run": - if !seen[event.Test] { - ran = append(ran, event.Test) - seen[event.Test] = true - } - case "pass": - passed = append(passed, event.Test) - case "skip": - skipped = append(skipped, event.Test) - } - } - if err := scanner.Err(); err != nil { - return nil, nil, nil, err - } - slices.Sort(ran) - slices.Sort(passed) - slices.Sort(skipped) - return ran, passed, skipped, nil -} diff --git a/tools/flakeguard/golang/testdata/go.mod b/tools/flakeguard/golang/testdata/go.mod deleted file mode 100644 index 7cc5c70c5..000000000 --- a/tools/flakeguard/golang/testdata/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/owner/repo/testdata - -go 1.24.3 diff --git a/tools/flakeguard/golang/testdata/package_a/pack_a_test.go b/tools/flakeguard/golang/testdata/package_a/pack_a_test.go deleted file mode 100644 index 1a5b5ab81..000000000 --- a/tools/flakeguard/golang/testdata/package_a/pack_a_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package package_a - -import "testing" - -func TestPackAPass(t *testing.T) { - t.Log("This test should pass and not get skipped by flakeguard") -} - -func TestPackAFail(t *testing.T) { - t.Log("This test should fail and get skipped by flakeguard") - t.FailNow() -} - -func TestPackAFailTrick(t *testing.T) { - t.Log("This test should not fail or get skipped by flakeguard") -} - -func TestPackAAlreadySkipped(t *testing.T) { - t.Skip("This test should already be skipped, and not be skipped again") -} diff --git a/tools/flakeguard/golang/testdata/package_b/pack_b_test.go b/tools/flakeguard/golang/testdata/package_b/pack_b_test.go deleted file mode 100644 index 912732fd2..000000000 --- a/tools/flakeguard/golang/testdata/package_b/pack_b_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package package_b - -import "testing" - -func TestPackBFail(t *testing.T) { - t.Log("This test should fail and get skipped by flakeguard") - t.FailNow() -} - -func TestPackBPass(t *testing.T) { - t.Log("This test should pass and not get skipped by flakeguard") -} - -func TestPackBFailTrick(t *testing.T) { - t.Log("This test should not fail or get skipped by flakeguard") -} - -func TestPackBAlreadySkipped(t *testing.T) { - t.Skip("This test should already be skipped, and not be skipped again") -} diff --git a/tools/flakeguard/jirautils/jira.go b/tools/flakeguard/jirautils/jira.go deleted file mode 100644 index f628f6c68..000000000 --- a/tools/flakeguard/jirautils/jira.go +++ /dev/null @@ -1,247 +0,0 @@ -package jirautils - -import ( - "context" - "encoding/json" - "fmt" - "io" - "os" - "strings" - - "github.com/andygrunwald/go-jira" - "github.com/rs/zerolog/log" -) - -const PillarCustomFieldID = "customfield_11016" // Define constant for pillar field - -// GetJiraClient creates and returns a Jira client using env vars. -func GetJiraClient() (*jira.Client, error) { - domain := os.Getenv("JIRA_DOMAIN") - if domain == "" { - return nil, fmt.Errorf("JIRA_DOMAIN env var is not set") - } - email := os.Getenv("JIRA_EMAIL") - if email == "" { - return nil, fmt.Errorf("JIRA_EMAIL env var is not set") - } - apiKey := os.Getenv("JIRA_API_KEY") - if apiKey == "" { - return nil, fmt.Errorf("JIRA_API_KEY env var is not set") - } - - tp := jira.BasicAuthTransport{ - Username: email, - Password: apiKey, - } - return jira.NewClient(tp.Client(), fmt.Sprintf("https://%s", domain)) -} - -// CreateTicketInJira creates a new Jira ticket with specified details. -// Adds support for assignee, priority, labels, and pillar name. -func CreateTicketInJira( - ctx context.Context, // Add context for cancellation/timeout - client *jira.Client, - summary, description, projectKey, issueType, assigneeID, priorityName string, - relatedJiraTickets []string, - labels []string, // Add labels parameter - pillarName string, // Add pillarName parameter -) (string, error) { - if client == nil { - return "", fmt.Errorf("jira client is nil") - } - - // Basic validation - if summary == "" || projectKey == "" || issueType == "" { - return "", fmt.Errorf("summary, projectKey, and issueType are required") - } - - // Prepare issue fields - issueFields := &jira.IssueFields{ - Project: jira.Project{Key: projectKey}, - Summary: summary, - Description: description, - Type: jira.IssueType{Name: issueType}, - Labels: labels, // Add labels - } - for _, relatedTicket := range relatedJiraTickets { - issueFields.IssueLinks = append(issueFields.IssueLinks, &jira.IssueLink{ - ID: relatedTicket, - Type: jira.IssueLinkType{Name: "Relates"}, - }) - } - - // Add Assignee if provided - if assigneeID != "" { - issueFields.Assignee = &jira.User{AccountID: assigneeID} // Use AccountID typically - // Note: Sometimes 'Name' (username) is used instead of AccountID. Verify for your Jira instance. - // issueFields.Assignee = &jira.User{Name: assigneeID} - } - - // Add Priority if provided - if priorityName != "" { - issueFields.Priority = &jira.Priority{Name: priorityName} - } - - // Add Pillar Name (custom field) if provided - // Custom fields often require a specific structure (e.g., map[string]string{"value": "Pillar"}) - if pillarName != "" { - if issueFields.Unknowns == nil { - issueFields.Unknowns = make(map[string]any) - } - // The exact structure depends on the custom field type in Jira (e.g., text, select list) - // For a simple text field or select list (by value): - issueFields.Unknowns[PillarCustomFieldID] = map[string]any{"value": pillarName} - // If it's a select list by ID, it would be map[string]any{"id": "12345"} - } - - issue := jira.Issue{ - Fields: issueFields, - } - - // Use context with the API call - createdIssue, resp, err := client.Issue.CreateWithContext(ctx, &issue) - if err != nil { - // Try to read response body for more details - errMsg := ReadJiraErrorResponse(resp) - log.Error().Err(err).Str("responseBody", errMsg).Msg("Failed to create Jira issue") - // Return wrapped error with response details - return "", fmt.Errorf("failed to create Jira issue: %w; response: %s", err, errMsg) - } - if createdIssue == nil { - return "", fmt.Errorf("jira API returned success but issue object is nil") - } - - return createdIssue.Key, nil -} - -// DeleteTicketInJira permanently deletes a Jira ticket. Use with caution. -func DeleteTicketInJira(client *jira.Client, issueKey string) error { - if client == nil { - return fmt.Errorf("jira client is nil") - } - if issueKey == "" { - return fmt.Errorf("issue key cannot be empty") - } - - resp, err := client.Issue.DeleteWithContext(context.Background(), issueKey) - if err != nil { - errMsg := ReadJiraErrorResponse(resp) - log.Error().Err(err).Str("key", issueKey).Str("responseBody", errMsg).Msg("Failed to delete Jira issue") - return fmt.Errorf("failed to delete issue %s: %w; response: %s", issueKey, err, errMsg) - } - - return nil -} - -// PostCommentToTicket posts a comment to a Jira ticket identified by ticketKey. -// It returns an error if the comment cannot be added. -func PostCommentToTicket(client *jira.Client, ticketKey, comment string) error { - cmt := jira.Comment{ - Body: comment, - } - _, resp, err := client.Issue.AddComment(ticketKey, &cmt) - if err != nil { - return fmt.Errorf("failed to add comment to ticket %s: %w (response: %+v)", ticketKey, err, resp) - } - return nil -} - -// ReadJiraErrorResponse tries to extract error messages from Jira's response body. -func ReadJiraErrorResponse(resp *jira.Response) string { - if resp == nil || resp.Body == nil { - return "(No response body)" - } - defer resp.Body.Close() // Ensure body is closed - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return fmt.Sprintf("(Failed to read response body: %v)", err) - } - - bodyString := string(bodyBytes) - - // Attempt to unmarshal into Jira's standard error structure - var jiraErr jira.Error - if err := json.Unmarshal(bodyBytes, &jiraErr); err == nil { - // Extract messages if available - var messages []string - if len(jiraErr.ErrorMessages) > 0 { - messages = append(messages, jiraErr.ErrorMessages...) - } - if len(jiraErr.Errors) > 0 { - for key, val := range jiraErr.Errors { - messages = append(messages, fmt.Sprintf("%s: %s", key, val)) - } - } - if len(messages) > 0 { - return strings.Join(messages, "; ") - } - } - - // If JSON parsing fails or yields no messages, return the raw body (truncated if too long) - maxLen := 500 - if len(bodyString) > maxLen { - return bodyString[:maxLen] + "..." - } - return bodyString -} - -// getJiraLink returns the full Jira URL for a given ticket key if JIRA_DOMAIN is set. -func GetJiraLink(ticketKey string) string { - domain := os.Getenv("JIRA_DOMAIN") - if domain != "" { - return fmt.Sprintf("https://%s/browse/%s", domain, ticketKey) - } - return ticketKey -} - -func ExtractPillarValue(issue jira.Issue) string { - if issue.Fields == nil { - return "" - } - if pillarFieldRaw, ok := issue.Fields.Unknowns[PillarCustomFieldID]; ok && pillarFieldRaw != nil { - // Handle different possible structures for custom fields (text, select list value) - if pillarFieldMap, ok := pillarFieldRaw.(map[string]any); ok { - if value, ok := pillarFieldMap["value"].(string); ok { - return value // Common for select lists - } - if value, ok := pillarFieldMap["name"].(string); ok { - return value // Sometimes 'name' is used - } - } - // Handle simple text field case - if value, ok := pillarFieldRaw.(string); ok { - return value - } - } - return "" // Not found or unexpected format -} - -// UpdatePillarName updates the pillar name custom field for a given issue key. -func UpdatePillarName(client *jira.Client, issueKey, targetPillar string) error { - if client == nil || issueKey == "" || targetPillar == "" { - return fmt.Errorf("client, issueKey, and targetPillar must be provided") - } - // Construct the payload carefully based on field type - // Assuming it's a select list identified by 'value' - updatePayload := map[string]any{ - "fields": map[string]any{ - PillarCustomFieldID: map[string]any{ - "value": targetPillar, - }, - }, - } - - req, err := client.NewRequest("PUT", fmt.Sprintf("rest/api/2/issue/%s", issueKey), updatePayload) - if err != nil { - return fmt.Errorf("failed to create Jira update request: %w", err) - } - - resp, err := client.Do(req, nil) // No need to decode response body for PUT usually - if err != nil { - errMsg := ReadJiraErrorResponse(resp) // Use helper if available - return fmt.Errorf("failed to update pillar name for %s: %w; response: %s", issueKey, err, errMsg) - } - - return nil // Success -} diff --git a/tools/flakeguard/localdb/localdb.go b/tools/flakeguard/localdb/localdb.go deleted file mode 100644 index f99d13f9e..000000000 --- a/tools/flakeguard/localdb/localdb.go +++ /dev/null @@ -1,235 +0,0 @@ -package localdb - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "slices" - "sync" // Import sync for mutex - "time" - - "github.com/rs/zerolog/log" -) - -const defaultDBFileName = ".flaky_test_db.json" - -// Entry represents one record in the local DB for a given test. -// Removed IsSkipped as SkippedAt.IsZero() is the source of truth. -type Entry struct { - TestPackage string `json:"test_package"` - TestName string `json:"test_name"` - JiraTicket string `json:"jira_ticket,omitempty"` // The current Jira ticket for fixing the flaky test - PastJiraTickets []string `json:"past_jira_tickets,omitempty"` // All past, closed Jira tickets for the test - AssigneeID string `json:"jira_assignee_id,omitempty"` - SkippedAt time.Time `json:"skipped_at,omitempty"` -} - -// DB is a simple in-memory map keyed by "pkg::testName" => Entry, -// and it contains the file path used for persistence. -// Added a mutex for safe concurrent access if needed, although current TUI might be single-threaded. -type DB struct { - data map[string]Entry - path string - mu sync.RWMutex // Read-Write mutex -} - -// NewDBWithPath creates a new, empty DB using the provided path and returns a POINTER. -// If the provided path is empty, the default path is used. -func NewDBWithPath(path string) *DB { // Returns *DB - if path == "" { - path = DefaultDBPath() - } - log.Debug().Str("path", path).Msg("Initializing DB") - // Return address of the new DB struct - return &DB{ - data: make(map[string]Entry), - path: path, - // Mutex is zero-valued (unlocked) implicitly - } -} - -// LoadDB loads the JSON file from the default path into a DB, returning a POINTER. -func LoadDB() (*DB, error) { // Returns *DB - return LoadDBWithPath("") -} - -// LoadDBWithPath loads the JSON file from the specified path into a DB, returning a POINTER. -// Corrected locking strategy. -func LoadDBWithPath(path string) (*DB, error) { // Returns *DB - db := NewDBWithPath(path) // Gets *DB pointer - - // Check file existence *before* locking - fileInfo, err := os.Stat(db.path) // Use db.path directly - if os.IsNotExist(err) { - log.Info().Str("path", db.path).Msg("Local DB file not found, starting with empty DB.") - return db, nil // File doesn't exist, return the initialized empty DB pointer - } - if err != nil { - return db, fmt.Errorf("failed to stat local DB file '%s': %w", db.path, err) - } - if fileInfo.IsDir() { - return db, fmt.Errorf("local DB path '%s' is a directory, not a file", db.path) - } - - // File exists, lock for reading and decoding - db.mu.Lock() // Lock the pointed-to DB's mutex - defer db.mu.Unlock() // Ensure unlock - - f, err := os.Open(db.path) - if err != nil { - return db, fmt.Errorf("failed to open local DB file '%s': %w", db.path, err) - } - defer f.Close() - - tempData := make(map[string]Entry) - decoder := json.NewDecoder(f) - if err := decoder.Decode(&tempData); err != nil { - log.Error().Err(err).Str("path", db.path).Msg("Failed to decode local DB JSON. Returning empty DB state.") - db.data = make(map[string]Entry) // Clear data on decode error - return db, fmt.Errorf("failed to decode local DB JSON from '%s': %w", db.path, err) - } - - // Success, assign data - db.data = tempData // Modify the map in the pointed-to DB struct - log.Info().Str("path", db.path).Int("entries", len(db.data)).Msg("Local DB loaded successfully.") - return db, nil // Return the pointer to the populated DB - // db.mu.Unlock() is called here via defer -} - -// Save persists the DB contents to its file path in JSON format. -func (db *DB) Save() error { - db.mu.RLock() // Lock for reading data - defer db.mu.RUnlock() - - if db.path == "" { - return fmt.Errorf("cannot save DB: path is not set") - } - - log.Debug().Str("path", db.path).Int("entries", len(db.data)).Msg("Attempting to save local DB") - - // Create directory if it doesn't exist - dir := filepath.Dir(db.path) - if err := os.MkdirAll(dir, 0750); err != nil { // Use 0750 for permissions - return fmt.Errorf("failed to create directory '%s' for local DB: %w", dir, err) - } - - // Create or truncate the file - f, err := os.Create(db.path) - if err != nil { - return fmt.Errorf("failed to create/truncate local DB file '%s': %w", db.path, err) - } - defer f.Close() - - enc := json.NewEncoder(f) - enc.SetIndent("", " ") // Prettify the JSON. - if err := enc.Encode(db.data); err != nil { - return fmt.Errorf("failed to encode local DB to JSON '%s': %w", db.path, err) - } - - log.Info().Str("path", db.path).Msg("Local DB saved successfully.") - return nil -} - -// FilePath returns the file path where the DB is stored. -func (db *DB) FilePath() string { - // No lock needed as path is immutable after creation - return db.path -} - -// GetEntry retrieves the full Entry record for a given test. -func (db *DB) GetEntry(testPackage, testName string) (Entry, bool) { - db.mu.RLock() - defer db.mu.RUnlock() - key := makeKey(testPackage, testName) - entry, exists := db.data[key] - return entry, exists -} - -// UpsertEntry updates or inserts a record with all relevant details. -// This is the preferred method for modifying DB state. -func (db *DB) UpsertEntry(testPackage, testName, jiraTicket string, skippedAt time.Time, assigneeID string) error { - if testPackage == "" || testName == "" { - return fmt.Errorf("cannot upsert entry with empty package or name") - } - - db.mu.Lock() // Lock for writing - defer db.mu.Unlock() - - key := makeKey(testPackage, testName) - // Get existing entry or create a new one - entry, _ := db.data[key] // We don't care about 'exists' here, just overwrite - - // Update ALL fields based on input parameters - entry.TestPackage = testPackage // Ensure these are set even if entry was new - entry.TestName = testName - if entry.JiraTicket != jiraTicket && entry.JiraTicket != "" { - if !slices.Contains(entry.PastJiraTickets, entry.JiraTicket) { - entry.PastJiraTickets = append(entry.PastJiraTickets, entry.JiraTicket) - } - } - entry.JiraTicket = jiraTicket - entry.AssigneeID = assigneeID - entry.SkippedAt = skippedAt.UTC() // Always store in UTC - - // Store the updated/new entry back in the map - db.data[key] = entry - log.Debug().Str("key", key).Interface("entry", entry).Msg("Upserted DB entry") - return nil -} - -// RemoveEntry removes a record from the DB. Returns true if an entry was removed. -func (db *DB) RemoveEntry(testPackage, testName string) bool { - db.mu.Lock() - defer db.mu.Unlock() - key := makeKey(testPackage, testName) - _, exists := db.data[key] - if exists { - delete(db.data, key) - log.Debug().Str("key", key).Msg("Removed DB entry") - } - return exists -} - -// GetAllEntries returns a slice of all entries currently in the DB. -func (db *DB) GetAllEntries() []Entry { - db.mu.RLock() - defer db.mu.RUnlock() - entries := make([]Entry, 0, len(db.data)) - for _, entry := range db.data { - entries = append(entries, entry) - } - return entries -} - -// GetAllCurrentlyFlakyEntries returns all entries that currently have an open Jira ticket -// for being a flaky test. -func (db *DB) GetAllCurrentlyFlakyEntries() []Entry { - db.mu.RLock() - defer db.mu.RUnlock() - entries := make([]Entry, 0, len(db.data)) - for _, entry := range db.data { - if entry.JiraTicket != "" { - entries = append(entries, entry) - } - } - return entries -} - -// DefaultDBPath returns the default DB file path in the user's home directory. -// Renamed from getDefaultDBPath to be exported. -// If the user's home directory cannot be determined, it falls back to the current directory. -func DefaultDBPath() string { - home, err := os.UserHomeDir() - if err != nil { - log.Warn().Msg("Failed to get user home directory; using current directory for local DB.") - home = "." // Use current directory as fallback - } - return filepath.Join(home, defaultDBFileName) -} - -// makeKey is a helper to combine the package and test name into a single map key. -func makeKey(pkg, testName string) string { - // Consider normalization? Lowercase? Trim spaces? For now, keep simple. - return pkg + "::" + testName -} diff --git a/tools/flakeguard/main.go b/tools/flakeguard/main.go deleted file mode 100644 index 28249af16..000000000 --- a/tools/flakeguard/main.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "io" - "os" - "time" - - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "github.com/rs/zerolog/pkgerrors" - "github.com/spf13/cobra" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/cmd" -) - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "flakeguard", - Short: "A tool to find flaky tests", -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - err := rootCmd.Execute() - if err != nil { - os.Exit(1) - } -} - -func init() { - zerolog.TimeFieldFormat = time.RFC3339Nano - log.Logger = log.Output(zerolog.ConsoleWriter{ - Out: io.Discard, - TimeFormat: "15:04:05.00", // hh:mm:ss.ss format - }) - zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack - rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") - - rootCmd.AddCommand(cmd.FindTestsCmd) - rootCmd.AddCommand(cmd.RunTestsCmd) - rootCmd.AddCommand(cmd.CheckTestOwnersCmd) - rootCmd.AddCommand(cmd.GenerateTestReportCmd) - rootCmd.AddCommand(cmd.GenerateReportCmd) - rootCmd.AddCommand(cmd.GetGHArtifactLinkCmd) - rootCmd.AddCommand(cmd.SendToSplunkCmd) - rootCmd.AddCommand(cmd.ReviewTicketsCmd) - rootCmd.AddCommand(cmd.CreateTicketsCmd) - rootCmd.AddCommand(cmd.SyncJiraCmd) - rootCmd.AddCommand(cmd.MakePRCmd) -} - -func main() { - rootCmd.Execute() -} diff --git a/tools/flakeguard/mapping/mapping.go b/tools/flakeguard/mapping/mapping.go deleted file mode 100644 index 85cdd5d51..000000000 --- a/tools/flakeguard/mapping/mapping.go +++ /dev/null @@ -1,109 +0,0 @@ -// mapping/mapping.go -package mapping - -import ( - "encoding/json" - "fmt" - "os" - "regexp" - - "github.com/rs/zerolog/log" -) - -// UserMapping defines the structure for mapping Jira User IDs to Pillar Names. -type UserMapping struct { - JiraUserID string `json:"jira_user_id"` - PillarName string `json:"pillar_name"` - // Add other relevant user details if needed (e.g., Slack ID, Name) -} - -// UserTestMapping defines the structure for mapping test patterns to Jira User IDs. -type UserTestMapping struct { - JiraUserID string `json:"jira_user_id"` - Pattern string `json:"pattern"` -} - -// UserTestMappingWithRegex holds the original mapping and its compiled regex. -type UserTestMappingWithRegex struct { - UserTestMapping - CompiledRegex *regexp.Regexp -} - -// LoadUserMappings reads the user mapping file and returns a map for easy lookup. -func LoadUserMappings(path string) (map[string]UserMapping, error) { - data, err := os.ReadFile(path) - if err != nil { - // It might be acceptable for this file to be optional, return empty map - if os.IsNotExist(err) { - log.Warn().Str("path", path).Msg("User mapping file not found, proceeding without it.") - return make(map[string]UserMapping), nil - } - return nil, fmt.Errorf("failed to read user mapping file '%s': %w", path, err) - } - - var mappings []UserMapping - if err := json.Unmarshal(data, &mappings); err != nil { - return nil, fmt.Errorf("failed to unmarshal user mapping file '%s': %w", path, err) - } - - // Convert array to map for efficient lookup - userMap := make(map[string]UserMapping) - for _, user := range mappings { - userMap[user.JiraUserID] = user - } - log.Info().Str("path", path).Int("count", len(userMap)).Msg("Loaded user mappings") - return userMap, nil -} - -// LoadUserTestMappings reads the user test mapping file, compiles regex patterns, -// and returns a slice of mappings with their compiled regexes. -func LoadUserTestMappings(path string) ([]UserTestMappingWithRegex, error) { - data, err := os.ReadFile(path) - if err != nil { - // It might be acceptable for this file to be optional, return empty slice - if os.IsNotExist(err) { - log.Warn().Str("path", path).Msg("User test mapping file not found, proceeding without auto-assignment.") - return []UserTestMappingWithRegex{}, nil - } - return nil, fmt.Errorf("failed to read user test mapping file '%s': %w", path, err) - } - - var mappings []UserTestMapping - if err := json.Unmarshal(data, &mappings); err != nil { - return nil, fmt.Errorf("failed to unmarshal user test mapping file '%s': %w", path, err) - } - - compiledMappings := make([]UserTestMappingWithRegex, 0, len(mappings)) - for _, m := range mappings { - re, err := regexp.Compile(m.Pattern) - if err != nil { - // Log error but continue processing other patterns - log.Error().Err(err).Str("pattern", m.Pattern).Msg("Failed to compile regex pattern, skipping this mapping") - continue - } - compiledMappings = append(compiledMappings, UserTestMappingWithRegex{ - UserTestMapping: m, - CompiledRegex: re, - }) - } - - log.Info().Str("path", path).Int("count", len(compiledMappings)).Msg("Loaded and compiled user test mappings") - return compiledMappings, nil -} - -// FindAssigneeIDForTest iterates through the compiled test mappings and returns the -// Jira User ID from the *first* matching pattern. The order in the mapping file matters. -// It typically matches against the testPackage. -func FindAssigneeIDForTest(testPath string, compiledMappings []UserTestMappingWithRegex) (string, error) { - if testPath == "" { - return "", fmt.Errorf("testPath cannot be empty") - } - for _, compiledMapping := range compiledMappings { - if compiledMapping.CompiledRegex.MatchString(testPath) { - log.Debug().Str("testPath", testPath).Str("pattern", compiledMapping.Pattern).Str("assignee", compiledMapping.JiraUserID).Msg("Found matching assignee pattern") - return compiledMapping.JiraUserID, nil // Return the first match - } - } - log.Debug().Str("testPath", testPath).Msg("No matching assignee pattern found") - return "", nil // No match found -} diff --git a/tools/flakeguard/model/ticket.go b/tools/flakeguard/model/ticket.go deleted file mode 100644 index d1798baac..000000000 --- a/tools/flakeguard/model/ticket.go +++ /dev/null @@ -1,58 +0,0 @@ -package model - -import ( - "regexp" - "sort" - "time" - - "github.com/rs/zerolog/log" -) - -// FlakyTicket represents a ticket for a flaky test. -type FlakyTicket struct { - RowIndex int - Confirmed bool - Valid bool - InvalidReason string - TestName string - TestPackage string - Summary string - Description string - ExistingJiraKey string - ExistingTicketSource string // "localdb" or "jira" - AssigneeId string - Priority string - FlakeRate float64 - SkippedAt time.Time // timestamp when the ticket was marked as skipped - MissingUserMapping bool // true if the assignee ID exists but has no mapping in user_mapping.json - PillarName string // pillar name from Jira customfield_11016 - JiraStatus string // status from Jira - RelatedJiraTickets []string // related Jira tickets -} - -// MapTestPackageToUser maps a test package to a user ID using regex patterns -func MapTestPackageToUser(testPackage string, testPatternMap map[string]string) string { - // Sort patterns by length (longest first) to ensure most specific match - patterns := make([]string, 0, len(testPatternMap)) - for pattern := range testPatternMap { - patterns = append(patterns, pattern) - } - sort.Slice(patterns, func(i, j int) bool { - return len(patterns[i]) > len(patterns[j]) - }) - - // Try each pattern - for _, pattern := range patterns { - matched, err := regexp.MatchString(pattern, testPackage) - if err != nil { - log.Error().Err(err).Msgf("Error matching pattern %s against package %s", pattern, testPackage) - continue - } - if matched { - return testPatternMap[pattern] - } - } - - // If no match found, return empty string - return "" -} diff --git a/tools/flakeguard/reports/codebase_scanner.go b/tools/flakeguard/reports/codebase_scanner.go deleted file mode 100644 index a45676df1..000000000 --- a/tools/flakeguard/reports/codebase_scanner.go +++ /dev/null @@ -1,70 +0,0 @@ -package reports - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "os" - "path/filepath" - "strings" -) - -// TestFileMap maps test function names to their file paths. -type TestFileMap map[string]string - -// ScanTestFiles scans the codebase for test functions and maps them to file paths. -func ScanTestFiles(rootDir string) (TestFileMap, error) { - testFileMap := make(TestFileMap) - - // Ensure rootDir is absolute - rootDir, err := filepath.Abs(rootDir) - if err != nil { - return nil, fmt.Errorf("error normalizing rootDir: %v", err) - } - - // Walk through the root directory to find test files - err = filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Skip files that are not Go test files - if !strings.HasSuffix(path, "_test.go") { - return nil - } - - // Normalize path relative to rootDir - relPath, err := filepath.Rel(rootDir, path) - if err != nil { - return fmt.Errorf("error getting relative path for %s: %v", path, err) - } - relPath = filepath.ToSlash(relPath) // Ensure Unix-style paths - - // Parse the Go file - fset := token.NewFileSet() - node, err := parser.ParseFile(fset, path, nil, parser.AllErrors) - if err != nil { - return fmt.Errorf("error parsing file %s: %v", path, err) - } - - // Traverse the AST to find test or fuzz functions - ast.Inspect(node, func(n ast.Node) bool { - funcDecl, ok := n.(*ast.FuncDecl) - if !ok { - return true - } - - // Match both "Test" and "Fuzz" prefixes - if strings.HasPrefix(funcDecl.Name.Name, "Test") || strings.HasPrefix(funcDecl.Name.Name, "Fuzz") { - // Add the function to the map with relative path - testFileMap[funcDecl.Name.Name] = relPath - } - return true - }) - - return nil - }) - - return testFileMap, err -} diff --git a/tools/flakeguard/reports/data.go b/tools/flakeguard/reports/data.go deleted file mode 100644 index b83e40ec5..000000000 --- a/tools/flakeguard/reports/data.go +++ /dev/null @@ -1,245 +0,0 @@ -package reports - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "sort" - "strings" - "time" -) - -// TestResult contains the results and outputs of a single test -type TestResult struct { - // ReportID is the ID of the report this test result belongs to - // used mostly for Splunk logging - ReportID string `json:"report_id,omitempty"` - TestName string `json:"test_name"` - TestPackage string `json:"test_package"` - PackagePanic bool `json:"package_panic"` - Panic bool `json:"panic"` - Timeout bool `json:"timeout"` - Race bool `json:"race"` - Skipped bool `json:"skipped"` - PassRatio float64 `json:"pass_ratio"` - Runs int `json:"runs"` - Failures int `json:"failures"` - Successes int `json:"successes"` - Skips int `json:"skips"` - Outputs map[string][]string `json:"-"` // Temporary storage for outputs during test run - PassedOutputs map[string][]string `json:"passed_outputs,omitempty"` // Outputs for passed runs - FailedOutputs map[string][]string `json:"failed_outputs,omitempty"` // Outputs for failed runs - Durations []time.Duration `json:"durations"` - PackageOutputs []string `json:"package_outputs,omitempty"` - TestPath string `json:"test_path,omitempty"` - CodeOwners []string `json:"code_owners,omitempty"` -} - -func SaveTestResultsToFile(results []TestResult, filePath string) error { - // Create directory path if it doesn't exist - dir := filepath.Dir(filePath) - if err := os.MkdirAll(dir, 0o755); err != nil { - return fmt.Errorf("error creating directories: %w", err) - } - - jsonData, err := json.MarshalIndent(results, "", " ") - if err != nil { - return fmt.Errorf("error marshaling test results to JSON: %w", err) - } - - if err := os.WriteFile(filePath, jsonData, 0o600); err != nil { - return fmt.Errorf("error writing test results to file: %w", err) - } - - return nil -} - -// SummaryData contains aggregated data from a set of test results -type SummaryData struct { - // Overall test run stats - // UniqueTestsRun tracks how many unique tests were run - UniqueTestsRun int `json:"unique_tests_run"` - // UniqueSkippedTestCount tracks how many unique tests were entirely skipped - UniqueSkippedTestCount int `json:"unique_skipped_test_count"` - // TestRunCount tracks the max amount of times the tests were run, giving an idea of how many times flakeguard was executed - // e.g. if TestA was run 5 times, and TestB was run 10 times, UniqueTestsRun == 2 and TestRunCount == 10 - TestRunCount int `json:"test_run_count"` - // PanickedTests tracks how many tests panicked - PanickedTests int `json:"panicked_tests"` - // RacedTests tracks how many tests raced - RacedTests int `json:"raced_tests"` - // FlakyTests tracks how many tests are considered flaky - FlakyTests int `json:"flaky_tests"` - // FlakyTestPercent is the human-readable percentage of tests that are considered flaky - FlakyTestPercent string `json:"flaky_test_percent"` - - // Individual test run counts - // TotalRuns tracks how many total test runs were executed - // e.g. if TestA was run 5 times, and TestB was run 10 times, TotalRuns would be 15 - TotalRuns int `json:"total_runs"` - // PassedRuns tracks how many test runs passed - PassedRuns int `json:"passed_runs"` - // FailedRuns tracks how many test runs failed - FailedRuns int `json:"failed_runs"` - // SkippedRuns tracks how many test runs were skipped - SkippedRuns int `json:"skipped_runs"` - // PassPercent is the human-readable percentage of test runs that passed - PassPercent string `json:"pass_percent"` -} - -// SplunkType represents what type of data is being sent to Splunk, e.g. a report or a result. -// This is a custom field to help us distinguish what kind of data we're sending. -type SplunkType string - -const ( - Report SplunkType = "report" - Result SplunkType = "result" - - // https://docs.splunk.com/Splexicon:Sourcetype - SplunkSourceType = "flakeguard_json" - // https://docs.splunk.com/Splexicon:Index - SplunkIndex = "github_flakeguard_runs" -) - -// SplunkTestReport is the full wrapper structure sent to Splunk for the full test report (sans results) -type SplunkTestReport struct { - Event SplunkTestReportEvent `json:"event"` // https://docs.splunk.com/Splexicon:Event - SourceType string `json:"sourcetype"` // https://docs.splunk.com/Splexicon:Sourcetype - Index string `json:"index"` // https://docs.splunk.com/Splexicon:Index -} - -// SplunkTestReportEvent contains the actual meat of the Splunk test report event -type SplunkTestReportEvent struct { - Event string `json:"event"` - Type SplunkType `json:"type"` - Data TestReport `json:"data"` - // Incomplete indicates that there were issues uploading test results and the report is incomplete - Incomplete bool `json:"incomplete"` -} - -// SplunkTestResult is the full wrapper structure sent to Splunk for a single test result -type SplunkTestResult struct { - Event SplunkTestResultEvent `json:"event"` // https://docs.splunk.com/Splexicon:Event - SourceType string `json:"sourcetype"` // https://docs.splunk.com/Splexicon:Sourcetype - Index string `json:"index"` // https://docs.splunk.com/Splexicon:Index -} - -// SplunkTestResultEvent contains the actual meat of the Splunk test result event -type SplunkTestResultEvent struct { - Event string `json:"event"` - Type SplunkType `json:"type"` - Data TestResult `json:"data"` -} - -// Data Processing Functions - -func FilterResults(report *TestReport, maxPassRatio float64) *TestReport { - filteredResults := FilterTests(report.Results, func(tr TestResult) bool { - return !tr.Skipped && tr.PassRatio < maxPassRatio - }) - report.Results = filteredResults - return report -} - -func FilterTests(results []TestResult, predicate func(TestResult) bool) []TestResult { - var filtered []TestResult - for _, result := range results { - if predicate(result) { - filtered = append(filtered, result) - } - } - return filtered -} - -func mergeTestResults(a, b TestResult) TestResult { - a.Runs += b.Runs - a.Durations = append(a.Durations, b.Durations...) - if a.PassedOutputs == nil { - a.PassedOutputs = make(map[string][]string) - } - if a.FailedOutputs == nil { - a.FailedOutputs = make(map[string][]string) - } - for runID, outputs := range b.PassedOutputs { - a.PassedOutputs[runID] = append(a.PassedOutputs[runID], outputs...) - } - for runID, outputs := range b.FailedOutputs { - a.FailedOutputs[runID] = append(a.FailedOutputs[runID], outputs...) - } - a.PackageOutputs = append(a.PackageOutputs, b.PackageOutputs...) - a.Successes += b.Successes - a.Failures += b.Failures - a.Panic = a.Panic || b.Panic - a.Race = a.Race || b.Race - a.Skips += b.Skips - a.Skipped = a.Skipped && b.Skipped - - if a.Runs > 0 { - a.PassRatio = float64(a.Successes) / float64(a.Runs) - } else { - a.PassRatio = -1.0 // Indicate undefined pass ratio for skipped tests - } - - return a -} - -func sortTestResults(results []TestResult) { - sort.Slice(results, func(i, j int) bool { - if results[i].TestPackage != results[j].TestPackage { - return results[i].TestPackage < results[j].TestPackage - } - iParts := strings.Split(results[i].TestName, "/") - jParts := strings.Split(results[j].TestName, "/") - for k := 0; k < len(iParts) && k < len(jParts); k++ { - if iParts[k] != jParts[k] { - return iParts[k] < jParts[k] - } - } - if len(iParts) != len(jParts) { - return len(iParts) < len(jParts) - } - return results[i].PassRatio < results[j].PassRatio - }) -} - -func avgDuration(durations []time.Duration) time.Duration { - if len(durations) == 0 { - return 0 - } - var total time.Duration - for _, d := range durations { - total += d - } - return total / time.Duration(len(durations)) -} - -// passRatio calculates the pass percentage in statistical terms (0-1) -func passRatio(successes, runs int) float64 { - passRatio := 1.0 - if runs > 0 { - passRatio = (float64(successes) / float64(runs)) - } - return passRatio -} - -// flakeRatio calculates the flake percentage in statistical terms (0-1) -func flakeRatio(flakyTests, totalTests int) float64 { - flakeRatio := 0.0 - if totalTests > 0 { - flakeRatio = (float64(flakyTests) / float64(totalTests)) - } - return flakeRatio -} - -// formatRatio converts a float ratio (0.0-1.0) into a human-readable string (0.00%-100.00%) -func formatRatio(ratio float64) string { - ratio *= 100 - // Format with 4 decimal places - s := fmt.Sprintf("%.4f", ratio) - // Trim trailing zeros - s = strings.TrimRight(s, "0") - // Trim trailing '.' if needed (in case we have an integer) - s = strings.TrimRight(s, ".") - return s + "%" -} diff --git a/tools/flakeguard/reports/data_test.go b/tools/flakeguard/reports/data_test.go deleted file mode 100644 index e340c8ec1..000000000 --- a/tools/flakeguard/reports/data_test.go +++ /dev/null @@ -1,721 +0,0 @@ -package reports - -import ( - "math" - "reflect" - "sort" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -// TestGenerateSummaryData tests the GenerateSummaryData function. -func TestGenerateSummaryData(t *testing.T) { - tests := []struct { - name string - testReport *TestReport - expected *SummaryData - }{ - { - name: "All tests passed", - testReport: &TestReport{ - Results: []TestResult{ - {PassRatio: 1.0, Runs: 10, Successes: 10}, - {PassRatio: 1.0, Runs: 5, Successes: 5}, - }, - MaxPassRatio: 1.0, - }, - expected: &SummaryData{ - UniqueTestsRun: 2, - TestRunCount: 10, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 0, - FlakyTestPercent: "0%", // no flaky tests - TotalRuns: 15, - PassedRuns: 15, - FailedRuns: 0, - SkippedRuns: 0, - PassPercent: "100%", - UniqueSkippedTestCount: 0, - }, - }, - { - name: "Some flaky tests", - testReport: &TestReport{ - Results: []TestResult{ - {PassRatio: 0.8, Runs: 10, Successes: 8, Failures: 2}, - {PassRatio: 1.0, Runs: 5, Successes: 5}, - {PassRatio: 0.5, Runs: 4, Successes: 2, Failures: 2}, - }, - MaxPassRatio: 0.9, - }, - expected: &SummaryData{ - UniqueTestsRun: 3, - TestRunCount: 10, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 2, - // 2/3 => 66.666...% - FlakyTestPercent: "66.6667%", - TotalRuns: 19, - PassedRuns: 15, - FailedRuns: 4, - SkippedRuns: 0, - // 15/19 => ~78.947... - PassPercent: "78.9474%", - UniqueSkippedTestCount: 0, - }, - }, - { - name: "Tests with panics and races", - testReport: &TestReport{ - Results: []TestResult{ - {PassRatio: 1.0, Runs: 5, Successes: 5, Panic: true}, - {PassRatio: 0.9, Runs: 10, Successes: 9, Failures: 1, Race: true}, - {PassRatio: 1.0, Runs: 3, Successes: 3}, - }, - MaxPassRatio: 1.0, - }, - expected: &SummaryData{ - UniqueTestsRun: 3, - TestRunCount: 10, - PanickedTests: 1, - RacedTests: 1, - FlakyTests: 2, - // 2/3 => ~66.666... - FlakyTestPercent: "66.6667%", - TotalRuns: 18, - PassedRuns: 17, - FailedRuns: 1, - SkippedRuns: 0, - // 17/18 => ~94.444... - PassPercent: "94.4444%", - UniqueSkippedTestCount: 0, - }, - }, - { - name: "No tests ran", - testReport: &TestReport{ - MaxPassRatio: 1.0, - Results: []TestResult{}, - }, - expected: &SummaryData{ - UniqueTestsRun: 0, - TestRunCount: 0, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 0, - FlakyTestPercent: "0%", - TotalRuns: 0, - PassedRuns: 0, - FailedRuns: 0, - SkippedRuns: 0, - // With zero runs, we default passRatio to "100%" - PassPercent: "100%", - UniqueSkippedTestCount: 0, - }, - }, - { - name: "Skipped tests included in total but not executed", - testReport: &TestReport{ - Results: []TestResult{ - // Skipped test with no runs should be counted in UniqueSkippedTestCount. - {PassRatio: -1.0, Runs: 0, Successes: 0, Skips: 1, Skipped: true}, - {PassRatio: 0.7, Runs: 10, Successes: 7, Failures: 3}, - }, - MaxPassRatio: 0.8, - }, - expected: &SummaryData{ - UniqueTestsRun: 2, - TestRunCount: 10, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 1, - FlakyTestPercent: "50%", - TotalRuns: 10, - PassedRuns: 7, - FailedRuns: 3, - SkippedRuns: 1, - PassPercent: "70%", - UniqueSkippedTestCount: 1, - }, - }, - { - name: "Mixed skipped and executed tests", - testReport: &TestReport{ - Results: []TestResult{ - // Skipped test should be counted for UniqueSkippedTestCount. - {PassRatio: -1.0, Runs: 0, Successes: 0, Skips: 1, Skipped: true}, - {PassRatio: 0.9, Runs: 10, Successes: 9, Failures: 1}, - {PassRatio: 0.5, Runs: 4, Successes: 2, Failures: 2}, - }, - MaxPassRatio: 0.85, - }, - expected: &SummaryData{ - UniqueTestsRun: 3, - TestRunCount: 10, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 1, - FlakyTestPercent: "33.3333%", - TotalRuns: 14, - PassedRuns: 11, - FailedRuns: 3, - SkippedRuns: 1, - PassPercent: "78.5714%", - UniqueSkippedTestCount: 1, - }, - }, - { - name: "Tiny flake ratio that is exactly 0.01%", - testReport: &TestReport{ - Results: func() []TestResult { - // 9,999 total: - // - 9,998 stable tests => pass ratio = 1.0 - // - 1 flaky test => pass ratio = 0.5 - const total = 9999 - tests := make([]TestResult, total) - for i := 0; i < total-1; i++ { - tests[i] = TestResult{ - PassRatio: 1.0, - Runs: 10, - Successes: 10, - } - } - tests[total-1] = TestResult{ - PassRatio: 0.5, // 1 success, 1 failure - Runs: 2, - Successes: 1, - Failures: 1, - } - return tests - }(), - MaxPassRatio: 1.0, - }, - expected: &SummaryData{ - UniqueTestsRun: 9999, - TestRunCount: 10, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 1, - FlakyTestPercent: "0.01%", - TotalRuns: (9998 * 10) + 2, - PassedRuns: (9998 * 10) + 1, - FailedRuns: 1, - SkippedRuns: 0, - PassPercent: "99.999%", - UniqueSkippedTestCount: 0, - }, - }, - { - name: "Duplicate skipped tests", - testReport: &TestReport{ - Results: []TestResult{ - // Two entries for "TestA" should count as one unique skipped test. - {TestName: "TestA", PassRatio: -1.0, Runs: 0, Skips: 1, Skipped: true}, - {TestName: "TestA", PassRatio: -1.0, Runs: 0, Skips: 1, Skipped: true}, - // A different test "TestB" - {TestName: "TestB", PassRatio: -1.0, Runs: 0, Skips: 1, Skipped: true}, - // This test was executed so it should not count as skipped. - {TestName: "TestC", PassRatio: 1.0, Runs: 5, Successes: 5, Skipped: false}, - }, - MaxPassRatio: 1.0, - }, - expected: &SummaryData{ - UniqueTestsRun: 4, - TestRunCount: 5, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 0, - FlakyTestPercent: "0%", - TotalRuns: 5, - PassedRuns: 5, - FailedRuns: 0, - SkippedRuns: 3, // Sum of Skips for all skipped tests. - PassPercent: "100%", - UniqueSkippedTestCount: 2, // Only "TestA" and "TestB" count. - }, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - tc.testReport.GenerateSummaryData() - assert.Equal(t, tc.expected, tc.testReport.SummaryData, "Summary data does not match expected") - }) - } -} - -// TestFilterTests tests the FilterTests function. -func TestFilterTests(t *testing.T) { - testResults := []TestResult{ - {TestName: "TestA", PassRatio: 1.0, Skipped: false}, - {TestName: "TestB", PassRatio: 0.8, Skipped: false}, - {TestName: "TestC", PassRatio: 0.7, Skipped: true}, - {TestName: "TestD", PassRatio: 0.6, Skipped: false}, - } - - // Filter tests with PassRatio < 0.9 and not skipped - filtered := FilterTests(testResults, func(tr TestResult) bool { - return !tr.Skipped && tr.PassRatio < 0.9 - }) - - expected := []TestResult{ - {TestName: "TestB", PassRatio: 0.8, Skipped: false}, - {TestName: "TestD", PassRatio: 0.6, Skipped: false}, - } - - if !reflect.DeepEqual(filtered, expected) { - t.Errorf("Expected %+v, got %+v", expected, filtered) - } -} - -func TestFilterFailedTests(t *testing.T) { - results := []TestResult{ - {TestName: "Test1", PassRatio: 0.5, Skipped: false}, - {TestName: "Test2", PassRatio: 0.9, Skipped: false}, - {TestName: "Test3", PassRatio: 0.3, Skipped: false}, - {TestName: "Test4", PassRatio: 0.8, Skipped: true}, // Skipped test - } - - failedTests := FilterTests(results, func(tr TestResult) bool { - return !tr.Skipped && tr.PassRatio < 0.6 - }) - expected := []TestResult{ - {TestName: "Test1", PassRatio: 0.5, Skipped: false}, - {TestName: "Test3", PassRatio: 0.3, Skipped: false}, - } - - if !reflect.DeepEqual(failedTests, expected) { - t.Errorf("Expected failed tests %+v, got %+v", expected, failedTests) - } -} - -func TestFilterPassedTests(t *testing.T) { - results := []TestResult{ - {TestName: "Test1", PassRatio: 0.7, Skipped: false}, - {TestName: "Test2", PassRatio: 1.0, Skipped: false}, - {TestName: "Test3", PassRatio: 0.3, Skipped: false}, - {TestName: "Test4", PassRatio: 0.8, Skipped: true}, // Skipped test - } - - passedTests := FilterTests(results, func(tr TestResult) bool { - return !tr.Skipped && tr.PassRatio >= 0.6 - }) - expected := []TestResult{ - {TestName: "Test1", PassRatio: 0.7, Skipped: false}, - {TestName: "Test2", PassRatio: 1.0, Skipped: false}, - } - - if !reflect.DeepEqual(passedTests, expected) { - t.Errorf("Expected passed tests %+v, got %+v", expected, passedTests) - } -} - -func TestFilterSkippedTests(t *testing.T) { - results := []TestResult{ - {TestName: "Test1", PassRatio: 0.7, Skipped: false}, - {TestName: "Test2", PassRatio: 1.0, Skipped: true}, - {TestName: "Test3", PassRatio: 0.3, Skipped: false}, - {TestName: "Test4", PassRatio: 0.8, Skipped: true}, - } - - skippedTests := FilterTests(results, func(tr TestResult) bool { - return tr.Skipped - }) - expected := []TestResult{ - {TestName: "Test2", PassRatio: 1.0, Skipped: true}, - {TestName: "Test4", PassRatio: 0.8, Skipped: true}, - } - - if !reflect.DeepEqual(skippedTests, expected) { - t.Errorf("Expected skipped tests %+v, got %+v", expected, skippedTests) - } -} - -// TestAggregate tests the Aggregate function. -func TestAggregate(t *testing.T) { - report1 := &TestReport{ - GoProject: "ProjectX", - Results: []TestResult{ - { - TestName: "TestA", - TestPackage: "pkg1", - Runs: 2, - Successes: 2, - PassRatio: 1.0, - }, - { - TestName: "TestB", - TestPackage: "pkg1", - Runs: 2, - Successes: 1, - Failures: 1, - PassRatio: 0.5, - }, - }, - } - - report2 := &TestReport{ - GoProject: "ProjectX", - Results: []TestResult{ - { - TestName: "TestA", - TestPackage: "pkg1", - Runs: 3, - Successes: 3, - PassRatio: 1.0, - }, - { - TestName: "TestC", - TestPackage: "pkg2", - Runs: 3, - Successes: 2, - Failures: 1, - PassRatio: 0.6667, - }, - }, - } - - // Create channels for test results and errors. - resultsChan := make(chan []TestResult) - errChan := make(chan error) - - // Launch a goroutine to send the test results into the results channel. - go func() { - resultsChan <- report1.Results - resultsChan <- report2.Results - close(resultsChan) - }() - - // No errors to send; close the error channel. - go func() { - close(errChan) - }() - - // Call the updated aggregate function. - aggregatedResults, err := aggregate(resultsChan, errChan) - if err != nil { - t.Fatalf("Error aggregating reports: %v", err) - } - - expectedResults := []TestResult{ - { - TestName: "TestA", - TestPackage: "pkg1", - Runs: 5, - Successes: 5, - Failures: 0, - PassRatio: 1.0, - }, - { - TestName: "TestB", - TestPackage: "pkg1", - Runs: 2, - Successes: 1, - Failures: 1, - PassRatio: 0.5, - }, - { - TestName: "TestC", - TestPackage: "pkg2", - Runs: 3, - Successes: 2, - Failures: 1, - PassRatio: 0.6667, - }, - } - - // Sort both slices by TestName to ensure the order matches for comparison. - sort.Slice(expectedResults, func(i, j int) bool { - return expectedResults[i].TestName < expectedResults[j].TestName - }) - sort.Slice(aggregatedResults, func(i, j int) bool { - return aggregatedResults[i].TestName < aggregatedResults[j].TestName - }) - - // Compare the aggregated results with expected results. - for i, result := range aggregatedResults { - expected := expectedResults[i] - if result.TestName != expected.TestName || - result.TestPackage != expected.TestPackage || - result.Runs != expected.Runs || - result.Successes != expected.Successes || - result.Failures != expected.Failures || - math.Abs(result.PassRatio-expected.PassRatio) > 0.0001 { - t.Errorf("Mismatch in aggregated result for test %s. Expected %+v, got %+v", expected.TestName, expected, result) - } - } -} - -func TestAggregateOutputs(t *testing.T) { - report1 := &TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 1}, - Results: []TestResult{ - { - TestName: "TestOutput", - TestPackage: "pkg1", - Runs: 1, - Successes: 1, - PassedOutputs: map[string][]string{ - "run1": {"Output from report1 test run"}, - }, - PackageOutputs: []string{"Package output from report1"}, - }, - }, - } - - report2 := &TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 1}, - Results: []TestResult{ - { - TestName: "TestOutput", - TestPackage: "pkg1", - Runs: 1, - Successes: 1, - PassedOutputs: map[string][]string{ - "run2": {"Output from report2 test run"}, - }, - PackageOutputs: []string{"Package output from report2"}, - }, - }, - } - - // Create channels for results and errors. - resultsChan := make(chan []TestResult) - errChan := make(chan error) - - // Launch a goroutine to send the results into the resultsChan. - go func() { - resultsChan <- report1.Results - resultsChan <- report2.Results - close(resultsChan) - }() - - // Launch a goroutine to close the error channel (no errors to report). - go func() { - close(errChan) - }() - - // Call the new aggregate function. - aggregatedResults, err := aggregate(resultsChan, errChan) - if err != nil { - t.Fatalf("Error aggregating reports: %v", err) - } - - if len(aggregatedResults) != 1 { - t.Fatalf("Expected 1 result, got %d", len(aggregatedResults)) - } - - result := aggregatedResults[0] - - expectedOutputs := map[string][]string{ - "run1": {"Output from report1 test run"}, - "run2": {"Output from report2 test run"}, - } - - expectedPackageOutputs := []string{ - "Package output from report1", - "Package output from report2", - } - - if !reflect.DeepEqual(result.PassedOutputs, expectedOutputs) { - t.Errorf("Expected Outputs %v, got %v", expectedOutputs, result.PassedOutputs) - } - - if !reflect.DeepEqual(result.PackageOutputs, expectedPackageOutputs) { - t.Errorf("Expected PackageOutputs %v, got %v", expectedPackageOutputs, result.PackageOutputs) - } -} - -func TestAggregateIdenticalOutputs(t *testing.T) { - report1 := &TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 1}, - Results: []TestResult{ - { - TestName: "TestIdenticalOutput", - TestPackage: "pkg1", - Runs: 1, - Successes: 1, - PassedOutputs: map[string][]string{ - "run1": {"Identical output"}, - }, - PackageOutputs: []string{"Identical package output"}, - }, - }, - } - - report2 := &TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 1}, - Results: []TestResult{ - { - TestName: "TestIdenticalOutput", - TestPackage: "pkg1", - Runs: 1, - Successes: 1, - PassedOutputs: map[string][]string{ - "run1": {"Identical output"}, - }, - PackageOutputs: []string{"Identical package output"}, - }, - }, - } - - // Create channels for results and errors. - resultsChan := make(chan []TestResult) - errChan := make(chan error) - - // Send the results from both reports. - go func() { - resultsChan <- report1.Results - resultsChan <- report2.Results - close(resultsChan) - }() - - // Close error channel since there are no errors. - go func() { - close(errChan) - }() - - aggregatedResults, err := aggregate(resultsChan, errChan) - if err != nil { - t.Fatalf("Error aggregating reports: %v", err) - } - - if len(aggregatedResults) != 1 { - t.Fatalf("Expected 1 result, got %d", len(aggregatedResults)) - } - - result := aggregatedResults[0] - - expectedOutputs := map[string][]string{ - "run1": {"Identical output", "Identical output"}, - } - - expectedPackageOutputs := []string{ - "Identical package output", - "Identical package output", - } - - if !reflect.DeepEqual(result.PassedOutputs, expectedOutputs) { - t.Errorf("Expected Outputs %v, got %v", expectedOutputs, result.PassedOutputs) - } - - if !reflect.DeepEqual(result.PackageOutputs, expectedPackageOutputs) { - t.Errorf("Expected PackageOutputs %v, got %v", expectedPackageOutputs, result.PackageOutputs) - } -} - -// TestAvgDuration tests the avgDuration function. -func TestAvgDuration(t *testing.T) { - durations := []time.Duration{ - time.Second, - 2 * time.Second, - 3 * time.Second, - } - expected := 2 * time.Second - - avg := avgDuration(durations) - if avg != expected { - t.Errorf("Expected average duration %v, got %v", expected, avg) - } - - // Test with empty slice - avg = avgDuration([]time.Duration{}) - if avg != 0 { - t.Errorf("Expected average duration 0, got %v", avg) - } -} - -func TestAggregate_AllSkippedTests(t *testing.T) { - report1 := &TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 3}, - Results: []TestResult{ - { - TestName: "TestSkipped", - TestPackage: "pkg1", - Skipped: true, - Runs: 0, - Skips: 3, - PassRatio: -1, // -1 indicates undefined - }, - }, - } - - report2 := &TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 2}, - Results: []TestResult{ - { - TestName: "TestSkipped", - TestPackage: "pkg1", - Skipped: true, - Runs: 0, - Skips: 2, - PassRatio: -1, - }, - }, - } - - // Create channels for results and errors. - resultsChan := make(chan []TestResult) - errChan := make(chan error) - - // Send results from both reports. - go func() { - resultsChan <- report1.Results - resultsChan <- report2.Results - close(resultsChan) - }() - - // Close error channel since there are no errors. - go func() { - close(errChan) - }() - - aggregatedResults, err := aggregate(resultsChan, errChan) - if err != nil { - t.Fatalf("Error aggregating reports: %v", err) - } - - expectedResult := TestResult{ - TestName: "TestSkipped", - TestPackage: "pkg1", - Skipped: true, - Runs: 0, - Skips: 5, - PassRatio: -1, - } - - if len(aggregatedResults) != 1 { - t.Fatalf("Expected 1 result, got %d", len(aggregatedResults)) - } - - result := aggregatedResults[0] - - if result.TestName != expectedResult.TestName { - t.Errorf("Expected TestName %v, got %v", expectedResult.TestName, result.TestName) - } - if result.TestPackage != expectedResult.TestPackage { - t.Errorf("Expected TestPackage %v, got %v", expectedResult.TestPackage, result.TestPackage) - } - if result.Skipped != expectedResult.Skipped { - t.Errorf("Expected Skipped %v, got %v", expectedResult.Skipped, result.Skipped) - } - if result.Runs != expectedResult.Runs { - t.Errorf("Expected Runs %v, got %v", expectedResult.Runs, result.Runs) - } - if result.Skips != expectedResult.Skips { - t.Errorf("Expected Skips %v, got %v", expectedResult.Skips, result.Skips) - } - if result.PassRatio != expectedResult.PassRatio { - t.Errorf("Expected PassRatio %v, got %v", expectedResult.PassRatio, result.PassRatio) - } -} diff --git a/tools/flakeguard/reports/io.go b/tools/flakeguard/reports/io.go deleted file mode 100644 index eac5140aa..000000000 --- a/tools/flakeguard/reports/io.go +++ /dev/null @@ -1,231 +0,0 @@ -package reports - -import ( - "bufio" - "encoding/json" - "fmt" - "io" - "os" - "path/filepath" - - "github.com/rs/zerolog/log" -) - -// FileSystem interface and implementations -type FileSystem interface { - MkdirAll(path string, perm os.FileMode) error - Create(name string) (io.WriteCloser, error) - WriteFile(filename string, data []byte, perm os.FileMode) error -} - -type OSFileSystem struct{} - -func (OSFileSystem) MkdirAll(path string, perm os.FileMode) error { - return os.MkdirAll(path, perm) -} - -func (OSFileSystem) Create(name string) (io.WriteCloser, error) { - return os.Create(name) -} - -func (OSFileSystem) WriteFile(filename string, data []byte, perm os.FileMode) error { - return os.WriteFile(filename, data, perm) -} - -// LoadAndAggregate reads all JSON files in `resultsDir` and aggregates them -// into a single slice of `TestResult`. -func LoadAndAggregate(resultsDir string) ([]TestResult, error) { - if _, err := os.Stat(resultsDir); os.IsNotExist(err) { - return nil, fmt.Errorf("results directory does not exist: %s", resultsDir) - } - - resultsChan := make(chan []TestResult) - errChan := make(chan error, 1) - - // Walk the directory in a separate goroutine - go func() { - defer close(resultsChan) - defer close(errChan) - - err := filepath.Walk(resultsDir, func(path string, info os.FileInfo, walkErr error) error { - if walkErr != nil { - return fmt.Errorf("error accessing path %s: %w", path, walkErr) - } - - // If it's a .json file, parse it, then send the slice to resultsChan - if !info.IsDir() && filepath.Ext(path) == ".json" { - parsed, parseErr := processFile(path) - if parseErr != nil { - // If we can't parse this file, return an error to halt the walk - return fmt.Errorf("error processing file '%s': %w", path, parseErr) - } - // Send the parsed results from this file into the aggregator - resultsChan <- parsed - } - - return nil - }) - if err != nil { - errChan <- err - } - }() - - // Aggregate all the test results from resultsChan - return aggregate(resultsChan, errChan) -} - -// processFile reads a large JSON report file and creates TestReport objects in a memory-efficient way. -func processFile(filePath string) ([]TestResult, error) { - file, err := os.Open(filePath) - if err != nil { - return nil, fmt.Errorf("error opening file %s: %w", filePath, err) - } - defer file.Close() - - var results []TestResult - if err := json.NewDecoder(file).Decode(&results); err != nil { - return nil, fmt.Errorf("error decoding JSON array in %s: %w", filePath, err) - } - - return results, nil -} - -// LoadReport reads a JSON file and returns a TestReport pointer -func LoadReport(filePath string) (*TestReport, error) { - data, err := os.ReadFile(filePath) - if err != nil { - return nil, fmt.Errorf("error reading file %s: %w", filePath, err) - } - var report TestReport - if err := json.Unmarshal(data, &report); err != nil { - return nil, fmt.Errorf("error unmarshalling JSON from file %s: %w", filePath, err) - } - return &report, nil -} - -func SaveSummaryAsJSON(fs FileSystem, path string, summary SummaryData) error { - file, err := fs.Create(path) - if err != nil { - return fmt.Errorf("error creating JSON summary file: %w", err) - } - defer file.Close() - - encoder := json.NewEncoder(file) - encoder.SetIndent("", " ") - if err := encoder.Encode(summary); err != nil { - return fmt.Errorf("error writing JSON summary: %w", err) - } - return nil -} - -func SaveReportNoLogs(fs FileSystem, filePath string, report TestReport) error { - var filteredResults []TestResult - for _, r := range report.Results { - r.FailedOutputs = nil - r.PassedOutputs = nil - r.PackageOutputs = nil - filteredResults = append(filteredResults, r) - } - report.Results = filteredResults - - data, err := json.MarshalIndent(report, "", " ") - if err != nil { - return fmt.Errorf("error marshaling results: %v", err) - } - return fs.WriteFile(filePath, data, 0644) -} - -// SaveReport saves a TestReport to a specified file path in JSON format. -// It ensures the file is created or truncated and handles any errors during -// file operations, providing a reliable way to persist test results. -func SaveReport(fs FileSystem, filePath string, report TestReport) error { - // Open the file with truncation mode - file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - return fmt.Errorf("error opening file: %v", err) - } - defer func() { - if cerr := file.Close(); cerr != nil { - err = fmt.Errorf("error closing file: %v", cerr) - } - }() - - // Use a buffered writer for better performance - bufferedWriter := bufio.NewWriter(file) - defer func() { - if err := bufferedWriter.Flush(); err != nil { - log.Error().Err(err).Msg("Error flushing buffer") - } - }() - - // Create a JSON encoder with the buffered writer - encoder := json.NewEncoder(bufferedWriter) - encoder.SetIndent("", " ") - - // Encode the report - if err := encoder.Encode(report); err != nil { - return fmt.Errorf("error encoding JSON: %v", err) - } - - return nil -} - -// aggregate listens for slices of TestResult on resultsChan, -// merges them, and returns a single slice of aggregated results once -// the channel is closed. It also checks for errors on errChan. -func aggregate( - resultsChan <-chan []TestResult, - errChan <-chan error, -) ([]TestResult, error) { - // Maps each unique "Package|Name" to a single TestResult - testMap := make(map[string]TestResult) - - // Consume data from the results channel - for results := range resultsChan { - for _, r := range results { - key := r.TestPackage + "|" + r.TestName - if existing, found := testMap[key]; found { - // Merge your results (runs, failures, pass ratios, etc.) - testMap[key] = mergeTestResults(existing, r) - } else { - testMap[key] = r - } - } - } - - // Collect any errors from errChan - for err := range errChan { - if err != nil { - return nil, err - } - } - - // Convert the map back to a slice - aggregated := make([]TestResult, 0, len(testMap)) - for _, r := range testMap { - aggregated = append(aggregated, r) - } - - // Sort if desired - sortTestResults(aggregated) - - return aggregated, nil -} - -// ZerologRestyLogger wraps zerolog for Resty's logging interface -type ZerologRestyLogger struct{} - -// Errorf logs errors using zerolog's global logger -func (ZerologRestyLogger) Errorf(format string, v ...interface{}) { - log.Error().Msgf(format, v...) -} - -// Warnf logs warnings using zerolog's global logger -func (ZerologRestyLogger) Warnf(format string, v ...interface{}) { - log.Warn().Msgf(format, v...) -} - -// Debugf logs debug messages using zerolog's global logger -func (ZerologRestyLogger) Debugf(format string, v ...interface{}) { - log.Debug().Msgf(format, v...) -} diff --git a/tools/flakeguard/reports/io_test.go b/tools/flakeguard/reports/io_test.go deleted file mode 100644 index 250e0448c..000000000 --- a/tools/flakeguard/reports/io_test.go +++ /dev/null @@ -1,169 +0,0 @@ -package reports - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/http/httptest" - "testing" - - "github.com/rs/zerolog" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -const ( - splunkToken = "test-token" - splunkEvent = "test" - reportID = "123" - totalTestRuns = 270 - testRunCount = 15 - uniqueTests = 19 -) - -func TestAggregateResultFilesSplunk(t *testing.T) { - t.Parallel() - - var ( - reportRequestsReceived int - resultRequestsReceived int - ) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - require.Equal(t, "application/json", r.Header.Get("Content-Type"), "unexpected content type") - require.Equal(t, fmt.Sprintf("Splunk %s", splunkToken), r.Header.Get("Authorization"), "unexpected authorization header") - - // Figure out what kind of splunk data the payload is - bodyBytes, err := io.ReadAll(r.Body) - require.NoError(t, err, "error reading request") - defer r.Body.Close() - - report := SplunkTestReport{} - err = json.Unmarshal(bodyBytes, &report) - if err == nil { - require.Equal(t, SplunkSourceType, report.SourceType, "source type mismatch") - require.Equal(t, Report, report.Event.Type, "event type mismatch") - require.Equal(t, splunkEvent, report.Event.Event, "event mismatch") - require.Equal(t, reportID, report.Event.Data.ID, "report ID mismatch") - require.False(t, report.Event.Incomplete, "report should not be incomplete") - require.NotNil(t, report.Event.Data.SummaryData, "report summary data is nil") - require.Len(t, report.Event.Data.Results, 0, "shouldn't send all result data to splunk") - reportRequestsReceived++ - } else { - results, err := unBatchSplunkResults(bodyBytes) - require.NoError(t, err, "error parsing splunk results data") - require.NotNil(t, results, "expected some results") - require.NotZero(t, len(results), "expected some results") - for _, result := range results { - require.Equal(t, SplunkSourceType, result.SourceType, "source type mismatch") - require.Equal(t, Result, result.Event.Type, "event type mismatch") - require.Equal(t, splunkEvent, result.Event.Event, "event mismatch") - resultRequestsReceived++ - } - } - - w.WriteHeader(http.StatusOK) - })) - t.Cleanup(srv.Close) - - results, err := LoadAndAggregate("./testdata") - require.NoError(t, err, "LoadAndAggregate failed") - - report, err := NewTestReport(results, WithReportID(reportID)) - require.NoError(t, err, "NewTestReport failed") - - err = SendTestReportToSplunk(srv.URL, splunkToken, splunkEvent, report) - require.NoError(t, err, "SendReportToSplunk failed") - verifyAggregatedReport(t, report) - assert.Equal(t, 1, reportRequestsReceived, "unexpected number of report requests") - assert.Equal(t, uniqueTests, resultRequestsReceived, "unexpected number of report requests") -} - -func TestAggregateResultFiles(t *testing.T) { - t.Parallel() - - results, err := LoadAndAggregate("./testdata") - require.NoError(t, err, "LoadAndAggregate failed") - - report, err := NewTestReport(results, WithReportID(reportID)) - require.NoError(t, err, "NewTestReport failed") - - verifyAggregatedReport(t, report) -} - -func verifyAggregatedReport(t *testing.T, report TestReport) { - require.NotNil(t, report, "report is nil") - require.Equal(t, reportID, report.ID, "report ID mismatch") - require.Equal(t, uniqueTests, len(report.Results), "report results count mismatch") - require.Equal(t, totalTestRuns, report.SummaryData.TotalRuns, "report test total runs mismatch") - require.Equal(t, false, report.RaceDetection, "race detection should be false") - - var ( - testFail, testSkipped, testPass TestResult - testFailName = "TestFail" - testSkippedName = "TestSkipped" - testPassName = "TestPass" - ) - for _, result := range report.Results { - if result.TestName == testFailName { - testFail = result - } - if result.TestName == testSkippedName { - testSkipped = result - } - if result.TestName == testPassName { - testPass = result - } - } - - t.Run("verify TestFail", func(t *testing.T) { - require.Equal(t, testFailName, testFail.TestName, "TestFail not found") - assert.False(t, testFail.Panic, "TestFail should not panic") - assert.False(t, testFail.Skipped, "TestFail should not be skipped") - assert.Equal(t, testRunCount, testFail.Runs, "TestFail should run every time") - assert.Zero(t, testFail.Skips, "TestFail should not be skipped") - assert.Equal(t, testRunCount, testFail.Failures, "TestFail should fail every time") - assert.Len(t, testFail.Durations, testRunCount, "TestFail should have durations") - }) - - t.Run("verify TestSkipped", func(t *testing.T) { - require.Equal(t, testSkippedName, testSkipped.TestName, "TestSkip not found") - assert.False(t, testSkipped.Panic, "TestSkipped should not panic") - assert.Zero(t, testSkipped.Runs, "TestSkipped should not pass") - assert.True(t, testSkipped.Skipped, "TestSkipped should be skipped") - assert.Equal(t, testRunCount, testSkipped.Skips, "TestSkipped should be skipped entirely") - assert.Empty(t, testSkipped.Durations, "TestSkipped should not have durations") - }) - - t.Run("verify TestPass", func(t *testing.T) { - require.Equal(t, testPassName, testPass.TestName, "TestPass not found") - assert.False(t, testPass.Panic, "TestPass should not panic") - assert.Equal(t, testRunCount, testPass.Runs, "TestPass should run every time") - assert.False(t, testPass.Skipped, "TestPass should not be skipped") - assert.Zero(t, testPass.Skips, "TestPass should not be skipped") - assert.Equal(t, testRunCount, testPass.Successes, "TestPass should pass every time") - assert.Len(t, testPass.Durations, testRunCount, "TestPass should have durations") - }) -} - -func BenchmarkAggregateResultFiles(b *testing.B) { - zerolog.SetGlobalLevel(zerolog.Disabled) - for i := 0; i < b.N; i++ { - _, err := LoadAndAggregate("./testdata") - require.NoError(b, err, "LoadAndAggregate failed") - } -} - -func BenchmarkAggregateResultFilesSplunk(b *testing.B) { - zerolog.SetGlobalLevel(zerolog.Disabled) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - })) - b.Cleanup(srv.Close) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := LoadAndAggregate("./testdata") - require.NoError(b, err, "LoadAndAggregate failed") - } -} diff --git a/tools/flakeguard/reports/owner_mapper.go b/tools/flakeguard/reports/owner_mapper.go deleted file mode 100644 index ad9ce6007..000000000 --- a/tools/flakeguard/reports/owner_mapper.go +++ /dev/null @@ -1,24 +0,0 @@ -package reports - -import "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/codeowners" - -// MapTestResultsToOwners maps test results to their code owners based on the TestPath and CODEOWNERS file. -func MapTestResultsToOwners(report *TestReport, codeOwnersPath string) error { - // Parse the CODEOWNERS file - codeOwnerPatterns, err := codeowners.Parse(codeOwnersPath) - if err != nil { - return err - } - - // Assign owners to each test result - for i, result := range report.Results { - if result.TestPath != "NOT FOUND" { - report.Results[i].CodeOwners = codeowners.FindOwners(result.TestPath, codeOwnerPatterns) - } else { - // Mark owners as unknown for unmapped tests - report.Results[i].CodeOwners = []string{"UNKNOWN"} - } - } - - return nil -} diff --git a/tools/flakeguard/reports/path_mapper.go b/tools/flakeguard/reports/path_mapper.go deleted file mode 100644 index f682940bb..000000000 --- a/tools/flakeguard/reports/path_mapper.go +++ /dev/null @@ -1,40 +0,0 @@ -package reports - -import ( - "strings" -) - -// MapTestResultsToPaths maps test results to their corresponding file paths. -func MapTestResultsToPaths(report *TestReport, rootDir string) error { - // Scan the codebase for test functions - testFileMap, err := ScanTestFiles(rootDir) - if err != nil { - return err - } - - // Assign file paths to each test result - for i, result := range report.Results { - testName := result.TestName - var filePath string - - // Handle subtests - if strings.Contains(testName, "/") { - parentTestName := strings.SplitN(testName, "/", 2)[0] // Extract parent test - if path, exists := testFileMap[parentTestName]; exists { - filePath = path - } - } else if path, exists := testFileMap[testName]; exists { - // Handle normal tests - filePath = path - } - - if filePath != "" { - report.Results[i].TestPath = filePath - } else { - // Log or mark tests not found in the codebase - report.Results[i].TestPath = "NOT FOUND" - } - } - - return nil -} diff --git a/tools/flakeguard/reports/presentation.go b/tools/flakeguard/reports/presentation.go deleted file mode 100644 index 762df86be..000000000 --- a/tools/flakeguard/reports/presentation.go +++ /dev/null @@ -1,417 +0,0 @@ -package reports - -import ( - "bytes" - "fmt" - "io" - "strings" - - "golang.org/x/text/language" - "golang.org/x/text/message" -) - -// generateTestResultsTable is a helper that builds the table based on the given filter function. -func generateTestResultsTable( - results []TestResult, - markdown bool, - filter func(result TestResult) bool, -) [][]string { - p := message.NewPrinter(language.English) - - // Headers in the requested order - headers := []string{ - "Name", - "Pass Ratio", - "Panicked?", - "Timed Out?", - "Race?", - "Runs", - "Successes", - "Failures", - "Skips", - "Package", - "Package Panicked?", - "Avg Duration", - "Code Owners", - } - - // Format headers for Markdown if needed - if markdown { - for i, header := range headers { - headers[i] = fmt.Sprintf("**%s**", header) - } - } - - // Initialize the table with headers - table := [][]string{headers} - - for _, result := range results { - if filter(result) { - row := []string{ - result.TestName, - formatRatio(result.PassRatio), - fmt.Sprintf("%t", result.Panic), - fmt.Sprintf("%t", result.Timeout), - fmt.Sprintf("%t", result.Race), - p.Sprintf("%d", result.Runs), - p.Sprintf("%d", result.Successes), - p.Sprintf("%d", result.Failures), - p.Sprintf("%d", result.Skips), - result.TestPackage, - fmt.Sprintf("%t", result.PackagePanic), - avgDuration(result.Durations).String(), - } - - // Add code owners - owners := "Unknown" - if len(result.CodeOwners) > 0 { - owners = strings.Join(result.CodeOwners, ", ") - } - row = append(row, owners) - - table = append(table, row) - } - } - return table -} - -func generateShortTestResultsTable( - results []TestResult, - markdown bool, - showEverPassed bool, - showRuns bool, - showSuccesses bool, - filter func(TestResult) bool, -) [][]string { - p := message.NewPrinter(language.English) - - // Build headers dynamically - var headers []string - headers = append(headers, "Name") - if showEverPassed { - headers = append(headers, "Ever Passed") - } - if showRuns { - headers = append(headers, "Runs") - } - if showSuccesses { - headers = append(headers, "Successes") - } - - headers = append(headers, "Code Owners", "Path") - - // Optionally format the headers for Markdown - if markdown { - for i, header := range headers { - headers[i] = fmt.Sprintf("**%s**", header) - } - } - - // Initialize table with headers - table := [][]string{headers} - - // Fill the table rows - for _, r := range results { - if !filter(r) { - continue - } - - // Determine whether the test has passed at least once - passed := "NO" - if r.Successes > 0 { - passed = "YES" - } - - // Format the Code Owners - owners := "Unknown" - if len(r.CodeOwners) > 0 { - owners = strings.Join(r.CodeOwners, ", ") - } - - // Build row dynamically - row := []string{r.TestName} - if showEverPassed { - row = append(row, passed) - } - if showRuns { - row = append(row, p.Sprintf("%d", r.Runs)) - } - if showSuccesses { - row = append(row, p.Sprintf("%d", r.Successes)) - } - - row = append(row, - owners, - r.TestPath, - ) - - table = append(table, row) - } - - return table -} - -// GenerateFlakyTestsTable returns a table with only the flaky tests. -func GenerateFlakyTestsTable( - testReport TestReport, - markdown bool, -) [][]string { - return generateTestResultsTable(testReport.Results, markdown, func(result TestResult) bool { - return !result.Skipped && result.PassRatio < testReport.MaxPassRatio - }) -} - -// PrintTestResultsTable prints a table with all test results. -func PrintTestResultsTable( - w io.Writer, - results []TestResult, - markdown bool, - collapsible bool, - shortTable bool, - showEverPassed bool, - showRuns bool, - showSuccesses bool) { - filter := func(result TestResult) bool { - return true // Include all tests - } - var table [][]string - if shortTable { - table = generateShortTestResultsTable(results, markdown, showEverPassed, showRuns, showSuccesses, filter) - } else { - table = generateTestResultsTable(results, markdown, filter) - } - printTable(w, table, collapsible) -} - -// GenerateGitHubSummaryMarkdown generates a markdown summary of the test results for a GitHub workflow summary -func GenerateGitHubSummaryMarkdown(w io.Writer, testReport TestReport, maxPassRatio float64, artifactName, artifactLink string) { - fmt.Fprint(w, "# Flakeguard Summary\n\n") - - if len(testReport.Results) == 0 { - fmt.Fprintln(w, "No tests were executed.") - return - } - - settingsTable := buildSettingsTable(testReport, maxPassRatio) - printTable(w, settingsTable, false) - fmt.Fprintln(w) - - if testReport.SummaryData.FlakyTests > 0 { - fmt.Fprintln(w, "## Found Flaky Tests :x:") - } else { - fmt.Fprintln(w, "## No Flakes Found :white_check_mark:") - } - fmt.Fprintln(w) - - RenderTestReport(w, testReport, true, false) - - if artifactLink != "" { - renderArtifactSection(w, artifactName, artifactLink) - } - - if testReport.SummaryData.FlakyTests > 0 { - renderTroubleshootingSection(w) - } -} - -// GeneratePRCommentMarkdown generates a markdown summary of the test results for a GitHub PR comment. -func GeneratePRCommentMarkdown( - w io.Writer, - testReport TestReport, - maxPassRatio float64, - baseBranch, currentBranch, currentCommitSHA, repoURL, actionRunID, artifactName, artifactLink string, -) { - fmt.Fprint(w, "# Flakeguard Summary\n\n") - - if len(testReport.Results) == 0 { - fmt.Fprintln(w, "No tests were executed.") - return - } - - // Construct additional info - additionalInfo := fmt.Sprintf( - "Ran new or updated tests between `%s` and %s (`%s`).", - baseBranch, - currentCommitSHA, - currentBranch, - ) - - // Construct the links - viewDetailsLink := fmt.Sprintf("[View Flaky Detector Details](%s/actions/runs/%s)", repoURL, actionRunID) - compareChangesLink := fmt.Sprintf("[Compare Changes](%s/compare/%s...%s#files_bucket)", repoURL, baseBranch, currentCommitSHA) - linksLine := fmt.Sprintf("%s | %s", viewDetailsLink, compareChangesLink) - - // Include additional information - fmt.Fprintln(w, additionalInfo) - fmt.Fprintln(w) // Add an extra newline for formatting - - // Include the links - fmt.Fprintln(w, linksLine) - fmt.Fprintln(w) // Add an extra newline for formatting - - // Add the flaky tests section - if testReport.SummaryData.FlakyTests > 0 { - fmt.Fprintln(w, "## Found Flaky Tests :x:") - } else { - fmt.Fprintln(w, "## No Flakes Found :white_check_mark:") - } - - resultsTable := GenerateFlakyTestsTable(testReport, true) - renderTestResultsTable(w, resultsTable, true) - - if artifactLink != "" { - renderArtifactSection(w, artifactName, artifactLink) - } -} - -func buildSettingsTable(testReport TestReport, maxPassRatio float64) [][]string { - rows := [][]string{ - {"**Setting**", "**Value**"}, - } - - if testReport.GoProject != "" { - rows = append(rows, []string{"Project", testReport.GoProject}) - } - - rows = append(rows, []string{"Max Pass Ratio", fmt.Sprintf("%.2f%%", maxPassRatio*100)}) - rows = append(rows, []string{"Test Run Count", fmt.Sprintf("%d", testReport.SummaryData.TestRunCount)}) - rows = append(rows, []string{"Race Detection", fmt.Sprintf("%t", testReport.RaceDetection)}) - - if len(testReport.ExcludedTests) > 0 { - rows = append(rows, []string{"Excluded Tests", strings.Join(testReport.ExcludedTests, ", ")}) - } - if len(testReport.SelectedTests) > 0 { - rows = append(rows, []string{"Selected Tests", strings.Join(testReport.SelectedTests, ", ")}) - } - - return rows -} - -func RenderError( - w io.Writer, - err error, -) { - fmt.Fprintln(w, ":x: Error Running Flakeguard :x:") -} - -// RenderTestReport renders the test results into a console or markdown format. -// If in markdown mode, the table results can also be made collapsible. -func RenderTestReport( - w io.Writer, - testReport TestReport, - markdown bool, - collapsible bool, -) { - resultsTable := GenerateFlakyTestsTable(testReport, markdown) - renderSummaryTable(w, testReport.SummaryData, markdown, false, testReport.RaceDetection) // Don't make the summary collapsible - renderTestResultsTable(w, resultsTable, collapsible) -} - -// renderSummaryTable renders a summary table with the given data into a console or markdown format. -// If in markdown mode, the table can also be made collapsible. -func renderSummaryTable(w io.Writer, summary *SummaryData, markdown bool, collapsible bool, raceDetection bool) { - summaryData := [][]string{ - {"Category", "Total"}, - {"Unique Tests", fmt.Sprintf("%d", summary.UniqueTestsRun)}, - {"Unique Flaky Tests", fmt.Sprintf("%d (%s)", summary.FlakyTests, summary.FlakyTestPercent)}, - {"Unique Skipped Tests", fmt.Sprintf("%d", summary.UniqueSkippedTestCount)}, - {"Unique Panicked Tests", fmt.Sprintf("%d", summary.PanickedTests)}, - {"Total Test Runs", fmt.Sprintf("%d", summary.TotalRuns)}, - {"Passed Test Runs", fmt.Sprintf("%d (%s)", summary.PassedRuns, summary.PassPercent)}, - } - // Only include "Raced Tests" row if race detection is enabled. - if raceDetection { - summaryData = append(summaryData, []string{"Raced Tests", fmt.Sprintf("%d", summary.RacedTests)}) - } - - if markdown { - for i, row := range summaryData { - if i == 0 { - summaryData[i] = []string{"**Category**", "**Total**"} - } else { - summaryData[i] = []string{fmt.Sprintf("**%s**", row[0]), row[1]} - } - } - } - printTable(w, summaryData, collapsible && markdown) - fmt.Fprintln(w) -} - -func renderTestResultsTable(w io.Writer, table [][]string, collapsible bool) { - if len(table) <= 1 { - return - } - printTable(w, table, collapsible) -} - -func renderArtifactSection(w io.Writer, artifactName, artifactLink string) { - if artifactLink != "" { - fmt.Fprintln(w) - fmt.Fprintln(w, "## Artifacts") - fmt.Fprintln(w) - fmt.Fprintf(w, "For detailed logs of the failed tests, please refer to the artifact [%s](%s).\n", artifactName, artifactLink) - } -} - -// renderTroubleshootingSection appends a troubleshooting section with a link to the README -func renderTroubleshootingSection(w io.Writer) { - fmt.Fprintln(w) - fmt.Fprintln(w, "## Troubleshooting Flaky Tests 🔍") - fmt.Fprintln(w) - fmt.Fprintln(w, "For guidance on diagnosing and resolving E2E test flakiness, refer to the [Finding the Root Cause of Test Flakes](https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/tools/flakeguard/e2e-flaky-test-guide.md) guide.") -} - -// printTable prints a markdown table to the given writer in a pretty format. -func printTable(w io.Writer, table [][]string, collapsible bool) { - colWidths := calculateColumnWidths(table) - separator := buildSeparator(colWidths) - - if collapsible { - numResults := len(table) - 1 - fmt.Fprintln(w, "
") - fmt.Fprintf(w, "%d Results\n\n", numResults) - } - - for i, row := range table { - printRow(w, row, colWidths) - if i == 0 { - fmt.Fprintln(w, separator) - } - } - - if collapsible { - fmt.Fprintln(w, "
") - } -} - -func calculateColumnWidths(table [][]string) []int { - colWidths := make([]int, len(table[0])) - for _, row := range table { - for i, cell := range row { - if len(cell) > colWidths[i] { - colWidths[i] = len(cell) - } - } - } - return colWidths -} - -func buildSeparator(colWidths []int) string { - var buffer bytes.Buffer - for _, width := range colWidths { - buffer.WriteString("|-") - buffer.WriteString(strings.Repeat("-", width)) - buffer.WriteString("-") - } - buffer.WriteString("|") - return buffer.String() -} - -func printRow(w io.Writer, row []string, colWidths []int) { - var buffer bytes.Buffer - for i, cell := range row { - buffer.WriteString(fmt.Sprintf("| %-*s ", colWidths[i], cell)) - } - buffer.WriteString("|") - fmt.Fprintln(w, buffer.String()) -} diff --git a/tools/flakeguard/reports/presentation_test.go b/tools/flakeguard/reports/presentation_test.go deleted file mode 100644 index 77fcfb953..000000000 --- a/tools/flakeguard/reports/presentation_test.go +++ /dev/null @@ -1,259 +0,0 @@ -package reports - -import ( - "bytes" - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestGenerateFlakyTestsTable(t *testing.T) { - report := TestReport{ - Results: []TestResult{ - { - TestName: "TestFlaky", - PassRatio: 0.5, - Skipped: false, - Runs: 2, - Successes: 1, - Failures: 1, - TestPackage: "pkg1", - CodeOwners: []string{"owner1"}, - }, - { - TestName: "TestSkipped", - PassRatio: -1.0, - Skipped: true, - Runs: 0, - Skips: 1, - TestPackage: "pkg2", - CodeOwners: []string{"owner2"}, - }, - }, - MaxPassRatio: 0.9, - } - - markdown := false - - table := GenerateFlakyTestsTable(report, markdown) - - // Verify headers - expectedHeaders := []string{ - "Name", "Pass Ratio", "Panicked?", "Timed Out?", "Race?", "Runs", - "Successes", "Failures", "Skips", "Package", "Package Panicked?", - "Avg Duration", "Code Owners", - } - assert.Equal(t, expectedHeaders, table[0], "Expected headers to match") - - // Verify rows (only TestFlaky should appear) - assert.Len(t, table, 2, "Expected 2 rows in table (headers + 1 data row)") - - expectedRow := []string{ - "TestFlaky", - "50%", - "false", - "false", - "false", - "2", - "1", - "1", - "0", - "pkg1", - "false", - "0s", - "owner1", - } - assert.Equal(t, expectedRow, table[1], "Expected row to match") -} - -func TestGenerateGitHubSummaryMarkdown(t *testing.T) { - maxPassRatio := 0.9 - testReport := TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 2, FlakyTests: 1}, - RaceDetection: true, - Results: []TestResult{ - { - TestName: "TestA", - PassRatio: 0.8, - Runs: 5, - Successes: 4, - Failures: 1, - TestPackage: "pkg1", - CodeOwners: []string{"owner1"}, - Durations: []time.Duration{time.Second, time.Second, time.Second, time.Second, time.Second}, - }, - { - TestName: "TestB", - PassRatio: 1.0, - Runs: 3, - Successes: 3, - Failures: 0, - TestPackage: "pkg2", - CodeOwners: []string{"owner2"}, - Durations: []time.Duration{2 * time.Second, 2 * time.Second, 2 * time.Second}, - }, - }, - MaxPassRatio: maxPassRatio, - } - - var buffer bytes.Buffer - - GenerateGitHubSummaryMarkdown(&buffer, testReport, maxPassRatio, "", "") - - output := buffer.String() - - // Check that the summary includes the expected headings - assert.Contains(t, output, "# Flakeguard Summary", "Expected markdown summary to contain '# Flakeguard Summary'") - assert.Contains(t, output, "## Found Flaky Tests :x:", "Expected markdown summary to contain '## Found Flaky Tests :x:'") - assert.Contains(t, output, "| **Name**", "Expected markdown table headers for test results") - assert.Contains(t, output, "| TestA ", "Expected markdown table to include TestA") - assert.NotContains(t, output, "| TestB ", "Markdown table should not include TestB") -} - -// TestGeneratePRCommentMarkdown tests the GeneratePRCommentMarkdown function. -func TestGeneratePRCommentMarkdown(t *testing.T) { - maxPassRatio := 0.9 - testReport := TestReport{ - GoProject: "ProjectX", - SummaryData: &SummaryData{UniqueTestsRun: 3, FlakyTests: 1}, - RaceDetection: true, - MaxPassRatio: maxPassRatio, - Results: []TestResult{ - { - TestName: "TestA", - PassRatio: 0.8, - Runs: 5, - Successes: 4, - Failures: 1, - TestPackage: "pkg1", - CodeOwners: []string{"owner1"}, - Durations: []time.Duration{time.Second, time.Second, time.Second, time.Second, time.Second}, - }, - { - TestName: "TestB", - PassRatio: 1.0, - Runs: 3, - Successes: 3, - Failures: 0, - TestPackage: "pkg2", - CodeOwners: []string{"owner2"}, - Durations: []time.Duration{2 * time.Second, 2 * time.Second, 2 * time.Second}, - }, - }, - } - - var buffer bytes.Buffer - baseBranch := "develop" - currentBranch := "feature-branch" - currentCommitSHA := "abcdef1234567890" - repoURL := "https://github.com/example/repo" - actionRunID := "123456789" - - GeneratePRCommentMarkdown(&buffer, testReport, maxPassRatio, baseBranch, currentBranch, currentCommitSHA, repoURL, actionRunID, "", "") - - output := buffer.String() - - // Check that the output includes the expected headings and links - assert.Contains(t, output, "# Flakeguard Summary", "Expected markdown summary to contain '# Flakeguard Summary'") - assert.Contains(t, output, fmt.Sprintf("Ran new or updated tests between `%s` and %s (`%s`).", baseBranch, currentCommitSHA, currentBranch), "Expected markdown to contain the additional info line with branches and commit SHA") - assert.Contains(t, output, fmt.Sprintf("[View Flaky Detector Details](%s/actions/runs/%s)", repoURL, actionRunID), "Expected markdown to contain the 'View Flaky Detector Details' link") - assert.Contains(t, output, fmt.Sprintf("[Compare Changes](%s/compare/%s...%s#files_bucket)", repoURL, baseBranch, currentCommitSHA), "Expected markdown to contain the 'Compare Changes' link") - assert.Contains(t, output, "## Found Flaky Tests :x:", "Expected markdown summary to contain '## Found Flaky Tests :x:'") - assert.Contains(t, output, "| **Name**", "Expected markdown table headers for test results") - assert.Contains(t, output, "| TestA ", "Expected markdown table to include TestA") - assert.NotContains(t, output, "| TestB ", "Markdown table should not include TestB") -} - -// TestPrintTable tests the printTable function. -func TestPrintTable(t *testing.T) { - table := [][]string{ - {"Header1", "Header2", "Header3"}, - {"Row1Col1", "Row1Col2", "Row1Col3"}, - {"Row2Col1", "Row2Col2", "Row2Col3"}, - } - - var buffer bytes.Buffer - printTable(&buffer, table, false) - - output := buffer.String() - - expected := `| Header1 | Header2 | Header3 | -|----------|----------|----------| -| Row1Col1 | Row1Col2 | Row1Col3 | -| Row2Col1 | Row2Col2 | Row2Col3 | -` - - if output != expected { - t.Errorf("Expected output:\n%s\nGot:\n%s", expected, output) - } -} - -func TestRenderResults(t *testing.T) { - testcases := []struct { - name string - testReport TestReport - expectedSummary *SummaryData - expectedStringsContain []string - }{ - { - name: "single flaky test", - testReport: TestReport{ - Results: []TestResult{ - { - TestName: "Test1", - TestPackage: "package1", - PassRatio: 0.75, - Successes: 3, - Failures: 1, - Skipped: false, - Runs: 4, - Durations: []time.Duration{ - time.Millisecond * 1200, - time.Millisecond * 900, - time.Millisecond * 1100, - time.Second, - }, - }, - }, - MaxPassRatio: 0.9, - }, - expectedSummary: &SummaryData{ - UniqueTestsRun: 1, - TestRunCount: 4, - PanickedTests: 0, - RacedTests: 0, - FlakyTests: 1, - FlakyTestPercent: "100%", - TotalRuns: 4, - PassedRuns: 3, - FailedRuns: 1, - SkippedRuns: 0, - PassPercent: "75%", - }, - expectedStringsContain: []string{"Test1", "package1", "75%", "false", "1.05s", "4", "0"}, - }, - // Add more test cases as needed - } - - for _, tc := range testcases { - t.Run(tc.name, func(t *testing.T) { - // Generate the summary data - tc.testReport.GenerateSummaryData() - - var buf bytes.Buffer - RenderTestReport(&buf, tc.testReport, false, false) - output := buf.String() - - // Verify summary data - assert.Equal(t, tc.expectedSummary, tc.testReport.SummaryData, "Summary data does not match expected") - - // Verify output content - for _, expected := range tc.expectedStringsContain { - assert.Contains(t, output, expected, "Expected output to contain %q", expected) - } - }) - } -} diff --git a/tools/flakeguard/reports/splunk.go b/tools/flakeguard/reports/splunk.go deleted file mode 100644 index 9ab72ccca..000000000 --- a/tools/flakeguard/reports/splunk.go +++ /dev/null @@ -1,229 +0,0 @@ -package reports - -import ( - "bufio" - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "fmt" - "os" - "strings" - "sync" - "time" - - "github.com/go-resty/resty/v2" - "github.com/rs/zerolog/log" -) - -// SendTestReportToSplunk sends a truncated TestReport and each individual TestResults to Splunk as events -func SendTestReportToSplunk(splunkURL, splunkToken, splunkEvent string, report TestReport) error { - start := time.Now() - results := report.Results - report.Results = nil // Don't send results to Splunk, doing that individually - // Dry-run mode for example runs - isExampleRun := strings.Contains(splunkURL, "splunk.example.com") - - client := resty.New(). - SetBaseURL(splunkURL). - SetAuthScheme("Splunk"). - SetAuthToken(splunkToken). - SetHeader("Content-Type", "application/json"). - SetLogger(ZerologRestyLogger{}) - - log.Debug().Str("report id", report.ID).Int("results", len(results)).Msg("Sending aggregated data to Splunk") - - const ( - resultsBatchSize = 10 - splunkSizeLimitBytes = 100_000_000 // 100MB. Actual limit is over 800MB, but that's excessive - exampleSplunkReportFileName = "example_results/example_splunk_report.json" - exampleSplunkResultsFileName = "example_results/example_splunk_results_batch_%d.json" - ) - - var ( - splunkErrs = []error{} - resultsBatch = []SplunkTestResult{} - successfulResultsSent = 0 - batchNum = 1 - ) - - for resultCount, result := range results { - // No need to send log outputs to Splunk - result.FailedOutputs = nil - result.PassedOutputs = nil - result.PackageOutputs = nil - - resultsBatch = append(resultsBatch, SplunkTestResult{ - Event: SplunkTestResultEvent{ - Event: splunkEvent, - Type: Result, - Data: result, - }, - SourceType: SplunkSourceType, - Index: SplunkIndex, - }) - - if len(resultsBatch) >= resultsBatchSize || - resultCount == len(results)-1 || - binary.Size(resultsBatch) >= splunkSizeLimitBytes { - - batchData, testNames, err := batchSplunkResults(resultsBatch) - if err != nil { - return fmt.Errorf("error batching results: %w", err) - } - - if isExampleRun { - exampleSplunkResultsFileName := fmt.Sprintf(exampleSplunkResultsFileName, batchNum) - exampleSplunkResultsFile, err := os.Create(exampleSplunkResultsFileName) - if err != nil { - return fmt.Errorf("error creating example Splunk results file: %w", err) - } - for _, result := range resultsBatch { - jsonResult, err := json.Marshal(result) - if err != nil { - return fmt.Errorf("error marshaling result for '%s' to json: %w", result.Event.Data.TestName, err) - } - _, err = exampleSplunkResultsFile.Write(jsonResult) - if err != nil { - return fmt.Errorf("error writing result for '%s' to file: %w", result.Event.Data.TestName, err) - } - } - err = exampleSplunkResultsFile.Close() - if err != nil { - return fmt.Errorf("error closing example Splunk results file: %w", err) - } - } else { - resp, err := client.R().SetBody(batchData.String()).Post("") - if err != nil { - splunkErrs = append(splunkErrs, - fmt.Errorf("error sending results for [%s] to Splunk: %w", strings.Join(testNames, ", "), err), - ) - } - if resp.IsError() { - splunkErrs = append(splunkErrs, - fmt.Errorf("error sending result for [%s] to Splunk: %s", strings.Join(testNames, ", "), resp.String()), - ) - } - if err == nil && !resp.IsError() { - successfulResultsSent += len(resultsBatch) - } - } - resultsBatch = []SplunkTestResult{} - batchNum++ - } - } - - if isExampleRun { - log.Info().Msg("Example Run. See 'example_results/splunk_results' for the results that would be sent to splunk") - } - - // Sanitize report fields - report.BranchName = strings.TrimSpace(report.BranchName) - - reportData := SplunkTestReport{ - Event: SplunkTestReportEvent{ - Event: splunkEvent, - Type: Report, - Data: report, - Incomplete: len(splunkErrs) > 0, - }, - SourceType: SplunkSourceType, - Index: SplunkIndex, - } - - if isExampleRun { - exampleSplunkReportFile, err := os.Create(exampleSplunkReportFileName) - if err != nil { - return fmt.Errorf("error creating example Splunk report file: %w", err) - } - jsonReport, err := json.Marshal(reportData) - if err != nil { - return fmt.Errorf("error marshaling report: %w", err) - } - _, err = exampleSplunkReportFile.Write(jsonReport) - if err != nil { - return fmt.Errorf("error writing report: %w", err) - } - log.Info().Msgf("Example Run. See '%s' for the results that would be sent to splunk", exampleSplunkReportFileName) - } else { - resp, err := client.R().SetBody(reportData).Post("") - if err != nil { - splunkErrs = append(splunkErrs, fmt.Errorf("error sending report '%s' to Splunk: %w", report.ID, err)) - } - if resp.IsError() { - splunkErrs = append(splunkErrs, fmt.Errorf("error sending report '%s' to Splunk: %s", report.ID, resp.String())) - } - } - - if len(splunkErrs) > 0 { - log.Error(). - Int("successfully sent", successfulResultsSent). - Int("total results", len(results)). - Errs("errors", splunkErrs). - Str("report id", report.ID). - Str("duration", time.Since(start).String()). - Msg("Errors occurred while sending test results to Splunk") - } else { - log.Debug(). - Int("successfully sent", successfulResultsSent). - Int("total results", len(results)). - Int("result batches", batchNum). - Str("duration", time.Since(start).String()). - Str("report id", report.ID). - Msg("All results sent successfully to Splunk") - } - - return errors.Join(splunkErrs...) -} - -// batchSplunkResults creates a batch of TestResult objects as individual JSON objects -// Splunk doesn't accept JSON arrays, they want individual events as single JSON objects -// https://docs.splunk.com/Documentation/Splunk/9.4.0/Data/FormateventsforHTTPEventCollector -func batchSplunkResults(results []SplunkTestResult) (batchData bytes.Buffer, resultTestNames []string, err error) { - for _, result := range results { - data, err := json.Marshal(result) - if err != nil { - return batchData, nil, fmt.Errorf("error marshaling result for '%s': %w", result.Event.Data.TestName, err) - } - if _, err := batchData.Write(data); err != nil { - return batchData, nil, fmt.Errorf("error writing result for '%s': %w", result.Event.Data.TestName, err) - } - if _, err := batchData.WriteRune('\n'); err != nil { - return batchData, nil, fmt.Errorf("error writing newline for '%s': %w", result.Event.Data.TestName, err) - } - resultTestNames = append(resultTestNames, result.Event.Data.TestName) - } - return batchData, resultTestNames, nil -} - -// unBatchSplunkResults un-batches a batch of TestResult objects into a slice of TestResult objects -func unBatchSplunkResults(batch []byte) ([]*SplunkTestResult, error) { - results := make([]*SplunkTestResult, 0, bytes.Count(batch, []byte{'\n'})) - scanner := bufio.NewScanner(bytes.NewReader(batch)) - - maxCapacity := 1024 * 1024 // 1 MB - buf := make([]byte, maxCapacity) - scanner.Buffer(buf, maxCapacity) - - var pool sync.Pool - pool.New = func() interface{} { return new(SplunkTestResult) } - - for scanner.Scan() { - line := scanner.Bytes() - if len(bytes.TrimSpace(line)) == 0 { - continue // Skip empty lines - } - - result := pool.Get().(*SplunkTestResult) - if err := json.Unmarshal(line, result); err != nil { - return results, fmt.Errorf("error unmarshalling result: %w", err) - } - results = append(results, result) - } - - if err := scanner.Err(); err != nil { - return results, fmt.Errorf("error scanning: %w", err) - } - - return results, nil -} diff --git a/tools/flakeguard/reports/test_report.go b/tools/flakeguard/reports/test_report.go deleted file mode 100644 index ebea0e4e3..000000000 --- a/tools/flakeguard/reports/test_report.go +++ /dev/null @@ -1,347 +0,0 @@ -package reports - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - - "github.com/google/uuid" -) - -// reportOptions influence how reports are aggregated together -type reportOptions struct { - maxPassRatio float64 - reportID string - rerunOfReportID string - projectPath string - goProjectName string - raceDetection bool - excludedTests []string - selectedTests []string - jsonOutputPaths []string - branchName string - baseSha string - headSha string - repoURL string - codeownersPath string - gitHubWorkflowName string - gitHubWorkflowRunURL string -} - -// TestReportOption is a functional option for configuring the aggregation process. -type TestReportOption func(*reportOptions) - -func WithProjectPath(projectPath string) TestReportOption { - return func(opts *reportOptions) { - opts.projectPath = projectPath - } -} - -func WithGoProject(goProject string) TestReportOption { - return func(opts *reportOptions) { - opts.goProjectName = goProject - } -} - -func WithReportID(reportID string) TestReportOption { - return func(opts *reportOptions) { - opts.reportID = reportID - } -} - -func WithRerunOfReportID(rerunOfReportID string) TestReportOption { - return func(opts *reportOptions) { - opts.rerunOfReportID = rerunOfReportID - } -} - -func WithGeneratedReportID(genReportID bool) TestReportOption { - return func(opts *reportOptions) { - if !genReportID { - return - } - uuid, err := uuid.NewRandom() - if err != nil { - panic(fmt.Errorf("error generating random report id: %w", err)) - } - opts.reportID = uuid.String() - } -} - -func WithBranchName(branchName string) TestReportOption { - return func(opts *reportOptions) { - opts.branchName = branchName - } -} - -// WithHeadSha sets the head SHA for the aggregated report. -func WithHeadSha(headSha string) TestReportOption { - return func(opts *reportOptions) { - opts.headSha = headSha - } -} - -// WithBaseSha sets the base SHA for the aggregated report. -func WithBaseSha(baseSha string) TestReportOption { - return func(opts *reportOptions) { - opts.baseSha = baseSha - } -} - -// WithRepoURL sets the repository URL for the aggregated report. -func WithRepoURL(repoURL string) TestReportOption { - return func(opts *reportOptions) { - opts.repoURL = repoURL - } -} - -func WithRepoPath(repoPath string) TestReportOption { - return func(opts *reportOptions) { - opts.repoURL = repoPath - } -} - -func WithCodeOwnersPath(codeOwnersPath string) TestReportOption { - return func(opts *reportOptions) { - opts.codeownersPath = codeOwnersPath - } -} - -// WithGitHubWorkflowName sets the GitHub workflow name for the aggregated report. -func WithGitHubWorkflowName(githubWorkflowName string) TestReportOption { - return func(opts *reportOptions) { - opts.gitHubWorkflowName = githubWorkflowName - } -} - -// WithGitHubWorkflowRunURL sets the GitHub workflow run URL for the aggregated report. -func WithGitHubWorkflowRunURL(githubWorkflowRunURL string) TestReportOption { - return func(opts *reportOptions) { - opts.gitHubWorkflowRunURL = githubWorkflowRunURL - } -} - -// WithMaxPassRatio sets the maximum pass ratio for the aggregated report. -func WithMaxPassRatio(maxPassRatio float64) TestReportOption { - return func(opts *reportOptions) { - opts.maxPassRatio = maxPassRatio - } -} - -func WithGoRaceDetection(raceDetection bool) TestReportOption { - return func(opts *reportOptions) { - opts.raceDetection = raceDetection - } -} - -func WithExcludedTests(excludedTests []string) TestReportOption { - return func(opts *reportOptions) { - opts.excludedTests = excludedTests - } -} - -func WithSelectedTests(selectedTests []string) TestReportOption { - return func(opts *reportOptions) { - opts.selectedTests = selectedTests - } -} - -func WithJSONOutputPaths(jsonOutputPaths []string) TestReportOption { - return func(opts *reportOptions) { - opts.jsonOutputPaths = jsonOutputPaths - } -} - -// NewTestReport creates a new TestReport based on the provided test results and optional aggregate settings. -func NewTestReport(results []TestResult, opts ...TestReportOption) (TestReport, error) { - defaultOpts := &reportOptions{ - reportID: "", - branchName: "", - headSha: "", - baseSha: "", - repoURL: "", - codeownersPath: "", - gitHubWorkflowName: "", - gitHubWorkflowRunURL: "", - maxPassRatio: 1.0, // default value - } - - for _, opt := range opts { - opt(defaultOpts) - } - - r := TestReport{ - ID: defaultOpts.reportID, - RerunOfReportID: defaultOpts.rerunOfReportID, - ProjectPath: defaultOpts.projectPath, - GoProject: defaultOpts.goProjectName, - BranchName: defaultOpts.branchName, - HeadSHA: defaultOpts.headSha, - BaseSHA: defaultOpts.baseSha, - RepoURL: defaultOpts.repoURL, - GitHubWorkflowName: defaultOpts.gitHubWorkflowName, - GitHubWorkflowRunURL: defaultOpts.gitHubWorkflowRunURL, - RaceDetection: defaultOpts.raceDetection, - ExcludedTests: defaultOpts.excludedTests, - SelectedTests: defaultOpts.selectedTests, - MaxPassRatio: defaultOpts.maxPassRatio, - JSONOutputPaths: defaultOpts.jsonOutputPaths, - Results: results, - } - - r.GenerateSummaryData() - - // Map test results to paths - err := MapTestResultsToPaths(&r, r.ProjectPath) - if err != nil { - return r, fmt.Errorf("error mapping test results to paths: %w", err) - } - - // Map test results to code owners if a codeowners file is provided - if defaultOpts.codeownersPath != "" { - err = MapTestResultsToOwners(&r, defaultOpts.codeownersPath) - if err != nil { - return r, fmt.Errorf("error mapping test results to code owners: %w", err) - } - } - - // Set the report ID for each test result - for i := range r.Results { - r.Results[i].ReportID = r.ID - } - - return r, nil -} - -// TestReport reports on the parameters and results of one to many test runs -type TestReport struct { - ID string `json:"id"` - RerunOfReportID string `json:"rerun_of_report_id"` // references the ID of the original/base report from which this re-run was created. - ProjectPath string `json:"project_path"` - GoProject string `json:"go_project"` - BranchName string `json:"branch_name,omitempty"` - HeadSHA string `json:"head_sha,omitempty"` - BaseSHA string `json:"base_sha,omitempty"` - RepoURL string `json:"repo_url,omitempty"` - GitHubWorkflowName string `json:"github_workflow_name,omitempty"` - GitHubWorkflowRunURL string `json:"github_workflow_run_url,omitempty"` - SummaryData *SummaryData `json:"summary_data"` - RaceDetection bool `json:"race_detection"` - ExcludedTests []string `json:"excluded_tests,omitempty"` - SelectedTests []string `json:"selected_tests,omitempty"` - Results []TestResult `json:"results,omitempty"` - FailedLogsURL string `json:"failed_logs_url,omitempty"` - JSONOutputPaths []string `json:"-"` // go test -json outputs from runs - // MaxPassRatio is the maximum flakiness ratio allowed for a test to be considered not flaky - MaxPassRatio float64 `json:"max_pass_ratio,omitempty"` -} - -// SaveToFile saves the test report to a JSON file at the given path. -// It returns an error if there's any issue with marshaling the report or writing to the file. -func (testReport *TestReport) SaveToFile(outputPath string) error { - // Create directory path if it doesn't exist - dir := filepath.Dir(outputPath) - if err := os.MkdirAll(dir, 0o755); err != nil { - return fmt.Errorf("error creating directories: %w", err) - } - - jsonData, err := json.MarshalIndent(testReport, "", " ") - if err != nil { - return fmt.Errorf("error marshaling test results to JSON: %w", err) - } - - if err := os.WriteFile(outputPath, jsonData, 0600); err != nil { - return fmt.Errorf("error writing test results to file: %w", err) - } - - return nil -} - -func (tr *TestReport) PrintGotestsumOutput(w io.Writer, format string) error { - if len(tr.JSONOutputPaths) == 0 { - fmt.Fprintf(w, "No JSON test output paths found in test report\n") - return nil - } - - for _, path := range tr.JSONOutputPaths { - cmdStr := fmt.Sprintf("cat %q | gotestsum --raw-command --format %q -- cat", path, format) - cmd := exec.Command("bash", "-c", cmdStr) - - var outBuf bytes.Buffer - cmd.Stdout = &outBuf - cmd.Stderr = &outBuf - - if err := cmd.Run(); err != nil { - return fmt.Errorf("gotestsum command failed for file %s: %w\nOutput: %s", path, err, outBuf.String()) - } - - fmt.Fprint(w, outBuf.String()) - fmt.Fprint(w, "\n------------------------------------------\n\n") - } - return nil -} - -// GenerateSummaryData generates a summary of a report's test results -func (testReport *TestReport) GenerateSummaryData() { - var runs, testRunCount, passes, fails, skips, panickedTests, racedTests, flakyTests int - - // Map to hold unique test names that were entirely skipped - uniqueSkippedTestsMap := make(map[string]struct{}) - - for _, result := range testReport.Results { - runs += result.Runs - if result.Runs > testRunCount { - testRunCount = result.Runs - } - passes += result.Successes - fails += result.Failures - skips += result.Skips - - if result.Runs == 0 && result.Skipped { - uniqueSkippedTestsMap[result.TestName] = struct{}{} - } - - if result.Panic { - panickedTests++ - flakyTests++ - } else if result.Race { - racedTests++ - flakyTests++ - } else if !result.Skipped && result.Runs > 0 && result.PassRatio < testReport.MaxPassRatio { - flakyTests++ - } - } - - // Calculate the unique count of skipped tests - uniqueSkippedTestCount := len(uniqueSkippedTestsMap) - - // Calculate the raw pass ratio - passRatio := passRatio(passes, runs) - - // Calculate the raw flake ratio - totalTests := len(testReport.Results) - flakeRatio := flakeRatio(flakyTests, totalTests) - - passRatioStr := formatRatio(passRatio) - flakeTestRatioStr := formatRatio(flakeRatio) - - testReport.SummaryData = &SummaryData{ - UniqueTestsRun: totalTests, - UniqueSkippedTestCount: uniqueSkippedTestCount, - TestRunCount: testRunCount, - PanickedTests: panickedTests, - RacedTests: racedTests, - FlakyTests: flakyTests, - FlakyTestPercent: flakeTestRatioStr, - - TotalRuns: runs, - PassedRuns: passes, - FailedRuns: fails, - SkippedRuns: skips, - PassPercent: passRatioStr, - } -} diff --git a/tools/flakeguard/reports/testdata/run_1.json b/tools/flakeguard/reports/testdata/run_1.json deleted file mode 100644 index 11e2a21f7..000000000 --- a/tools/flakeguard/reports/testdata/run_1.json +++ /dev/null @@ -1,6029 +0,0 @@ -[ - { - "report_id": "", - "test_name": "TestSubTestsAllPass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSkipped", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": true, - "pass_ratio": 1, - "runs": 0, - "failures": 0, - "successes": 0, - "skips": 5, - "durations": null, - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail/Fail1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail/Fail2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestPass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass/Pass1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail/Pass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests/Pass2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailLargeOutput", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentBeforeSubTests", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFlaky", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0.4, - "runs": 5, - "failures": 3, - "successes": 2, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ], - "run3": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ], - "run5": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestRace", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests/Pass1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail/Fail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass/Pass2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.193s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.179s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n" - ], - "test_path": "example_folder/example_test.go", - "code_owners": [ - "@chainlink/example-team1", - "@chainlink/example-team2" - ] - } -] \ No newline at end of file diff --git a/tools/flakeguard/reports/testdata/run_2.json b/tools/flakeguard/reports/testdata/run_2.json deleted file mode 100644 index 4308d2b29..000000000 --- a/tools/flakeguard/reports/testdata/run_2.json +++ /dev/null @@ -1,6019 +0,0 @@ -[ - { - "report_id": "", - "test_name": "TestSubTestsSomeFail/Pass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail/Fail1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentBeforeSubTests", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestRace", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFlaky", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0.6, - "runs": 5, - "failures": 2, - "successes": 3, - "skips": 0, - "failed_outputs": { - "run2": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ], - "run4": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail/Fail2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailLargeOutput", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSkipped", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": true, - "pass_ratio": 1, - "runs": 0, - "failures": 0, - "successes": 0, - "skips": 5, - "durations": null, - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass/Pass1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests/Pass2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestPass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests/Pass1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass/Pass2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail/Fail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.191s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.172s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.166s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n" - ], - "test_path": "", - "code_owners": null - } -] \ No newline at end of file diff --git a/tools/flakeguard/reports/testdata/run_3.json b/tools/flakeguard/reports/testdata/run_3.json deleted file mode 100644 index 5531f27ba..000000000 --- a/tools/flakeguard/reports/testdata/run_3.json +++ /dev/null @@ -1,6026 +0,0 @@ -[ - { - "report_id": "", - "test_name": "TestFailLargeOutput", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailLargeOutput\n", - "=== PAUSE TestFailLargeOutput\n", - "=== CONT TestFailLargeOutput\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:24: This is a log line\n", - " example_tests_test.go:26: This test always fails\n", - "--- FAIL: TestFailLargeOutput (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail/Pass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests/Pass1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentBeforeSubTests", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailInParentBeforeSubTests\n", - "=== PAUSE TestFailInParentBeforeSubTests\n", - "=== CONT TestFailInParentBeforeSubTests\n", - " example_tests_test.go:104: This test always fails\n", - "--- FAIL: TestFailInParentBeforeSubTests (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail/Fail1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail/Fail1\n", - "=== PAUSE TestSubTestsAllFail/Fail1\n", - "=== CONT TestSubTestsAllFail/Fail1\n", - " example_tests_test.go:48: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail1 (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail/Fail2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail/Fail2\n", - "=== PAUSE TestSubTestsAllFail/Fail2\n", - "=== CONT TestSubTestsAllFail/Fail2\n", - " example_tests_test.go:53: This subtest always fails\n", - "--- FAIL: TestSubTestsAllFail/Fail2 (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail/Fail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsSomeFail/Fail\n", - "=== PAUSE TestSubTestsSomeFail/Fail\n", - "=== CONT TestSubTestsSomeFail/Fail\n", - " example_tests_test.go:67: This subtest always fails\n", - "--- FAIL: TestSubTestsSomeFail/Fail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestPass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsAllFail\n", - "=== PAUSE TestSubTestsAllFail\n", - "=== CONT TestSubTestsAllFail\n", - "--- FAIL: TestSubTestsAllFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsSomeFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestSubTestsSomeFail\n", - "=== PAUSE TestSubTestsSomeFail\n", - "=== CONT TestSubTestsSomeFail\n", - "--- FAIL: TestSubTestsSomeFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run2": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run3": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run4": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ], - "run5": [ - "=== RUN TestFailInParentAfterSubTests\n", - "=== PAUSE TestFailInParentAfterSubTests\n", - "=== CONT TestFailInParentAfterSubTests\n", - " example_tests_test.go:98: This test always fails\n", - "--- FAIL: TestFailInParentAfterSubTests (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFailInParentAfterSubTests/Pass2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFlaky", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0.4, - "runs": 5, - "failures": 3, - "successes": 2, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ], - "run3": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ], - "run5": [ - "=== RUN TestFlaky\n", - "=== PAUSE TestFlaky\n", - "=== CONT TestFlaky\n", - " example_tests_test.go:129: This is a designed flaky test working as intended\n", - "--- FAIL: TestFlaky (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestRace", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestFail", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 0, - "runs": 5, - "failures": 5, - "successes": 0, - "skips": 0, - "failed_outputs": { - "run1": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run2": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run3": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run4": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ], - "run5": [ - "=== RUN TestFail\n", - "=== PAUSE TestFail\n", - "=== CONT TestFail\n", - " example_tests_test.go:18: This test always fails\n", - "--- FAIL: TestFail (0.00s)\n" - ] - }, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSkipped", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": true, - "pass_ratio": 1, - "runs": 0, - "failures": 0, - "successes": 0, - "skips": 5, - "durations": null, - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass/Pass1", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - }, - { - "report_id": "", - "test_name": "TestSubTestsAllPass/Pass2", - "test_package": "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package", - "package_panic": false, - "panic": false, - "timeout": false, - "race": false, - "skipped": false, - "pass_ratio": 1, - "runs": 5, - "failures": 0, - "successes": 5, - "skips": 0, - "durations": [ - 0, - 0, - 0, - 0, - 0 - ], - "package_outputs": [ - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.180s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.169s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.171s\n", - "FAIL\n", - "FAIL\tgithub.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package\t0.173s\n" - ], - "test_path": "", - "code_owners": null - } -] \ No newline at end of file diff --git a/tools/flakeguard/runner/example_test_package/example_tests_test.go b/tools/flakeguard/runner/example_test_package/example_tests_test.go deleted file mode 100644 index be1590158..000000000 --- a/tools/flakeguard/runner/example_test_package/example_tests_test.go +++ /dev/null @@ -1,207 +0,0 @@ -//go:build example_package_tests -// +build example_package_tests - -package exampletestpackage - -import ( - "log" - "os" - "sync" - "testing" - "time" -) - -func TestPass(t *testing.T) { - t.Parallel() - t.Log("This test always passes") -} - -func TestFail(t *testing.T) { - t.Parallel() - t.Fatal("This test always fails") -} - -func TestFailLargeOutput(t *testing.T) { - t.Parallel() - for range 1000 { - t.Log("This is a log line") - } - t.Fatal("This test always fails") -} - -func TestSubTestsAllPass(t *testing.T) { - t.Parallel() - - t.Run("Pass1", func(t *testing.T) { - t.Log("This subtest always passes") - }) - - t.Run("Pass2", func(t *testing.T) { - t.Log("This subtest always passes") - }) -} - -func TestSubTestsAllFail(t *testing.T) { - t.Parallel() - - t.Run("Fail1", func(t *testing.T) { - t.Fatal("This subtest always fails") - }) - - t.Run("Fail2", func(t *testing.T) { - t.Fatal("This subtest always fails") - }) -} - -func TestSubTestsSomeFail(t *testing.T) { - t.Parallel() - - t.Run("Pass", func(t *testing.T) { - t.Log("This subtest always passes") - }) - - t.Run("Fail", func(t *testing.T) { - t.Fatal("This subtest always fails") - }) -} - -func TestSubTestsSomePanic(t *testing.T) { - t.Parallel() - - t.Run("Pass", func(t *testing.T) { - t.Log("This subtest always passes") - }) - - t.Run("Panic", func(t *testing.T) { - panic("This subtest always panics") - }) -} - -func TestFailInParentAfterSubTests(t *testing.T) { - t.Parallel() - - t.Run("Pass1", func(t *testing.T) { - t.Log("This subtest always passes") - }) - - t.Run("Pass2", func(t *testing.T) { - t.Log("This subtest always passes") - }) - - t.Fatal("This test always fails") -} - -func TestFailInParentBeforeSubTests(t *testing.T) { - t.Parallel() - - t.Fatal("This test always fails") //nolint:revive - - t.Run("Pass1", func(t *testing.T) { - t.Parallel() - t.Log("This subtest always passes") - }) - - t.Run("Pass2", func(t *testing.T) { - t.Parallel() - t.Log("This subtest always passes") - }) -} - -// This test should have a 50% pass ratio -func TestFlaky(t *testing.T) { - t.Parallel() - - // Track if the test has run before - stateFile := "tmp_test_flaky_state" - - // If the state file does not exist, create it and fail the test - if _, err := os.Stat(stateFile); os.IsNotExist(err) { - if err := os.WriteFile(stateFile, []byte("run once"), 0644); err != nil { //nolint:gosec - t.Fatalf("THIS IS UNEXPECTED: failed to create state file: %v", err) - } - t.Fatalf("This is a designed flaky test working as intended") - } else { - t.Cleanup(func() { - err := os.Remove(stateFile) - if err != nil { - t.Fatalf("THIS IS UNEXPECTED: failed to remove state file: %v", err) - } - }) - } - - t.Log("This test passes after the first run") -} - -func TestSkipped(t *testing.T) { - t.Parallel() - t.Skip("This test is intentionally skipped") -} - -func TestPanic(t *testing.T) { - t.Parallel() - panic("This test intentionally panics") -} - -func TestFlakyPanic(t *testing.T) { - t.Parallel() - - // Track if the test has run before - stateFile := "tmp_test_flaky_panic_state" - - // If the state file does not exist, create it and fail the test - if _, err := os.Stat(stateFile); os.IsNotExist(err) { - if err := os.WriteFile(stateFile, []byte("run once"), 0644); err != nil { //nolint:gosec - t.Fatalf("THIS IS UNEXPECTED: failed to create state file: %v", err) - } - panic("This is a designed flaky test panicking as intended") - } - t.Cleanup(func() { - err := os.Remove(stateFile) - if err != nil { - t.Fatalf("THIS IS UNEXPECTED: failed to remove state file: %v", err) - } - }) -} - -func TestRace(t *testing.T) { - t.Parallel() - t.Logf("This test should trigger a failure if run with the -race flag, but otherwise pass") - - var ( - numGoroutines = 100 - sharedCounter int - wg sync.WaitGroup - ) - - worker := func(id int) { - defer wg.Done() - for i := 0; i < 1000; i++ { - sharedCounter++ - _ = sharedCounter * id - } - } - - wg.Add(numGoroutines) - for i := 0; i < numGoroutines; i++ { - go worker(i) - } - - wg.Wait() - - // Log the result - t.Logf("Final value of sharedCounter: %d", sharedCounter) -} - -func TestTimeout(t *testing.T) { - t.Parallel() - - deadline, ok := t.Deadline() - if !ok { - log.Fatal("This test should have a deadline") - } - - t.Logf("This test will sleep %s in order to timeout", time.Until(deadline).String()) - // Sleep until the deadline - time.Sleep(time.Until(deadline)) - t.Logf("This test should have timed out") -} diff --git a/tools/flakeguard/runner/executor/executor.go b/tools/flakeguard/runner/executor/executor.go deleted file mode 100644 index af7269cff..000000000 --- a/tools/flakeguard/runner/executor/executor.go +++ /dev/null @@ -1,189 +0,0 @@ -package executor - -import ( - "bytes" - "errors" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/rs/zerolog/log" -) - -type Config struct { - ProjectPath string - Verbose bool - GoTestCountFlag *int - GoTestRaceFlag bool - GoTestTimeoutFlag string - Tags []string - UseShuffle bool - ShuffleSeed string - SkipTests []string - SelectTests []string - RawOutputDir string -} - -type Executor interface { - RunTestPackage(cfg Config, packageName string, runIndex int) (outputFilePath string, passed bool, err error) - RunCmd(cfg Config, testCmd []string, runIndex int) (outputFilePath string, passed bool, err error) -} - -type exitCoder interface { - ExitCode() int -} - -type commandExecutor struct{} - -func NewCommandExecutor() Executor { - return &commandExecutor{} -} - -// RunTestPackage runs the tests for a given package and returns the path to the output file. -func (e *commandExecutor) RunTestPackage(cfg Config, packageName string, runIndex int) (string, bool, error) { - args := []string{"test", packageName, "-json"} - if cfg.GoTestCountFlag != nil { - args = append(args, fmt.Sprintf("-count=%d", *cfg.GoTestCountFlag)) - } - if cfg.GoTestRaceFlag { - args = append(args, "-race") - } - if cfg.GoTestTimeoutFlag != "" { - args = append(args, fmt.Sprintf("-timeout=%s", cfg.GoTestTimeoutFlag)) - } - if len(cfg.Tags) > 0 { - args = append(args, fmt.Sprintf("-tags=%s", strings.Join(cfg.Tags, ","))) - } - if cfg.UseShuffle { - if cfg.ShuffleSeed != "" { - args = append(args, fmt.Sprintf("-shuffle=%s", cfg.ShuffleSeed)) - } else { - args = append(args, "-shuffle=on") - } - } - if len(cfg.SkipTests) > 0 { - skipPattern := strings.Join(cfg.SkipTests, "|") - args = append(args, fmt.Sprintf("-skip=%s", skipPattern)) - } - if len(cfg.SelectTests) > 0 { - selectPattern := strings.Join(cfg.SelectTests, "$|^") - args = append(args, fmt.Sprintf("-run=^%s$", selectPattern)) - } - - err := os.MkdirAll(cfg.RawOutputDir, 0o755) - if err != nil { - return "", false, fmt.Errorf("failed to create raw output directory: %w", err) - } - - saniPackageName := filepath.Base(packageName) - tmpFile, err := os.CreateTemp(cfg.RawOutputDir, fmt.Sprintf("test-output-%s-%d-*.json", saniPackageName, runIndex)) - if err != nil { - return "", false, fmt.Errorf("failed to create temp file: %w", err) - } - tempFilePath := tmpFile.Name() - if err := tmpFile.Close(); err != nil { - log.Warn().Err(err).Str("file", tempFilePath).Msg("Failed to close temporary file handle after creation") - } - - absPath, absErr := filepath.Abs(tempFilePath) - if absErr != nil { - log.Warn().Err(absErr).Str("relative_path", tempFilePath).Msg("Failed to get absolute path for log message, using relative path") - absPath = tempFilePath - } - - if cfg.Verbose { - log.Info().Str("raw_output_file", absPath).Str("command", fmt.Sprintf("go %s", strings.Join(args, " "))).Msg("Running command") - } - - cmd := exec.Command("go", args...) - cmd.Dir = cfg.ProjectPath - var stderrBuf bytes.Buffer - cmd.Stderr = &stderrBuf - - stdoutBytes, err := cmd.Output() - - writeErr := os.WriteFile(tempFilePath, stdoutBytes, 0644) - if writeErr != nil { - log.Error().Err(writeErr).Str("file", tempFilePath).Msg("Failed to write captured stdout to temp file") - _ = os.Remove(tempFilePath) - return "", false, fmt.Errorf("failed to write command output to %s: %w", tempFilePath, writeErr) - } - - if err != nil { - if stderrStr := stderrBuf.String(); stderrStr != "" { - log.Error().Str("package", packageName).Str("stderr", stderrStr).Msg("Command failed with error and stderr output") - } - - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { - return tempFilePath, false, nil - } - _ = os.Remove(tempFilePath) - return "", false, fmt.Errorf("test command execution failed for package %s: %w", packageName, err) - } - - return tempFilePath, true, nil -} - -// RunCmd runs the user-supplied command once, captures its JSON output -func (e *commandExecutor) RunCmd(cfg Config, testCmd []string, runIndex int) (tempFilePath string, passed bool, err error) { - if len(testCmd) == 0 { - return "", false, errors.New("test command cannot be empty") - } - - err = os.MkdirAll(cfg.RawOutputDir, 0o755) - if err != nil { - return "", false, fmt.Errorf("failed to create raw output directory: %w", err) - } - tmpFile, err := os.CreateTemp(cfg.RawOutputDir, fmt.Sprintf("test-output-cmd-run%d-*.json", runIndex+1)) - if err != nil { - return "", false, fmt.Errorf("failed to create temp file for command run: %w", err) - } - tempFilePath = tmpFile.Name() - if err := tmpFile.Close(); err != nil { - log.Warn().Err(err).Str("file", tempFilePath).Msg("Failed to close temporary file handle after creation (cmd run)") - } - - absPath, absErr := filepath.Abs(tempFilePath) - if absErr != nil { - log.Warn().Err(absErr).Str("relative_path", tempFilePath).Msg("Failed to get absolute path for log message (cmd run), using relative path") - absPath = tempFilePath - } - - if cfg.Verbose { - log.Info().Str("raw_output_file", absPath).Str("command", strings.Join(testCmd, " ")).Msg("Running custom command") - } - - cmd := exec.Command(testCmd[0], testCmd[1:]...) //nolint:gosec - cmd.Dir = cfg.ProjectPath - var stderrBuf bytes.Buffer - cmd.Stderr = &stderrBuf - - stdoutBytes, err := cmd.Output() - - writeErr := os.WriteFile(tempFilePath, stdoutBytes, 0644) - if writeErr != nil { - log.Error().Err(writeErr).Str("file", tempFilePath).Msg("Failed to write captured stdout to temp file (cmd run)") - _ = os.Remove(tempFilePath) - return "", false, fmt.Errorf("failed to write command output to %s: %w", tempFilePath, writeErr) - } - - if err != nil { - if stderrStr := stderrBuf.String(); stderrStr != "" { - log.Error().Str("command", strings.Join(testCmd, " ")).Str("stderr", stderrStr).Msg("Custom command failed with error and stderr output") - } - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { - passed = false - return tempFilePath, passed, nil - } else { - _ = os.Remove(tempFilePath) - return "", false, fmt.Errorf("error running test command %v: %w", testCmd, err) - } - } - - passed = true - return tempFilePath, passed, nil -} diff --git a/tools/flakeguard/runner/parser/attribution.go b/tools/flakeguard/runner/parser/attribution.go deleted file mode 100644 index 45ce19787..000000000 --- a/tools/flakeguard/runner/parser/attribution.go +++ /dev/null @@ -1,126 +0,0 @@ -package parser - -import ( - "errors" - "fmt" - "regexp" - "strings" - "time" - - "github.com/rs/zerolog/log" -) - -var ( - nestedTestNameRe = regexp.MustCompile(`\.(Test[^\s]+?)(?:\.[^(]+)?\s*\(`) - testLogAfterTestRe = regexp.MustCompile(`^panic: Log in goroutine after (Test[^\s]+) has completed:`) - didTestTimeoutRe = regexp.MustCompile(`^panic: test timed out after ([^\s]+)`) - timedOutTestNameRe = regexp.MustCompile(`^\s*(Test[^\s]+)\s+\((.*)\)`) - - ErrFailedToAttributePanicToTest = errors.New("failed to attribute panic to test") - ErrFailedToAttributeRaceToTest = errors.New("failed to attribute race to test") - ErrFailedToParseTimeoutDuration = errors.New("failed to parse timeout duration") - ErrFailedToExtractTimeoutDuration = errors.New("failed to extract timeout duration") - ErrDetectedLogAfterCompleteFailedAttribution = errors.New("detected a log after test has completed panic, but failed to properly attribute it") - ErrDetectedTimeoutFailedParse = errors.New("detected test timeout, but failed to parse the duration from the test") - ErrDetectedTimeoutFailedAttribution = errors.New("detected test timeout, but failed to attribute the timeout to a specific test") -) - -// AttributePanicToTest attributes panics to the test that caused them. -func AttributePanicToTest(outputs []string) (test string, timeout bool, err error) { - var ( - timeoutDurationStr string - timeoutDuration time.Duration - foundTestName string - ) - - for _, output := range outputs { - output = strings.TrimSpace(output) - if output == "" { - continue - } - - if match := testLogAfterTestRe.FindStringSubmatch(output); len(match) > 1 { - testName := strings.TrimSpace(match[1]) - log.Debug().Str("test", testName).Str("line", output).Msg("Attributed panic via LogAfterTest pattern") - return testName, false, nil - } - - if match := didTestTimeoutRe.FindStringSubmatch(output); len(match) > 1 { - timeout = true - timeoutDurationStr = match[1] - var parseErr error - timeoutDuration, parseErr = time.ParseDuration(timeoutDurationStr) - if parseErr != nil { - log.Warn().Str("duration_str", timeoutDurationStr).Err(parseErr).Msg("Failed to parse timeout duration from initial panic line") - return "", true, fmt.Errorf("%w: %w using output line: %s", ErrFailedToParseTimeoutDuration, parseErr, output) - } - log.Debug().Dur("duration", timeoutDuration).Msg("Detected timeout panic") - continue - } - - if timeout { - if match := timedOutTestNameRe.FindStringSubmatch(output); len(match) > 2 { - testName := strings.TrimSpace(match[1]) - testDurationStr := strings.TrimSpace(match[2]) - testDuration, parseErr := time.ParseDuration(testDurationStr) - if parseErr != nil { - log.Warn().Str("test", testName).Str("duration_str", testDurationStr).Err(parseErr).Msg("Failed to parse duration from timed-out test line") - return "", true, fmt.Errorf("%w: test '%s' listed with unparseable duration '%s': %w", ErrDetectedTimeoutFailedParse, testName, testDurationStr, parseErr) - } else if testDuration >= timeoutDuration { - log.Debug().Str("test", testName).Dur("test_duration", testDuration).Dur("timeout_duration", timeoutDuration).Msg("Attributed timeout panic via duration match") - return testName, true, nil - } else { - log.Debug().Str("test", testName).Dur("test_duration", testDuration).Dur("timeout_duration", timeoutDuration).Msg("Ignoring test line, duration too short for timeout") - } - } - } - - matchNestedTestName := nestedTestNameRe.FindStringSubmatch(output) - if len(matchNestedTestName) > 1 { - testName := strings.TrimSpace(matchNestedTestName[1]) - if !strings.HasPrefix(testName, "Test") { - continue - } - if foundTestName == "" { - log.Debug().Str("test", testName).Str("line", output).Msg("Found potential test name in panic output") - foundTestName = testName - } - } - } - - if timeout { - var errMsg string - if foundTestName != "" { - errMsg = fmt.Sprintf("timeout duration %s detected, found candidate test '%s' but duration did not meet threshold or failed parsing earlier", timeoutDurationStr, foundTestName) - } else { - errMsg = fmt.Sprintf("timeout duration %s detected, but no matching test found in output", timeoutDurationStr) - } - return "", true, fmt.Errorf("%w: %s: %w", ErrDetectedTimeoutFailedAttribution, errMsg, errors.New(strings.Join(outputs, "\n"))) - } - - if foundTestName != "" { - log.Debug().Str("test", foundTestName).Msg("Attributed non-timeout panic via test name found in stack") - return foundTestName, false, nil - } - - return "", false, fmt.Errorf("%w: using output: %w", ErrFailedToAttributePanicToTest, errors.New(strings.Join(outputs, "\n"))) -} - -// AttributeRaceToTest attributes races to the test that caused them. -func AttributeRaceToTest(outputs []string) (string, error) { - for _, output := range outputs { - output = strings.TrimSpace(output) - if output == "" { - continue - } - match := nestedTestNameRe.FindStringSubmatch(output) - if len(match) > 1 { - testName := strings.TrimSpace(match[1]) - if strings.HasPrefix(testName, "Test") { - log.Debug().Str("test", testName).Str("line", output).Msg("Attributed race via test name match") - return testName, nil - } - } - } - return "", fmt.Errorf("%w: using output: %w", ErrFailedToAttributeRaceToTest, errors.New(strings.Join(outputs, "\n"))) -} diff --git a/tools/flakeguard/runner/parser/attribution_test.go b/tools/flakeguard/runner/parser/attribution_test.go deleted file mode 100644 index 45e26666d..000000000 --- a/tools/flakeguard/runner/parser/attribution_test.go +++ /dev/null @@ -1,226 +0,0 @@ -package parser - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestAttributePanicToTest(t *testing.T) { - t.Parallel() - - testCases := []struct { - name string - expectedTestName string - expectedTimeout bool - expectedError error - outputs []string - }{ - { - name: "properly attributed panic", - expectedTestName: "TestPanic", - expectedTimeout: false, - outputs: []string{ - "panic: This test intentionally panics [recovered]", - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/example_test_package.TestPanic(0x140000b6ea0?)", - }, - }, - { - name: "improperly attributed panic (but still findable)", - expectedTestName: "TestPanic", - expectedTimeout: false, - outputs: []string{ - "panic: This test intentionally panics [recovered]", - "TestPanic(0x140000b6ea0?)", - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/example_test_package.TestPanic(0x140000b6ea0?)", - }, - }, - { - name: "log after test complete panic", - expectedTestName: "Test_workflowRegisteredHandler/skips_fetch_if_secrets_url_is_missing", - expectedTimeout: false, - outputs: []string{ - "panic: Log in goroutine after Test_workflowRegisteredHandler/skips_fetch_if_secrets_url_is_missing has completed: ...", - }, - }, - { - name: "timeout panic with obvious culprit", - expectedTestName: "TestTimedOut", - expectedTimeout: true, - outputs: []string{ - "panic: test timed out after 10m0s", - "running tests", - "\tTestNoTimeout (9m59s)", - "\tTestTimedOut (10m0s)", - }, - }, - { - name: "subtest panic", - expectedTestName: "TestSubTestsSomePanic", - expectedTimeout: false, - outputs: []string{ - "panic: This subtest always panics", - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/example_test_package.TestSubTestsSomePanic.func2(0x140000c81a0?)", - }, - }, - { - name: "memory_test panic extraction", - expectedTestName: "TestJobClientJobAPI", - expectedTimeout: false, - outputs: []string{ - "panic: freeport: cannot allocate port block", - "github.com/smartcontractkit/chainlink/deployment/environment/memory_test.TestJobClientJobAPI(0xc000683dc0)", - }, - }, - { - name: "changeset_test panic extraction", - expectedTestName: "TestDeployBalanceReader", - expectedTimeout: false, - outputs: []string{ - "panic: freeport: cannot allocate port block", - "github.com/smartcontractkit/chainlink/deployment/keystone/changeset_test.TestDeployBalanceReader(0xc000583c00)", - }, - }, - { - name: "empty output", - expectedError: ErrFailedToAttributePanicToTest, - outputs: []string{}, - }, - { - name: "no test name in panic", - expectedError: ErrFailedToAttributePanicToTest, - outputs: []string{ - "panic: reflect: Elem of invalid type bool", - }, - }, - { - name: "fail to parse timeout duration", - expectedTimeout: true, - expectedError: ErrFailedToParseTimeoutDuration, - outputs: []string{ - "panic: test timed out after malformedDurationStr\n", - }, - }, - { - name: "timeout panic without obvious culprit", - expectedTimeout: true, - expectedError: ErrDetectedTimeoutFailedAttribution, - outputs: []string{ - "panic: test timed out after 10m0s\n", - "\trunning tests:\n", - "\t\tTestAlmostPanicTime (9m59s)\n", - }, - }, - { - name: "possible regex trip-up (no TestXxx)", - expectedError: ErrFailedToAttributePanicToTest, - outputs: []string{ - "panic: runtime error: invalid memory address or nil pointer dereference\n", - "github.com/smartcontractkit/chainlink/v2/core/services/workflows.newTestEngine.func4(0x0)", - }, - }, - { - name: "Panic with multiple Test names in stack", - expectedTestName: "TestInner", - expectedTimeout: false, - outputs: []string{ - "panic: Something went wrong in helper", - "main.helperFunction()", - "main.TestInner(0xc00...)", - "main.TestOuter(0xc00...)", - }, - }, - { - name: "Timeout with multiple matching durations", - expectedTestName: "TestA", - expectedTimeout: true, - outputs: []string{ - "panic: test timed out after 5m0s", - "running tests:", - "\tTestA (5m0s)", - "\tTestB (4m59s)", - "\tTestC (5m1s)", - "\tTestD (5m0s)", - }, - }, - { - name: "fail to parse test duration in timeout list", - expectedTimeout: true, - expectedError: ErrDetectedTimeoutFailedParse, - outputs: []string{ - "panic: test timed out after 10m0s\n", - "\trunning tests:\n", - "\t\tTestAddAndPromoteCandidatesForNewChain (malformedDurationStr)\n", - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - testName, timeout, err := AttributePanicToTest(tc.outputs) - - assert.Equal(t, tc.expectedTimeout, timeout, "Timeout flag mismatch") - if tc.expectedError != nil { - require.Error(t, err, "Expected an error but got none") - assert.ErrorIs(t, err, tc.expectedError, "Error mismatch") - assert.Empty(t, testName, "Test name should be empty on error") - } else { - require.NoError(t, err, "Expected no error but got one") - assert.Equal(t, tc.expectedTestName, testName, "Test name mismatch") - } - }) - } -} - -func TestAttributeRaceToTest(t *testing.T) { - t.Parallel() - - testCases := []struct { - name string - expectedTestName string - expectedError error - outputs []string - }{ - { - name: "properly attributed race", - expectedTestName: "TestRace", - outputs: []string{ - "WARNING: DATA RACE", - " github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/example_test_package.TestRace.func1()", - }, - }, - { - name: "empty output", - expectedError: ErrFailedToAttributeRaceToTest, - outputs: []string{}, - }, - { - name: "no test name in race output", - expectedError: ErrFailedToAttributeRaceToTest, - outputs: []string{ - "WARNING: DATA RACE", - " main.main.func1()", - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - testName, err := AttributeRaceToTest(tc.outputs) - - if tc.expectedError != nil { - require.Error(t, err, "Expected an error but got none") - assert.ErrorIs(t, err, tc.expectedError, "Error mismatch") - assert.Empty(t, testName, "Test name should be empty on error") - } else { - require.NoError(t, err, "Expected no error but got one") - assert.Equal(t, tc.expectedTestName, testName, "Test name mismatch") - } - }) - } -} diff --git a/tools/flakeguard/runner/parser/parser.go b/tools/flakeguard/runner/parser/parser.go deleted file mode 100644 index 2f4533272..000000000 --- a/tools/flakeguard/runner/parser/parser.go +++ /dev/null @@ -1,622 +0,0 @@ -package parser - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - "time" - - "github.com/rs/zerolog/log" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/go-test-transform/pkg/transformer" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" -) - -// Constants related to parsing and transformation outputs -const ( - // RawOutputTransformedDir defines the directory where transformed output files are stored. - RawOutputTransformedDir = "./flakeguard_raw_output_transformed" -) - -// Parser-specific errors -var ( - // ErrBuild indicates a failure during the test build phase. (Exported) - ErrBuild = errors.New("failed to build test code") - // errFailedToShowBuild indicates an error occurred while trying to read build failure details. (Internal) - errFailedToShowBuild = errors.New("flakeguard failed to show build errors") -) - -// Parser-specific regexes -var ( - startPanicRe = regexp.MustCompile(`^panic:`) - startRaceRe = regexp.MustCompile(`^WARNING: DATA RACE`) -) - -type entry struct { - Action string `json:"Action"` - Test string `json:"Test"` - Package string `json:"Package"` - Output string `json:"Output"` - Elapsed float64 `json:"Elapsed"` // Decimal value in seconds -} - -func (e entry) String() string { - return fmt.Sprintf("Action: %s, Test: %s, Package: %s, Output: %s, Elapsed: %f", e.Action, e.Test, e.Package, e.Output, e.Elapsed) -} - -type Parser interface { - // ParseFiles takes a list of raw output file paths, processes them (including potential transformation), - // and returns the aggregated test results and the list of file paths that were actually parsed. - ParseFiles(rawFilePaths []string, runPrefix string, expectedRuns int, cfg Config) ([]reports.TestResult, []string, error) -} - -type Config struct { - IgnoreParentFailuresOnSubtests bool - OmitOutputsOnSuccess bool -} - -type defaultParser struct { - transformedOutputFiles []string -} - -func NewParser() Parser { - return &defaultParser{ - transformedOutputFiles: make([]string, 0), - } -} - -// ParseFiles is the main entry point for the parser. -func (p *defaultParser) ParseFiles(rawFilePaths []string, runPrefix string, expectedRuns int, cfg Config) ([]reports.TestResult, []string, error) { - var parseFilePaths = rawFilePaths - - if cfg.IgnoreParentFailuresOnSubtests { - err := p.transformTestOutputFiles(rawFilePaths) - if err != nil { - return nil, nil, fmt.Errorf("failed during output transformation: %w", err) - } - parseFilePaths = p.transformedOutputFiles - } - - results, err := p.parseTestResults(parseFilePaths, runPrefix, expectedRuns, cfg) - if err != nil { - return nil, parseFilePaths, err // Return paths even on error? - } - - return results, parseFilePaths, nil -} - -// rawEventData stores the original event along with its run ID. -type rawEventData struct { - RunID string - Event entry -} - -// testProcessingState holds temporary state while processing events for a single test. -type testProcessingState struct { - result *reports.TestResult // Pointer to the result being built - processedRunIDs map[string]bool // runID -> true if terminal action processed - runOutcome map[string]string // runID -> "pass", "fail", "skip" - panicRaceOutputByRunID map[string][]string // runID -> []string of panic/race output - temporaryOutputsByRunID map[string][]string // runID -> []string of normal output - panicDetectionMode bool - raceDetectionMode bool - detectedEntries []rawEventData // Raw entries collected during panic/race - key string // Test key (pkg/TestName) - filePath string // File path currently being processed (for logging) -} - -// parseTestResults orchestrates the multi-pass parsing approach. -func (p *defaultParser) parseTestResults(parseFilePaths []string, runPrefix string, totalExpectedRunsPerTest int, cfg Config) ([]reports.TestResult, error) { - eventsByTest, pkgOutputs, subTests, panickedPkgs, racedPkgs, err := p.collectAndGroupEvents(parseFilePaths, runPrefix) - if err != nil { - if errors.Is(err, ErrBuild) { - return nil, err - } - return nil, fmt.Errorf("error during event collection: %w", err) - } - - processedTestDetails, err := p.processEventsPerTest(eventsByTest, cfg) - if err != nil { - return nil, fmt.Errorf("error during event processing: %w", err) - } - - finalResults := p.aggregateAndFinalizeResults(processedTestDetails, subTests, panickedPkgs, racedPkgs, pkgOutputs, totalExpectedRunsPerTest, cfg) - - return finalResults, nil -} - -func (p *defaultParser) collectAndGroupEvents(parseFilePaths []string, runPrefix string) ( - eventsByTest map[string][]rawEventData, - packageLevelOutputs map[string][]string, - testsWithSubTests map[string][]string, - panickedPackages map[string]struct{}, - racePackages map[string]struct{}, - err error, -) { - eventsByTest = make(map[string][]rawEventData) - packageLevelOutputs = make(map[string][]string) - testsWithSubTests = make(map[string][]string) - panickedPackages = make(map[string]struct{}) - racePackages = make(map[string]struct{}) - - runNumber := 0 - for _, filePath := range parseFilePaths { - runNumber++ - runID := fmt.Sprintf("%s%d", runPrefix, runNumber) - file, fileErr := os.Open(filePath) - if fileErr != nil { - err = fmt.Errorf("failed to open test output file '%s': %w", filePath, fileErr) - return - } - - scanner := bufio.NewScanner(file) - parsingErrorOccurred := false - for scanner.Scan() { - lineBytes := scanner.Bytes() - var entryLine entry - if jsonErr := json.Unmarshal(lineBytes, &entryLine); jsonErr != nil { - if !parsingErrorOccurred { - log.Warn().Str("file", filePath).Err(jsonErr).Str("line_content", scanner.Text()).Msg("Failed to parse JSON line, skipping") - parsingErrorOccurred = true - } - continue - } - if entryLine.Action == "build-fail" { - _, seekErr := file.Seek(0, io.SeekStart) - if seekErr != nil { - log.Error().Str("file", filePath).Err(seekErr).Msg("Failed to seek to read build errors") - } - buildErrs, readErr := io.ReadAll(file) - if readErr != nil { - log.Error().Str("file", filePath).Err(readErr).Msg("Failed to read build errors") - } - fmt.Fprintf(os.Stderr, "--- Build Error in %s ---\n%s\n-------------------------\n", filePath, string(buildErrs)) - file.Close() - err = ErrBuild - return - } - if entryLine.Package != "" { - if startPanicRe.MatchString(entryLine.Output) { - panickedPackages[entryLine.Package] = struct{}{} - } - if startRaceRe.MatchString(entryLine.Output) { - racePackages[entryLine.Package] = struct{}{} - } - if entryLine.Test != "" { - key := fmt.Sprintf("%s/%s", entryLine.Package, entryLine.Test) - ev := rawEventData{RunID: runID, Event: entryLine} - eventsByTest[key] = append(eventsByTest[key], ev) - parentTestName, subTestName := parseSubTest(entryLine.Test) - if subTestName != "" { - parentTestKey := fmt.Sprintf("%s/%s", entryLine.Package, parentTestName) - if _, ok := testsWithSubTests[parentTestKey]; !ok { - testsWithSubTests[parentTestKey] = []string{} - } - found := false - for _, st := range testsWithSubTests[parentTestKey] { - if st == subTestName { - found = true - break - } - } - if !found { - testsWithSubTests[parentTestKey] = append(testsWithSubTests[parentTestKey], subTestName) - } - } - } else if entryLine.Output != "" { - if _, exists := packageLevelOutputs[entryLine.Package]; !exists { - packageLevelOutputs[entryLine.Package] = []string{} - } - packageLevelOutputs[entryLine.Package] = append(packageLevelOutputs[entryLine.Package], entryLine.Output) - } - } - } - if scanErr := scanner.Err(); scanErr != nil { - file.Close() - err = fmt.Errorf("scanner error reading file '%s': %w", filePath, scanErr) - return - } - file.Close() - } - return -} - -func (p *defaultParser) processEventsPerTest(eventsByTest map[string][]rawEventData, cfg Config) (map[string]*reports.TestResult, error) { - processedTestDetails := make(map[string]*reports.TestResult) - for key, rawEvents := range eventsByTest { - if len(rawEvents) == 0 { - continue - } - firstEvent := rawEvents[0].Event - result := &reports.TestResult{ - TestName: firstEvent.Test, - TestPackage: firstEvent.Package, - PassedOutputs: make(map[string][]string), - FailedOutputs: make(map[string][]string), - PackageOutputs: make([]string, 0), - Durations: make([]time.Duration, 0), - } - state := &testProcessingState{ - result: result, - key: key, - processedRunIDs: make(map[string]bool), - runOutcome: make(map[string]string), - panicRaceOutputByRunID: make(map[string][]string), - temporaryOutputsByRunID: make(map[string][]string), - } - - for _, rawEv := range rawEvents { - p.processEvent(state, rawEv) - } - - // If after processing all events, and these are still true - // it means there were no terminal actions (pass/fail/skip) after a panic or race. - if state.panicDetectionMode || state.raceDetectionMode { - firstDetected := state.detectedEntries[0] - terminalEvent := entry{ - Action: "fail", - Test: firstDetected.Event.Test, - Package: firstDetected.Event.Package, - Output: "", - Elapsed: 0.0, // No elapsed time - } - p.handlePanicRaceTermination(state, terminalEvent, firstDetected.RunID) - } - - p.finalizeOutputs(state, cfg) - result.Runs = len(state.processedRunIDs) - processedTestDetails[key] = result - } - return processedTestDetails, nil -} - -// processEvent is the main dispatcher for processing a single event for a test. -func (p *defaultParser) processEvent(state *testProcessingState, rawEv rawEventData) { - runID := rawEv.RunID - event := rawEv.Event - - // 1. Handle Output / Panic/Race Start Detection - if event.Output != "" { - // already detected panic or race, collect non-empty outputs - if state.panicDetectionMode || state.raceDetectionMode { - state.detectedEntries = append(state.detectedEntries, rawEv) - return - } - - if panicStarted := startPanicRe.MatchString(event.Output); panicStarted { - state.panicDetectionMode = true - state.detectedEntries = append(state.detectedEntries, rawEv) - return - } - - if raceStarted := startRaceRe.MatchString(event.Output); raceStarted { - state.raceDetectionMode = true - state.detectedEntries = append(state.detectedEntries, rawEv) - return - } - - if state.temporaryOutputsByRunID[runID] == nil { - state.temporaryOutputsByRunID[runID] = []string{} - } - state.temporaryOutputsByRunID[runID] = append(state.temporaryOutputsByRunID[runID], event.Output) - } - - // 2. Handle Panic/Race Termination - p.handlePanicRaceTermination(state, event, runID) - - // 3. Handle Terminal Actions (only if not already processed by panic/race) - terminalAction := event.Action == "pass" || event.Action == "fail" || event.Action == "skip" - if terminalAction && !state.processedRunIDs[runID] { - p.handleTerminalAction(state, event, runID) - } -} - -// handlePanicRaceTermination processes the end of a panic/race block. -func (p *defaultParser) handlePanicRaceTermination(state *testProcessingState, event entry, runID string) { - terminalAction := event.Action == "pass" || event.Action == "fail" || event.Action == "skip" - if !(state.panicDetectionMode || state.raceDetectionMode) || !terminalAction { - return - } - - var outputs []string - for _, de := range state.detectedEntries { - outputs = append(outputs, de.Event.Output) - } - outputStr := strings.Join(outputs, "\n") - currentPackage := event.Package - if currentPackage == "" && len(state.detectedEntries) > 0 { - currentPackage = state.detectedEntries[0].Event.Package - } - - attributedTestName := event.Test - var isTimeout bool - var attrErr error - - if currentPackage == "" { - log.Error().Str("file", state.filePath).Msg("Cannot attribute panic/race: Package context is missing.") - } else { - if state.panicDetectionMode { - attributedTestName, isTimeout, attrErr = AttributePanicToTest(outputs) - if attrErr != nil { - log.Error().Str("test", state.key).Err(attrErr).Str("output", outputStr).Msg("Panic attribution failed") - } - state.result.Panic = true - state.result.Timeout = isTimeout - if state.panicRaceOutputByRunID[runID] == nil { - state.panicRaceOutputByRunID[runID] = []string{} - } - state.panicRaceOutputByRunID[runID] = append(state.panicRaceOutputByRunID[runID], "--- PANIC DETECTED ---") - state.panicRaceOutputByRunID[runID] = append(state.panicRaceOutputByRunID[runID], outputs...) - state.panicRaceOutputByRunID[runID] = append(state.panicRaceOutputByRunID[runID], "--- END PANIC ---") - } else { // raceDetectionMode - attributedTestName, attrErr = AttributeRaceToTest(outputs) - if attrErr != nil { - log.Warn().Str("test", state.key).Err(attrErr).Str("output", outputStr).Msg("Race attribution failed") - } - state.result.Race = true - if state.panicRaceOutputByRunID[runID] == nil { - state.panicRaceOutputByRunID[runID] = []string{} - } - state.panicRaceOutputByRunID[runID] = append(state.panicRaceOutputByRunID[runID], "--- RACE DETECTED ---") - state.panicRaceOutputByRunID[runID] = append(state.panicRaceOutputByRunID[runID], outputs...) - state.panicRaceOutputByRunID[runID] = append(state.panicRaceOutputByRunID[runID], "--- END RACE ---") - } - if attributedTestName != state.result.TestName { - log.Warn().Str("event_test", state.result.TestName).Str("attributed_test", attributedTestName).Msg("Panic/Race attribution mismatch") - } - - // Mark run as processed (failed) if not already done - if !state.processedRunIDs[runID] { - state.result.Failures++ - state.processedRunIDs[runID] = true - state.runOutcome[runID] = "fail" - } - } - - // Reset state - state.detectedEntries = []rawEventData{} - state.panicDetectionMode = false - state.raceDetectionMode = false -} - -// handleTerminalAction processes pass/fail/skip actions. -func (p *defaultParser) handleTerminalAction(state *testProcessingState, event entry, runID string) { - switch event.Action { - case "pass": - state.result.Successes++ - state.runOutcome[runID] = "pass" - case "fail": - state.result.Failures++ - state.runOutcome[runID] = "fail" - case "skip": - state.result.Skips++ - state.result.Skipped = true - state.runOutcome[runID] = "skip" - delete(state.temporaryOutputsByRunID, runID) - } - state.processedRunIDs[runID] = true - - if event.Action == "pass" || event.Action == "fail" { - duration, parseErr := time.ParseDuration(strconv.FormatFloat(event.Elapsed, 'f', -1, 64) + "s") - if parseErr == nil { - state.result.Durations = append(state.result.Durations, duration) - } else { - log.Warn().Str("test", state.key).Float64("elapsed", event.Elapsed).Err(parseErr).Msg("Failed to parse duration") - } - } -} - -// finalizeOutputs moves collected temporary outputs to the correct final map based on run outcome. -func (p *defaultParser) finalizeOutputs(state *testProcessingState, cfg Config) { - for runID, outcome := range state.runOutcome { - normalOutputs := state.temporaryOutputsByRunID[runID] - panicOrRaceOutputs := state.panicRaceOutputByRunID[runID] - - if outcome == "pass" { - if !cfg.OmitOutputsOnSuccess { - if len(normalOutputs) > 0 { - if state.result.PassedOutputs[runID] == nil { - state.result.PassedOutputs[runID] = []string{} - } - state.result.PassedOutputs[runID] = append(state.result.PassedOutputs[runID], normalOutputs...) - } - } - } else if outcome == "fail" { - if len(panicOrRaceOutputs) > 0 || len(normalOutputs) > 0 { - if state.result.FailedOutputs[runID] == nil { - state.result.FailedOutputs[runID] = []string{} - } - } - if len(panicOrRaceOutputs) > 0 { - state.result.FailedOutputs[runID] = append(state.result.FailedOutputs[runID], panicOrRaceOutputs...) - } - if len(normalOutputs) > 0 { - state.result.FailedOutputs[runID] = append(state.result.FailedOutputs[runID], normalOutputs...) - } - if len(state.result.FailedOutputs[runID]) == 0 { - state.result.FailedOutputs[runID] = []string{"--- TEST FAILED (no specific output captured) ---"} - } - } - } -} - -// parseSubTest checks if a test name is a subtest and returns the parent and sub names. -func parseSubTest(testName string) (parentTestName, subTestName string) { - parts := strings.SplitN(testName, "/", 2) - if len(parts) == 1 { - return parts[0], "" - } - return parts[0], parts[1] -} - -// transformTestOutputFiles transforms the test output JSON files to ignore parent failures when only subtests fail. -func (p *defaultParser) transformTestOutputFiles(filePaths []string) error { - p.transformedOutputFiles = make([]string, 0, len(filePaths)) - err := os.MkdirAll(RawOutputTransformedDir, 0o755) - if err != nil { - return fmt.Errorf("failed to create transformed output directory '%s': %w", RawOutputTransformedDir, err) - } - log.Info().Int("count", len(filePaths)).Msg("Starting transformation of output files") - for i, origPath := range filePaths { - inFile, err := os.Open(origPath) - if err != nil { - return fmt.Errorf("failed to open original file %s for transformation: %w", origPath, err) - } - - baseName := filepath.Base(origPath) - outBaseName := fmt.Sprintf("transformed-%d-%s", i, strings.TrimSuffix(baseName, filepath.Ext(baseName))) - outPath := filepath.Join(RawOutputTransformedDir, outBaseName+".json") - - outFile, err := os.Create(outPath) - if err != nil { - inFile.Close() - return fmt.Errorf("failed to create transformed file '%s': %w", outPath, err) - } - - transformErr := transformer.TransformJSON(inFile, outFile, transformer.NewOptions(true)) - - closeErrIn := inFile.Close() - closeErrOut := outFile.Close() - - if transformErr != nil { - if removeErr := os.Remove(outPath); removeErr != nil { - log.Warn().Str("file", outPath).Err(removeErr).Msg("Failed to remove incomplete transformed file after error") - } - return fmt.Errorf("failed to transform output file %s to %s: %w", origPath, outPath, transformErr) - } - if closeErrIn != nil { - log.Warn().Str("file", origPath).Err(closeErrIn).Msg("Error closing input file after transformation") - } - if closeErrOut != nil { - log.Warn().Str("file", outPath).Err(closeErrOut).Msg("Error closing output file after transformation") - } - - p.transformedOutputFiles = append(p.transformedOutputFiles, outPath) - } - log.Info().Int("count", len(p.transformedOutputFiles)).Msg("Finished transforming output files") - return nil -} - -func (p *defaultParser) aggregateAndFinalizeResults( - processedTestDetails map[string]*reports.TestResult, - testsWithSubTests map[string][]string, - panickedPackages map[string]struct{}, - racePackages map[string]struct{}, - packageLevelOutputs map[string][]string, - totalExpectedRunsPerTest int, - cfg Config, -) []reports.TestResult { - finalResults := make([]reports.TestResult, 0, len(processedTestDetails)) - - // Panic Inheritance - for parentTestKey, subTests := range testsWithSubTests { - if parentTestResult, exists := processedTestDetails[parentTestKey]; exists { - if parentTestResult.Panic { - for _, subTestName := range subTests { - subTestKey := fmt.Sprintf("%s/%s", parentTestKey, subTestName) - if subTestResult, subExists := processedTestDetails[subTestKey]; subExists { - if !subTestResult.Skipped { - subTestResult.Panic = true - if subTestResult.Failures == 0 && subTestResult.Successes > 0 { - log.Warn().Str("subtest", subTestKey).Msg("Marking subtest as failed due to parent panic.") - subTestResult.Failures += subTestResult.Successes - subTestResult.Successes = 0 - for runID, outputs := range subTestResult.PassedOutputs { - if subTestResult.FailedOutputs == nil { - subTestResult.FailedOutputs = make(map[string][]string) - } - subTestResult.FailedOutputs[runID] = append(subTestResult.FailedOutputs[runID], outputs...) - } - subTestResult.PassedOutputs = make(map[string][]string) - } - } - } - } - } - } - } - - // Final Calculation, Correction, Filtering - for key, result := range processedTestDetails { - if !result.Skipped && result.Runs > totalExpectedRunsPerTest { - log.Warn().Str("test", key).Int("actualRuns", result.Runs).Int("expectedRuns", totalExpectedRunsPerTest).Msg("Correcting run count exceeding expected total runs") - targetRuns := totalExpectedRunsPerTest - if result.Panic || result.Race { - newFailures := result.Failures - if newFailures == 0 { - newFailures = 1 - } - if newFailures > targetRuns { - newFailures = targetRuns - } - newSuccesses := targetRuns - newFailures - if newSuccesses < 0 { - newSuccesses = 0 - } - result.Successes = newSuccesses - result.Failures = newFailures - } else { - if result.Runs > 0 { - newSuccesses := int(float64(result.Successes*targetRuns) / float64(result.Runs)) - newFailures := targetRuns - newSuccesses - if newFailures < 0 { - newFailures = 0 - newSuccesses = targetRuns - } - result.Successes = newSuccesses - result.Failures = newFailures - } else { - result.Successes = 0 - result.Failures = targetRuns - } - } - result.Runs = targetRuns - } - - if !result.Skipped { - if result.Runs > 0 { - result.PassRatio = float64(result.Successes) / float64(result.Runs) - } else { - result.PassRatio = 0.0 - } - } else { - result.PassRatio = 1.0 - if result.Runs != 0 { - result.Runs = 0 - } - } - - // Apply package-level flags/outputs - if _, panicked := panickedPackages[result.TestPackage]; panicked && !result.Skipped { - result.PackagePanic = true - } - if outputs, exists := packageLevelOutputs[result.TestPackage]; exists { - result.PackageOutputs = outputs - } - - // Filter out results with no runs and not skipped - if result.Runs > 0 || result.Skipped { - if cfg.OmitOutputsOnSuccess { - result.PassedOutputs = make(map[string][]string) - } - finalResults = append(finalResults, *result) - } - } - - sort.Slice(finalResults, func(i, j int) bool { - if finalResults[i].TestPackage != finalResults[j].TestPackage { - return finalResults[i].TestPackage < finalResults[j].TestPackage - } - return finalResults[i].TestName < finalResults[j].TestName - }) - - return finalResults -} diff --git a/tools/flakeguard/runner/parser/parser_test.go b/tools/flakeguard/runner/parser/parser_test.go deleted file mode 100644 index 5360abaf2..000000000 --- a/tools/flakeguard/runner/parser/parser_test.go +++ /dev/null @@ -1,1159 +0,0 @@ -package parser - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" -) - -func jsonLine(action, pkg, test, output string, elapsed float64) string { - fixedTime, _ := time.Parse(time.RFC3339Nano, "2024-01-01T10:00:00.000Z") - entry := struct { - Time time.Time - Action string - Package string - Test string `json:",omitempty"` - Output string `json:",omitempty"` - Elapsed float64 `json:",omitempty"` - }{ - Time: fixedTime, - Action: action, - Package: pkg, - Test: test, - Output: output, - } - if action == "pass" || action == "fail" { - entry.Elapsed = elapsed - } - - jsonBytes, err := json.Marshal(entry) - if err != nil { - panic(fmt.Sprintf("test setup error: failed to marshal jsonLine: %v", err)) - } - return string(jsonBytes) -} - -func buildOutput(lines ...string) string { - return strings.Join(lines, "\n") + "\n" -} - -func TestParseTestResults_Basic(t *testing.T) { - t.Parallel() - - pkg1 := "github.com/test/package1" - pkg2 := "github.com/test/package2" - - testCases := []struct { - name string - inputFiles map[string]string - cfg Config - expectedResults map[string]reports.TestResult - expectedErrorIs error - expectedErrorMsg string - }{ - { - name: "Single Test Pass", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("run", pkg1, "TestPass", "", 0), - jsonLine("output", pkg1, "TestPass", "output line 1\n", 0), - jsonLine("pass", pkg1, "TestPass", "", 1.23), - ), - }, - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/%s", pkg1, "TestPass"): { - TestName: "TestPass", - TestPackage: pkg1, - Runs: 1, - Successes: 1, - PassRatio: 1.0, - }, - }, - }, - { - name: "Single Test Fail", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("run", pkg1, "TestFail", "", 0), - jsonLine("output", pkg1, "TestFail", "fail output\n", 0), - jsonLine("fail", pkg1, "TestFail", "", 2.34), - ), - }, - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/%s", pkg1, "TestFail"): { - TestName: "TestFail", - TestPackage: pkg1, - Runs: 1, - Failures: 1, - PassRatio: 0.0, - }, - }, - }, - { - name: "Single Test Skip", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("run", pkg1, "TestSkip", "", 0), - jsonLine("output", pkg1, "TestSkip", "skip reason\n", 0), - jsonLine("skip", pkg1, "TestSkip", "", 0), - ), - }, - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/%s", pkg1, "TestSkip"): { - TestName: "TestSkip", - TestPackage: pkg1, - Runs: 0, - Skips: 1, - Skipped: true, - PassRatio: 1.0, - }, - }, - }, - { - name: "Mixed Pass Fail Skip Multiple Runs", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("run", pkg1, "TestA", "", 0), - jsonLine("pass", pkg1, "TestA", "", 1.0), - jsonLine("run", pkg1, "TestB", "", 0), - jsonLine("fail", pkg1, "TestB", "", 1.0), - jsonLine("run", pkg2, "TestC", "", 0), - jsonLine("skip", pkg2, "TestC", "", 0), - ), - "run2.json": buildOutput( - jsonLine("run", pkg1, "TestA", "", 0), - jsonLine("fail", pkg1, "TestA", "", 1.1), // TestA fails on run 2 - jsonLine("run", pkg1, "TestB", "", 0), - jsonLine("pass", pkg1, "TestB", "", 1.1), // TestB passes on run 2 - jsonLine("run", pkg2, "TestC", "", 0), - jsonLine("skip", pkg2, "TestC", "", 0), - ), - }, - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/%s", pkg1, "TestA"): {TestName: "TestA", TestPackage: pkg1, Runs: 2, Successes: 1, Failures: 1, PassRatio: 0.5}, - fmt.Sprintf("%s/%s", pkg1, "TestB"): {TestName: "TestB", TestPackage: pkg1, Runs: 2, Successes: 1, Failures: 1, PassRatio: 0.5}, - fmt.Sprintf("%s/%s", pkg2, "TestC"): {TestName: "TestC", TestPackage: pkg2, Runs: 0, Skips: 2, Skipped: true, PassRatio: 1.0}, - }, - }, - { - name: "Build Failure", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("build-fail", "", "", "compile error message", 0), - ), - }, - cfg: Config{}, - expectedResults: nil, - expectedErrorIs: ErrBuild, - }, - } - - for _, tc := range testCases { - tc := tc // Capture range variable - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - parser := NewParser().(*defaultParser) - - tempDir := t.TempDir() - filePaths := make([]string, 0, len(tc.inputFiles)) - for name, content := range tc.inputFiles { - fpath := filepath.Join(tempDir, name) - err := os.WriteFile(fpath, []byte(content), 0644) - require.NoError(t, err, "Failed to write temp file %s", name) - filePaths = append(filePaths, fpath) - } - - actualResults, err := parser.parseTestResults(filePaths, "run", len(filePaths), tc.cfg) - - if tc.expectedErrorIs != nil { - require.Error(t, err, "Expected an error but got none") - assert.ErrorIs(t, err, tc.expectedErrorIs, "Error mismatch") - if tc.expectedErrorMsg != "" { - assert.ErrorContains(t, err, tc.expectedErrorMsg, "Error message mismatch") - } - assert.Nil(t, actualResults, "Results should be nil on error") - } else { - require.NoError(t, err, "Expected no error but got: %v", err) - require.NotNil(t, actualResults, "Results should not be nil on success") - require.Equal(t, len(tc.expectedResults), len(actualResults), "Unexpected number of results") - - actualResultsMap := make(map[string]reports.TestResult) - for _, res := range actualResults { - key := fmt.Sprintf("%s/%s", res.TestPackage, res.TestName) - actualResultsMap[key] = res - } - - for key, expected := range tc.expectedResults { - actual, ok := actualResultsMap[key] - require.True(t, ok, "Expected result for key '%s' not found", key) - - // Compare relevant fields - assertResultBasic(t, key, expected, actual) - if strings.HasSuffix(key, "TestPass") { - assert.NotEmpty(t, actual.Durations, "TestPass should have duration") - if !tc.cfg.OmitOutputsOnSuccess { - assert.Contains(t, actual.PassedOutputs["run1"], "output line 1\n", "TestPass missing expected output") - } - } else if strings.HasSuffix(key, "TestFail") { - assert.NotEmpty(t, actual.Durations, "TestFail should have duration") - assert.Contains(t, actual.FailedOutputs["run1"], "fail output\n", "TestFail missing expected output") - } else if strings.HasSuffix(key, "TestSkip") { - assert.Empty(t, actual.Durations, "TestSkip should have no duration") - assert.Empty(t, actual.PassedOutputs, "TestSkip should have no passed output") - assert.Empty(t, actual.FailedOutputs, "TestSkip should have no failed output") - } - if expected.TestName == "TestA" || expected.TestName == "TestB" { - assert.Len(t, actual.Durations, 2, "%s should have 2 durations", expected.TestName) - } - if expected.TestName == "TestC" { - assert.Empty(t, actual.Durations, "TestC should have 0 durations") - } - } - } - }) - } -} - -func TestParseTestResults_OutputHandling(t *testing.T) { - t.Parallel() - - pkg1 := "github.com/test/outputpkg" - - testCases := []struct { - name string - inputFile string - cfg Config - expectedPassOut map[string][]string - expectedFailOut map[string][]string - expectedPkgOut []string - }{ - { - name: "OmitOutputsOnSuccess=true", - inputFile: buildOutput( - jsonLine("run", pkg1, "TestPass", "", 0), - jsonLine("output", pkg1, "TestPass", "pass output 1", 0), - jsonLine("pass", pkg1, "TestPass", "", 1.0), - jsonLine("run", pkg1, "TestFail", "", 0), - jsonLine("output", pkg1, "TestFail", "fail output 1", 0), - jsonLine("fail", pkg1, "TestFail", "", 1.0), - jsonLine("output", pkg1, "", "package output 1", 0), - ), - cfg: Config{OmitOutputsOnSuccess: true}, - expectedPassOut: map[string][]string{}, - expectedFailOut: map[string][]string{ - "run1": {"fail output 1"}, - }, - expectedPkgOut: []string{"package output 1"}, - }, - { - name: "OmitOutputsOnSuccess=false", - inputFile: buildOutput( - jsonLine("run", pkg1, "TestPass", "", 0), - jsonLine("output", pkg1, "TestPass", "pass output 1", 0), - jsonLine("pass", pkg1, "TestPass", "", 1.0), - jsonLine("run", pkg1, "TestFail", "", 0), - jsonLine("output", pkg1, "TestFail", "fail output 1", 0), - jsonLine("fail", pkg1, "TestFail", "", 1.0), - jsonLine("output", pkg1, "", "package output 1", 0), - jsonLine("output", pkg1, "", "package output 2", 0), - ), - cfg: Config{OmitOutputsOnSuccess: false}, - expectedPassOut: map[string][]string{ - "run1": {"pass output 1"}, - }, - expectedFailOut: map[string][]string{ - "run1": {"fail output 1"}, - }, - expectedPkgOut: []string{"package output 1", "package output 2"}, - }, - { - name: "No test-specific output", - inputFile: buildOutput( - jsonLine("run", pkg1, "TestPass", "", 0), - jsonLine("pass", pkg1, "TestPass", "", 1.0), - jsonLine("run", pkg1, "TestFail", "", 0), - jsonLine("fail", pkg1, "TestFail", "", 1.0), - jsonLine("output", pkg1, "", "package output only", 0), - ), - cfg: Config{OmitOutputsOnSuccess: false}, - expectedPassOut: map[string][]string{}, - expectedFailOut: map[string][]string{ - "run1": {"--- TEST FAILED (no specific output captured) ---"}, - }, - expectedPkgOut: []string{"package output only"}, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(tc.inputFile), 0644) - require.NoError(t, err) - - actualResults, err := parser.parseTestResults([]string{fpath}, "run", 1, tc.cfg) - require.NoError(t, err) - require.NotEmpty(t, actualResults) - - passResult := findResult(t, actualResults, "TestPass") - failResult := findResult(t, actualResults, "TestFail") - - if passResult != nil { - assert.Equal(t, len(tc.expectedPassOut), len(passResult.PassedOutputs), "PassedOutputs length mismatch for TestPass") - if len(tc.expectedPassOut) > 0 { - assert.Equal(t, tc.expectedPassOut["run1"], passResult.PassedOutputs["run1"], "PassedOutputs content mismatch for TestPass") - } - assert.Empty(t, passResult.Outputs, "General Outputs map should be empty after processing TestPass") - assert.Equal(t, tc.expectedPkgOut, passResult.PackageOutputs, "PackageOutputs mismatch for TestPass") - } - - if failResult != nil { - assert.Equal(t, len(tc.expectedFailOut), len(failResult.FailedOutputs), "FailedOutputs length mismatch for TestFail") - if len(tc.expectedFailOut) > 0 { - assert.Equal(t, tc.expectedFailOut["run1"], failResult.FailedOutputs["run1"], "FailedOutputs content mismatch for TestFail") - } - assert.Empty(t, failResult.Outputs, "General Outputs map should be empty after processing TestFail") - assert.Equal(t, tc.expectedPkgOut, failResult.PackageOutputs, "PackageOutputs mismatch for TestFail") - } - }) - } -} - -func TestParseTestResults_Subtests(t *testing.T) { - t.Parallel() - - pkg := "github.com/test/subtestpkg" - - testCases := []struct { - name string - inputFile string - cfg Config - expectedResults map[string]reports.TestResult - }{ - { - name: "Parent and Subtest Pass", - inputFile: buildOutput( - jsonLine("run", pkg, "TestParent", "", 0), - jsonLine("run", pkg, "TestParent/SubPass", "", 0), - jsonLine("output", pkg, "TestParent/SubPass", "sub output", 0), - jsonLine("pass", pkg, "TestParent/SubPass", "", 0.5), - jsonLine("output", pkg, "TestParent", "parent output after sub", 0), - jsonLine("pass", pkg, "TestParent", "", 1.0), - ), - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParent", pkg): {TestName: "TestParent", TestPackage: pkg, Runs: 1, Successes: 1, PassRatio: 1.0}, - fmt.Sprintf("%s/TestParent/SubPass", pkg): {TestName: "TestParent/SubPass", TestPackage: pkg, Runs: 1, Successes: 1, PassRatio: 1.0}, - }, - }, - { - name: "Parent Pass, Subtest Fail", - inputFile: buildOutput( - jsonLine("run", pkg, "TestParent", "", 0), - jsonLine("run", pkg, "TestParent/SubFail", "", 0), - jsonLine("output", pkg, "TestParent/SubFail", "sub fail output", 0), - jsonLine("fail", pkg, "TestParent/SubFail", "", 0.6), - jsonLine("output", pkg, "TestParent", "parent output after sub fail", 0), - jsonLine("pass", pkg, "TestParent", "", 1.2), - ), - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParent", pkg): {TestName: "TestParent", TestPackage: pkg, Runs: 1, Successes: 1, PassRatio: 1.0}, - fmt.Sprintf("%s/TestParent/SubFail", pkg): {TestName: "TestParent/SubFail", TestPackage: pkg, Runs: 1, Failures: 1, PassRatio: 0.0}, - }, - }, - { - name: "Parent Fail Before Subtest", - inputFile: buildOutput( - jsonLine("run", pkg, "TestParentFailEarly", "", 0), - jsonLine("output", pkg, "TestParentFailEarly", "parent fail output", 0), - jsonLine("fail", pkg, "TestParentFailEarly", "", 0.1), - ), - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParentFailEarly", pkg): {TestName: "TestParentFailEarly", TestPackage: pkg, Runs: 1, Failures: 1, PassRatio: 0.0}, - }, - }, - { - name: "Parent Fail After Subtest", - inputFile: buildOutput( - jsonLine("run", pkg, "TestParentFailLate", "", 0), - jsonLine("run", pkg, "TestParentFailLate/SubPass", "", 0), - jsonLine("pass", pkg, "TestParentFailLate/SubPass", "", 0.5), - jsonLine("output", pkg, "TestParentFailLate", "parent fail output later", 0), - jsonLine("fail", pkg, "TestParentFailLate", "", 1.5), - ), - cfg: Config{OmitOutputsOnSuccess: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParentFailLate", pkg): {TestName: "TestParentFailLate", TestPackage: pkg, Runs: 1, Failures: 1, PassRatio: 0.0}, - fmt.Sprintf("%s/TestParentFailLate/SubPass", pkg): {TestName: "TestParentFailLate/SubPass", TestPackage: pkg, Runs: 1, Successes: 1, PassRatio: 1.0}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(tc.inputFile), 0644) - require.NoError(t, err) - - actualResults, err := parser.parseTestResults([]string{fpath}, "run", 1, tc.cfg) - require.NoError(t, err) - require.Equal(t, len(tc.expectedResults), len(actualResults), "Unexpected number of results") - - actualResultsMap := resultsToMap(actualResults) - for key, expected := range tc.expectedResults { - actual, ok := actualResultsMap[key] - require.True(t, ok, "Expected result for key '%s' not found", key) - assertResultBasic(t, key, expected, actual) - if strings.Contains(key, "SubPass") { - assert.Len(t, actual.Durations, 1, "SubPass should have 1 duration") - if !tc.cfg.OmitOutputsOnSuccess { - if tc.name == "Parent and Subtest Pass" { - require.Contains(t, actual.PassedOutputs, "run1", "PassedOutputs map missing run1 key for %s in %s", key, tc.name) - assert.Contains(t, actual.PassedOutputs["run1"], "sub output", "SubPass missing expected output in %s", tc.name) - } else { - assert.Empty(t, actual.PassedOutputs["run1"], "PassedOutputs[run1] should be empty for %s in %s", key, tc.name) - } - } - } else if strings.Contains(key, "SubFail") { - assert.Len(t, actual.Durations, 1, "SubFail should have 1 duration") - require.Contains(t, actual.FailedOutputs, "run1", "FailedOutputs map missing run1 key for %s", key) - assert.Contains(t, actual.FailedOutputs["run1"], "sub fail output", "SubFail missing expected output") - } - } - }) - } -} - -func TestParseTestResults_Durations(t *testing.T) { - t.Parallel() - pkg := "github.com/test/durationpkg" - - inputFile := buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("pass", pkg, "TestA", "", 1.5), - jsonLine("run", pkg, "TestB", "", 0), - jsonLine("fail", pkg, "TestB", "", 2.5), - jsonLine("run", pkg, "TestC", "", 0), - jsonLine("pass", pkg, "TestC", "", 0), - jsonLine("run", pkg, "TestD", "", 0), - jsonLine("skip", pkg, "TestD", "", 0), - ) - - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(inputFile), 0644) - require.NoError(t, err) - - actualResults, err := parser.parseTestResults([]string{fpath}, "run", 1, Config{}) - require.NoError(t, err) - - resultsMap := resultsToMap(actualResults) - - resA, ok := resultsMap[fmt.Sprintf("%s/TestA", pkg)] - require.True(t, ok, "TestA not found") - require.Len(t, resA.Durations, 1, "TestA should have 1 duration") - assert.Equal(t, int64(1500), resA.Durations[0].Milliseconds(), "TestA duration mismatch") - - resB, ok := resultsMap[fmt.Sprintf("%s/TestB", pkg)] - require.True(t, ok, "TestB not found") - require.Len(t, resB.Durations, 1, "TestB should have 1 duration") - assert.Equal(t, int64(2500), resB.Durations[0].Milliseconds(), "TestB duration mismatch") - - resC, ok := resultsMap[fmt.Sprintf("%s/TestC", pkg)] - require.True(t, ok, "TestC not found") - require.Len(t, resC.Durations, 1, "TestC should have 1 duration") - assert.Equal(t, int64(0), resC.Durations[0].Milliseconds(), "TestC duration mismatch") - - resD, ok := resultsMap[fmt.Sprintf("%s/TestD", pkg)] - require.True(t, ok, "TestD not found") - assert.Empty(t, resD.Durations, "TestD should have 0 durations") -} - -func TestParseTestResults_PanicRace(t *testing.T) { - t.Parallel() - pkg := "github.com/test/panicracepkg" - - panicOutput := []string{ - "panic: This test intentionally panics", - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/example_test_package.TestRegularPanic(...)", - } - raceOutput := []string{ - "WARNING: DATA RACE", - " github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/example_test_package.TestDataRace(...)", - } - timeoutOutput := []string{ - "panic: test timed out after 1m0s", - "running tests:", - "\tTestTimeoutCulprit (1m0s)", - } - - testCases := []struct { - name string - inputFile string - cfg Config - expectedResults map[string]reports.TestResult - }{ - { - name: "Regular Panic", - inputFile: buildOutput( - jsonLine("run", pkg, "TestRegularPanic", "", 0), - jsonLine("output", pkg, "TestRegularPanic", panicOutput[0], 0), - jsonLine("output", pkg, "TestRegularPanic", panicOutput[1], 0), - jsonLine("fail", pkg, "TestRegularPanic", "", 0.5), - ), - cfg: Config{}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestRegularPanic", pkg): { - TestName: "TestRegularPanic", TestPackage: pkg, Runs: 1, Failures: 1, Panic: true, - }, - }, - }, - { - name: "Data Race", - inputFile: buildOutput( - jsonLine("run", pkg, "TestDataRace", "", 0), - jsonLine("output", pkg, "TestDataRace", raceOutput[0], 0), - jsonLine("output", pkg, "TestDataRace", raceOutput[1], 0), - jsonLine("fail", pkg, "TestDataRace", "", 0.6), - ), - cfg: Config{}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestDataRace", pkg): { - TestName: "TestDataRace", TestPackage: pkg, Runs: 1, Failures: 1, Race: true, - }, - }, - }, - { - name: "Timeout Panic", - inputFile: buildOutput( - jsonLine("run", pkg, "TestTimeoutCulprit", "", 0), - jsonLine("output", pkg, "TestTimeoutCulprit", timeoutOutput[0], 0), - jsonLine("output", pkg, "TestTimeoutCulprit", timeoutOutput[1], 0), - jsonLine("output", pkg, "TestTimeoutCulprit", timeoutOutput[2], 0), - jsonLine("fail", pkg, "TestTimeoutCulprit", "", 60.1), - ), - cfg: Config{}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestTimeoutCulprit", pkg): { - TestName: "TestTimeoutCulprit", TestPackage: pkg, Runs: 1, Failures: 1, Panic: true, Timeout: true, - }, - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(tc.inputFile), 0644) - require.NoError(t, err) - - actualResults, err := parser.parseTestResults([]string{fpath}, "run", 1, tc.cfg) - require.NoError(t, err) - require.Equal(t, len(tc.expectedResults), len(actualResults), "Unexpected number of results") - - actualResultsMap := resultsToMap(actualResults) - for key, expected := range tc.expectedResults { - actual, ok := actualResultsMap[key] - require.True(t, ok, "Expected result for key '%s' not found", key) - assertResultBasic(t, key, expected, actual) - assert.Equal(t, expected.Panic, actual.Panic, "Panic flag mismatch for %s", key) - assert.Equal(t, expected.Race, actual.Race, "Race flag mismatch for %s", key) - assert.Equal(t, expected.Timeout, actual.Timeout, "Timeout flag mismatch for %s", key) - - // Check if panic/race output was added to FailedOutputs - if expected.Panic || expected.Race { - outputs, ok := actual.FailedOutputs["run1"] - require.True(t, ok, "FailedOutputs map missing run1 key for %s", key) - require.NotEmpty(t, outputs, "FailedOutputs should contain panic/race info for %s", key) - - if expected.Panic { - assert.Contains(t, outputs[0], "PANIC DETECTED", "Missing PANIC marker for %s", key) - if tc.name == "Regular Panic" { - assert.Contains(t, outputs, panicOutput[0]) - assert.Contains(t, outputs, panicOutput[1]) - } else if tc.name == "Timeout Panic" { - assert.Contains(t, outputs, timeoutOutput[0]) - assert.Contains(t, outputs, timeoutOutput[1]) - assert.Contains(t, outputs, timeoutOutput[2]) - } - } else if expected.Race { - assert.Contains(t, outputs[0], "RACE DETECTED", "Missing RACE marker for %s", key) - assert.Contains(t, outputs, raceOutput[0]) - assert.Contains(t, outputs, raceOutput[1]) - } - } - } - }) - } -} - -func TestParseTestResults_RunCountCorrection(t *testing.T) { - t.Parallel() - pkg := "github.com/test/runcountpkg" - - // Simulate a panic happening, which often causes a 'fail' event without a preceding 'pass' - // for the same test in the same run, leading to potential overcounting if not handled. - // This example simulates 2 expected runs, but the panic causes 3 fail events for TestA. - inputFileRun1 := buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("output", pkg, "TestA", "panic: Error in TestA", 0), - jsonLine("output", pkg, "TestA", "github.com/test/runcountpkg.TestA(...)", 0), - jsonLine("fail", pkg, "TestA", "", 0.1), // Fail from panic - jsonLine("run", pkg, "TestB", "", 0), - jsonLine("pass", pkg, "TestB", "", 0.2), - ) - inputFileRun2 := buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("pass", pkg, "TestA", "", 1.1), // Passes on run 2 - jsonLine("run", pkg, "TestB", "", 0), - jsonLine("pass", pkg, "TestB", "", 1.2), - ) - - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - filePaths := []string{ - filepath.Join(tempDir, "run1.json"), - filepath.Join(tempDir, "run2.json"), - } - err := os.WriteFile(filePaths[0], []byte(inputFileRun1), 0644) - require.NoError(t, err) - err = os.WriteFile(filePaths[1], []byte(inputFileRun2), 0644) - require.NoError(t, err) - - // Pass 2 as totalExpectedRunsPerTest - actualResults, err := parser.parseTestResults(filePaths, "run", 2, Config{}) - require.NoError(t, err) - - resultsMap := resultsToMap(actualResults) - - resA, ok := resultsMap[fmt.Sprintf("%s/TestA", pkg)] - require.True(t, ok, "TestA not found") - // Final runs = 2 (processed run1 fail, processed run2 pass) - assert.Equal(t, 2, resA.Runs, "TestA Runs should be 2") - assert.Equal(t, 1, resA.Successes, "TestA Successes should be 1") - assert.Equal(t, 1, resA.Failures, "TestA Failures should be 1") - assert.True(t, resA.Panic, "TestA should be marked panicked") // Panic flag from attribution - assert.InDelta(t, 0.5, resA.PassRatio, 0.001, "TestA PassRatio mismatch") - - resB, ok := resultsMap[fmt.Sprintf("%s/TestB", pkg)] - require.True(t, ok, "TestB not found") - // Final runs = 2 (processed run1 pass, processed run2 pass) - assert.Equal(t, 2, resB.Runs, "TestB Runs should be 2") - assert.Equal(t, 2, resB.Successes, "TestB Successes should be 2") - assert.Equal(t, 0, resB.Failures, "TestB Failures should be 0") - assert.False(t, resB.Panic, "TestB should not be panicked") - assert.Equal(t, 1.0, resB.PassRatio, "TestB PassRatio mismatch") -} - -func TestParseTestResults_RunCountCorrectionRefined(t *testing.T) { - t.Parallel() - pkg := "github.com/test/runcountpkg2" - - testCases := []struct { - name string - inputFiles map[string]string - expectedTotalRuns int - expectedResultTestA reports.TestResult - }{ - { - name: "Panic within expected runs", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("output", pkg, "TestA", "panic: Error", 0), // Panic - jsonLine("output", pkg, "TestA", "github.com/test/pkg.TestA(...)", 0), - jsonLine("fail", pkg, "TestA", "", 0.1), - ), - "run2.json": buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("pass", pkg, "TestA", "", 0.2), - ), - "run3.json": buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("pass", pkg, "TestA", "", 0.3), - ), - }, - expectedTotalRuns: 3, - expectedResultTestA: reports.TestResult{ // Runs=3, Success=2, Fail=1, Panic=true - TestName: "TestA", TestPackage: pkg, Runs: 3, Successes: 2, Failures: 1, Panic: true, PassRatio: 2.0 / 3.0, - }, - }, - { - name: "Panic exceeding expected runs (capped)", - inputFiles: map[string]string{ - "run1.json": buildOutput( // This run fails due to panic - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("output", pkg, "TestA", "panic: Error", 0), - jsonLine("output", pkg, "TestA", "github.com/test/pkg.TestA(...)", 0), - jsonLine("fail", pkg, "TestA", "", 0.1), - jsonLine("fail", pkg, "TestA", "", 0.11), - ), - "run2.json": buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("pass", pkg, "TestA", "", 0.2), - ), - }, - expectedTotalRuns: 2, // Only expected 2 runs total - expectedResultTestA: reports.TestResult{ // Expect correction: Runs=2, Success=1, Fail=1, Panic=true - TestName: "TestA", TestPackage: pkg, Runs: 2, Successes: 1, Failures: 1, Panic: true, PassRatio: 0.5, - }, - }, - { - name: "Normal overcount (no panic/race, capped)", - inputFiles: map[string]string{ - "run1.json": buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("pass", pkg, "TestA", "", 0.1), - jsonLine("pass", pkg, "TestA", "", 0.11), - ), - "run2.json": buildOutput( - jsonLine("run", pkg, "TestA", "", 0), - jsonLine("fail", pkg, "TestA", "", 0.2), - ), - }, - expectedTotalRuns: 2, - expectedResultTestA: reports.TestResult{ - TestName: "TestA", TestPackage: pkg, Runs: 2, Successes: 1, Failures: 1, Panic: false, PassRatio: 0.5, - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - filePaths := make([]string, 0, len(tc.inputFiles)) - for name, content := range tc.inputFiles { - fpath := filepath.Join(tempDir, name) - err := os.WriteFile(fpath, []byte(content), 0644) - require.NoError(t, err) - filePaths = append(filePaths, fpath) - } - - actualResults, err := parser.parseTestResults(filePaths, "run", tc.expectedTotalRuns, Config{}) - require.NoError(t, err) - - resultsMap := resultsToMap(actualResults) - actualA, ok := resultsMap[fmt.Sprintf("%s/TestA", pkg)] - require.True(t, ok, "TestA not found") - assertResultBasic(t, "TestA", tc.expectedResultTestA, actualA) - assert.Equal(t, tc.expectedResultTestA.Panic, actualA.Panic, "TestA Panic mismatch") - - }) - } -} - -func TestParseTestResults_PanicInheritance(t *testing.T) { - t.Parallel() - pkg := "github.com/test/panicinheritpkg" - - parentPanicInput := buildOutput( - jsonLine("run", pkg, "TestParentPanics", "", 0), - jsonLine("run", pkg, "TestParentPanics/SubPass", "", 0), - jsonLine("pass", pkg, "TestParentPanics/SubPass", "", 0.1), - jsonLine("run", pkg, "TestParentPanics/SubFail", "", 0), - jsonLine("fail", pkg, "TestParentPanics/SubFail", "", 0.2), - jsonLine("output", pkg, "TestParentPanics", "panic: Parent panics here!", 0), - jsonLine("output", pkg, "TestParentPanics", "github.com/test/panicinheritpkg.TestParentPanics(...)", 0), - jsonLine("fail", pkg, "TestParentPanics", "", 0.3), - ) - - testCases := []struct { - name string - cfg Config - expectedResults map[string]reports.TestResult - }{ - { - name: "Inheritance Enabled (Default)", - cfg: Config{IgnoreParentFailuresOnSubtests: false}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParentPanics", pkg): {TestName: "TestParentPanics", TestPackage: pkg, Runs: 1, Failures: 1, Panic: true}, - fmt.Sprintf("%s/TestParentPanics/SubPass", pkg): {TestName: "TestParentPanics/SubPass", TestPackage: pkg, Runs: 1, Successes: 0, Failures: 1, Panic: true}, - fmt.Sprintf("%s/TestParentPanics/SubFail", pkg): {TestName: "TestParentPanics/SubFail", TestPackage: pkg, Runs: 1, Failures: 1, Panic: true}, - }, - }, - { - name: "IgnoreParentFailures (No Transform Effect Here)", - cfg: Config{IgnoreParentFailuresOnSubtests: true}, - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParentPanics", pkg): {TestName: "TestParentPanics", TestPackage: pkg, Runs: 1, Failures: 1, Panic: true}, - fmt.Sprintf("%s/TestParentPanics/SubPass", pkg): {TestName: "TestParentPanics/SubPass", TestPackage: pkg, Runs: 1, Successes: 0, Failures: 1, Panic: true}, - fmt.Sprintf("%s/TestParentPanics/SubFail", pkg): {TestName: "TestParentPanics/SubFail", TestPackage: pkg, Runs: 1, Failures: 1, Panic: true}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(parentPanicInput), 0644) - require.NoError(t, err) - - actualResults, err := parser.parseTestResults([]string{fpath}, "run", 1, tc.cfg) - require.NoError(t, err) - require.Equal(t, len(tc.expectedResults), len(actualResults), "Unexpected number of results") - - actualResultsMap := resultsToMap(actualResults) - for key, expected := range tc.expectedResults { - actual, ok := actualResultsMap[key] - require.True(t, ok, "Expected result for key '%s' not found", key) - assertResultBasic(t, key, expected, actual) - assert.Equal(t, expected.Panic, actual.Panic, "Panic flag mismatch for %s", key) - } - }) - } -} - -func TestParseTestResults_JSONErrors(t *testing.T) { - t.Parallel() - pkg := "github.com/test/jsonerrpkg" - - inputFile := strings.Join([]string{ - jsonLine("run", pkg, "TestBeforeError", "", 0), // Valid line - jsonLine("pass", pkg, "TestBeforeError", "", 1.0), // Valid line - `{"Action":"run","Package":"github.com/test/jsonerrpkg","Test":"TestWithError"}`, // Missing fields - `this is not json`, // Invalid line - jsonLine("run", pkg, "TestAfterError", "", 0), // Valid line - jsonLine("pass", pkg, "TestAfterError", "", 1.0), // Valid line - }, "\n") + "\n" - - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(inputFile), 0644) - require.NoError(t, err) - - actualResults, err := parser.parseTestResults([]string{fpath}, "run", 1, Config{}) - require.NoError(t, err, "Parsing should continue despite invalid JSON lines") - - require.Len(t, actualResults, 2, "Expected results only from tests with terminal actions") - resultsMap := resultsToMap(actualResults) - - resBefore, okBefore := resultsMap[fmt.Sprintf("%s/TestBeforeError", pkg)] - assert.True(t, okBefore, "TestBeforeError should be parsed") - assert.Equal(t, 1, resBefore.Runs, "TestBeforeError Runs mismatch") - assert.Equal(t, 1, resBefore.Successes, "TestBeforeError Successes mismatch") - - resAfter, okAfter := resultsMap[fmt.Sprintf("%s/TestAfterError", pkg)] - assert.True(t, okAfter, "TestAfterError should be parsed") - assert.Equal(t, 1, resAfter.Runs, "TestAfterError Runs mismatch") - assert.Equal(t, 1, resAfter.Successes, "TestAfterError Successes mismatch") - - _, okMid := resultsMap[fmt.Sprintf("%s/TestWithError", pkg)] - assert.False(t, okMid, "TestWithError should not be in final results") -} - -func TestParseFiles_Transformation(t *testing.T) { - t.Parallel() - pkg := "github.com/test/transformpkg" - - inputFile := buildOutput( - jsonLine("run", pkg, "TestParentTransform", "", 0), - jsonLine("output", pkg, "TestParentTransform", "parent output", 0), - jsonLine("run", pkg, "TestParentTransform/SubFail", "", 0), - jsonLine("output", pkg, "TestParentTransform/SubFail", "sub fail output", 0), - jsonLine("fail", pkg, "TestParentTransform/SubFail", "", 0.1), - jsonLine("fail", pkg, "TestParentTransform", "", 0.2), - ) - - parser := NewParser() - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(inputFile), 0644) - require.NoError(t, err) - - cfg := Config{IgnoreParentFailuresOnSubtests: true, OmitOutputsOnSuccess: false} - actualResults, _, err := parser.ParseFiles([]string{fpath}, "run", 1, cfg) - require.NoError(t, err) - - require.Len(t, actualResults, 2, "Expected 2 results after transformation") - resultsMap := resultsToMap(actualResults) - - parentRes, okP := resultsMap[fmt.Sprintf("%s/TestParentTransform", pkg)] - require.True(t, okP, "Parent test not found") - assert.Equal(t, 1, parentRes.Runs, "Parent Runs mismatch") - assert.Equal(t, 1, parentRes.Successes, "Parent Successes mismatch (should pass)") - assert.Equal(t, 0, parentRes.Failures, "Parent Failures mismatch (should pass)") - assert.Equal(t, 1.0, parentRes.PassRatio, "Parent PassRatio mismatch") - assert.False(t, parentRes.Panic, "Parent Panic mismatch") - require.Contains(t, parentRes.PassedOutputs, "run1", "Parent PassedOutputs missing run1") - assert.Contains(t, parentRes.PassedOutputs["run1"], "parent output", "Parent output missing from PassedOutputs") - assert.NotContains(t, parentRes.PassedOutputs["run1"][0], "=== PASS", "Parent output should not be transformed unless original contained FAIL markers") - - subRes, okS := resultsMap[fmt.Sprintf("%s/TestParentTransform/SubFail", pkg)] - require.True(t, okS, "Subtest not found") - assert.Equal(t, 1, subRes.Runs, "Subtest Runs mismatch") - assert.Equal(t, 0, subRes.Successes, "Subtest Successes mismatch") - assert.Equal(t, 1, subRes.Failures, "Subtest Failures mismatch") - assert.Equal(t, 0.0, subRes.PassRatio, "Subtest PassRatio mismatch") -} - -func TestParseTestResults_EmptyOrIncomplete(t *testing.T) { - t.Parallel() - pkg := "github.com/test/empty" - - testCases := []struct { - name string - inputFiles map[string]string - numExpResults int - expError bool - }{ - { - name: "Empty File", - inputFiles: map[string]string{"run1.json": ""}, - numExpResults: 0, - expError: false, - }, - { - name: "Only Run Action", - inputFiles: map[string]string{"run1.json": buildOutput(jsonLine("run", pkg, "TestOnlyRun", "", 0))}, - numExpResults: 0, - expError: false, - }, - { - name: "Run and Output Only", - inputFiles: map[string]string{"run1.json": buildOutput(jsonLine("run", pkg, "TestRunOutput", "", 0), jsonLine("output", pkg, "TestRunOutput", "out", 0))}, - numExpResults: 0, - expError: false, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser().(*defaultParser) - tempDir := t.TempDir() - filePaths := make([]string, 0, len(tc.inputFiles)) - for name, content := range tc.inputFiles { - fpath := filepath.Join(tempDir, name) - err := os.WriteFile(fpath, []byte(content), 0644) - require.NoError(t, err) - filePaths = append(filePaths, fpath) - } - - actualResults, err := parser.parseTestResults(filePaths, "run", 1, Config{}) - - if tc.expError { - assert.Error(t, err) - } else { - assert.NoError(t, err) - assert.Len(t, actualResults, tc.numExpResults) - } - }) - } -} - -// findResult finds a specific test result by name from a slice. -func findResult(t *testing.T, results []reports.TestResult, testName string) *reports.TestResult { - t.Helper() - for i := range results { - if results[i].TestName == testName { - return &results[i] - } - } - return nil -} - -// resultsToMap converts a slice of results to a map keyed by "package/testName". -func resultsToMap(results []reports.TestResult) map[string]reports.TestResult { - m := make(map[string]reports.TestResult, len(results)) - for _, res := range results { - key := fmt.Sprintf("%s/%s", res.TestPackage, res.TestName) - m[key] = res - } - return m -} - -// assertResultBasic performs basic assertions on core result fields. -func assertResultBasic(t *testing.T, key string, expected, actual reports.TestResult) { - t.Helper() - assert.Equal(t, expected.TestName, actual.TestName, "TestName mismatch for %s", key) - assert.Equal(t, expected.TestPackage, actual.TestPackage, "TestPackage mismatch for %s", key) - assert.Equal(t, expected.Runs, actual.Runs, "Runs mismatch for %s", key) - assert.Equal(t, expected.Successes, actual.Successes, "Successes mismatch for %s", key) - assert.Equal(t, expected.Failures, actual.Failures, "Failures mismatch for %s", key) - assert.Equal(t, expected.Skips, actual.Skips, "Skips mismatch for %s", key) - assert.Equal(t, expected.Skipped, actual.Skipped, "Skipped flag mismatch for %s", key) - assert.InDelta(t, expected.PassRatio, actual.PassRatio, 0.001, "PassRatio mismatch for %s", key) -} - -// TestParseFiles_WithTransformationScenarios verifies the interaction between the parser and the transformer. -func TestParseFiles_IgnoreParentFailures(t *testing.T) { - t.Parallel() - pkg := "github.com/test/transformpkg" - - testCases := []struct { - name string - inputFile string - expectedResults map[string]reports.TestResult - }{ - { - name: "Parent only fails due to subtest", - inputFile: buildOutput( - jsonLine("run", pkg, "TestParentTransform", "", 0), - jsonLine("output", pkg, "TestParentTransform", "parent setup output", 0), // Regular output - jsonLine("run", pkg, "TestParentTransform/SubFail", "", 0), - jsonLine("output", pkg, "TestParentTransform/SubFail", "sub fail output", 0), - jsonLine("output", pkg, "TestParentTransform/SubFail", "--- FAIL: TestParentTransform/SubFail (0.1s)", 0), // Subtest fail marker - jsonLine("fail", pkg, "TestParentTransform/SubFail", "", 0.1), - jsonLine("output", pkg, "TestParentTransform", "--- FAIL: TestParentTransform (0.2s)", 0), // Parent fail marker (due to subtest) - jsonLine("fail", pkg, "TestParentTransform", "", 0.2), - ), - expectedResults: map[string]reports.TestResult{ - fmt.Sprintf("%s/TestParentTransform", pkg): {TestName: "TestParentTransform", TestPackage: pkg, Runs: 1, Successes: 1, Failures: 0, PassRatio: 1.0}, - fmt.Sprintf("%s/TestParentTransform/SubFail", pkg): {TestName: "TestParentTransform/SubFail", TestPackage: pkg, Runs: 1, Successes: 0, Failures: 1, PassRatio: 0.0}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - parser := NewParser() - tempDir := t.TempDir() - fpath := filepath.Join(tempDir, "run1.json") - err := os.WriteFile(fpath, []byte(tc.inputFile), 0644) - require.NoError(t, err) - - cfg := Config{IgnoreParentFailuresOnSubtests: true, OmitOutputsOnSuccess: false} - actualResults, _, err := parser.ParseFiles([]string{fpath}, "run", 1, cfg) - require.NoError(t, err) - - require.Equal(t, len(tc.expectedResults), len(actualResults), "Unexpected number of results") - actualResultsMap := resultsToMap(actualResults) - for key, expected := range tc.expectedResults { - actual, ok := actualResultsMap[key] - require.True(t, ok, "Expected result for key '%s' not found", key) - assertResultBasic(t, key, expected, actual) - if expected.TestName == "TestParentTransform" { - require.Contains(t, actual.PassedOutputs, "run1", "PassedOutputs missing run1 for transformed parent") - assert.Contains(t, actual.PassedOutputs["run1"], "parent setup output", "Parent original output missing") - assert.Contains(t, actual.PassedOutputs["run1"], "--- PASS: TestParentTransform (0.2s)", "Parent output marker not transformed to PASS") - } - if expected.TestName == "TestParentTransform/SubFail" { - require.Contains(t, actual.FailedOutputs, "run1", "FailedOutputs missing run1 for failing subtest %s", key) - assert.Contains(t, actual.FailedOutputs["run1"], "sub fail output", "Subtest fail output missing for %s", key) - assert.Contains(t, actual.FailedOutputs["run1"], "--- FAIL: TestParentTransform/SubFail (0.1s)", "Subtest fail marker missing for %s", key) - } - } - }) - } -} - -func TestParseFiles_WithPanicEventFile(t *testing.T) { - t.Parallel() - - parser := NewParser() - filePath := "testdata/events-with-panic.json" - results, _, err := parser.ParseFiles([]string{filePath}, "run", 1, Config{}) - - if err != nil { - t.Fatalf("Failed to parse event file: %v", err) - } - - assert.Equal(t, 6, len(results), "Expected 6 test results from file.") - - // Map test names to expected values for easier assertions - expected := map[string]struct { - pkg string - pkgPanic bool - panic bool - passRatio float64 - runs int - failures int - successes int - skipped bool - skips int - }{ - "Test_EventHandlerStateSync": { - pkg: "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", pkgPanic: true, panic: false, passRatio: 1, runs: 1, failures: 0, successes: 1, skipped: false, skips: 0, - }, - "Test_InitialStateSync": { - pkg: "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", pkgPanic: true, panic: false, passRatio: 1, runs: 1, failures: 0, successes: 1, skipped: false, skips: 0, - }, - "Test_RegistrySyncer_SkipsEventsNotBelongingToDON": { - pkg: "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", pkgPanic: true, panic: false, passRatio: 1, runs: 1, failures: 0, successes: 1, skipped: false, skips: 0, - }, - "Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated": { - pkg: "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", pkgPanic: true, panic: true, passRatio: 0, runs: 1, failures: 1, successes: 0, skipped: false, skips: 0, - }, - "Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused": { - pkg: "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", pkgPanic: true, panic: false, passRatio: 1, runs: 1, failures: 0, successes: 1, skipped: false, skips: 0, - }, - "Test_SecretsWorker": { - pkg: "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", pkgPanic: false, panic: false, passRatio: 1, runs: 0, failures: 0, successes: 0, skipped: true, skips: 1, - }, - } - - for _, r := range results { - exp, ok := expected[r.TestName] - require.True(t, ok, "Unexpected test name: %s", r.TestName) - assert.Equal(t, exp.pkg, r.TestPackage, "Package mismatch for %s", r.TestName) - assert.Equal(t, exp.pkgPanic, r.PackagePanic, "PackagePanic mismatch for %s", r.TestName) - assert.Equal(t, exp.panic, r.Panic, "Panic mismatch for %s", r.TestName) - assert.InDelta(t, exp.passRatio, r.PassRatio, 0.001, "PassRatio mismatch for %s", r.TestName) - assert.Equal(t, exp.runs, r.Runs, "Runs mismatch for %s", r.TestName) - assert.Equal(t, exp.failures, r.Failures, "Failures mismatch for %s", r.TestName) - assert.Equal(t, exp.successes, r.Successes, "Successes mismatch for %s", r.TestName) - assert.Equal(t, exp.skipped, r.Skipped, "Skipped mismatch for %s", r.TestName) - assert.Equal(t, exp.skips, r.Skips, "Skips count mismatch for %s", r.TestName) - } - - -} - -func TestParseFiles_WithPanicEventFileSpecific(t *testing.T) { - t.Parallel() - - parser := NewParser() - filePath := "testdata/events-with-panic-single.json" - - results, _, err := parser.ParseFiles([]string{filePath}, "run", 1, Config{}) - if err != nil { - t.Fatalf("Failed to parse event file: %v", err) - } - assert.Equal(t, 1, len(results), "Expected 6 test results from file.") - - testResult := results[0] - - assert.True(t, testResult.Panic, "Expected test result to be marked as panic") - assert.True(t, testResult.PackagePanic, "Expected test result to be marked as panic") - assert.Equal(t, "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer", testResult.TestPackage, "Test package mismatch") - assert.Equal(t, "Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated", testResult.TestName, "Test name mismatch") -} diff --git a/tools/flakeguard/runner/parser/testdata/events-with-panic-single.json b/tools/flakeguard/runner/parser/testdata/events-with-panic-single.json deleted file mode 100644 index 595f5bb3c..000000000 --- a/tools/flakeguard/runner/parser/testdata/events-with-panic-single.json +++ /dev/null @@ -1,42 +0,0 @@ -{"Time":"2025-06-06T14:35:38.799736-07:00","Action":"start","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer"} -{"Time":"2025-06-06T14:35:48.66784-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated"} -{"Time":"2025-06-06T14:35:48.667842-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"=== RUN Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated\n"} -{"Time":"2025-06-06T14:35:48.67684-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.676808000\tDEBUG\tLogPoller\tNew logger: LogPoller\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.681025-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.680-0700\tDEBUG\tWorkflowLimiter\tsyncerlimiter/limiter.go:58\tworkflow limits set\t{\"version\": \"unset@unset\", \"perOwner\": 200, \"global\": 200, \"overrides\": {}}\n"} -{"Time":"2025-06-06T14:35:48.688773-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.688-0700\tDEBUG\tsyncer/workflow_registry.go:245\tWaiting for DON...\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.688936-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.688919000\tDEBUG\tChainReader\tNew logger: ChainReader\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.698277-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.698-0700\tDEBUG\tsyncer/workflow_registry.go:415\tLoading initial workflows for DON\t{\"version\": \"unset@unset\", \"DON\": 1}\n"} -{"Time":"2025-06-06T14:35:48.698459-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.698442000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.698464-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.698455000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:48.698642-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.698624000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.698932-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.698-0700\tDEBUG\tsyncer/workflow_registry.go:422\tRehydrating existing workflows\t{\"version\": \"unset@unset\", \"len\": 1}\n"} -{"Time":"2025-06-06T14:35:48.700684-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.700660000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:48.700878-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.700849000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 10, \"blockHash\": \"0x6ebee403440d3dc5db2bcc20e668b50c4c4c94eb26cab6339e9f5d17958d0a14\", \"timestamp\": \"14:35:56.000000000\"}\n"} -{"Time":"2025-06-06T14:35:48.706784-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.706765000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 11, \"blockHash\": \"0x61c3f8c8bf90f836c14ada1f98ec28567781dc29b64c14b092137d5177ae2cbb\", \"timestamp\": \"14:35:57.000000000\"}\n"} -{"Time":"2025-06-06T14:35:48.70757-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.707545000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 12, \"blockHash\": \"0xca9894b01ad147e02db1ddbffbd7ac7927e2d424afb39874cd6335caa507a3a8\", \"timestamp\": \"14:35:58.000000000\"}\n"} -{"Time":"2025-06-06T14:35:48.712992-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"panic: runtime error: invalid memory address or nil pointer dereference\n"} -{"Time":"2025-06-06T14:35:48.712997-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"[signal SIGSEGV: segmentation violation code=0x2 addr=0x48 pc=0x101f834bc]\n"} -{"Time":"2025-06-06T14:35:48.713-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\n"} -{"Time":"2025-06-06T14:35:48.713012-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"goroutine 56083 [running]:\n"} -{"Time":"2025-06-06T14:35:48.713015-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).ensureCapRegistryReady.func1()\n"} -{"Time":"2025-06-06T14:35:48.713017-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:791 +0x2c\n"} -{"Time":"2025-06-06T14:35:48.713026-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/internal.RunWithRetries({0x105d0b770, 0x14001102a50}, {0x14eeb3940, 0x140023141e0}, 0x1dcd6500, 0x0, 0x140025151f8)\n"} -{"Time":"2025-06-06T14:35:48.713028-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/internal/retry.go:25 +0x7c\n"} -{"Time":"2025-06-06T14:35:48.713031-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).ensureCapRegistryReady(0x1400107c800?, {0x105d0b770?, 0x14001102a50?})\n"} -{"Time":"2025-06-06T14:35:48.713037-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:784 +0x80\n"} -{"Time":"2025-06-06T14:35:48.713046-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).tryEngineCreate(0x1400107c800, {0x105d0b770, 0x14001102a50}, 0x14001306240)\n"} -{"Time":"2025-06-06T14:35:48.713049-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:700 +0x34\n"} -{"Time":"2025-06-06T14:35:48.713071-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).workflowRegisteredEvent(0x1400107c800, {0x105d0b770, 0x14001102a50}, {{0x0, 0x39, 0xa5, 0xc1, 0xbe, 0x78, 0x5e, ...}, ...})\n"} -{"Time":"2025-06-06T14:35:48.713077-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:433 +0x448\n"} -{"Time":"2025-06-06T14:35:48.713096-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).Handle(0x1400107c800, {0x105d0b770, 0x14001102a50}, {{0x1040ab3e3?, 0x14002515cb8?}, {0x105b80160?, 0x14003ab5a00?}})\n"} -{"Time":"2025-06-06T14:35:48.713099-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:249 +0x1fc4\n"} -{"Time":"2025-06-06T14:35:48.713125-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).handleWithMetrics(0x14000626800, {0x105d0b770, 0x14001102a50}, {{0x1040ab3e3?, 0x0?}, {0x105b80160?, 0x14003ab5a00?}})\n"} -{"Time":"2025-06-06T14:35:48.713129-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:405 +0x84\n"} -{"Time":"2025-06-06T14:35:48.713155-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).syncUsingEventStrategy(0x14000626800, {0x105d0b770, 0x14001102a50}, {0x1, 0x0, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)\n"} -{"Time":"2025-06-06T14:35:48.713158-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:430 +0x378\n"} -{"Time":"2025-06-06T14:35:48.71316-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).Start.func1.1()\n"} -{"Time":"2025-06-06T14:35:48.713165-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:261 +0x244\n"} -{"Time":"2025-06-06T14:35:48.713168-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"created by github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).Start.func1 in goroutine 55818\n"} -{"Time":"2025-06-06T14:35:48.713176-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:241 +0xac\n"} -{"Time":"2025-06-06T14:35:48.71692-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Output":"FAIL\tgithub.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer\t9.915s\n"} -{"Time":"2025-06-06T14:35:48.71693-07:00","Action":"fail","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Elapsed":9.917} diff --git a/tools/flakeguard/runner/parser/testdata/events-with-panic.json b/tools/flakeguard/runner/parser/testdata/events-with-panic.json deleted file mode 100644 index 010b7d5cb..000000000 --- a/tools/flakeguard/runner/parser/testdata/events-with-panic.json +++ /dev/null @@ -1,1336 +0,0 @@ -{"Time":"2025-06-06T14:35:38.799736-07:00","Action":"start","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer"} -{"Time":"2025-06-06T14:35:40.414999-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync"} -{"Time":"2025-06-06T14:35:40.41504-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":"=== RUN Test_EventHandlerStateSync\n"} -{"Time":"2025-06-06T14:35:40.426994-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.426832000\tDEBUG\tLogPoller\tNew logger: LogPoller\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:40.449323-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.449195000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 14, \"finalized\": 12}\n"} -{"Time":"2025-06-06T14:35:40.449348-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.449303000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:40.449821-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.449792000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:40.451667-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.451647000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:40.451676-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.451661000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 12, \"end\": 12}\n"} -{"Time":"2025-06-06T14:35:40.452507-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.452490000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:40.452559-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.452537000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 13, \"blockHash\": \"0x564708e7d08fbd43691f4b23b30238157af959e405435f2b9868428c88dbf478\", \"timestamp\": \"14:35:51.000000000\"}\n"} -{"Time":"2025-06-06T14:35:40.457358-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.457333000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 14, \"blockHash\": \"0xc04bea2db5123721e045e6a80b19ff53ae80f7d0d181648f81dea6a96e09c09a\", \"timestamp\": \"14:35:52.000000000\"}\n"} -{"Time":"2025-06-06T14:35:40.458675-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.458659000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 15, \"blockHash\": \"0xed17f844c3a4bb2a18d2568f3dd270858043138cff66ddb060b14ce4f912475a\", \"timestamp\": \"14:35:53.000000000\"}\n"} -{"Time":"2025-06-06T14:35:40.524703-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.524-0700\tDEBUG\tsyncer/workflow_registry.go:245\tWaiting for DON...\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:40.524855-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.524837000\tDEBUG\tChainReader\tNew logger: ChainReader\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:40.525947-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.525925000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:40.526155-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.526139000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:40.532687-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.532-0700\tDEBUG\tsyncer/workflow_registry.go:415\tLoading initial workflows for DON\t{\"version\": \"unset@unset\", \"DON\": 1}\n"} -{"Time":"2025-06-06T14:35:40.533373-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.533350000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 16, \"end\": 66}\n"} -{"Time":"2025-06-06T14:35:40.534814-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.534-0700\tDEBUG\tsyncer/workflow_registry.go:422\tRehydrating existing workflows\t{\"version\": \"unset@unset\", \"len\": 20}\n"} -{"Time":"2025-06-06T14:35:40.534832-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.534-0700\tDEBUG\tsyncer/workflow_registry.go:316\trunning readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:40.534944-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.534928000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.534949-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.534942000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [16, 18]}\n"} -{"Time":"2025-06-06T14:35:40.543754-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.543-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.544813-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.544777000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 16, \"to\": 18, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6e0682580dbae558c96de7c519d7412a04f52d31352eb291ee646e519abad88f\",\"BlockNumber\":16,\"BlockTimestamp\":\"2025-06-06T14:35:54-07:00\",\"FinalizedBlockNumber\":16,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.549669-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.549653000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.549673-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.549662000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [19, 21]}\n"} -{"Time":"2025-06-06T14:35:40.551804-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.551779000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 19, \"to\": 21, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcbc99ce86c0fe02e365aab5c6c988e6577f082f1f1bcbe10e304e25d97ec3388\",\"BlockNumber\":19,\"BlockTimestamp\":\"2025-06-06T14:35:57-07:00\",\"FinalizedBlockNumber\":19,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.553963-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.553948000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.553966-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.553957000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [22, 24]}\n"} -{"Time":"2025-06-06T14:35:40.556483-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.556462000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 22, \"to\": 24, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd077dfc66792c5fb698dd69db126ae76c80f48b20479c29433530eb6960560e9\",\"BlockNumber\":22,\"BlockTimestamp\":\"2025-06-06T14:36:00-07:00\",\"FinalizedBlockNumber\":22,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.559786-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.559771000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.55979-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.559779000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [25, 27]}\n"} -{"Time":"2025-06-06T14:35:40.562075-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.562057000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 25, \"to\": 27, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2adcfb17eb236c47da943138f89c04f0e86f3c20419a6c6863fbea846d81c666\",\"BlockNumber\":25,\"BlockTimestamp\":\"2025-06-06T14:36:03-07:00\",\"FinalizedBlockNumber\":25,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.565153-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.565127000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.565159-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.565143000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [28, 30]}\n"} -{"Time":"2025-06-06T14:35:40.567449-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.567417000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 28, \"to\": 30, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x26a199dd675f7eb44e6a0d9bcf3ba7f1f2ed9e43bbe82f2bf49d03909f27ca1c\",\"BlockNumber\":28,\"BlockTimestamp\":\"2025-06-06T14:36:06-07:00\",\"FinalizedBlockNumber\":28,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.568797-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.568771000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.568803-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.568784000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [31, 33]}\n"} -{"Time":"2025-06-06T14:35:40.570299-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.570278000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 31, \"to\": 33, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe61577a7209388710dda7182a93d5baea118eab53beaa1e2bfa1d6f143dfb3bd\",\"BlockNumber\":31,\"BlockTimestamp\":\"2025-06-06T14:36:09-07:00\",\"FinalizedBlockNumber\":31,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.571439-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.571418000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.571447-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.571432000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [36, 34]}\n"} -{"Time":"2025-06-06T14:35:40.572819-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.572800000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 34, \"to\": 36, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xca2909a9666e72f12745a14896f1b54e879b731d65431e45998b1b158eafce13\",\"BlockNumber\":34,\"BlockTimestamp\":\"2025-06-06T14:36:12-07:00\",\"FinalizedBlockNumber\":34,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.573956-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.573920000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.573963-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.573946000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [37, 39]}\n"} -{"Time":"2025-06-06T14:35:40.575493-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.575462000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 37, \"to\": 39, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x864ac2ae01655d4b6a1db7cc5c040d8ffcc15caa1fa1bb20fea5190fa01a96ba\",\"BlockNumber\":37,\"BlockTimestamp\":\"2025-06-06T14:36:15-07:00\",\"FinalizedBlockNumber\":37,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.576833-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.576808000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.576842-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.576820000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [40, 42]}\n"} -{"Time":"2025-06-06T14:35:40.578054-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.577-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.57854-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.578511000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 40, \"to\": 42, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x45621d2ba544d16152d0b92878e5b3c64264ad3ea7ea579b3facf973453328ac\",\"BlockNumber\":40,\"BlockTimestamp\":\"2025-06-06T14:36:18-07:00\",\"FinalizedBlockNumber\":40,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.579657-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.579635000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.579663-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.579651000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [43, 45]}\n"} -{"Time":"2025-06-06T14:35:40.581151-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.581129000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 43, \"to\": 45, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2404b95e2453fc7e005e49c25486c3f33b0981ae41a55410a67e47ad3fb7e05a\",\"BlockNumber\":43,\"BlockTimestamp\":\"2025-06-06T14:36:21-07:00\",\"FinalizedBlockNumber\":43,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.58232-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.582300000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.582327-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.582312000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [48, 46]}\n"} -{"Time":"2025-06-06T14:35:40.583884-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.583793000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 46, \"to\": 48, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xeb0d4eb16dd61bd9266da56a3da7d926db243783f26a42402d0eba3050d6fba4\",\"BlockNumber\":46,\"BlockTimestamp\":\"2025-06-06T14:36:24-07:00\",\"FinalizedBlockNumber\":46,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.585333-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.585303000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.585339-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.585319000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [49, 51]}\n"} -{"Time":"2025-06-06T14:35:40.586772-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.586743000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 49, \"to\": 51, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2f5a3ac5b59be03ad90a42170a9dd66586c80a34fbbee9cf6002760508394630\",\"BlockNumber\":49,\"BlockTimestamp\":\"2025-06-06T14:36:27-07:00\",\"FinalizedBlockNumber\":49,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.588154-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.588115000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.588161-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.588134000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [52, 54]}\n"} -{"Time":"2025-06-06T14:35:40.590124-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.590094000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 52, \"to\": 54, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd10e0c2d11d6f75e5200a45a664c4419890daf0310e7acc6f4e3fac8cf657bb8\",\"BlockNumber\":52,\"BlockTimestamp\":\"2025-06-06T14:36:30-07:00\",\"FinalizedBlockNumber\":52,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.59555-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.595515000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.595572-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.595539000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [55, 57]}\n"} -{"Time":"2025-06-06T14:35:40.597076-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.597037000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 55, \"to\": 57, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x8ee4a93068a3e81dcb10a32580f710936cb3e0f4f49cb02764f7fd4f6ead10a9\",\"BlockNumber\":55,\"BlockTimestamp\":\"2025-06-06T14:36:33-07:00\",\"FinalizedBlockNumber\":55,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.598181-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.598160000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.598188-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.598172000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [58, 60]}\n"} -{"Time":"2025-06-06T14:35:40.599513-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.599490000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 58, \"to\": 60, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x97200f3bf7b431a8e0dac846975987e1b362abc499dd29b466dddbaf850d54d8\",\"BlockNumber\":58,\"BlockTimestamp\":\"2025-06-06T14:36:36-07:00\",\"FinalizedBlockNumber\":58,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.600467-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.600444000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.600473-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.600462000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [61, 63]}\n"} -{"Time":"2025-06-06T14:35:40.601882-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.601856000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 61, \"to\": 63, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x8fb67df5ba8668eb641cb280af4886e8232799cc7eb13b0bb7e76c25c23bf733\",\"BlockNumber\":61,\"BlockTimestamp\":\"2025-06-06T14:36:39-07:00\",\"FinalizedBlockNumber\":61,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.602798-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.602782000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:40.602802-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.602790000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [64, 66]}\n"} -{"Time":"2025-06-06T14:35:40.604154-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.604128000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 64, \"to\": 66, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x80bb1bd3e05f731cc08be01067048b57d188b9708bda7e4ecb92b0d51c33890e\",\"BlockNumber\":64,\"BlockTimestamp\":\"2025-06-06T14:36:42-07:00\",\"FinalizedBlockNumber\":64,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:40.605242-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.605219000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 67, \"blockHash\": \"0x345d4420ac9cd55622d044b0266f78070225d05bf7036a7b085a7d12a849e273\", \"timestamp\": \"14:36:45.000000000\"}\n"} -{"Time":"2025-06-06T14:35:40.606158-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.606139000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 68, \"blockHash\": \"0x92b982a7ed13c0a22ac42d7dcbf2099f619dde1ef09d5ad0a7b98456e76c5cc5\", \"timestamp\": \"14:36:46.000000000\"}\n"} -{"Time":"2025-06-06T14:35:40.606777-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.606762000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 69, \"blockHash\": \"0x64bec66286d717f691c8b5bb7fb2800006474f81459a24398404864632cff14d\", \"timestamp\": \"14:36:47.000000000\"}\n"} -{"Time":"2025-06-06T14:35:40.624271-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.624244000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:40.624491-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.624469000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:40.624496-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.624482000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:40.627786-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.627-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.678917-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.678-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.718886-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.718857000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:40.719129-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.719112000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:40.719133-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.719120000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:40.729847-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.729-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.780033-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.779-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.823905-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.823861000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:40.824163-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.824144000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:40.82417-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.824153000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:40.82792-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.827-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.878295-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.878-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.928882-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.928-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:40.930763-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.930741000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:40.931039-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.931022000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:40.931043-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:40.931031000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:40.978188-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:40.978-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.028189-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.028-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.035336-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.035314000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.03559-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.035576000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:41.035594-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.035582000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:41.077918-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.077-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.128203-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.128-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.130642-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.130627000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.130887-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.130868000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:41.130891-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.130878000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:41.178321-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.178-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.228207-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.228-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.229212-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.229194000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.229442-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.229426000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:41.229445-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.229433000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:41.278886-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.278-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.321809-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.321770000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.322105-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.322082000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:41.322111-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.322094000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:41.328969-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.328-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.378423-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.378-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.412158-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.412118000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.412443-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.412423000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:41.412451-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.412433000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:41.42838-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.428-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.47903-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.478-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.521498-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.521464000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.521773-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.521755000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 69, \"finalized\": 67}\n"} -{"Time":"2025-06-06T14:35:41.521777-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.521764000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70, \"latestBlockNumber\": 69}\n"} -{"Time":"2025-06-06T14:35:41.528089-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.528-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.579487-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.579-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.623446-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.623409000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 70}\n"} -{"Time":"2025-06-06T14:35:41.623667-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.623651000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 105, \"finalized\": 103}\n"} -{"Time":"2025-06-06T14:35:41.624535-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.624518000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 70, \"end\": 102}\n"} -{"Time":"2025-06-06T14:35:41.625476-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.625457000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.625486-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.625467000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [70, 72]}\n"} -{"Time":"2025-06-06T14:35:41.627344-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.627297000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 70, \"to\": 72, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x45c01932a00f20ce1a8418f68993bc34ffa81e4d42c6ad2622160dbdce2dc98b\",\"BlockNumber\":70,\"BlockTimestamp\":\"2025-06-06T14:36:48-07:00\",\"FinalizedBlockNumber\":70,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.628103-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.628-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.630256-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.630227000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.630269-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.630241000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [73, 75]}\n"} -{"Time":"2025-06-06T14:35:41.631922-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.631896000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 73, \"to\": 75, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x75667e6fa6d98c1b05bec0d9d3f8744f24cd9a584ceafd7bc42c924fca938dbd\",\"BlockNumber\":73,\"BlockTimestamp\":\"2025-06-06T14:36:51-07:00\",\"FinalizedBlockNumber\":73,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.63614-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.636118000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.636149-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.636129000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [78, 76]}\n"} -{"Time":"2025-06-06T14:35:41.638159-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.638127000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 76, \"to\": 78, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xeb064106401a92021c123f48d17278e5359fdebe4f5a1d9f70f051eb5133aae3\",\"BlockNumber\":76,\"BlockTimestamp\":\"2025-06-06T14:36:54-07:00\",\"FinalizedBlockNumber\":76,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.64124-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.641224000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.641249-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.641235000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [79, 81]}\n"} -{"Time":"2025-06-06T14:35:41.643261-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.643243000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 79, \"to\": 81, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5691987c539357947fa293c13406de519ca84542530d45ac2e96dbcd121893c4\",\"BlockNumber\":79,\"BlockTimestamp\":\"2025-06-06T14:36:57-07:00\",\"FinalizedBlockNumber\":79,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.645266-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.645250000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.645273-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.645260000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [82, 84]}\n"} -{"Time":"2025-06-06T14:35:41.646731-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.646712000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 82, \"to\": 84, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x7aaa7333509ab5cd541d4d87ef5213c8e3da334e9248c7164b284cf965cb4da2\",\"BlockNumber\":82,\"BlockTimestamp\":\"2025-06-06T14:37:00-07:00\",\"FinalizedBlockNumber\":82,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.649828-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.649812000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.649833-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.649821000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [85, 87]}\n"} -{"Time":"2025-06-06T14:35:41.651826-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.651791000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 85, \"to\": 87, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf6fe2f7dc91497378406f89c3dfb2caf79a82de876df287349767758ee0a29fa\",\"BlockNumber\":85,\"BlockTimestamp\":\"2025-06-06T14:37:03-07:00\",\"FinalizedBlockNumber\":85,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.653579-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.653557000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.653584-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.653570000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [88, 90]}\n"} -{"Time":"2025-06-06T14:35:41.65507-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.655036000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 88, \"to\": 90, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x8546ef5de6120eb7d920059cca7ead531a45967d1fedf745c8d2d533719aaaee\",\"BlockNumber\":88,\"BlockTimestamp\":\"2025-06-06T14:37:06-07:00\",\"FinalizedBlockNumber\":88,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.657903-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.657886000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.657908-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.657897000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [91, 93]}\n"} -{"Time":"2025-06-06T14:35:41.659999-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.659970000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 91, \"to\": 93, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa836d6e542f8b1078aa23888cf19824f01b8c8ddc5d55b65a359dc3b61f6d184\",\"BlockNumber\":91,\"BlockTimestamp\":\"2025-06-06T14:37:09-07:00\",\"FinalizedBlockNumber\":91,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.663036-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.663021000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.66304-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.663030000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [94, 96]}\n"} -{"Time":"2025-06-06T14:35:41.66511-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.665083000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 94, \"to\": 96, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe31a3296ae0e7fedbb2c149d3e874c6b144b9e9eba6bbdb48395f0360311a3e8\",\"BlockNumber\":94,\"BlockTimestamp\":\"2025-06-06T14:37:12-07:00\",\"FinalizedBlockNumber\":94,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.668181-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.668161000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.668186-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.668170000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [97, 99]}\n"} -{"Time":"2025-06-06T14:35:41.669977-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.669954000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 97, \"to\": 99, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xbbfe76cc524dc1fabe43c78301613fec0d7f69b82b0a587e83f2287e27033d6b\",\"BlockNumber\":97,\"BlockTimestamp\":\"2025-06-06T14:37:15-07:00\",\"FinalizedBlockNumber\":97,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.672696-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.672676000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.6727-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.672688000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [100, 102]}\n"} -{"Time":"2025-06-06T14:35:41.674581-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.674559000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 100, \"to\": 102, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x86420891cee6130bd3b7a19e557930d62859ea584f93d2a15dd62ca44fce6162\",\"BlockNumber\":100,\"BlockTimestamp\":\"2025-06-06T14:37:18-07:00\",\"FinalizedBlockNumber\":100,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.676811-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.676793000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 103, \"blockHash\": \"0xc1b47a52ef67de1e4e3ec38402860ac3d5433fdef8170f231e00c2ebde9d08fb\", \"timestamp\": \"14:37:21.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.679244-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.679226000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 104, \"blockHash\": \"0x301e416722cf88576a860efda3d32535a175aed2c1ec018f59a4bcfd74350070\", \"timestamp\": \"14:37:22.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.679531-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.679-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 12, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:41.680134-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.680116000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 105, \"blockHash\": \"0xcef830c0107bcabfda37f3feae15bbdeb2c4d2e706841743f442331c44ded67c\", \"timestamp\": \"14:37:23.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.717245-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.717198000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 106}\n"} -{"Time":"2025-06-06T14:35:41.717464-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.717445000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 138, \"finalized\": 136}\n"} -{"Time":"2025-06-06T14:35:41.717892-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.717868000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 106, \"end\": 135}\n"} -{"Time":"2025-06-06T14:35:41.718502-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.718481000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.71851-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.718495000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [106, 108]}\n"} -{"Time":"2025-06-06T14:35:41.71994-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.719907000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 106, \"to\": 108, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xebbf43e277ee1eefbdc164e50a3f4a9a68df1cdff30aecd91fd88f6716f85065\",\"BlockNumber\":106,\"BlockTimestamp\":\"2025-06-06T14:37:24-07:00\",\"FinalizedBlockNumber\":106,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.721172-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.721145000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.721189-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.721159000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [109, 111]}\n"} -{"Time":"2025-06-06T14:35:41.722501-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.722476000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 109, \"to\": 111, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xca0e8121e7c67852c1bcede5760452780854ff05035f0eeed022f9de6c47b889\",\"BlockNumber\":109,\"BlockTimestamp\":\"2025-06-06T14:37:27-07:00\",\"FinalizedBlockNumber\":109,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.723515-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.723496000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.72352-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.723509000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [112, 114]}\n"} -{"Time":"2025-06-06T14:35:41.724945-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.724920000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 112, \"to\": 114, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x7a215e713d70781a604d4f0f87b3a93adb83e84744dc49c081883b4da9ce5b0e\",\"BlockNumber\":112,\"BlockTimestamp\":\"2025-06-06T14:37:30-07:00\",\"FinalizedBlockNumber\":112,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.725877-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.725858000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.725881-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.725867000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [115, 117]}\n"} -{"Time":"2025-06-06T14:35:41.727185-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.727160000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 115, \"to\": 117, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x298d9365e2f54c69237c180d5c23d26e85a595971577bbf9b5ed6556a2f83d95\",\"BlockNumber\":115,\"BlockTimestamp\":\"2025-06-06T14:37:33-07:00\",\"FinalizedBlockNumber\":115,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.728964-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.728-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 3, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"103-0-0x6857a5b47127ad6f7a3190bf23ba34d24019b010a618c155e126da95bcf7438c\"}\n"} -{"Time":"2025-06-06T14:35:41.729223-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.729201000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.729227-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.729210000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [118, 120]}\n"} -{"Time":"2025-06-06T14:35:41.730508-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.730491000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 118, \"to\": 120, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6df315a67410a7b707698a68f77495d0717883b799c24bdc1a4fa69a6b2d30b6\",\"BlockNumber\":118,\"BlockTimestamp\":\"2025-06-06T14:37:36-07:00\",\"FinalizedBlockNumber\":118,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.731653-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.731633000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.731663-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.731641000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [121, 123]}\n"} -{"Time":"2025-06-06T14:35:41.733013-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.732982000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 121, \"to\": 123, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xca3a655eb5c99a2889fb594663087faa7d533442593fee5eb5630e089bf21cd2\",\"BlockNumber\":121,\"BlockTimestamp\":\"2025-06-06T14:37:39-07:00\",\"FinalizedBlockNumber\":121,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.73409-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.734064000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.734097-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.734080000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [124, 126]}\n"} -{"Time":"2025-06-06T14:35:41.735462-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.735440000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 124, \"to\": 126, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x859f6a6aec470a822c46ee5a07cf271ccf02f692809edd460d5658c333d6b317\",\"BlockNumber\":124,\"BlockTimestamp\":\"2025-06-06T14:37:42-07:00\",\"FinalizedBlockNumber\":124,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.736369-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.736354000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.736375-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.736363000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [127, 129]}\n"} -{"Time":"2025-06-06T14:35:41.737694-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.737667000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 127, \"to\": 129, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x4472e28b1b232bb23e6e6e2d6aa28033602909bf54e2c2b04ea5fd3dbc96b445\",\"BlockNumber\":127,\"BlockTimestamp\":\"2025-06-06T14:37:45-07:00\",\"FinalizedBlockNumber\":127,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.738631-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.738613000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.738637-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.738622000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [132, 130]}\n"} -{"Time":"2025-06-06T14:35:41.739978-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.739959000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 130, \"to\": 132, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x9cd2b360339102af2ec57303bbf20b897b49d95b7a27c420deb3f38ae005f246\",\"BlockNumber\":130,\"BlockTimestamp\":\"2025-06-06T14:37:48-07:00\",\"FinalizedBlockNumber\":130,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.740931-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.740913000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.740935-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.740926000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [133, 135]}\n"} -{"Time":"2025-06-06T14:35:41.74224-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.742221000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 133, \"to\": 135, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd027a5e48b59efbb6be131a17fd6967679c0f18cfb4e73f5b6a3e2119ebb26dd\",\"BlockNumber\":133,\"BlockTimestamp\":\"2025-06-06T14:37:51-07:00\",\"FinalizedBlockNumber\":133,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.74319-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.743169000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 136, \"blockHash\": \"0xa7bf4fb05c2a01bfb5daa1a03b4c1a347a2be197344f37d46e03a2c01e0aa118\", \"timestamp\": \"14:37:54.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.74414-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.744121000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 137, \"blockHash\": \"0x5e5dd6170836b5618c1f84164ef46196b31515ca6865f86ff7e8302e848ef152\", \"timestamp\": \"14:37:55.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.744806-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.744785000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 138, \"blockHash\": \"0xfb0467e1671f9d169835acc33516ad60430730eacdc4bd25757a634e00d9e63a\", \"timestamp\": \"14:37:56.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.779401-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.779-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"112-0-0xdf3a4188501227b85de19393e8802fa246563856197ef1adb7baa703c793fc0f\"}\n"} -{"Time":"2025-06-06T14:35:41.810269-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.810240000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 139}\n"} -{"Time":"2025-06-06T14:35:41.810483-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.810464000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 171, \"finalized\": 169}\n"} -{"Time":"2025-06-06T14:35:41.811682-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.811666000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 139, \"end\": 168}\n"} -{"Time":"2025-06-06T14:35:41.812841-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.812828000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.812846-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.812836000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [139, 141]}\n"} -{"Time":"2025-06-06T14:35:41.81591-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.815885000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 139, \"to\": 141, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3a6b89f54fe7323e1ea8dfecdf2ca4c0f52cdf2396b2cfe9210253838da87ba8\",\"BlockNumber\":139,\"BlockTimestamp\":\"2025-06-06T14:37:57-07:00\",\"FinalizedBlockNumber\":139,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.818487-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.818470000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.818493-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.818480000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [142, 144]}\n"} -{"Time":"2025-06-06T14:35:41.820375-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.820350000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 142, \"to\": 144, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe4b61f33e6147c8433bbb6f0f887e7622a84cca826e18ef285f672dd27cf18c2\",\"BlockNumber\":142,\"BlockTimestamp\":\"2025-06-06T14:38:00-07:00\",\"FinalizedBlockNumber\":142,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.822429-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.822375000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.822434-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.822387000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [145, 147]}\n"} -{"Time":"2025-06-06T14:35:41.824248-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.824223000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 145, \"to\": 147, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd599a178eaea51179674d0b3538c00a9d3b800bf9f93cf30dcfb64475f7a26ab\",\"BlockNumber\":145,\"BlockTimestamp\":\"2025-06-06T14:38:03-07:00\",\"FinalizedBlockNumber\":145,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.83056-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.830518000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.830573-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.830533000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [148, 150]}\n"} -{"Time":"2025-06-06T14:35:41.830653-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.830-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 3, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"136-0-0xcf4689d5507e5b0dec4c28d8834d67d4139dc72cb054d15734d0626734201e71\"}\n"} -{"Time":"2025-06-06T14:35:41.832252-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.832229000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 148, \"to\": 150, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x60df06f149e6e3eeb6d1d6ea17b0971088adc57d8ae1f124ae6d6fe6e7ca5c35\",\"BlockNumber\":148,\"BlockTimestamp\":\"2025-06-06T14:38:06-07:00\",\"FinalizedBlockNumber\":148,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.834705-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.834685000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.834709-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.834694000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [151, 153]}\n"} -{"Time":"2025-06-06T14:35:41.8363-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.836273000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 151, \"to\": 153, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x50d189e756fe41543a1844e372f05908513c59a335c7eacfe3a30a1e774ef56d\",\"BlockNumber\":151,\"BlockTimestamp\":\"2025-06-06T14:38:09-07:00\",\"FinalizedBlockNumber\":151,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.838265-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.838245000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.838269-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.838259000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [154, 156]}\n"} -{"Time":"2025-06-06T14:35:41.839783-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.839760000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 154, \"to\": 156, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf355e1c7e4d497a0008e8d1be2a09323c8f3f7fe2f1b212c9e66f161721fab04\",\"BlockNumber\":154,\"BlockTimestamp\":\"2025-06-06T14:38:12-07:00\",\"FinalizedBlockNumber\":154,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.841955-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.841936000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.841962-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.841949000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [157, 159]}\n"} -{"Time":"2025-06-06T14:35:41.844956-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.844654000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 157, \"to\": 159, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3822d95c8ea75c319bfb65e365f1bc91745ffa4dd701670a5d2dd84120b09b27\",\"BlockNumber\":157,\"BlockTimestamp\":\"2025-06-06T14:38:15-07:00\",\"FinalizedBlockNumber\":157,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.84687-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.846850000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.846877-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.846864000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [160, 162]}\n"} -{"Time":"2025-06-06T14:35:41.848406-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.848382000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 160, \"to\": 162, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xefde98b7435f8f385a2a011cb282533e25dd280b2280059a04f08f6310be650c\",\"BlockNumber\":160,\"BlockTimestamp\":\"2025-06-06T14:38:18-07:00\",\"FinalizedBlockNumber\":160,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.850429-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.850413000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.850434-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.850422000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [163, 165]}\n"} -{"Time":"2025-06-06T14:35:41.852286-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.852258000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 163, \"to\": 165, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xb2dbd4cbeeb51f589e3a608900916832bd5c8e6dd05b8a01ea07b3079dd21d83\",\"BlockNumber\":163,\"BlockTimestamp\":\"2025-06-06T14:38:21-07:00\",\"FinalizedBlockNumber\":163,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.856039-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.856014000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.856056-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.856027000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [166, 168]}\n"} -{"Time":"2025-06-06T14:35:41.857411-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.857384000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 166, \"to\": 168, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x9b9b816122a1c611fe064d4fb753634136d16a60f0245dcdbb255e7df33d53b3\",\"BlockNumber\":166,\"BlockTimestamp\":\"2025-06-06T14:38:24-07:00\",\"FinalizedBlockNumber\":166,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.8594-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.859347000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 169, \"blockHash\": \"0x775040e763a862b51774e7acae35be093d30e087341b502acfa943f422ec2a6d\", \"timestamp\": \"14:38:27.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.861421-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.861401000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 170, \"blockHash\": \"0x09fbf459a79930b6706b23c027efe6891f0d2113cf1879805e6936e6fe2e25e3\", \"timestamp\": \"14:38:28.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.862509-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.862490000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 171, \"blockHash\": \"0x1a661c9abe713d7411eadc528271e282bd3cbb532d20c0278db28a607217bde1\", \"timestamp\": \"14:38:29.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.880089-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.880-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"145-0-0x8f6eb3a59382d43f398bda91ddf7d986bf43a693c9a5ceb4b8b43aad1cfdf5ac\"}\n"} -{"Time":"2025-06-06T14:35:41.918206-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.918167000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 172}\n"} -{"Time":"2025-06-06T14:35:41.91843-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.918413000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 213, \"finalized\": 211}\n"} -{"Time":"2025-06-06T14:35:41.91908-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.919057000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 172, \"end\": 210}\n"} -{"Time":"2025-06-06T14:35:41.919916-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.919894000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.919921-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.919907000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [172, 174]}\n"} -{"Time":"2025-06-06T14:35:41.921492-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.921469000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 172, \"to\": 174, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x38d5d3eab5a758b2158f9cce1c4d865ec1f76fed6c7119ccaa76695a7e5893fd\",\"BlockNumber\":172,\"BlockTimestamp\":\"2025-06-06T14:38:30-07:00\",\"FinalizedBlockNumber\":172,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.923168-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.923149000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.923175-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.923163000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [175, 177]}\n"} -{"Time":"2025-06-06T14:35:41.924787-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.924762000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 175, \"to\": 177, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x32823db97df3efd29d545086ea21a1adb4c4a9e3d65e0136e60767018afbe508\",\"BlockNumber\":175,\"BlockTimestamp\":\"2025-06-06T14:38:33-07:00\",\"FinalizedBlockNumber\":175,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.926548-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.926527000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.926553-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.926536000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [178, 180]}\n"} -{"Time":"2025-06-06T14:35:41.928264-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.928240000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 178, \"to\": 180, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2a11fe0951b44e838c05db191d57f295f09fb6f89d7d9c9b1c7113ae71ad258a\",\"BlockNumber\":178,\"BlockTimestamp\":\"2025-06-06T14:38:36-07:00\",\"FinalizedBlockNumber\":178,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.928466-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.928-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 2, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"169-0-0x41bf47495dfb8d7ed6b3ff7e3ebd47dbf29800a56425724fb7cb4f402a6a179a\"}\n"} -{"Time":"2025-06-06T14:35:41.930009-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.929991000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.930017-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.929999000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [181, 183]}\n"} -{"Time":"2025-06-06T14:35:41.931472-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.931454000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 181, \"to\": 183, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3c5b91c59fd791c6741045b68752f04babd13b82ead7ae3143900fc333e9ad9a\",\"BlockNumber\":181,\"BlockTimestamp\":\"2025-06-06T14:38:39-07:00\",\"FinalizedBlockNumber\":181,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.933116-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.933099000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.93312-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.933110000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [184, 186]}\n"} -{"Time":"2025-06-06T14:35:41.934815-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.934798000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 184, \"to\": 186, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x7b9fbf5d88608b0384a753e7d18c257f96489ba0883ec35c12f9c1fed2e0976d\",\"BlockNumber\":184,\"BlockTimestamp\":\"2025-06-06T14:38:42-07:00\",\"FinalizedBlockNumber\":184,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.936992-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.936970000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.936999-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.936980000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [187, 189]}\n"} -{"Time":"2025-06-06T14:35:41.938545-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.938527000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 187, \"to\": 189, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfdbc427638b21848333668f3f7bf4e59966508391976ec718e26304f6928f774\",\"BlockNumber\":187,\"BlockTimestamp\":\"2025-06-06T14:38:45-07:00\",\"FinalizedBlockNumber\":187,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.940081-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.940064000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.940086-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.940074000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [190, 192]}\n"} -{"Time":"2025-06-06T14:35:41.941598-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.941579000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 190, \"to\": 192, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x460e8002dd6a96a832503d6bcb9e05eded80768fcfcdb729d6f95c3d04d7b27f\",\"BlockNumber\":190,\"BlockTimestamp\":\"2025-06-06T14:38:48-07:00\",\"FinalizedBlockNumber\":190,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.943527-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.943511000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.943532-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.943521000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [193, 195]}\n"} -{"Time":"2025-06-06T14:35:41.944956-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.944938000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 193, \"to\": 195, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5c009473193de03ed277172314d25585ef816218bef0c700e6e1577bfc92c217\",\"BlockNumber\":193,\"BlockTimestamp\":\"2025-06-06T14:38:51-07:00\",\"FinalizedBlockNumber\":193,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.946406-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.946390000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.94641-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.946401000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [198, 196]}\n"} -{"Time":"2025-06-06T14:35:41.947917-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.947897000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 196, \"to\": 198, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa9a8c3f54d192ade843389b959d239294e1ec8d52dda7842b8a48d17e3292104\",\"BlockNumber\":196,\"BlockTimestamp\":\"2025-06-06T14:38:54-07:00\",\"FinalizedBlockNumber\":196,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.949734-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.949720000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.949741-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.949728000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [199, 201]}\n"} -{"Time":"2025-06-06T14:35:41.951249-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.951224000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 199, \"to\": 201, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2f528570bcf7b4129bf5ea0acf275cdb185a64fbf51edebbf54cc0616b4bdca6\",\"BlockNumber\":199,\"BlockTimestamp\":\"2025-06-06T14:38:57-07:00\",\"FinalizedBlockNumber\":199,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.953313-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.953295000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.953317-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.953305000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [202, 204]}\n"} -{"Time":"2025-06-06T14:35:41.954819-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.954799000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 202, \"to\": 204, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3684e2434ca2d7af209296076f008d79cd7391ee98a10af127c3a7f7a8bee4f7\",\"BlockNumber\":202,\"BlockTimestamp\":\"2025-06-06T14:39:00-07:00\",\"FinalizedBlockNumber\":202,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.956573-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.956553000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.956579-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.956562000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [205, 207]}\n"} -{"Time":"2025-06-06T14:35:41.9581-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.958073000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 205, \"to\": 207, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfffa8b533bc97b26258938f6b5d55c227fed37299af23bef9bd76fca14460b21\",\"BlockNumber\":205,\"BlockTimestamp\":\"2025-06-06T14:39:03-07:00\",\"FinalizedBlockNumber\":205,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.960475-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.960461000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:41.960479-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.960469000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [208, 210]}\n"} -{"Time":"2025-06-06T14:35:41.962049-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.962034000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 208, \"to\": 210, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x69bc724e8578a6b39b0a6bc372fe587f59e33cf9cb5953a8a52471cfc1d3e4b3\",\"BlockNumber\":208,\"BlockTimestamp\":\"2025-06-06T14:39:06-07:00\",\"FinalizedBlockNumber\":208,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:41.964737-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.964716000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 211, \"blockHash\": \"0xd442a7084461cfb3a0dc75b678229f05681fb39bd98dd38f3f571e42e03d0ae2\", \"timestamp\": \"14:39:09.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.966463-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.966448000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 212, \"blockHash\": \"0x6673a29219f13c9dde820a6f5782f3f79371a717e2871129958b2414c035a1d2\", \"timestamp\": \"14:39:10.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.967579-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:41.967562000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 213, \"blockHash\": \"0x43c24ddfc18b5639b1c78f13ac51f8e571ff822c6b5ab13213286a29033adeda\", \"timestamp\": \"14:39:11.000000000\"}\n"} -{"Time":"2025-06-06T14:35:41.979333-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:41.979-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 12, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"175-0-0x022c5126e79e6a28045d1d5f1e5254c23be0fb8c14ad58d6b102c7d6d375b661\"}\n"} -{"Time":"2025-06-06T14:35:42.018836-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.018793000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 214}\n"} -{"Time":"2025-06-06T14:35:42.019046-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.019027000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 255, \"finalized\": 253}\n"} -{"Time":"2025-06-06T14:35:42.020281-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.020265000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 214, \"end\": 252}\n"} -{"Time":"2025-06-06T14:35:42.023469-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.023452000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.023474-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.023462000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [214, 216]}\n"} -{"Time":"2025-06-06T14:35:42.025254-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.025224000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 214, \"to\": 216, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x257463f84abb1a42646c1da35e738d309f98175162ff7ecab4ab009107597c39\",\"BlockNumber\":214,\"BlockTimestamp\":\"2025-06-06T14:39:12-07:00\",\"FinalizedBlockNumber\":214,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.028213-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.028-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 1, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"211-0-0xfc21ff9a81ed200a5a75b9f963755ffbc86ccf241a2af27ea4b49d3a29b0fe9f\"}\n"} -{"Time":"2025-06-06T14:35:42.028965-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.028948000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.028971-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.028957000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [217, 219]}\n"} -{"Time":"2025-06-06T14:35:42.030778-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.030759000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 217, \"to\": 219, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfa64f6acd083e08161620071f0e694968f2deb97cb24adfbd8fa9c79b8237a0a\",\"BlockNumber\":217,\"BlockTimestamp\":\"2025-06-06T14:39:15-07:00\",\"FinalizedBlockNumber\":217,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.033911-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.033891000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.033918-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.033907000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [220, 222]}\n"} -{"Time":"2025-06-06T14:35:42.036479-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.036458000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 220, \"to\": 222, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x310b3fc1b6e7827dbe83dfdaf22c07abb03cbccba10a364cc8bef3f90ab1bfd4\",\"BlockNumber\":220,\"BlockTimestamp\":\"2025-06-06T14:39:18-07:00\",\"FinalizedBlockNumber\":220,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.039461-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.039444000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.039465-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.039453000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [225, 223]}\n"} -{"Time":"2025-06-06T14:35:42.041512-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.041489000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 223, \"to\": 225, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xb681d739e3a7f6cf30262892c2523ebd49c88cc5c4b60aa3be068079791cc0fd\",\"BlockNumber\":223,\"BlockTimestamp\":\"2025-06-06T14:39:21-07:00\",\"FinalizedBlockNumber\":223,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.044412-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.044394000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.04442-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.044405000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [228, 226]}\n"} -{"Time":"2025-06-06T14:35:42.046303-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.046281000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 226, \"to\": 228, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf8384f927f95c8d4daa74cc77ccdbb1a552d3bda3222c79505b274ec7e35a04a\",\"BlockNumber\":226,\"BlockTimestamp\":\"2025-06-06T14:39:24-07:00\",\"FinalizedBlockNumber\":226,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.048264-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.048247000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.048268-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.048261000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [229, 231]}\n"} -{"Time":"2025-06-06T14:35:42.050029-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.050006000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 229, \"to\": 231, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x9be2757f7fb2289fef56764a74076b9844b81979b94976585ee6b2ecd3eac4a3\",\"BlockNumber\":229,\"BlockTimestamp\":\"2025-06-06T14:39:27-07:00\",\"FinalizedBlockNumber\":229,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.053318-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.053304000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.053324-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.053312000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [232, 234]}\n"} -{"Time":"2025-06-06T14:35:42.05539-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.055364000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 232, \"to\": 234, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xee55bcfaf17a95b0e246703dd46d6283ed943a3a14e806c813b433dff0b46488\",\"BlockNumber\":232,\"BlockTimestamp\":\"2025-06-06T14:39:30-07:00\",\"FinalizedBlockNumber\":232,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.057641-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.057626000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.057647-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.057634000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [235, 237]}\n"} -{"Time":"2025-06-06T14:35:42.059882-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.059864000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 235, \"to\": 237, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x953dbbae648616a18bf3547e3b67f553cb43ce04c8291f73340c0af4afa3b1b5\",\"BlockNumber\":235,\"BlockTimestamp\":\"2025-06-06T14:39:33-07:00\",\"FinalizedBlockNumber\":235,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.062871-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.062854000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.062875-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.062867000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [238, 240]}\n"} -{"Time":"2025-06-06T14:35:42.064825-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.064806000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 238, \"to\": 240, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x459ca91c784f9e8da5b68117510cf5aaba2be0b088a4071928f4a2d8d8c77a60\",\"BlockNumber\":238,\"BlockTimestamp\":\"2025-06-06T14:39:36-07:00\",\"FinalizedBlockNumber\":238,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.069092-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.069073000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.069098-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.069085000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [241, 243]}\n"} -{"Time":"2025-06-06T14:35:42.070749-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.070733000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 241, \"to\": 243, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x435ca736e0cbbc4011e9397323bbee16eb8cff7e795659558db24211622c9287\",\"BlockNumber\":241,\"BlockTimestamp\":\"2025-06-06T14:39:39-07:00\",\"FinalizedBlockNumber\":241,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.073929-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.073914000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.073934-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.073923000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [244, 246]}\n"} -{"Time":"2025-06-06T14:35:42.075706-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.075686000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 244, \"to\": 246, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe53cef3c88b5547b720996e0fc756430c47f8dbdd457a3a0c575bd44112b6f45\",\"BlockNumber\":244,\"BlockTimestamp\":\"2025-06-06T14:39:42-07:00\",\"FinalizedBlockNumber\":244,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.08003-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.080014000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.080035-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.080024000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [247, 249]}\n"} -{"Time":"2025-06-06T14:35:42.0803-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.080-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 10, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"214-0-0x4fb2ee459d46d27ed8f59082302fc0fdf2c9332997f0da82d726a667336f1d6a\"}\n"} -{"Time":"2025-06-06T14:35:42.081854-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.081833000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 247, \"to\": 249, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xacec713c72d73d66129db37bee82ac13d385e75813afba1316b57b43e2c87c83\",\"BlockNumber\":247,\"BlockTimestamp\":\"2025-06-06T14:39:45-07:00\",\"FinalizedBlockNumber\":247,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.084568-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.084552000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.084573-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.084559000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [250, 252]}\n"} -{"Time":"2025-06-06T14:35:42.086213-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.086194000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 250, \"to\": 252, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcefd20593891e7d77946c4b6654851ed077323ecb1401377dcd105ad6453765f\",\"BlockNumber\":250,\"BlockTimestamp\":\"2025-06-06T14:39:48-07:00\",\"FinalizedBlockNumber\":250,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.089572-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.089551000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 253, \"blockHash\": \"0x7fa9b080cb234280759489a8801fecbd8e589363a7bba2259e79406172bc10a1\", \"timestamp\": \"14:39:51.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.092079-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.092065000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 254, \"blockHash\": \"0xc682779190fb218d49b52f50a45d34d71ec862a052eccfe9036217bdf73468ca\", \"timestamp\": \"14:39:52.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.093382-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.093363000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 255, \"blockHash\": \"0x2031bf18f319b625ddf47bd75fc2eb9d778ee2301db5a673c10113aedf2123b3\", \"timestamp\": \"14:39:53.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.119879-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.119847000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 256}\n"} -{"Time":"2025-06-06T14:35:42.120089-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.120071000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 294, \"finalized\": 292}\n"} -{"Time":"2025-06-06T14:35:42.122471-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.122452000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 256, \"end\": 291}\n"} -{"Time":"2025-06-06T14:35:42.123332-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.123317000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.123336-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.123325000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [256, 258]}\n"} -{"Time":"2025-06-06T14:35:42.125146-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.125124000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 256, \"to\": 258, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x45f7da1d33780b5c639bd6755f959e84cb12f1cd25575a9991a793391f2764c5\",\"BlockNumber\":256,\"BlockTimestamp\":\"2025-06-06T14:39:54-07:00\",\"FinalizedBlockNumber\":256,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.126907-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.126888000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.126913-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.126898000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [259, 261]}\n"} -{"Time":"2025-06-06T14:35:42.127871-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.127-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 4, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"244-0-0xfa7f17ed8c7011f4341339a8146a3f2584987e7985f34b7d1c017d7f7e32e8d5\"}\n"} -{"Time":"2025-06-06T14:35:42.128314-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.128293000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 259, \"to\": 261, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x13e6291dbcd4b66d63836310f1cd8ca20d9ad943b7b45857d57e582edbfb952e\",\"BlockNumber\":259,\"BlockTimestamp\":\"2025-06-06T14:39:57-07:00\",\"FinalizedBlockNumber\":259,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.129273-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.129254000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.12928-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.129268000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [262, 264]}\n"} -{"Time":"2025-06-06T14:35:42.13081-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.130783000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 262, \"to\": 264, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x72a660289a8577af1cde832137060c85637dbb8b95f46f1ea452c4cb4b558574\",\"BlockNumber\":262,\"BlockTimestamp\":\"2025-06-06T14:40:00-07:00\",\"FinalizedBlockNumber\":262,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.131768-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.131744000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.131775-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.131756000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [265, 267]}\n"} -{"Time":"2025-06-06T14:35:42.133007-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.132984000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 265, \"to\": 267, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa115ae8292fbc721ccd7b50eee359a3def01a2428218a1489f5be907d0ac50ab\",\"BlockNumber\":265,\"BlockTimestamp\":\"2025-06-06T14:40:03-07:00\",\"FinalizedBlockNumber\":265,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.133969-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.133944000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.133976-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.133956000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [268, 270]}\n"} -{"Time":"2025-06-06T14:35:42.135562-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.135533000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 268, \"to\": 270, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa78435b74132cd56e3e9f020bbf6e578cab6a17b125a5c094cc91da1af8a1dbd\",\"BlockNumber\":268,\"BlockTimestamp\":\"2025-06-06T14:40:06-07:00\",\"FinalizedBlockNumber\":268,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.136544-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.136522000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.136552-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.136531000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [271, 273]}\n"} -{"Time":"2025-06-06T14:35:42.137822-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.137799000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 271, \"to\": 273, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6b185993a7c4ac5a235b6fe4b955dd40435f1d7f8d0d16f671266eb0d0d1eace\",\"BlockNumber\":271,\"BlockTimestamp\":\"2025-06-06T14:40:09-07:00\",\"FinalizedBlockNumber\":271,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.138746-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.138729000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.13876-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.138741000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [274, 276]}\n"} -{"Time":"2025-06-06T14:35:42.140049-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.140023000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 274, \"to\": 276, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x490cfbbeceecc1f69d04c76fce6af5755c191e0a2c66a5507635141d72f3189a\",\"BlockNumber\":274,\"BlockTimestamp\":\"2025-06-06T14:40:12-07:00\",\"FinalizedBlockNumber\":274,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.141079-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.141054000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.141087-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.141062000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [277, 279]}\n"} -{"Time":"2025-06-06T14:35:42.142616-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.142590000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 277, \"to\": 279, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x02d5ac1880671bfcc9a47c7cb1ac55b4d8580f20a2b3f3379d8bd926088e30ec\",\"BlockNumber\":277,\"BlockTimestamp\":\"2025-06-06T14:40:15-07:00\",\"FinalizedBlockNumber\":277,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.143883-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.143864000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.143889-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.143878000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [280, 282]}\n"} -{"Time":"2025-06-06T14:35:42.145175-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.145159000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 280, \"to\": 282, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfe1b2f2f7252a7b5cddfb13d331d677921904b64677ca1a2c9368f9030dd6a62\",\"BlockNumber\":280,\"BlockTimestamp\":\"2025-06-06T14:40:18-07:00\",\"FinalizedBlockNumber\":280,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.146363-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.146340000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.146368-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.146355000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [283, 285]}\n"} -{"Time":"2025-06-06T14:35:42.147703-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.147682000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 283, \"to\": 285, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe26270d44837021f006cc570a5a0a6455637ab7ca7dae3881daed38395079c91\",\"BlockNumber\":283,\"BlockTimestamp\":\"2025-06-06T14:40:21-07:00\",\"FinalizedBlockNumber\":283,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.148714-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.148692000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.148725-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.148703000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [286, 288]}\n"} -{"Time":"2025-06-06T14:35:42.150113-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.150089000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 286, \"to\": 288, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x9a685b9ec82caf08503dfae8ba357870d94ff127ef06857d81bdfedb41f7aef8\",\"BlockNumber\":286,\"BlockTimestamp\":\"2025-06-06T14:40:24-07:00\",\"FinalizedBlockNumber\":286,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.151076-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.151058000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.151083-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.151068000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [289, 291]}\n"} -{"Time":"2025-06-06T14:35:42.152382-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.152358000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 289, \"to\": 291, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x16b82a7315d1a9033a1f6cfcaf6d54f7564f194f21bee1d35262ca37263166a7\",\"BlockNumber\":289,\"BlockTimestamp\":\"2025-06-06T14:40:27-07:00\",\"FinalizedBlockNumber\":289,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.154606-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.154330000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 292, \"blockHash\": \"0x997568452f1dbfa5fb6179c4c577135b7df7246e5773ceca361e19134e6b3ccd\", \"timestamp\": \"14:40:30.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.156928-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.156773000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 293, \"blockHash\": \"0x902ebc7c526440da91f6e606bc82902266de8e0aa54acae6f7c8f3f1c4acf6b7\", \"timestamp\": \"14:40:31.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.158751-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.158664000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 294, \"blockHash\": \"0x5f75b343151eec7b0cc6dbae64148174a1e89b1b428cd0c915750ef7d03a47a7\", \"timestamp\": \"14:40:32.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.178472-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.178-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 12, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"256-0-0x1b20d97cf24b7039d49f49bc00e1cb8f942f121f657b45f541f1fa51aa32d811\"}\n"} -{"Time":"2025-06-06T14:35:42.211477-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.211429000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 295}\n"} -{"Time":"2025-06-06T14:35:42.211693-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.211674000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 330, \"finalized\": 328}\n"} -{"Time":"2025-06-06T14:35:42.212068-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.212054000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 295, \"end\": 327}\n"} -{"Time":"2025-06-06T14:35:42.212591-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.212557000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.212603-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.212573000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [295, 297]}\n"} -{"Time":"2025-06-06T14:35:42.214068-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.214036000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 295, \"to\": 297, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x50d082f86318b8e0157d513640beef76584d4e838cbd4bd6c53c5d12f6a5f02c\",\"BlockNumber\":295,\"BlockTimestamp\":\"2025-06-06T14:40:33-07:00\",\"FinalizedBlockNumber\":295,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.215398-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.215375000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.215404-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.215388000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [298, 300]}\n"} -{"Time":"2025-06-06T14:35:42.216816-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.216793000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 298, \"to\": 300, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfe67cffbe5baeda52c843aec129c54e6492488db64c9c3df75d3bdd3eb463fdb\",\"BlockNumber\":298,\"BlockTimestamp\":\"2025-06-06T14:40:36-07:00\",\"FinalizedBlockNumber\":298,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.218145-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.218114000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.218152-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.218140000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [301, 303]}\n"} -{"Time":"2025-06-06T14:35:42.219611-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.219583000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 301, \"to\": 303, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x32003f2b599091c6fc4123ea6d366fa6908aa83ea83d4a62d742788c9dea6152\",\"BlockNumber\":301,\"BlockTimestamp\":\"2025-06-06T14:40:39-07:00\",\"FinalizedBlockNumber\":301,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.220765-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.220738000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.220772-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.220753000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [304, 306]}\n"} -{"Time":"2025-06-06T14:35:42.222153-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.222121000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 304, \"to\": 306, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x840d1ff9391fb6e14c543637b58bc83ace543f1aa1fd0eb00df1b97a527d426b\",\"BlockNumber\":304,\"BlockTimestamp\":\"2025-06-06T14:40:42-07:00\",\"FinalizedBlockNumber\":304,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.223177-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.223154000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.223187-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.223165000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [307, 309]}\n"} -{"Time":"2025-06-06T14:35:42.22456-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.224539000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 307, \"to\": 309, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x89b328b43788c404b6935248c8e641befc674909c01c3c2db0543721350c1702\",\"BlockNumber\":307,\"BlockTimestamp\":\"2025-06-06T14:40:45-07:00\",\"FinalizedBlockNumber\":307,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.225822-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.225787000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.225827-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.225808000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [310, 312]}\n"} -{"Time":"2025-06-06T14:35:42.227158-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.227131000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 310, \"to\": 312, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x62d54c15389623e104580e99e9184156221819513479fe0bdffa710297081221\",\"BlockNumber\":310,\"BlockTimestamp\":\"2025-06-06T14:40:48-07:00\",\"FinalizedBlockNumber\":310,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.228495-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.228-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 5, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"292-0-0xed5d77321de0f0e42e39e910a45ffb363d07d95b9f707194e8efc4491ceed0d2\"}\n"} -{"Time":"2025-06-06T14:35:42.228914-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.228886000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.228924-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.228897000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [313, 315]}\n"} -{"Time":"2025-06-06T14:35:42.231255-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.231213000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 313, \"to\": 315, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x495b0a3c44a4d4bdab35d8eac6ac06070f1ccdcfebd7948e1e47e3cffcf8e3e6\",\"BlockNumber\":313,\"BlockTimestamp\":\"2025-06-06T14:40:51-07:00\",\"FinalizedBlockNumber\":313,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.234285-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.234224000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.234305-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.234266000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [316, 318]}\n"} -{"Time":"2025-06-06T14:35:42.236699-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.236629000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 316, \"to\": 318, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x7366bf30170ff6e69c2d4dae9283463bc79167111165a0aa73a9865fc76bcfe4\",\"BlockNumber\":316,\"BlockTimestamp\":\"2025-06-06T14:40:54-07:00\",\"FinalizedBlockNumber\":316,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.238834-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.238802000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.238852-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.238819000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [319, 321]}\n"} -{"Time":"2025-06-06T14:35:42.24014-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.240113000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 319, \"to\": 321, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x53890d0744c8d592d01512372045bd53f0e85a50886150f862552dfff462bedd\",\"BlockNumber\":319,\"BlockTimestamp\":\"2025-06-06T14:40:57-07:00\",\"FinalizedBlockNumber\":319,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.241324-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.241302000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.241335-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.241315000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [322, 324]}\n"} -{"Time":"2025-06-06T14:35:42.242687-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.242665000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 322, \"to\": 324, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xb939f924d0e598163baac4da4f9ea00e8e3e8a088516e7c30dfe2baa2d3178fe\",\"BlockNumber\":322,\"BlockTimestamp\":\"2025-06-06T14:41:00-07:00\",\"FinalizedBlockNumber\":322,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.243632-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.243614000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.24364-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.243624000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [327, 325]}\n"} -{"Time":"2025-06-06T14:35:42.244925-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.244904000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 325, \"to\": 327, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x978c474088819e41ae09e05d885bbf3abe6dcf088cb29ec3598242b38b8b6bf1\",\"BlockNumber\":325,\"BlockTimestamp\":\"2025-06-06T14:41:03-07:00\",\"FinalizedBlockNumber\":325,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.246033-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.246013000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 328, \"blockHash\": \"0xef49b7c0e906bd05647b290e0adb7ea2c03b3a24fa66c6faaaeed8fec018c088\", \"timestamp\": \"14:41:06.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.247232-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.247197000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 329, \"blockHash\": \"0x8e630124e36803e69341990d3fc28613a3830f7d7c230fb2e4e4ca2fa1d59a7e\", \"timestamp\": \"14:41:07.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.248554-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.248319000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 330, \"blockHash\": \"0x9c9e35540187129e81c7be780d1cf3470ed16b71abb6da101d5d1d99edf3724e\", \"timestamp\": \"14:41:08.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.278159-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.278-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 7, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"307-0-0x458cfda9ac4a48eff2026e384e0958704d2ba25e9e3535b42c8cdbaacf746357\"}\n"} -{"Time":"2025-06-06T14:35:42.32038-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.320336000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 331}\n"} -{"Time":"2025-06-06T14:35:42.320734-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.320711000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 372, \"finalized\": 370}\n"} -{"Time":"2025-06-06T14:35:42.32124-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.321220000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 331, \"end\": 369}\n"} -{"Time":"2025-06-06T14:35:42.321701-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.321686000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.321707-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.321697000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [331, 333]}\n"} -{"Time":"2025-06-06T14:35:42.323067-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.323032000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 331, \"to\": 333, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x0b5719f56a3405ffa184d4ae93dc3974e7cfc369539b05f4041ab0d612c692ee\",\"BlockNumber\":331,\"BlockTimestamp\":\"2025-06-06T14:41:09-07:00\",\"FinalizedBlockNumber\":331,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.324193-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.324173000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.324204-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.324185000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [334, 336]}\n"} -{"Time":"2025-06-06T14:35:42.325581-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.325558000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 334, \"to\": 336, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x822695344ec927b4d3763457dd873e790b644d0f55ce0d6c047bf284d0daf868\",\"BlockNumber\":334,\"BlockTimestamp\":\"2025-06-06T14:41:12-07:00\",\"FinalizedBlockNumber\":334,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.326619-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.326603000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.326624-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.326612000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [337, 339]}\n"} -{"Time":"2025-06-06T14:35:42.327698-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.327-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 2, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"328-0-0x63b69416d6912372c01f70d0933162a40af759ada80f939a07e9080a9195605e\"}\n"} -{"Time":"2025-06-06T14:35:42.327955-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.327938000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 337, \"to\": 339, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xed92f36fbdae29fefca933484552292be355fb0ebdec635342b82eda3993c5e6\",\"BlockNumber\":337,\"BlockTimestamp\":\"2025-06-06T14:41:15-07:00\",\"FinalizedBlockNumber\":337,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.328863-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.328849000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.328875-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.328858000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [340, 342]}\n"} -{"Time":"2025-06-06T14:35:42.330176-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.330156000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 340, \"to\": 342, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x1b0f780e8680e42c5b24d300044e8844d2fe0964001b1c6ee360a9ebfb3400e0\",\"BlockNumber\":340,\"BlockTimestamp\":\"2025-06-06T14:41:18-07:00\",\"FinalizedBlockNumber\":340,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.331121-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.331106000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.331127-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.331115000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [343, 345]}\n"} -{"Time":"2025-06-06T14:35:42.332424-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.332382000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 343, \"to\": 345, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x410c27cb79b34478aa15c3a07c537718ac21a85d9a56cc0959ae162ad3c8bd43\",\"BlockNumber\":343,\"BlockTimestamp\":\"2025-06-06T14:41:21-07:00\",\"FinalizedBlockNumber\":343,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.33351-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.333483000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.333528-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.333501000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [346, 348]}\n"} -{"Time":"2025-06-06T14:35:42.33497-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.334948000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 346, \"to\": 348, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf97f7d97294444e5774a3823204b8f209b744b10868a298da0222020888ebe50\",\"BlockNumber\":346,\"BlockTimestamp\":\"2025-06-06T14:41:24-07:00\",\"FinalizedBlockNumber\":346,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.336031-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.336014000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.33604-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.336026000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [349, 351]}\n"} -{"Time":"2025-06-06T14:35:42.337454-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.337437000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 349, \"to\": 351, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe27b8a9415ef7552e4c86231d40a898a7677e0f35c9a369dcc0db3ec074c5087\",\"BlockNumber\":349,\"BlockTimestamp\":\"2025-06-06T14:41:27-07:00\",\"FinalizedBlockNumber\":349,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.338543-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.338527000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.338547-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.338535000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [354, 352]}\n"} -{"Time":"2025-06-06T14:35:42.339959-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.339941000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 352, \"to\": 354, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x96d523cfaa833bf673711ad0e50417dea4cb32717e48fe3ae0f204b19d50253b\",\"BlockNumber\":352,\"BlockTimestamp\":\"2025-06-06T14:41:30-07:00\",\"FinalizedBlockNumber\":352,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.341012-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.340994000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.341017-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.341004000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [355, 357]}\n"} -{"Time":"2025-06-06T14:35:42.342431-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.342412000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 355, \"to\": 357, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x0046d5860915762a5e7b48bc09d3ad7fcebb061824fb6329c4c43d9cb3899023\",\"BlockNumber\":355,\"BlockTimestamp\":\"2025-06-06T14:41:33-07:00\",\"FinalizedBlockNumber\":355,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.343489-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.343474000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.343497-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.343483000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [358, 360]}\n"} -{"Time":"2025-06-06T14:35:42.344862-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.344844000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 358, \"to\": 360, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x38fd2e51fdbc376e6572a1a34185fac08388c29dd4807f26b0f13ae3398044ba\",\"BlockNumber\":358,\"BlockTimestamp\":\"2025-06-06T14:41:36-07:00\",\"FinalizedBlockNumber\":358,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.345699-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.345683000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.345705-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.345692000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [361, 363]}\n"} -{"Time":"2025-06-06T14:35:42.347063-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.347044000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 361, \"to\": 363, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf7ced3dc8d4a0b27df526e630bcc06cc33f67eb5fb247695a8ca9e6dc7400b1c\",\"BlockNumber\":361,\"BlockTimestamp\":\"2025-06-06T14:41:39-07:00\",\"FinalizedBlockNumber\":361,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.348046-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.348025000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.348051-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.348039000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [364, 366]}\n"} -{"Time":"2025-06-06T14:35:42.349412-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.349396000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 364, \"to\": 366, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x023e5dd4fb999061ef4522594a628b230903f93be4fdb7eed70ab6f3c9668add\",\"BlockNumber\":364,\"BlockTimestamp\":\"2025-06-06T14:41:42-07:00\",\"FinalizedBlockNumber\":364,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.350371-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.350355000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.350376-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.350367000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [367, 369]}\n"} -{"Time":"2025-06-06T14:35:42.351745-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.351727000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 367, \"to\": 369, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x07571c17a79be376ceabdc1d3ba491f384f960751edad0c1c39a63afec593c8c\",\"BlockNumber\":367,\"BlockTimestamp\":\"2025-06-06T14:41:45-07:00\",\"FinalizedBlockNumber\":367,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.352896-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.352875000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 370, \"blockHash\": \"0xc13febc601fe3fce5bbdcca0abcf4044612b447a031797bc8585f5f5433abbe2\", \"timestamp\": \"14:41:48.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.353858-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.353836000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 371, \"blockHash\": \"0x5d27b85e2f8b473a6f662314ebfae794d71f6c631417704fc4bf9bdba701d24b\", \"timestamp\": \"14:41:49.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.354556-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.354542000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 372, \"blockHash\": \"0x4084bffbccbf92df3f340ac275c424724db8491959030f7314ff72e073b0d7ff\", \"timestamp\": \"14:41:50.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.37837-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.378-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 12, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"334-0-0x486418f9b1aab4cb3d44920408c27a9d2f39a79f23e5fd736d83fa71993bf525\"}\n"} -{"Time":"2025-06-06T14:35:42.418004-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.417971000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 373}\n"} -{"Time":"2025-06-06T14:35:42.418223-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.418195000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 406, \"finalized\": 404}\n"} -{"Time":"2025-06-06T14:35:42.418613-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.418590000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 373, \"end\": 403}\n"} -{"Time":"2025-06-06T14:35:42.419344-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.419322000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.41935-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.419334000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [373, 375]}\n"} -{"Time":"2025-06-06T14:35:42.420783-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.420748000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 373, \"to\": 375, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x1ca9009e5ebf98780d8b1d495c8cac66afc65057d882d006f00fe36aacfecabc\",\"BlockNumber\":373,\"BlockTimestamp\":\"2025-06-06T14:41:51-07:00\",\"FinalizedBlockNumber\":373,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.421943-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.421918000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.42195-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.421930000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [376, 378]}\n"} -{"Time":"2025-06-06T14:35:42.423271-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.423248000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 376, \"to\": 378, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6a2cf2bfa0ec19392d0b84820ec1934c483abafb7d7501a97f557612b9d75462\",\"BlockNumber\":376,\"BlockTimestamp\":\"2025-06-06T14:41:54-07:00\",\"FinalizedBlockNumber\":376,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.424171-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.424157000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.424177-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.424165000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [379, 381]}\n"} -{"Time":"2025-06-06T14:35:42.425555-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.425530000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 379, \"to\": 381, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xea7b3b1b329487de5aec52862f83fb0832598279f077b2887f836ee85b03e214\",\"BlockNumber\":379,\"BlockTimestamp\":\"2025-06-06T14:41:57-07:00\",\"FinalizedBlockNumber\":379,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.426708-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.426682000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.426715-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.426693000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [382, 384]}\n"} -{"Time":"2025-06-06T14:35:42.427706-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.427-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 3, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"370-0-0xb05114cd867739e9c46730160b362e21c97a2ebc52d185ebb82414399d7d4416\"}\n"} -{"Time":"2025-06-06T14:35:42.428114-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.428094000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 382, \"to\": 384, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x678f1d8ed52e4b0b99f50dfaa90e4571b94b66abda32a61f89f887b7fa539190\",\"BlockNumber\":382,\"BlockTimestamp\":\"2025-06-06T14:42:00-07:00\",\"FinalizedBlockNumber\":382,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.42918-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.429156000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.429186-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.429165000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [385, 387]}\n"} -{"Time":"2025-06-06T14:35:42.430798-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.430777000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 385, \"to\": 387, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd927599a1af8d7f2ff97f46f69cf653707dd7d85c6ba3a0775e17c018e3b5a52\",\"BlockNumber\":385,\"BlockTimestamp\":\"2025-06-06T14:42:03-07:00\",\"FinalizedBlockNumber\":385,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.43182-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.431804000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.431825-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.431813000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [388, 390]}\n"} -{"Time":"2025-06-06T14:35:42.43314-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.433118000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 388, \"to\": 390, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2d3cbd68bc3c649829c4a3f3038643b87e76a767897c79d9ca82b214bce240e4\",\"BlockNumber\":388,\"BlockTimestamp\":\"2025-06-06T14:42:06-07:00\",\"FinalizedBlockNumber\":388,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.434109-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.434098000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.43412-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.434106000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [391, 393]}\n"} -{"Time":"2025-06-06T14:35:42.435801-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.435775000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 391, \"to\": 393, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc594e574a1602725f039742554db85257a97988b1b469b3f8251b1b81ca441b7\",\"BlockNumber\":391,\"BlockTimestamp\":\"2025-06-06T14:42:09-07:00\",\"FinalizedBlockNumber\":391,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.436761-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.436746000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.436766-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.436755000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [394, 396]}\n"} -{"Time":"2025-06-06T14:35:42.438094-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.438068000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 394, \"to\": 396, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5fa44c14707a15cc189133d68c29c1189469a88ea6f79d406ba3994999386b30\",\"BlockNumber\":394,\"BlockTimestamp\":\"2025-06-06T14:42:12-07:00\",\"FinalizedBlockNumber\":394,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.439016-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.438998000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.43902-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.439008000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [397, 399]}\n"} -{"Time":"2025-06-06T14:35:42.440374-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.440354000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 397, \"to\": 399, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xedeb1795c526dfb55214b58384da10d763f3a5ee14ffa2bfdc70d60ad9c99ace\",\"BlockNumber\":397,\"BlockTimestamp\":\"2025-06-06T14:42:15-07:00\",\"FinalizedBlockNumber\":397,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.44129-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.441273000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.441298-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.441283000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [400, 402]}\n"} -{"Time":"2025-06-06T14:35:42.442979-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.442957000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 400, \"to\": 402, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x24527a4388840b877c6852d2b39447eed77ae3fffc19fa338a390fc494db9f4a\",\"BlockNumber\":400,\"BlockTimestamp\":\"2025-06-06T14:42:18-07:00\",\"FinalizedBlockNumber\":400,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.444027-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.444012000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.444032-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.444024000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [403]}\n"} -{"Time":"2025-06-06T14:35:42.444836-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.444815000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 403, \"to\": 403, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x84c9e0a3fc0c8f258d68ea7f036a48b4204446d46fdae5193f8a2be1c544612e\",\"BlockNumber\":403,\"BlockTimestamp\":\"2025-06-06T14:42:21-07:00\",\"FinalizedBlockNumber\":403,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.445851-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.445828000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 404, \"blockHash\": \"0x458ad5e4a1849d37c3067b59694a8c6841947540d76b98a3ecc851d79e767048\", \"timestamp\": \"14:42:22.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.446491-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.446474000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 405, \"blockHash\": \"0xac0a7e51566ad9ecbaeceabeedf987ea61d9704ffe5b41b9661cb0063e464bdd\", \"timestamp\": \"14:42:23.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.447141-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.447123000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 406, \"blockHash\": \"0xb35a0b7bf02c3b9e56a5536ac0f0ee7dfe93439f5726c45654d6f5a76baf0abf\", \"timestamp\": \"14:42:24.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.478028-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.477-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"379-0-0xcd2f57580b4549d223392971e3c6ec3b4463073fd02469be791431472386b72d\"}\n"} -{"Time":"2025-06-06T14:35:42.51554-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.515507000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 407}\n"} -{"Time":"2025-06-06T14:35:42.515738-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.515714000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 445, \"finalized\": 443}\n"} -{"Time":"2025-06-06T14:35:42.516306-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.516283000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 407, \"end\": 442}\n"} -{"Time":"2025-06-06T14:35:42.516955-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.516934000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.516963-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.516947000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [409]}\n"} -{"Time":"2025-06-06T14:35:42.518178-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.518154000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 407, \"to\": 409, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5cb8de0938726b6831435cbfd47aeda982ccc21ba78969f8f0a4e8f20c48038d\",\"BlockNumber\":409,\"BlockTimestamp\":\"2025-06-06T14:42:27-07:00\",\"FinalizedBlockNumber\":409,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.520112-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.520097000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.520117-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.520105000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [412]}\n"} -{"Time":"2025-06-06T14:35:42.521159-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.521143000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 410, \"to\": 412, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6b91309a932f013e1a8eae4f8ca2a1466c11cc7b6183271c52768fd6662258dc\",\"BlockNumber\":412,\"BlockTimestamp\":\"2025-06-06T14:42:30-07:00\",\"FinalizedBlockNumber\":412,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.522809-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.522791000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.522813-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.522800000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [415]}\n"} -{"Time":"2025-06-06T14:35:42.523935-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.523915000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 413, \"to\": 415, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x75c7bea7afe5defd2019681e3652d0335de03f4af977a8d678a2e889f119cc49\",\"BlockNumber\":415,\"BlockTimestamp\":\"2025-06-06T14:42:33-07:00\",\"FinalizedBlockNumber\":415,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.525833-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.525820000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.525839-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.525827000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [418]}\n"} -{"Time":"2025-06-06T14:35:42.527015-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.526999000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 416, \"to\": 418, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd841c05047a76bfa4525ef49a9faa97a5615df99cec189742e8f0e51708c170d\",\"BlockNumber\":418,\"BlockTimestamp\":\"2025-06-06T14:42:36-07:00\",\"FinalizedBlockNumber\":418,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.530253-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.530233000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.53026-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.530243000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [421]}\n"} -{"Time":"2025-06-06T14:35:42.530398-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.530-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 5, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"403-0-0x1a1c758d765a4c05b6fc55022ef5aa4845dfb21dd33432a75976946adc7f125c\"}\n"} -{"Time":"2025-06-06T14:35:42.531596-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.531574000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 419, \"to\": 421, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd52a753edba2a6d7b471b8c0a565803e9e5455ebedd87f886c0c97436d8dcb2c\",\"BlockNumber\":421,\"BlockTimestamp\":\"2025-06-06T14:42:39-07:00\",\"FinalizedBlockNumber\":421,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.533235-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.533220000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.53324-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.533231000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [424]}\n"} -{"Time":"2025-06-06T14:35:42.534287-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.534263000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 422, \"to\": 424, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x521c2d2c3a3d07c9f92e42850615dbfa2b430a034dee7db73ecc6fa10f3119e0\",\"BlockNumber\":424,\"BlockTimestamp\":\"2025-06-06T14:42:42-07:00\",\"FinalizedBlockNumber\":424,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.535955-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.535934000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.535959-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.535944000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [427]}\n"} -{"Time":"2025-06-06T14:35:42.537174-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.537155000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 425, \"to\": 427, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x17ed27268e292b25412e2b342c3a78bc520396c06cc08cf185a6c30720e71c74\",\"BlockNumber\":427,\"BlockTimestamp\":\"2025-06-06T14:42:45-07:00\",\"FinalizedBlockNumber\":427,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.5389-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.538886000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.538906-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.538894000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [430]}\n"} -{"Time":"2025-06-06T14:35:42.540248-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.540232000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 428, \"to\": 430, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6d5cb5020b84c9cb8d1fcf2712cbbb37068795027a7cd76c83fe79c75f6f6985\",\"BlockNumber\":430,\"BlockTimestamp\":\"2025-06-06T14:42:48-07:00\",\"FinalizedBlockNumber\":430,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.541901-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.541885000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.541905-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.541895000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [433]}\n"} -{"Time":"2025-06-06T14:35:42.542975-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.542953000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 431, \"to\": 433, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x657eb2fb58349574868723cdb1a7dc87c205d55a5512e7ac8df411938cd2a484\",\"BlockNumber\":433,\"BlockTimestamp\":\"2025-06-06T14:42:51-07:00\",\"FinalizedBlockNumber\":433,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.544773-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.544752000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.54478-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.544762000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [436]}\n"} -{"Time":"2025-06-06T14:35:42.545972-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.545936000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 434, \"to\": 436, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa4ce2e2b56c9d172840cb7b01272223e860e59ba5941cbb6398c35b72c6bda87\",\"BlockNumber\":436,\"BlockTimestamp\":\"2025-06-06T14:42:54-07:00\",\"FinalizedBlockNumber\":436,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.547683-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.547658000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.547703-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.547669000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [439]}\n"} -{"Time":"2025-06-06T14:35:42.548798-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.548775000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 437, \"to\": 439, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x931fa819b5dcaefbbc7e2e635bb66a1e17a9ca0b072f94fc516c4bbec8551323\",\"BlockNumber\":439,\"BlockTimestamp\":\"2025-06-06T14:42:57-07:00\",\"FinalizedBlockNumber\":439,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.550473-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.550458000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.550481-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.550468000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [442]}\n"} -{"Time":"2025-06-06T14:35:42.55164-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.551617000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 440, \"to\": 442, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc53d426b181a5de518c52b5c66e8ae78c19b3e7ebf4300148ddcaf3d9193ad87\",\"BlockNumber\":442,\"BlockTimestamp\":\"2025-06-06T14:43:00-07:00\",\"FinalizedBlockNumber\":442,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.553496-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.553474000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 443, \"blockHash\": \"0xec766c7baba423884493aa92d9869ae049f1bf931ee98d7e5057c041ed501cb3\", \"timestamp\": \"14:43:01.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.554751-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.554736000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 444, \"blockHash\": \"0xa1cda24ea8ee4b0ffc77d661f2f6ea64a1817ffde0b605d2005c0bec111c2488\", \"timestamp\": \"14:43:02.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.555856-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.555831000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 445, \"blockHash\": \"0x4bfbe43431386bde76dc4672b4d7f17d62565e93992eea545b23f079ec03a6fc\", \"timestamp\": \"14:43:03.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.579405-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.579-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"418-0-0x96f0bda509ec8f8b3af2af62079f4b8aeaf656372bc0e1e4f786668bef952c53\"}\n"} -{"Time":"2025-06-06T14:35:42.611783-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.611672000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 446}\n"} -{"Time":"2025-06-06T14:35:42.61254-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.612341000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 480, \"finalized\": 478}\n"} -{"Time":"2025-06-06T14:35:42.613638-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.613581000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 446, \"end\": 477}\n"} -{"Time":"2025-06-06T14:35:42.614804-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.614744000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.614835-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.614772000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [448]}\n"} -{"Time":"2025-06-06T14:35:42.617521-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.617467000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 446, \"to\": 448, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe6f51243f077ad548d6ba0d9850580a4277f62a1c72f4142a38cc07f2ded4199\",\"BlockNumber\":448,\"BlockTimestamp\":\"2025-06-06T14:43:06-07:00\",\"FinalizedBlockNumber\":448,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.620525-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.620437000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.620547-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.620506000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [451]}\n"} -{"Time":"2025-06-06T14:35:42.622721-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.622677000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 449, \"to\": 451, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x69cf1fa189982694c1588e56e04b3e8565b8f4e8cec0901e8c16e6c33b14d035\",\"BlockNumber\":451,\"BlockTimestamp\":\"2025-06-06T14:43:09-07:00\",\"FinalizedBlockNumber\":451,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.624395-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.624365000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.624403-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.624385000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [454]}\n"} -{"Time":"2025-06-06T14:35:42.626907-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.626875000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 452, \"to\": 454, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6828b4b27f5e8f7bafa4738416bf6d855e7db0e9edd14b9b5168093311dc4380\",\"BlockNumber\":454,\"BlockTimestamp\":\"2025-06-06T14:43:12-07:00\",\"FinalizedBlockNumber\":454,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.629878-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.629851000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.629886-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.629865000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [457]}\n"} -{"Time":"2025-06-06T14:35:42.630025-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.629-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 4, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"442-0-0xd2fd7993c77d1346442126be77fed867acd18db731e4dfe67a1a05cfc672fe85\"}\n"} -{"Time":"2025-06-06T14:35:42.631001-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.630974000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 455, \"to\": 457, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe2eff5ba318f53a6dbfd6dc5b8c4c79430607c66122c36d9efc0f06495705fc6\",\"BlockNumber\":457,\"BlockTimestamp\":\"2025-06-06T14:43:15-07:00\",\"FinalizedBlockNumber\":457,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.632517-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.632467000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.632553-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.632481000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [460]}\n"} -{"Time":"2025-06-06T14:35:42.633539-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.633513000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 458, \"to\": 460, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfa7ef151ee42d5f225d5f7e370b337e8de602d315f35cfa459cafe7a4ac96ae4\",\"BlockNumber\":460,\"BlockTimestamp\":\"2025-06-06T14:43:18-07:00\",\"FinalizedBlockNumber\":460,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.635231-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.635205000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.635237-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.635220000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [463]}\n"} -{"Time":"2025-06-06T14:35:42.636529-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.636499000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 461, \"to\": 463, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa19a43d12831e5a72878154e0230b00b200c6f72b1ba835231aa5a9c2c8a6824\",\"BlockNumber\":463,\"BlockTimestamp\":\"2025-06-06T14:43:21-07:00\",\"FinalizedBlockNumber\":463,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.637886-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.637868000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.637892-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.637877000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [466]}\n"} -{"Time":"2025-06-06T14:35:42.638952-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.638926000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 464, \"to\": 466, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa36b282eaf744fb85d6f48e85a4f1f4dc1c469b426e39373dece35f06214c67c\",\"BlockNumber\":466,\"BlockTimestamp\":\"2025-06-06T14:43:24-07:00\",\"FinalizedBlockNumber\":466,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.640493-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.640471000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.640501-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.640482000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [469]}\n"} -{"Time":"2025-06-06T14:35:42.641673-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.641643000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 467, \"to\": 469, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x93f562003eb2bc9e41ea0525a0e1eeac5891c0ba6d403cdb096493a5ca3409a7\",\"BlockNumber\":469,\"BlockTimestamp\":\"2025-06-06T14:43:27-07:00\",\"FinalizedBlockNumber\":469,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.643143-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.643127000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.643148-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.643138000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [472]}\n"} -{"Time":"2025-06-06T14:35:42.644136-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.644103000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 470, \"to\": 472, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2c28127d9765d3c71e5257f42d4d764f177f93c3a4660f547457da5e6b2e49bd\",\"BlockNumber\":472,\"BlockTimestamp\":\"2025-06-06T14:43:30-07:00\",\"FinalizedBlockNumber\":472,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.645744-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.645726000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.64575-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.645737000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [475]}\n"} -{"Time":"2025-06-06T14:35:42.646769-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.646744000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 473, \"to\": 475, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd60ae7d6ec59503526305d59160a3612378bb341d94627ce77120f7f19531ec1\",\"BlockNumber\":475,\"BlockTimestamp\":\"2025-06-06T14:43:33-07:00\",\"FinalizedBlockNumber\":475,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.648931-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.648916000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 478}\n"} -{"Time":"2025-06-06T14:35:42.649044-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.649025000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 478, \"blockHash\": \"0x9a78d6b10b30ec2cb33d242e558b6a0a9b3abd4c67b1bb9d31bb36960dd57f0f\", \"timestamp\": \"14:43:36.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.651543-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.651524000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 479, \"blockHash\": \"0x8380ea215fcf525eeb55ac37793b5c53a8f98072f6d9a15482e564814a461cbc\", \"timestamp\": \"14:43:37.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.652645-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.652625000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 480, \"blockHash\": \"0xbcb313dba9e5afd180e05390ad9358ea68b75e4e9761a92b1e00ea265617372e\", \"timestamp\": \"14:43:38.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.67924-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.679-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"454-0-0x592233375491d70bfc03bbd726f929c513453085320074cd04da97209a0f3a7a\"}\n"} -{"Time":"2025-06-06T14:35:42.71699-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.716947000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 481}\n"} -{"Time":"2025-06-06T14:35:42.717202-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.717175000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 515, \"finalized\": 513}\n"} -{"Time":"2025-06-06T14:35:42.717912-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.717893000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 481, \"end\": 512}\n"} -{"Time":"2025-06-06T14:35:42.71898-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.718955000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.718986-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.718965000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [481, 483]}\n"} -{"Time":"2025-06-06T14:35:42.721361-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.721336000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 481, \"to\": 483, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x516f4d2a56a482de8e60d7a797b2feffbe3f948b8c26e6cc2c89c6c446072597\",\"BlockNumber\":481,\"BlockTimestamp\":\"2025-06-06T14:43:39-07:00\",\"FinalizedBlockNumber\":481,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.724403-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.724376000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.72441-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.724393000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [484, 486]}\n"} -{"Time":"2025-06-06T14:35:42.72661-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.726589000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 484, \"to\": 486, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x69465657e06ba0d8681ea5f59eb0ad8074e563c5b6aad766cc676ce791b6de63\",\"BlockNumber\":484,\"BlockTimestamp\":\"2025-06-06T14:43:42-07:00\",\"FinalizedBlockNumber\":484,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.732412-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.732394000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.732417-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.732406000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [487, 489]}\n"} -{"Time":"2025-06-06T14:35:42.732503-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.732-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 2, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"478-0-0xe01b2bb20aad00dbbd0d38a725aa8702678c516788deeb3824ae1184f757dcf3\"}\n"} -{"Time":"2025-06-06T14:35:42.734562-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.734540000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 487, \"to\": 489, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x57a22cfd1d3f57634cb9d66ff4a044fd923ca741d627d161bfc6c1c23eda7762\",\"BlockNumber\":487,\"BlockTimestamp\":\"2025-06-06T14:43:45-07:00\",\"FinalizedBlockNumber\":487,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.737144-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.737127000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.737163-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.737137000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [490, 492]}\n"} -{"Time":"2025-06-06T14:35:42.738675-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.738653000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 490, \"to\": 492, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x7a23072502c8cbecf4a52fd0023aa1730be733dd3465fb818bc9c8b1a0c32193\",\"BlockNumber\":490,\"BlockTimestamp\":\"2025-06-06T14:43:48-07:00\",\"FinalizedBlockNumber\":490,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.740122-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.740108000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.740145-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.740127000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [493, 495]}\n"} -{"Time":"2025-06-06T14:35:42.741762-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.741740000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 493, \"to\": 495, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6ea72761998bb5c9f371c32cfded2089932dc5854f83b8272cd31b22e7838ab1\",\"BlockNumber\":493,\"BlockTimestamp\":\"2025-06-06T14:43:51-07:00\",\"FinalizedBlockNumber\":493,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.743389-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.743373000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.743393-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.743382000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [496, 498]}\n"} -{"Time":"2025-06-06T14:35:42.744842-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.744823000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 496, \"to\": 498, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x00fc00ac1200f5a614192c07d76ac3b3c381386048e9a8dadf2a36cea7b11b8d\",\"BlockNumber\":496,\"BlockTimestamp\":\"2025-06-06T14:43:54-07:00\",\"FinalizedBlockNumber\":496,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.747088-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.747062000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.747099-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.747071000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [499, 501]}\n"} -{"Time":"2025-06-06T14:35:42.748678-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.748656000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 499, \"to\": 501, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x784b58c6a85cd7d74da5260023a45b204214ef2883a54e4ca9488b47f8cb268b\",\"BlockNumber\":499,\"BlockTimestamp\":\"2025-06-06T14:43:57-07:00\",\"FinalizedBlockNumber\":499,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.750303-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.750282000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.750308-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.750293000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [502, 504]}\n"} -{"Time":"2025-06-06T14:35:42.751995-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.751977000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 502, \"to\": 504, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6c38200fc5b3d0d45cad8124b220268691da4dbcf1750031da59b65e49511e37\",\"BlockNumber\":502,\"BlockTimestamp\":\"2025-06-06T14:44:00-07:00\",\"FinalizedBlockNumber\":502,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.753997-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.753984000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.754002-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.753993000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [507, 505]}\n"} -{"Time":"2025-06-06T14:35:42.756063-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.756049000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 505, \"to\": 507, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf8d8dec9d5e0bb448b96a111df1d387e4b3edede24514507e03f52b022708264\",\"BlockNumber\":505,\"BlockTimestamp\":\"2025-06-06T14:44:03-07:00\",\"FinalizedBlockNumber\":505,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.757789-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.757766000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.757797-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.757776000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [508, 510]}\n"} -{"Time":"2025-06-06T14:35:42.75955-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.759529000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 508, \"to\": 510, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x9d32bb76559aef201c0f3f563132f93561f8d62abaa3232a42c77fc388479964\",\"BlockNumber\":508,\"BlockTimestamp\":\"2025-06-06T14:44:06-07:00\",\"FinalizedBlockNumber\":508,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.761441-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.761424000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.761447-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.761433000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [511, 512]}\n"} -{"Time":"2025-06-06T14:35:42.763109-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.763090000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 511, \"to\": 512, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x91010e7bae3c899fdc9a2c087aab19f8de3566f07b11f918a20d16d016ab497b\",\"BlockNumber\":511,\"BlockTimestamp\":\"2025-06-06T14:44:09-07:00\",\"FinalizedBlockNumber\":511,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.765012-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.764991000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 513, \"blockHash\": \"0xfd77b36959372d9a2c89481666b19dff299f960d233294be61d3745e2ad5f58b\", \"timestamp\": \"14:44:11.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.766188-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.766172000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 514, \"blockHash\": \"0x3cda3b8a2039f05ff6d55b0215779857e5614c29f91fd170b9bf11d565d79927\", \"timestamp\": \"14:44:12.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.768091-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.768073000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 515, \"blockHash\": \"0xced93eab1ba27f749e87d2bcde071869fb635a677b0a758225956d24cf2f4e94\", \"timestamp\": \"14:44:13.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.778826-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.778-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 9, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"484-0-0x0fc66079fad88a083e41c5dec439eee18c69d58e6a12a495e5d5f5c599d6109a\"}\n"} -{"Time":"2025-06-06T14:35:42.824765-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.824723000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 516}\n"} -{"Time":"2025-06-06T14:35:42.824949-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.824933000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 561, \"finalized\": 559}\n"} -{"Time":"2025-06-06T14:35:42.826295-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.826275000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 516, \"end\": 558}\n"} -{"Time":"2025-06-06T14:35:42.827508-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.827489000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.827513-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.827500000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [517, 518]}\n"} -{"Time":"2025-06-06T14:35:42.829053-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.829-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"511-0-0x46175e9c83d6d045967347263306c80f21a529639099a52f6caae46409cc4e18\"}\n"} -{"Time":"2025-06-06T14:35:42.831624-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.831602000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 516, \"to\": 518, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x4d589f6369e840eb0f34d0454c9cc8ffd02d9a1429782d598424e9d1286e7338\",\"BlockNumber\":517,\"BlockTimestamp\":\"2025-06-06T14:44:15-07:00\",\"FinalizedBlockNumber\":517,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.836982-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.836966000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.836986-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.836975000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [520, 521]}\n"} -{"Time":"2025-06-06T14:35:42.839998-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.839973000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 519, \"to\": 521, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xae612ab22523a0583b6e0af8df5c3ad9934d7f4dbe0945616377e85d1287ea92\",\"BlockNumber\":520,\"BlockTimestamp\":\"2025-06-06T14:44:18-07:00\",\"FinalizedBlockNumber\":520,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.842732-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.842714000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.842737-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.842727000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [523, 524]}\n"} -{"Time":"2025-06-06T14:35:42.844784-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.844762000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 522, \"to\": 524, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x88574a8c2b9ef513bcd9e3fa47ac0bc4be8d68bb2485b4cf6de7240a40cf2e58\",\"BlockNumber\":523,\"BlockTimestamp\":\"2025-06-06T14:44:21-07:00\",\"FinalizedBlockNumber\":523,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.848866-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.848851000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.848869-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.848860000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [526, 527]}\n"} -{"Time":"2025-06-06T14:35:42.85121-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.851175000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 525, \"to\": 527, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc5a4e35eaf5aacc3c127281016a2409eefd70b3a784cb429c728977b71c47472\",\"BlockNumber\":526,\"BlockTimestamp\":\"2025-06-06T14:44:24-07:00\",\"FinalizedBlockNumber\":526,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.856023-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.856003000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.856026-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.856014000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [529, 530]}\n"} -{"Time":"2025-06-06T14:35:42.858049-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.858028000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 528, \"to\": 530, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x9c1906fa0f6a8957416aae215f957afa1103cad5c827e839b7f1117683622977\",\"BlockNumber\":529,\"BlockTimestamp\":\"2025-06-06T14:44:27-07:00\",\"FinalizedBlockNumber\":529,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.86154-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.861520000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.861544-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.861531000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [532, 533]}\n"} -{"Time":"2025-06-06T14:35:42.863253-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.863238000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 531, \"to\": 533, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd7083281c080d5a22d63b9ba5c7a1fd46b0ccbd7433ee72dd56a69058b53b5af\",\"BlockNumber\":532,\"BlockTimestamp\":\"2025-06-06T14:44:30-07:00\",\"FinalizedBlockNumber\":532,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.865897-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.865881000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.865901-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.865888000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [535, 536]}\n"} -{"Time":"2025-06-06T14:35:42.867781-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.867762000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 534, \"to\": 536, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6fad61987d625c9f75a41cc8328e1bed6c080ff3dd6bf503bf420b0232728800\",\"BlockNumber\":535,\"BlockTimestamp\":\"2025-06-06T14:44:33-07:00\",\"FinalizedBlockNumber\":535,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.870261-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.870230000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.870266-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.870248000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [538, 539]}\n"} -{"Time":"2025-06-06T14:35:42.871942-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.871916000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 537, \"to\": 539, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc190360e2488d574674ab302c5b97fdfd8fa7c5e79969893aefe58859f772b76\",\"BlockNumber\":538,\"BlockTimestamp\":\"2025-06-06T14:44:36-07:00\",\"FinalizedBlockNumber\":538,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.874019-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.873992000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.874024-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.874006000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [541, 542]}\n"} -{"Time":"2025-06-06T14:35:42.875748-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.875717000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 540, \"to\": 542, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x1180d217125a8cf659e27f6b972be99b7447037e9452b8e3c57765c3ff3be8d5\",\"BlockNumber\":541,\"BlockTimestamp\":\"2025-06-06T14:44:39-07:00\",\"FinalizedBlockNumber\":541,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.878991-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.878967000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.878999-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.878980000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [544, 545]}\n"} -{"Time":"2025-06-06T14:35:42.879256-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.879-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 10, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"511-0-0x46175e9c83d6d045967347263306c80f21a529639099a52f6caae46409cc4e18\"}\n"} -{"Time":"2025-06-06T14:35:42.880671-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.880651000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 543, \"to\": 545, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x11f8ee65415ee0792512985780690965124d7d6a9ade576cfa9fe599cf868665\",\"BlockNumber\":544,\"BlockTimestamp\":\"2025-06-06T14:44:42-07:00\",\"FinalizedBlockNumber\":544,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.882472-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.882456000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.882486-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.882468000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [547, 548]}\n"} -{"Time":"2025-06-06T14:35:42.884089-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.884067000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 546, \"to\": 548, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x99f345eac1d54869a7a31965bf02a7efd4628f2bd15db04d5e143d51af261e4a\",\"BlockNumber\":547,\"BlockTimestamp\":\"2025-06-06T14:44:45-07:00\",\"FinalizedBlockNumber\":547,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.88566-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.885642000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.88567-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.885652000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [551, 550]}\n"} -{"Time":"2025-06-06T14:35:42.887225-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.887209000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 549, \"to\": 551, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc6756d6dfe805b137a22b095be063cd0b6871897e75b45e1fb608c86d528cf6b\",\"BlockNumber\":550,\"BlockTimestamp\":\"2025-06-06T14:44:48-07:00\",\"FinalizedBlockNumber\":550,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.888913-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.888898000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.888918-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.888906000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [553, 554]}\n"} -{"Time":"2025-06-06T14:35:42.890546-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.890529000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 552, \"to\": 554, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x06da25a4ebe51569eb4a45ccbb0665dd4f31a2a97ba44cccb70e4550f2136d2f\",\"BlockNumber\":553,\"BlockTimestamp\":\"2025-06-06T14:44:51-07:00\",\"FinalizedBlockNumber\":553,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.892136-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.892121000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.89214-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.892131000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [556, 557]}\n"} -{"Time":"2025-06-06T14:35:42.893652-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.893637000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 555, \"to\": 557, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x6c67f9ccc16f21e43f618343ebf479a9ef69e6ad46db589ba13c7e40e2b7b014\",\"BlockNumber\":556,\"BlockTimestamp\":\"2025-06-06T14:44:54-07:00\",\"FinalizedBlockNumber\":556,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.895499-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.895479000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 559}\n"} -{"Time":"2025-06-06T14:35:42.895633-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.895608000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 559, \"blockHash\": \"0x133fe7cbee8ede24a9dafa295b4a76c7cb6a6869307fd9fbf96e612779bf0d07\", \"timestamp\": \"14:44:57.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.897152-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.897129000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 560, \"blockHash\": \"0xaad019f7584d0da6b9d7020c4f37c41acb9231f16b8199432fa37fcca2a18f54\", \"timestamp\": \"14:44:58.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.898092-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.898071000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 561, \"blockHash\": \"0x2ad252e6a3d84af82139abfbaf70ad66ec0c071aa370062879d2ade24380276c\", \"timestamp\": \"14:44:59.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.915061-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.915031000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 562}\n"} -{"Time":"2025-06-06T14:35:42.915248-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.915231000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 592, \"finalized\": 590}\n"} -{"Time":"2025-06-06T14:35:42.915709-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.915689000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 562, \"end\": 589}\n"} -{"Time":"2025-06-06T14:35:42.916218-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.916190000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.916222-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.916208000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [562, 564]}\n"} -{"Time":"2025-06-06T14:35:42.917799-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.917779000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 562, \"to\": 564, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x1cfa99a022b31da4b2bb050c1d0f3fd1d6b08185fcaed526f8b7e6218c2572f3\",\"BlockNumber\":562,\"BlockTimestamp\":\"2025-06-06T14:45:00-07:00\",\"FinalizedBlockNumber\":562,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.919496-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.919481000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.919501-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.919490000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [565, 567]}\n"} -{"Time":"2025-06-06T14:35:42.921073-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.921051000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 565, \"to\": 567, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x43d58ce0cf614d921bf484a4728328061197193c63a3cea364fdf5f445a1dda7\",\"BlockNumber\":565,\"BlockTimestamp\":\"2025-06-06T14:45:03-07:00\",\"FinalizedBlockNumber\":565,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.923201-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.923188000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.923206-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.923196000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [568, 570]}\n"} -{"Time":"2025-06-06T14:35:42.924828-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.924809000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 568, \"to\": 570, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5405e8ee2187b2f95f6ba078dad620fa4e365c6d732b32e87bb7f501c6e77fac\",\"BlockNumber\":568,\"BlockTimestamp\":\"2025-06-06T14:45:06-07:00\",\"FinalizedBlockNumber\":568,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.927319-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.927286000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.927324-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.927296000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [571, 573]}\n"} -{"Time":"2025-06-06T14:35:42.929212-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.929-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 9, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"541-0-0x4b842eaf3aac8325938800168a0115aca3bddd6ef68f4dc277e45d4a477ed1bb\"}\n"} -{"Time":"2025-06-06T14:35:42.930003-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.929971000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 571, \"to\": 573, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xb4ea8428635bebe8cb87c05620d8dfbdfc35dcb9ed34044c10fca019754f7610\",\"BlockNumber\":571,\"BlockTimestamp\":\"2025-06-06T14:45:09-07:00\",\"FinalizedBlockNumber\":571,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.931287-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.931270000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.931291-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.931279000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [576, 574]}\n"} -{"Time":"2025-06-06T14:35:42.933084-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.933064000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 574, \"to\": 576, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x11d765cb1dd75d23a06b676ba0282f1788aa02ead46775e580b49f0c044b97b1\",\"BlockNumber\":574,\"BlockTimestamp\":\"2025-06-06T14:45:12-07:00\",\"FinalizedBlockNumber\":574,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.93499-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.934976000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.934994-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.934984000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [577, 579]}\n"} -{"Time":"2025-06-06T14:35:42.936675-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.936654000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 577, \"to\": 579, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xde3e8bd17a9b97d290060579d266d91b9a8704150489abbc860f35cf981c88ea\",\"BlockNumber\":577,\"BlockTimestamp\":\"2025-06-06T14:45:15-07:00\",\"FinalizedBlockNumber\":577,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.938473-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.938455000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.938478-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.938466000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [580, 582]}\n"} -{"Time":"2025-06-06T14:35:42.940177-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.940159000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 580, \"to\": 582, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2856b231d19c82dc66a523a126a84558c0919ba4b336e532ef738e68b2f64464\",\"BlockNumber\":580,\"BlockTimestamp\":\"2025-06-06T14:45:18-07:00\",\"FinalizedBlockNumber\":580,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.942552-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.942538000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.942557-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.942546000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [583, 585]}\n"} -{"Time":"2025-06-06T14:35:42.944435-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.944415000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 583, \"to\": 585, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3330ea6a9366cd5887bffa8e0b83a196cd48cde4b83d6391a7b83c9cf831e93e\",\"BlockNumber\":583,\"BlockTimestamp\":\"2025-06-06T14:45:21-07:00\",\"FinalizedBlockNumber\":583,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.946636-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.946620000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.946641-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.946630000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [586, 588]}\n"} -{"Time":"2025-06-06T14:35:42.948529-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.948507000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 586, \"to\": 588, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xfec7104b89298809050810660a3e583e6b44ba7023dd1eac41858feef2220c3a\",\"BlockNumber\":586,\"BlockTimestamp\":\"2025-06-06T14:45:24-07:00\",\"FinalizedBlockNumber\":586,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.951702-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.951688000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:42.951705-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.951696000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [589]}\n"} -{"Time":"2025-06-06T14:35:42.952807-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.952787000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 589, \"to\": 589, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcdcdef209defa03b8d58bd98d253afaf4f37766f03d8ac2e3cd4593621b625ed\",\"BlockNumber\":589,\"BlockTimestamp\":\"2025-06-06T14:45:27-07:00\",\"FinalizedBlockNumber\":589,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:42.95485-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.954832000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 590, \"blockHash\": \"0x5d7461c4870969960f1b1f6d59bf60dc1e4755e672cc361159ffc9095ea1aa18\", \"timestamp\": \"14:45:28.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.955904-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.955885000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 591, \"blockHash\": \"0xa98b980e5509f9acc0830d44fbe09970497ae2d08f0d0bcdfaa1adf3ef2eeaa5\", \"timestamp\": \"14:45:29.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.957024-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:42.957003000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 592, \"blockHash\": \"0x73facf9d90c817552f47201d1dfb9aa5a897a728cdd0ebc62d68715b38f9c0bf\", \"timestamp\": \"14:45:30.000000000\"}\n"} -{"Time":"2025-06-06T14:35:42.980266-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:42.980-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 7, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"568-0-0x951162d638b473caefadcb78631ba63c2b36e5897cb70b2251f087928d7c6639\"}\n"} -{"Time":"2025-06-06T14:35:43.00673-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.006702000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 593}\n"} -{"Time":"2025-06-06T14:35:43.00694-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.006923000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 631, \"finalized\": 629}\n"} -{"Time":"2025-06-06T14:35:43.007462-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.007443000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 593, \"end\": 628}\n"} -{"Time":"2025-06-06T14:35:43.008025-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.008005000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.008029-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.008018000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [595]}\n"} -{"Time":"2025-06-06T14:35:43.009087-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.009068000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 593, \"to\": 595, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x38fd04ca70aef2d8fd05b31aa9e3045146fd1f22aff2cca0827a6fd18e101cf5\",\"BlockNumber\":595,\"BlockTimestamp\":\"2025-06-06T14:45:33-07:00\",\"FinalizedBlockNumber\":595,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.011597-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.011585000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.011609-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.011593000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [598]}\n"} -{"Time":"2025-06-06T14:35:43.013286-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.013269000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 596, \"to\": 598, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2078f21a498fbae66f2b6029395e0443bb21f8713b1825240f42f32da8249107\",\"BlockNumber\":598,\"BlockTimestamp\":\"2025-06-06T14:45:36-07:00\",\"FinalizedBlockNumber\":598,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.016212-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.016196000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.016217-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.016205000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [601]}\n"} -{"Time":"2025-06-06T14:35:43.017375-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.017348000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 599, \"to\": 601, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x0f31b88727eb8c39b146da1776363a33b58541ef457a48bb657d81a134e8505f\",\"BlockNumber\":601,\"BlockTimestamp\":\"2025-06-06T14:45:39-07:00\",\"FinalizedBlockNumber\":601,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.020441-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.020426000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.020444-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.020435000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [604]}\n"} -{"Time":"2025-06-06T14:35:43.022629-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.022605000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 602, \"to\": 604, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xca677754e3de656e70b22e992ed78defdc8e463b86b578ada9a9a51467d7c93a\",\"BlockNumber\":604,\"BlockTimestamp\":\"2025-06-06T14:45:42-07:00\",\"FinalizedBlockNumber\":604,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.024582-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.024560000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.02459-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.024571000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [607]}\n"} -{"Time":"2025-06-06T14:35:43.025896-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.025872000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 605, \"to\": 607, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x01d8ba14159b09e1c062200d6dcbd4b214b31e2039bcd520579c0e45fc36d54c\",\"BlockNumber\":607,\"BlockTimestamp\":\"2025-06-06T14:45:45-07:00\",\"FinalizedBlockNumber\":607,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.029991-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.029966000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.029997-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.029980000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [610]}\n"} -{"Time":"2025-06-06T14:35:43.030165-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.030-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 6, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"589-0-0x69e4da1245334ca1d095523429b1d1a398c073b3527d0a2bf6df2f5f4e4cad94\"}\n"} -{"Time":"2025-06-06T14:35:43.031331-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.031312000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 608, \"to\": 610, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x0deff8d9d0b7ab2f59ebaee8e0a65c13c5fd59645b15adf304dc0954b88a355b\",\"BlockNumber\":610,\"BlockTimestamp\":\"2025-06-06T14:45:48-07:00\",\"FinalizedBlockNumber\":610,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.033768-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.033749000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.033776-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.033758000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [613]}\n"} -{"Time":"2025-06-06T14:35:43.03529-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.035272000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 611, \"to\": 613, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd2539ccb7c89d19bc5d4dcb57844c9c9286cc6fed91c4ef9a5285ae8bcfd74c0\",\"BlockNumber\":613,\"BlockTimestamp\":\"2025-06-06T14:45:51-07:00\",\"FinalizedBlockNumber\":613,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.037708-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.037692000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.037712-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.037703000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [616]}\n"} -{"Time":"2025-06-06T14:35:43.039082-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.039060000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 614, \"to\": 616, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x0273d21a0596657bfc7fbfea10e636ccbd3b3b6ff5d1947e9d03b0b474292831\",\"BlockNumber\":616,\"BlockTimestamp\":\"2025-06-06T14:45:54-07:00\",\"FinalizedBlockNumber\":616,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.041252-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.041236000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.041257-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.041245000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [619]}\n"} -{"Time":"2025-06-06T14:35:43.042648-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.042625000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 617, \"to\": 619, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf02707973e46d25f97162cb547f31b4ed7388b8c79e77b409a7b094a0f80b268\",\"BlockNumber\":619,\"BlockTimestamp\":\"2025-06-06T14:45:57-07:00\",\"FinalizedBlockNumber\":619,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.04487-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.044856000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.044875-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.044864000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [622]}\n"} -{"Time":"2025-06-06T14:35:43.046333-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.046314000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 620, \"to\": 622, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd89b986cce33817dc19fd2b64026a83954ffcd27c96761f2b3fd477969b98f25\",\"BlockNumber\":622,\"BlockTimestamp\":\"2025-06-06T14:46:00-07:00\",\"FinalizedBlockNumber\":622,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.048213-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.048199000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.048218-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.048207000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [625]}\n"} -{"Time":"2025-06-06T14:35:43.049268-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.049249000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 623, \"to\": 625, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xece172e9551c5e5449dea643906d82ec1e7bab2310292435dfa828bfcc604a27\",\"BlockNumber\":625,\"BlockTimestamp\":\"2025-06-06T14:46:03-07:00\",\"FinalizedBlockNumber\":625,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.05095-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.050928000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.050953-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.050936000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [628]}\n"} -{"Time":"2025-06-06T14:35:43.052117-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.052101000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 626, \"to\": 628, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x1468365d4008e3c95a07e9fb1cc5e6189777774b76431878380cdc991c00f86f\",\"BlockNumber\":628,\"BlockTimestamp\":\"2025-06-06T14:46:06-07:00\",\"FinalizedBlockNumber\":628,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.053816-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.053799000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 629, \"blockHash\": \"0x15af6ff451062fbf172e377563e185c882cfec429f1845943b46ab3e0c2888d3\", \"timestamp\": \"14:46:07.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.054804-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.054792000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 630, \"blockHash\": \"0xa8f02fa5d613bd32da890d828e042769faa67e2ed17105583ad54233aef8ddc5\", \"timestamp\": \"14:46:08.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.055788-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.055769000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 631, \"blockHash\": \"0x32f8f2b651b4a6f9aca1f19e559365784f1ebc78f865443b5be4c6fcf96a99fc\", \"timestamp\": \"14:46:09.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.079461-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.079-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 7, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"607-0-0x2b15c6ddae96aecd180e5e3b596bfe001ccbf373f4fd0c83e7d959afaa621235\"}\n"} -{"Time":"2025-06-06T14:35:43.107144-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.107121000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 632}\n"} -{"Time":"2025-06-06T14:35:43.10733-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.107315000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 667, \"finalized\": 665}\n"} -{"Time":"2025-06-06T14:35:43.108148-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.108112000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 632, \"end\": 664}\n"} -{"Time":"2025-06-06T14:35:43.108858-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.108843000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.108863-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.108853000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [634]}\n"} -{"Time":"2025-06-06T14:35:43.11035-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.110328000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 632, \"to\": 634, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa2269721db671bfc2cbcf73b3b92569016c853f6ff2b59a389eaa46cbcb43774\",\"BlockNumber\":634,\"BlockTimestamp\":\"2025-06-06T14:46:12-07:00\",\"FinalizedBlockNumber\":634,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.113761-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.113738000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.113767-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.113752000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [637]}\n"} -{"Time":"2025-06-06T14:35:43.114922-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.114899000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 635, \"to\": 637, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xeaf6afba4c49138d4add7ab58807c113d51e7a57315764d210485fe07e3bfe6d\",\"BlockNumber\":637,\"BlockTimestamp\":\"2025-06-06T14:46:15-07:00\",\"FinalizedBlockNumber\":637,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.116727-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.116694000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.116732-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.116716000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [640]}\n"} -{"Time":"2025-06-06T14:35:43.117881-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.117861000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 638, \"to\": 640, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x8281c4f650e8747986fabeb12f3aad0be1f74b6677f8dc0aa452ec186c3fd5a6\",\"BlockNumber\":640,\"BlockTimestamp\":\"2025-06-06T14:46:18-07:00\",\"FinalizedBlockNumber\":640,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.119335-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.119319000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.11934-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.119329000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [643]}\n"} -{"Time":"2025-06-06T14:35:43.12038-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.120358000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 641, \"to\": 643, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcdc2ed847064989876f0519eccab47cb19a1daccb6df4a2cc83ba3df64469dbc\",\"BlockNumber\":643,\"BlockTimestamp\":\"2025-06-06T14:46:21-07:00\",\"FinalizedBlockNumber\":643,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.121759-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.121742000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.121763-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.121751000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [646]}\n"} -{"Time":"2025-06-06T14:35:43.122824-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.122808000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 644, \"to\": 646, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x10c859688d19720907053a88e7130b443a006139e7b202109caa2a2473b5ae9c\",\"BlockNumber\":646,\"BlockTimestamp\":\"2025-06-06T14:46:24-07:00\",\"FinalizedBlockNumber\":646,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.125669-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.125657000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.125672-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.125664000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [649]}\n"} -{"Time":"2025-06-06T14:35:43.127556-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.127537000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 647, \"to\": 649, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf8cd11dfcc780207b0c91f387ea8bfa2ac1f228ee96742c339c1f341ce1cde62\",\"BlockNumber\":649,\"BlockTimestamp\":\"2025-06-06T14:46:27-07:00\",\"FinalizedBlockNumber\":649,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.129327-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.129-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 6, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"628-0-0x511df98b124e7266d3bc7b92ddac2382e65d7df678729fba91bf80e3efb367ec\"}\n"} -{"Time":"2025-06-06T14:35:43.131669-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.131650000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.131686-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.131660000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [652]}\n"} -{"Time":"2025-06-06T14:35:43.132905-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.132881000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 650, \"to\": 652, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x07c30e594c816c220e12530030734a99839d1fd93aeaebe4b9f604d4f1175c02\",\"BlockNumber\":652,\"BlockTimestamp\":\"2025-06-06T14:46:30-07:00\",\"FinalizedBlockNumber\":652,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.134964-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.134945000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.134975-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.134955000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [655]}\n"} -{"Time":"2025-06-06T14:35:43.136141-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.136123000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 653, \"to\": 655, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x81919f145474e265a4e93fd7e35dfa475875b9bc30e5f7e6e1c9a12e3252c51d\",\"BlockNumber\":655,\"BlockTimestamp\":\"2025-06-06T14:46:33-07:00\",\"FinalizedBlockNumber\":655,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.137892-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.137875000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.137897-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.137885000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [658]}\n"} -{"Time":"2025-06-06T14:35:43.139179-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.139162000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 656, \"to\": 658, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xbb68a5bd44c1b629fe02f99776ae4bd8b0f7324f44d97b6d10c5f43dd1f05cdd\",\"BlockNumber\":658,\"BlockTimestamp\":\"2025-06-06T14:46:36-07:00\",\"FinalizedBlockNumber\":658,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.140676-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.140655000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.140682-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.140665000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [661]}\n"} -{"Time":"2025-06-06T14:35:43.141733-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.141715000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 659, \"to\": 661, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x560c4f7215a9b25f0cbfee43e02326f1ce97a678333cf072467e8daa0b252ac4\",\"BlockNumber\":661,\"BlockTimestamp\":\"2025-06-06T14:46:39-07:00\",\"FinalizedBlockNumber\":661,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.143483-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.143468000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.143489-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.143477000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [664]}\n"} -{"Time":"2025-06-06T14:35:43.144686-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.144668000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 662, \"to\": 664, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5b3c556b9265d9faf4c2fdc8baf21f23623380ad37c77ea57fe85f9ac87873db\",\"BlockNumber\":664,\"BlockTimestamp\":\"2025-06-06T14:46:42-07:00\",\"FinalizedBlockNumber\":664,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.146491-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.146469000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 665, \"blockHash\": \"0x02219f879affbc336148568ac13a0368dadad5401fc1692f494c55a528a2c139\", \"timestamp\": \"14:46:43.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.147629-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.147607000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 666, \"blockHash\": \"0x5b863d989a8d26849b904a9496f02ffeb2c0bcd831679e96171ef740c0219c87\", \"timestamp\": \"14:46:44.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.148689-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.148668000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 667, \"blockHash\": \"0x1e773cbb58fb249a3fe6f1b5d452813ae0cf755c286f8f0ea3843fb77a5c95e7\", \"timestamp\": \"14:46:45.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.180233-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.180-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 6, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"646-0-0xec29d1f5deb1e07e776906d27373eef6243e019fbf377b5ec274d31a3256efa0\"}\n"} -{"Time":"2025-06-06T14:35:43.198262-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.198236000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 668}\n"} -{"Time":"2025-06-06T14:35:43.198461-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.198444000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 705, \"finalized\": 703}\n"} -{"Time":"2025-06-06T14:35:43.199161-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.199143000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 668, \"end\": 702}\n"} -{"Time":"2025-06-06T14:35:43.199852-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.199831000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.199858-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.199843000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [670]}\n"} -{"Time":"2025-06-06T14:35:43.20131-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.201291000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 668, \"to\": 670, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3010b27426b9295a42172c988e2e9a68f544a75e179f3de09a9c3e5c12087b49\",\"BlockNumber\":670,\"BlockTimestamp\":\"2025-06-06T14:46:48-07:00\",\"FinalizedBlockNumber\":670,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.204298-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.204272000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.204305-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.204283000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [673]}\n"} -{"Time":"2025-06-06T14:35:43.206068-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.206048000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 671, \"to\": 673, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3b80fdffb4dfd256cc966b22932db9d54fb2ac410747349361b4ad602e9f09a0\",\"BlockNumber\":673,\"BlockTimestamp\":\"2025-06-06T14:46:51-07:00\",\"FinalizedBlockNumber\":673,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.2081-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.208081000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.208104-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.208093000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [676]}\n"} -{"Time":"2025-06-06T14:35:43.20935-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.209332000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 674, \"to\": 676, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3d8269fa0f3ffa7b22f2e22e229b59c5c0573a75431592e5ede6bcd0314387f6\",\"BlockNumber\":676,\"BlockTimestamp\":\"2025-06-06T14:46:54-07:00\",\"FinalizedBlockNumber\":676,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.213181-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.213163000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.213185-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.213174000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [679]}\n"} -{"Time":"2025-06-06T14:35:43.214924-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.214900000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 677, \"to\": 679, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x51b5304e57ca71eb9036ef8ad96f02710f8589ee20d0f7d9649a8ab430b341da\",\"BlockNumber\":679,\"BlockTimestamp\":\"2025-06-06T14:46:57-07:00\",\"FinalizedBlockNumber\":679,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.217822-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.217802000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.217826-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.217816000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [682]}\n"} -{"Time":"2025-06-06T14:35:43.220531-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.220494000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 680, \"to\": 682, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xdf89183f56415b2e274c92213c035baca59f88f8a05a99135d257ea9fdbd90df\",\"BlockNumber\":682,\"BlockTimestamp\":\"2025-06-06T14:47:00-07:00\",\"FinalizedBlockNumber\":682,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.222219-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.222188000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.222226-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.222213000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [685]}\n"} -{"Time":"2025-06-06T14:35:43.223293-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.223270000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 683, \"to\": 685, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x124a5b64c221681ddd1894080f65314a1ab3572607f884e17b33d2fdd55c0fbb\",\"BlockNumber\":685,\"BlockTimestamp\":\"2025-06-06T14:47:03-07:00\",\"FinalizedBlockNumber\":685,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.224619-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.224603000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.224625-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.224612000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [688]}\n"} -{"Time":"2025-06-06T14:35:43.225703-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.225682000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 686, \"to\": 688, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x29b3036de73fc34dbe6d8a7d64adc62ce69c3f67d2785e1cc6e20fd75e1ab14f\",\"BlockNumber\":688,\"BlockTimestamp\":\"2025-06-06T14:47:06-07:00\",\"FinalizedBlockNumber\":688,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.227216-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.227196000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.227222-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.227206000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [691]}\n"} -{"Time":"2025-06-06T14:35:43.229478-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.229-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"664-0-0x811e4df43f1b7f2c315f697840151a2dd3a4d327550db1a7c9093f2dbff0e385\"}\n"} -{"Time":"2025-06-06T14:35:43.229797-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.229766000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 689, \"to\": 691, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x551eb319f3a5f9aa7d8322769e0c4a5fc2312bcb956b9171d410f00e09a299ce\",\"BlockNumber\":691,\"BlockTimestamp\":\"2025-06-06T14:47:09-07:00\",\"FinalizedBlockNumber\":691,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.232484-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.232466000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.23249-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.232478000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [694]}\n"} -{"Time":"2025-06-06T14:35:43.234218-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.234198000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 692, \"to\": 694, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x728758e97d7811e80249eaaadbe18ebe026af0a0e2e076f058e9d87f59a3451c\",\"BlockNumber\":694,\"BlockTimestamp\":\"2025-06-06T14:47:12-07:00\",\"FinalizedBlockNumber\":694,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.238409-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.238390000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.238417-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.238401000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [697]}\n"} -{"Time":"2025-06-06T14:35:43.24019-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.240168000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 695, \"to\": 697, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x4052342bd6aa388551d2cb8e5fe8a93d742aeca504d5d0c30cff75c87bc09c3e\",\"BlockNumber\":697,\"BlockTimestamp\":\"2025-06-06T14:47:15-07:00\",\"FinalizedBlockNumber\":697,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.245662-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.245598000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.24567-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.245623000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [700]}\n"} -{"Time":"2025-06-06T14:35:43.248759-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.248622000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 698, \"to\": 700, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x16ced97d501570cf4bd0837ea3e5143e512d51b2f4d93649c2973eee4b2e24f0\",\"BlockNumber\":700,\"BlockTimestamp\":\"2025-06-06T14:47:18-07:00\",\"FinalizedBlockNumber\":700,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.251245-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.251118000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 703}\n"} -{"Time":"2025-06-06T14:35:43.251721-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.251506000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 703, \"blockHash\": \"0xcb9b5b0643bec18602f3e64c8c8c6207a5ffe75c5fc85c739949c5667a3774f6\", \"timestamp\": \"14:47:21.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.254517-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.254279000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 704, \"blockHash\": \"0x41ec258f1725fe2bfc7caf9d70185e630bf5c41866027d5293745d7ea4f86b52\", \"timestamp\": \"14:47:22.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.25642-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.256288000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 705, \"blockHash\": \"0x719361d690d211269f7ecdcc716ca0a8ed2abfee4be9875ed4422f3fdc7a7696\", \"timestamp\": \"14:47:23.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.279187-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.279-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 5, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"688-0-0xae0f926cf76fe64b0b22ed917de220617203763a3967d75960f16a3845207ed9\"}\n"} -{"Time":"2025-06-06T14:35:43.294625-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.294582000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 706}\n"} -{"Time":"2025-06-06T14:35:43.294826-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.294804000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 738, \"finalized\": 736}\n"} -{"Time":"2025-06-06T14:35:43.295633-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.295618000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 706, \"end\": 735}\n"} -{"Time":"2025-06-06T14:35:43.296398-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.296372000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.296417-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.296384000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [706, 708]}\n"} -{"Time":"2025-06-06T14:35:43.298363-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.298338000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 706, \"to\": 708, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf0d8a0d5ffc803ac1a1e52ae8fc4bd6639e9751511f4c44875a745c928ef7e59\",\"BlockNumber\":706,\"BlockTimestamp\":\"2025-06-06T14:47:24-07:00\",\"FinalizedBlockNumber\":706,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.301742-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.301726000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.301748-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.301736000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [709, 711]}\n"} -{"Time":"2025-06-06T14:35:43.304504-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.304486000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 709, \"to\": 711, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xaacbe52d1440914623145287004f3034f5087c78946fa85f2a84be656d31d0fb\",\"BlockNumber\":709,\"BlockTimestamp\":\"2025-06-06T14:47:27-07:00\",\"FinalizedBlockNumber\":709,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.30771-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.307687000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.307714-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.307696000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [712, 714]}\n"} -{"Time":"2025-06-06T14:35:43.309412-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.309393000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 712, \"to\": 714, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x290ded8028ff7cfac555a9ba2493b22de3c4dc7addb9980355c757ec020d46ba\",\"BlockNumber\":712,\"BlockTimestamp\":\"2025-06-06T14:47:30-07:00\",\"FinalizedBlockNumber\":712,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.311791-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.311772000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.311796-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.311783000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [715, 717]}\n"} -{"Time":"2025-06-06T14:35:43.313803-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.313777000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 715, \"to\": 717, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf3a5df74fd3390825b538604534eea005b096d5a6a0cb5efbe7d327b4c535372\",\"BlockNumber\":715,\"BlockTimestamp\":\"2025-06-06T14:47:33-07:00\",\"FinalizedBlockNumber\":715,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.316006-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.315993000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.31601-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.316001000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [718, 720]}\n"} -{"Time":"2025-06-06T14:35:43.317692-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.317674000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 718, \"to\": 720, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd8c5b2f07f0d3e42afc585ddaa71344bf157b2d926624374b9f15ba541080336\",\"BlockNumber\":718,\"BlockTimestamp\":\"2025-06-06T14:47:36-07:00\",\"FinalizedBlockNumber\":718,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.319429-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.319411000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.319436-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.319420000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [721, 723]}\n"} -{"Time":"2025-06-06T14:35:43.320987-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.320966000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 721, \"to\": 723, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xb27a755ac2768f44db438beea1f95e84a22bb38eba83e77fe046661036399880\",\"BlockNumber\":721,\"BlockTimestamp\":\"2025-06-06T14:47:39-07:00\",\"FinalizedBlockNumber\":721,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.322926-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.322912000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.322932-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.322920000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [724, 726]}\n"} -{"Time":"2025-06-06T14:35:43.324781-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.324766000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 724, \"to\": 726, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xbdd6cb26d2d673b1d9fb23ad1d8b330923e11027ff6e7b9351433eb4bbe59926\",\"BlockNumber\":724,\"BlockTimestamp\":\"2025-06-06T14:47:42-07:00\",\"FinalizedBlockNumber\":724,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.326398-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.326376000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.326404-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.326387000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [727, 729]}\n"} -{"Time":"2025-06-06T14:35:43.327982-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.327959000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 727, \"to\": 729, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcfea73cc476f7eae8f4d4d1382208539ccfa74ea91b01fe1fb043c2b9ac2cb6b\",\"BlockNumber\":727,\"BlockTimestamp\":\"2025-06-06T14:47:45-07:00\",\"FinalizedBlockNumber\":727,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.329512-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.329-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 7, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"703-0-0x3cc70cfef3f19266ad3e390ffbe82484f7be16c55438c4cfe05535e47a80a70c\"}\n"} -{"Time":"2025-06-06T14:35:43.329831-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.329814000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.329836-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.329823000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [730, 732]}\n"} -{"Time":"2025-06-06T14:35:43.331451-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.331430000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 730, \"to\": 732, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xb49254c8e83d9706e21dac46522ee393edca458f8ab30bbf9472058b924e5563\",\"BlockNumber\":730,\"BlockTimestamp\":\"2025-06-06T14:47:48-07:00\",\"FinalizedBlockNumber\":730,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.333188-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.333174000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.333193-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.333182000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [733, 735]}\n"} -{"Time":"2025-06-06T14:35:43.334854-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.334838000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 733, \"to\": 735, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa22677204bb3575737db8aac28b9aa1ca9bdfa2860f1a7fbf58ef70846ff4a04\",\"BlockNumber\":733,\"BlockTimestamp\":\"2025-06-06T14:47:51-07:00\",\"FinalizedBlockNumber\":733,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.336861-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.336840000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 736, \"blockHash\": \"0x21a0c7784e7f532899cc73e1697f7dd40aab79ba7087f4a826d1295018c34b04\", \"timestamp\": \"14:47:54.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.33828-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.338263000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 737, \"blockHash\": \"0xcc585ba5a65205b6ef759558d8f9569640205f32228eceb5f7f5a8a52f52ac65\", \"timestamp\": \"14:47:55.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.339131-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.339106000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 738, \"blockHash\": \"0x9dc565f938043fbbad27e932454eddfb865d2798cd8a7bf529dc9bf3250a0a51\", \"timestamp\": \"14:47:56.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.378782-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.378-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 4, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"724-0-0x226f25e62859a51320add2ef914216d8a896cb7c6fa687222d91ae589a8174b5\"}\n"} -{"Time":"2025-06-06T14:35:43.386422-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.386393000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 739}\n"} -{"Time":"2025-06-06T14:35:43.386639-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.386611000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 772, \"finalized\": 770}\n"} -{"Time":"2025-06-06T14:35:43.387705-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.387687000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 739, \"end\": 769}\n"} -{"Time":"2025-06-06T14:35:43.389011-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.388996000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.389016-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.389007000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [739, 741]}\n"} -{"Time":"2025-06-06T14:35:43.391299-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.391272000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 739, \"to\": 741, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3e8e45cb29f94ba44de3343b812ca5091cd09809568f2f279ce94f3f180a6e5e\",\"BlockNumber\":739,\"BlockTimestamp\":\"2025-06-06T14:47:57-07:00\",\"FinalizedBlockNumber\":739,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.39521-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.395193000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.395216-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.395206000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [742, 744]}\n"} -{"Time":"2025-06-06T14:35:43.397524-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.397502000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 742, \"to\": 744, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x51c9aa628193d81a30dd92f6c973dcbeac8fec45f7916b841bf479ca318f680f\",\"BlockNumber\":742,\"BlockTimestamp\":\"2025-06-06T14:48:00-07:00\",\"FinalizedBlockNumber\":742,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.400901-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.400883000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.400909-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.400893000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [745, 747]}\n"} -{"Time":"2025-06-06T14:35:43.403341-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.403314000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 745, \"to\": 747, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x1f7105fbbb1cbb763f597a1c68fb4591156140c9aeb09619531f6a6aa12204b0\",\"BlockNumber\":745,\"BlockTimestamp\":\"2025-06-06T14:48:03-07:00\",\"FinalizedBlockNumber\":745,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.406618-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.406604000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.406622-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.406615000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [748, 750]}\n"} -{"Time":"2025-06-06T14:35:43.408509-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.408480000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 748, \"to\": 750, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x07ec0592f2cb97b9f73b9fcd86c7b8806ee8ca3714920754fbdd7ab479f21870\",\"BlockNumber\":748,\"BlockTimestamp\":\"2025-06-06T14:48:06-07:00\",\"FinalizedBlockNumber\":748,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.410484-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.410465000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.410489-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.410476000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [751, 753]}\n"} -{"Time":"2025-06-06T14:35:43.412897-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.412880000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 751, \"to\": 753, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xbe1167c9daa1ba4ec30a26359fdc4b9e93be2571a43bf5223cf636576b4ebef6\",\"BlockNumber\":751,\"BlockTimestamp\":\"2025-06-06T14:48:09-07:00\",\"FinalizedBlockNumber\":751,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.415678-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.415661000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.415683-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.415673000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [754, 756]}\n"} -{"Time":"2025-06-06T14:35:43.41744-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.417414000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 754, \"to\": 756, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x49127806faa125e9bca7552422eb0ac44ed6479c9ce573cc6a671497bd3f521f\",\"BlockNumber\":754,\"BlockTimestamp\":\"2025-06-06T14:48:12-07:00\",\"FinalizedBlockNumber\":754,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.419863-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.419832000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.419874-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.419842000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [757, 759]}\n"} -{"Time":"2025-06-06T14:35:43.421938-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.421917000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 757, \"to\": 759, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcf3cd1dd7f3bd39951d9c50e2a0dbe6be2983189215992a1260293dc9680253b\",\"BlockNumber\":757,\"BlockTimestamp\":\"2025-06-06T14:48:15-07:00\",\"FinalizedBlockNumber\":757,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.424141-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.424127000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.424147-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.424136000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [760, 762]}\n"} -{"Time":"2025-06-06T14:35:43.426087-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.426070000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 760, \"to\": 762, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xba92737bf473f547dc52fc2f1ef4639e9126495634750139ba3fedfa37ccced3\",\"BlockNumber\":760,\"BlockTimestamp\":\"2025-06-06T14:48:18-07:00\",\"FinalizedBlockNumber\":760,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.429403-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.429388000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.429417-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.429397000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [763, 765]}\n"} -{"Time":"2025-06-06T14:35:43.429634-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.429-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 8, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"736-0-0xf934cc7eafa435f483c480c399c496d5f519fadcbc9910919c52445b0830b1f9\"}\n"} -{"Time":"2025-06-06T14:35:43.431057-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.431040000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 763, \"to\": 765, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd2ed87c7933f08c4712efec434b1c7446c3f0dcffafce38f6f1251d72558c641\",\"BlockNumber\":763,\"BlockTimestamp\":\"2025-06-06T14:48:21-07:00\",\"FinalizedBlockNumber\":763,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.432854-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.432835000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.432858-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.432843000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [766, 768]}\n"} -{"Time":"2025-06-06T14:35:43.434553-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.434531000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 766, \"to\": 768, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xa1b8399fc83cc4e3953459968d438698b4d97e93bd2cb96b9e5eeb1dbc9b0e5f\",\"BlockNumber\":766,\"BlockTimestamp\":\"2025-06-06T14:48:24-07:00\",\"FinalizedBlockNumber\":766,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.436749-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.436737000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.436755-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.436743000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [769]}\n"} -{"Time":"2025-06-06T14:35:43.438-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.437981000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 769, \"to\": 769, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xdac15d5ed9b66fbd8519a8d5fb8be76b617ea7482cfe2860b85f54fcedc9f1a4\",\"BlockNumber\":769,\"BlockTimestamp\":\"2025-06-06T14:48:27-07:00\",\"FinalizedBlockNumber\":769,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.440363-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.440349000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 770, \"blockHash\": \"0x9224e2fe3fddbcdc3979b630c1552ae3118366a7c67ddea962e11429bcc578af\", \"timestamp\": \"14:48:28.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.441367-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.441349000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 771, \"blockHash\": \"0x1ea6f254ea6e471a35935dd5a6b43bd7422add895a6263674f5b2392da8347ca\", \"timestamp\": \"14:48:29.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.442525-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.442504000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 772, \"blockHash\": \"0x64dffd564be7b721f3e1fae239cea0373d8a65de4cb2674126827c85f6882f8b\", \"timestamp\": \"14:48:30.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.478848-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.478-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 3, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"760-0-0xad380a7106f027ed516a161a0c5f0653b816c251399d605a7065597c1fb48e16\"}\n"} -{"Time":"2025-06-06T14:35:43.495179-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.495154000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 773}\n"} -{"Time":"2025-06-06T14:35:43.495388-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.495372000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 816, \"finalized\": 814}\n"} -{"Time":"2025-06-06T14:35:43.496436-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.496417000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 773, \"end\": 813}\n"} -{"Time":"2025-06-06T14:35:43.497178-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.497158000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.497183-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.497169000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [775]}\n"} -{"Time":"2025-06-06T14:35:43.498514-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.498491000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 773, \"to\": 775, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc87ddf5a54266e8311dc3cfa9842457f92ff1e7daca0d66f42e688174701b1f7\",\"BlockNumber\":775,\"BlockTimestamp\":\"2025-06-06T14:48:33-07:00\",\"FinalizedBlockNumber\":775,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.500321-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.500278000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.500335-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.500306000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [778]}\n"} -{"Time":"2025-06-06T14:35:43.501479-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.501461000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 776, \"to\": 778, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xad5608d151129caf71b28ca4fb4269dcc67270beaf6d7f97c302d9d385f87151\",\"BlockNumber\":778,\"BlockTimestamp\":\"2025-06-06T14:48:36-07:00\",\"FinalizedBlockNumber\":778,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.50312-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.503088000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.503127-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.503110000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [781]}\n"} -{"Time":"2025-06-06T14:35:43.504327-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.504302000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 779, \"to\": 781, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xcd35246f3b8cbb91e247b023f15028a3783a50a0b60e2b21be8a9220c61c6fc9\",\"BlockNumber\":781,\"BlockTimestamp\":\"2025-06-06T14:48:39-07:00\",\"FinalizedBlockNumber\":781,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.505893-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.505873000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.505898-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.505884000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [784]}\n"} -{"Time":"2025-06-06T14:35:43.507044-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.507022000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 782, \"to\": 784, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x5d7abb4b620422fa0f69508265b62ef3af6138eb165c3a87b2eae2a6dfa0235a\",\"BlockNumber\":784,\"BlockTimestamp\":\"2025-06-06T14:48:42-07:00\",\"FinalizedBlockNumber\":784,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.508407-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.508391000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.508411-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.508400000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [787]}\n"} -{"Time":"2025-06-06T14:35:43.509404-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.509387000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 785, \"to\": 787, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x694860dcd02b944c540c7343629b1c0ab68b0ef8540f1da8019c0a5c9b5406ac\",\"BlockNumber\":787,\"BlockTimestamp\":\"2025-06-06T14:48:45-07:00\",\"FinalizedBlockNumber\":787,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.510893-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.510875000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.510897-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.510883000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [790]}\n"} -{"Time":"2025-06-06T14:35:43.511916-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.511900000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 788, \"to\": 790, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x06deeef897128158eca1f45c2d4486a72c5d53cc3f36735b7c14da33fff8054d\",\"BlockNumber\":790,\"BlockTimestamp\":\"2025-06-06T14:48:48-07:00\",\"FinalizedBlockNumber\":790,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.513471-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.513455000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.513475-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.513464000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [793]}\n"} -{"Time":"2025-06-06T14:35:43.514458-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.514437000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 791, \"to\": 793, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe5307b4c7bd8ba2872c707453f0cc6c01e0316c6df9611f3e45ab3e87daaf4d5\",\"BlockNumber\":793,\"BlockTimestamp\":\"2025-06-06T14:48:51-07:00\",\"FinalizedBlockNumber\":793,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.515792-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.515775000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.515798-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.515782000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [796]}\n"} -{"Time":"2025-06-06T14:35:43.516779-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.516764000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 794, \"to\": 796, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xe2d514d8de580cadb783e5142ef7b0df45137a65ddefd12a48b276b8e534f102\",\"BlockNumber\":796,\"BlockTimestamp\":\"2025-06-06T14:48:54-07:00\",\"FinalizedBlockNumber\":796,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.518204-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.518188000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.518207-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.518198000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [799]}\n"} -{"Time":"2025-06-06T14:35:43.519252-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.519235000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 797, \"to\": 799, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xc3fdbb047079f0bed223a2400b3de38ddb9d14c9acc513c8744b0318295f602c\",\"BlockNumber\":799,\"BlockTimestamp\":\"2025-06-06T14:48:57-07:00\",\"FinalizedBlockNumber\":799,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.520656-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.520641000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.520661-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.520648000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [802]}\n"} -{"Time":"2025-06-06T14:35:43.521684-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.521665000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 800, \"to\": 802, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x72f33f149ab4a280bc89fd5711e09e87fb37caae1fee838c854b5b38774af3e3\",\"BlockNumber\":802,\"BlockTimestamp\":\"2025-06-06T14:49:00-07:00\",\"FinalizedBlockNumber\":802,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.523105-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.523089000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.523109-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.523097000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [805]}\n"} -{"Time":"2025-06-06T14:35:43.524113-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.524092000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 803, \"to\": 805, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x521a8a917237a7f253ba77c0e69c37578e3c2bcddd4e6136792fd43580903b45\",\"BlockNumber\":805,\"BlockTimestamp\":\"2025-06-06T14:49:03-07:00\",\"FinalizedBlockNumber\":805,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.525607-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.525590000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.52561-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.525600000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [808]}\n"} -{"Time":"2025-06-06T14:35:43.526714-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.526694000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 806, \"to\": 808, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x7c176d96437fde8c387e07a417a9cfa17ace8b9048f3a1f204c1efbdd468a4cc\",\"BlockNumber\":808,\"BlockTimestamp\":\"2025-06-06T14:49:06-07:00\",\"FinalizedBlockNumber\":808,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.531294-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.531267000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:43.531302-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.531281000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [811]}\n"} -{"Time":"2025-06-06T14:35:43.531662-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.531-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 13, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"769-0-0xcf690975ad362b29b2f5e586f556c7a030d75f3c45c81cbe0472c2510657a615\"}\n"} -{"Time":"2025-06-06T14:35:43.5325-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.532483000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 809, \"to\": 811, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x2bbb4757416c7dad7821990ceb37eab908395ec5d6bdb9ef216826316c0dba2f\",\"BlockNumber\":811,\"BlockTimestamp\":\"2025-06-06T14:49:09-07:00\",\"FinalizedBlockNumber\":811,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:43.534085-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.534066000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 814}\n"} -{"Time":"2025-06-06T14:35:43.534219-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.534199000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 814, \"blockHash\": \"0x7a558663365b3b17d858c78d93ab686f3c371af084e7a802119a52e28c5f1c7e\", \"timestamp\": \"14:49:12.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.535768-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.535755000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 815, \"blockHash\": \"0xf0f1ef43a89df2ad639f7184efd343481e6d6c04cac42c12c4aa7c8418b91771\", \"timestamp\": \"14:49:13.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.536798-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.536787000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 816, \"blockHash\": \"0x14b573fdc60c292eecbabeeba6f9e757a3786e0ba1b8735858cc3b84b8518b22\", \"timestamp\": \"14:49:14.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.578754-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.578-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 2, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"808-0-0x5f58dcd2c557068ff7e87d6035270ab1fefc738e62f39db7d72c73dae232b730\"}\n"} -{"Time":"2025-06-06T14:35:43.598785-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.598743000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 817}\n"} -{"Time":"2025-06-06T14:35:43.599063-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.599028000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:43.599946-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.599869000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 817, \"blockHash\": \"0x233f4947417944b6d7a7b831fe3c367b1dd4433e821e210ffa5609183f1f924c\", \"timestamp\": \"14:49:15.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.602005-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.601982000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 818, \"blockHash\": \"0x04e5d42feda1bb230b30209f5e25137e2af59e61c1a454ec12478b7584ee44d1\", \"timestamp\": \"14:49:16.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.603323-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.603290000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 819, \"blockHash\": \"0xf35318f8e30d076fe2a76a40e86f928d7742473b23412f4c31cbfe33cb967f7b\", \"timestamp\": \"14:49:17.000000000\"}\n"} -{"Time":"2025-06-06T14:35:43.62856-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.628-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 1, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"814-0-0xf0ade9a8694ee94f666b698addbbc7b654e17de9bcdd402545a21615d008fd56\"}\n"} -{"Time":"2025-06-06T14:35:43.678561-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.678-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:43.690339-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.690305000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:43.690598-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.690578000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:43.690603-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.690587000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:43.729646-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.729-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:43.778748-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.778-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:43.798381-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.798334000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:43.798671-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.798651000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:43.798677-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.798662000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:43.828527-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.828-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:43.878671-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.878-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:43.902655-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.902609000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:43.902938-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.902916000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:43.902943-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:43.902929000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:43.928506-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.928-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:43.978472-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:43.978-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.0069-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.006844000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:44.007189-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.007171000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:44.007195-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.007180000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:44.028447-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.028-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.078618-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.078-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.102397-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.102354000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:44.10267-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.102652000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:44.102675-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.102661000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:44.128325-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.128-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.178523-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.178-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.203888-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.203848000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:44.204198-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.204175000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:44.204204-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.204186000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:44.228548-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.228-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.279653-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.279-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.295892-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.295858000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:44.296207-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.296173000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:44.296214-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.296185000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:44.327845-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.327-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.378963-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.378-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.400093-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.400063000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:44.400359-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.400340000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:44.400364-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.400349000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:44.42847-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.428-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.478973-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.478-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"67\", \"logCursor\": \"817-0-0xdc9a7e9363d23de3a70137c63cee62c53c5027a1ebc2f178e435de0a2a243109\"}\n"} -{"Time":"2025-06-06T14:35:44.496342-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.496307000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820}\n"} -{"Time":"2025-06-06T14:35:44.496623-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.496604000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 819, \"finalized\": 817}\n"} -{"Time":"2025-06-06T14:35:44.496628-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 14:35:44.496614000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 820, \"latestBlockNumber\": 819}\n"} -{"Time":"2025-06-06T14:35:44.504771-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":" logger.go:146: 2025-06-06T14:35:44.504-0700\tDEBUG\tsyncer/workflow_registry.go:320\tshutting down readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:44.507416-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Output":"--- PASS: Test_EventHandlerStateSync (4.09s)\n"} -{"Time":"2025-06-06T14:35:44.507423-07:00","Action":"pass","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_EventHandlerStateSync","Elapsed":4.09} -{"Time":"2025-06-06T14:35:44.508233-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync"} -{"Time":"2025-06-06T14:35:44.508236-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":"=== RUN Test_InitialStateSync\n"} -{"Time":"2025-06-06T14:35:44.514384-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.514360000\tDEBUG\tLogPoller\tNew logger: LogPoller\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:44.526982-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.526953000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 9, \"finalized\": 7}\n"} -{"Time":"2025-06-06T14:35:44.526989-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.526969000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 7}\n"} -{"Time":"2025-06-06T14:35:44.527175-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.527158000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 9, \"finalized\": 7}\n"} -{"Time":"2025-06-06T14:35:44.529407-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.529390000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 7}\n"} -{"Time":"2025-06-06T14:35:44.529465-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.529448000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 7, \"blockHash\": \"0xff792f4f9774bc1ed99d719673e79db2eae1d4e54ca89d0b3187adcc29141920\", \"timestamp\": \"14:35:49.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.533174-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.533149000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 8, \"blockHash\": \"0xa4b009aabd5e213fdee91c82708ff927382f9edb1b24db42d336b43157f862fd\", \"timestamp\": \"14:35:50.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.535444-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.535425000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 9, \"blockHash\": \"0x4533390f5716fc22c18adc8942c94ca36cda1c768e0a3fc0755d7ad5036849c7\", \"timestamp\": \"14:35:51.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.606876-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.606833000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:44.607063-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.607048000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 66, \"finalized\": 64}\n"} -{"Time":"2025-06-06T14:35:44.60787-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.607853000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 10, \"end\": 63}\n"} -{"Time":"2025-06-06T14:35:44.609171-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.609146000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 64}\n"} -{"Time":"2025-06-06T14:35:44.609199-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.609186000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 64, \"blockHash\": \"0xd346d8428cc791b7582caf70af8d3c31bde29d009171f2e24ed6789d9287d86d\", \"timestamp\": \"14:36:46.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.610839-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.610815000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 65, \"blockHash\": \"0x741ec134d312e9c87842fa8174c1c5dc8f6c7a76ecda3a2c0a6b0d684a08a439\", \"timestamp\": \"14:36:47.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.612275-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.612260000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 66, \"blockHash\": \"0x6e21bac48ca418aa4d14640e8936a0f69a4919d3bcb768cea695c7839c2bb64b\", \"timestamp\": \"14:36:48.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.697462-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.697421000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 67}\n"} -{"Time":"2025-06-06T14:35:44.697643-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.697625000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 132, \"finalized\": 130}\n"} -{"Time":"2025-06-06T14:35:44.698524-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.698506000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 67, \"end\": 129}\n"} -{"Time":"2025-06-06T14:35:44.69983-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.699812000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 130}\n"} -{"Time":"2025-06-06T14:35:44.699877-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.699853000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 130, \"blockHash\": \"0xfabab86b0f79de3f509d29eae1155ac4ab587ffb10429adda72f9cdabcaf9e57\", \"timestamp\": \"14:37:52.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.701137-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.701116000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 131, \"blockHash\": \"0x098b53cedbf1ae0a913e2493b4b226dacb08a62c350d82c07ae17cd89cdc4fd6\", \"timestamp\": \"14:37:53.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.703355-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.703324000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 132, \"blockHash\": \"0x444f9ae305ffc45d8d2aea1060a258a3031ba63cb17bf573e513689c52ba5026\", \"timestamp\": \"14:37:54.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.795489-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.795445000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 133}\n"} -{"Time":"2025-06-06T14:35:44.795687-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.795655000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 201, \"finalized\": 199}\n"} -{"Time":"2025-06-06T14:35:44.796626-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.796610000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 133, \"end\": 198}\n"} -{"Time":"2025-06-06T14:35:44.798409-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.798391000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 199}\n"} -{"Time":"2025-06-06T14:35:44.798458-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.798441000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 199, \"blockHash\": \"0x4fe6bc698ff244a5462b89d9a84fca6bf8d4d6250907dbf21524cb6f63ee214f\", \"timestamp\": \"14:39:01.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.799729-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.799712000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 200, \"blockHash\": \"0x834835e69e5f6620cf18c9d1fe25ffe2b62ac663b4ef25b5002df37e29b6143b\", \"timestamp\": \"14:39:02.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.800809-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.800781000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 201, \"blockHash\": \"0x1c114cf81896ae19c9df7946e297ea686e0c2dc16ccda0b89822984107e99505\", \"timestamp\": \"14:39:03.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.886695-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.886656000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 202}\n"} -{"Time":"2025-06-06T14:35:44.886897-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.886873000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 267, \"finalized\": 265}\n"} -{"Time":"2025-06-06T14:35:44.887617-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.887600000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 202, \"end\": 264}\n"} -{"Time":"2025-06-06T14:35:44.88908-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.889067000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 265}\n"} -{"Time":"2025-06-06T14:35:44.889126-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.889105000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 265, \"blockHash\": \"0x0baac55f6159c550d26356bebee8e0108ce9833a12a94aea03cf891f732730da\", \"timestamp\": \"14:40:07.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.890561-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.890542000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 266, \"blockHash\": \"0xb4549acd41bac5535a23fcc05d3db464498c67006250fe2e3221a8e6cb0b1ebd\", \"timestamp\": \"14:40:08.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.891512-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.891499000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 267, \"blockHash\": \"0x52441491a3af7c4238e798ba8f6ff32468981c2c9488ef98a097edd3ed69d564\", \"timestamp\": \"14:40:09.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.980109-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.980063000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 268}\n"} -{"Time":"2025-06-06T14:35:44.980319-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.980295000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 333, \"finalized\": 331}\n"} -{"Time":"2025-06-06T14:35:44.980997-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.980980000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 268, \"end\": 330}\n"} -{"Time":"2025-06-06T14:35:44.982373-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.982356000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 331}\n"} -{"Time":"2025-06-06T14:35:44.982415-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.982395000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 331, \"blockHash\": \"0x1363023b7aeaf2a249184b6581f97d6caba589127bcbaba952aa67b18a5238bb\", \"timestamp\": \"14:41:13.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.983429-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.983413000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 332, \"blockHash\": \"0xc97af58f7715bc239f3c3380c4d4291692e194f351b17b638ea4d481bb1181e2\", \"timestamp\": \"14:41:14.000000000\"}\n"} -{"Time":"2025-06-06T14:35:44.984455-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:44.984439000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 333, \"blockHash\": \"0x06be60175f0b298793c85ca54a85eb1ed9830a5a8cb25f932df7d20f5fb8d751\", \"timestamp\": \"14:41:15.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.07983-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.079784000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 334}\n"} -{"Time":"2025-06-06T14:35:45.080029-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.080013000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 400, \"finalized\": 398}\n"} -{"Time":"2025-06-06T14:35:45.080625-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.080605000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 334, \"end\": 397}\n"} -{"Time":"2025-06-06T14:35:45.082694-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.082680000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 398}\n"} -{"Time":"2025-06-06T14:35:45.082737-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.082720000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 398, \"blockHash\": \"0x638ac626a0cd1b7729b4b825843ae14704abbd55318cde2323bb684957b6fdb5\", \"timestamp\": \"14:42:20.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.083775-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.083760000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 399, \"blockHash\": \"0x8dcd48b23082bcdf6d7bbf5338caff9a1ecb5e8281d3e46e783d997fd5623d49\", \"timestamp\": \"14:42:21.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.084755-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.084737000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 400, \"blockHash\": \"0x7ab4692f590f9fefac5cd2502ad10ae9896a5aabde0a155356eba6f0c59ac37f\", \"timestamp\": \"14:42:22.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.182718-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.182672000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 401}\n"} -{"Time":"2025-06-06T14:35:45.18291-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.182893000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 471, \"finalized\": 469}\n"} -{"Time":"2025-06-06T14:35:45.184458-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.183692000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 401, \"end\": 468}\n"} -{"Time":"2025-06-06T14:35:45.186741-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.186719000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 469}\n"} -{"Time":"2025-06-06T14:35:45.186811-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.186772000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 469, \"blockHash\": \"0x27ff3cc575981e7640713bfa4e544e9ceb80dbe702adbce1de83920b3fd392e2\", \"timestamp\": \"14:43:31.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.188408-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.188386000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 470, \"blockHash\": \"0xe2fdbbb352aa6aadfd589a2d9842968ca3989247e6d261cf9fc813ad83319df0\", \"timestamp\": \"14:43:32.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.189625-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.189600000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 471, \"blockHash\": \"0x12248e0121eb393b24086edccf6d7afce1efbc3d2fe3f7529ac232d4bfb54548\", \"timestamp\": \"14:43:33.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.291339-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.291289000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 472}\n"} -{"Time":"2025-06-06T14:35:45.291531-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.291515000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 546, \"finalized\": 544}\n"} -{"Time":"2025-06-06T14:35:45.292133-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.292119000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 472, \"end\": 543}\n"} -{"Time":"2025-06-06T14:35:45.293416-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.293399000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 544}\n"} -{"Time":"2025-06-06T14:35:45.293475-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.293447000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 544, \"blockHash\": \"0x8f164d823dfde55a36d1b6ec9524bbbbccb74eb06c7738036a0728e606490a62\", \"timestamp\": \"14:44:46.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.294524-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.294499000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 545, \"blockHash\": \"0x1a07985478b41cd8ad352d6379e026df6c19c433503b09aeb244205626ff36a5\", \"timestamp\": \"14:44:47.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.2957-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.295686000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 546, \"blockHash\": \"0x19829bd75c15379afd4166f2c5f365ad6c39854b2ee4db8c48bc3c4cb8cf4118\", \"timestamp\": \"14:44:48.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.394382-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.394339000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 547}\n"} -{"Time":"2025-06-06T14:35:45.394587-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.394565000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 615, \"finalized\": 613}\n"} -{"Time":"2025-06-06T14:35:45.395573-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.395555000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 547, \"end\": 612}\n"} -{"Time":"2025-06-06T14:35:45.397074-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.397052000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 613}\n"} -{"Time":"2025-06-06T14:35:45.397122-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.397104000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 613, \"blockHash\": \"0xc069d9a59d1e137553e9f54f8e0161014eb4ec77348affee21fc24c43aacc904\", \"timestamp\": \"14:45:55.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.398466-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.398447000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 614, \"blockHash\": \"0x5f1a9b9c2e0b4ad0b75e372662538623db5b5c2c9c033e8a4b9acf3b77afd958\", \"timestamp\": \"14:45:56.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.399426-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.399410000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 615, \"blockHash\": \"0x395a1d6484fca8321e9fa5c56628ddb89a35bf4c1aded3d81284701cc9e073bc\", \"timestamp\": \"14:45:57.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.503888-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.503832000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 616}\n"} -{"Time":"2025-06-06T14:35:45.504093-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.504067000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 689, \"finalized\": 687}\n"} -{"Time":"2025-06-06T14:35:45.504758-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.504731000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 616, \"end\": 686}\n"} -{"Time":"2025-06-06T14:35:45.506286-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.506270000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 687}\n"} -{"Time":"2025-06-06T14:35:45.506337-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.506312000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 687, \"blockHash\": \"0xafdd0ae126c6a62dc3b3fcf32885c1534b6bcc6c068f88c567b22e7f901006c3\", \"timestamp\": \"14:47:09.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.507265-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.507248000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 688, \"blockHash\": \"0x5c34d0acb68f299dc4b49e49bd247c1565cfecddfc7bbcf1427eeef57891fd37\", \"timestamp\": \"14:47:10.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.50812-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.508103000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 689, \"blockHash\": \"0x84c056b2c6ca5990b720fc52bf9abe1a7a431e22033d10fb770d57ded628883a\", \"timestamp\": \"14:47:11.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.594387-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.594342000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 690}\n"} -{"Time":"2025-06-06T14:35:45.594579-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.594561000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 750, \"finalized\": 748}\n"} -{"Time":"2025-06-06T14:35:45.595285-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.595266000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 690, \"end\": 747}\n"} -{"Time":"2025-06-06T14:35:45.596908-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.596883000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 748}\n"} -{"Time":"2025-06-06T14:35:45.596961-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.596941000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 748, \"blockHash\": \"0xfe9848ebb039e02f0f59a86b9a6083d189876f8c9d1202dee17ce8865f927b0f\", \"timestamp\": \"14:48:10.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.598423-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.598399000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 749, \"blockHash\": \"0xe92e88ddad1583ab80ef70de3f8873c64693ac0a79e0de7902d012ae6ffba0fd\", \"timestamp\": \"14:48:11.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.599932-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.599913000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 750, \"blockHash\": \"0xed1fd52b352294996db471de321c1bc7bc6215b649176c86fe8104c5ab5395ff\", \"timestamp\": \"14:48:12.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.606344-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 2025-06-06T14:35:45.606-0700\tDEBUG\tsyncer/workflow_registry.go:245\tWaiting for DON...\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:45.606524-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.606497000\tDEBUG\tChainReader\tNew logger: ChainReader\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:45.610037-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 2025-06-06T14:35:45.610-0700\tDEBUG\tsyncer/workflow_registry.go:415\tLoading initial workflows for DON\t{\"version\": \"unset@unset\", \"DON\": 1}\n"} -{"Time":"2025-06-06T14:35:45.631833-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 2025-06-06T14:35:45.631-0700\tDEBUG\tsyncer/workflow_registry.go:422\tRehydrating existing workflows\t{\"version\": \"unset@unset\", \"len\": 250}\n"} -{"Time":"2025-06-06T14:35:45.631913-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 2025-06-06T14:35:45.631-0700\tDEBUG\tsyncer/workflow_registry.go:316\trunning readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:45.701215-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.701182000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 751}\n"} -{"Time":"2025-06-06T14:35:45.701445-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.701429000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:45.70205-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.702033000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 751, \"end\": 756}\n"} -{"Time":"2025-06-06T14:35:45.703553-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.703539000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:45.703575-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.703550000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [751, 753]}\n"} -{"Time":"2025-06-06T14:35:45.705766-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.705745000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 751, \"to\": 753, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xf483640c17e6c7fc43a933d61618e992c180f26505fa0744b5a69e1c16601a9c\",\"BlockNumber\":751,\"BlockTimestamp\":\"2025-06-06T14:48:13-07:00\",\"FinalizedBlockNumber\":751,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:45.709721-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.709696000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:45.709724-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.709705000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [756, 754]}\n"} -{"Time":"2025-06-06T14:35:45.711322-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.711310000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 754, \"to\": 756, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0xd07874e4c1be2217f0e56075b50a8566d863a723173a773a5ffafaace90c95d3\",\"BlockNumber\":754,\"BlockTimestamp\":\"2025-06-06T14:48:16-07:00\",\"FinalizedBlockNumber\":754,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:45.713745-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.713729000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 757, \"blockHash\": \"0x182448cb1ac52caedcf7abf760e415b60fb8202dcdb73dd42d19e0571bcb89a8\", \"timestamp\": \"14:48:19.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.715846-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.715828000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 758, \"blockHash\": \"0x259d075ac6ed4693b6992f35f3da2e635f627da8722a5ffaf5418c6dd5d7f89f\", \"timestamp\": \"14:48:20.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.716811-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.716795000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 759, \"blockHash\": \"0x44dc01a97102ba6e65893271ec1e2ee5b2ee7800e9d583ff0fdedbbb3bac1c30\", \"timestamp\": \"14:48:21.000000000\"}\n"} -{"Time":"2025-06-06T14:35:45.796747-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.796687000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:45.797015-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.796993000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:45.79702-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.797010000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:45.892573-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.892533000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:45.892812-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.892794000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:45.892817-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.892803000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:45.999101-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.999047000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:45.999372-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.999351000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:45.99938-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:45.999361000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.104515-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.104474000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:46.104805-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.104784000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:46.10481-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.104793000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.209319-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.209251000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:46.209583-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.209562000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:46.20959-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.209578000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.317654-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.317593000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:46.317946-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.317928000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:46.317951-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.317937000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.412719-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.412677000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:46.412983-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.412965000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:46.412989-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.412974000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.507655-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.507594000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:46.507924-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.507906000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:46.507941-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.507915000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.59799-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.597947000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760}\n"} -{"Time":"2025-06-06T14:35:46.598229-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.598211000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 759, \"finalized\": 757}\n"} -{"Time":"2025-06-06T14:35:46.598234-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 14:35:46.598219000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 760, \"latestBlockNumber\": 759}\n"} -{"Time":"2025-06-06T14:35:46.606411-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":" logger.go:146: 2025-06-06T14:35:46.606-0700\tDEBUG\tsyncer/workflow_registry.go:320\tshutting down readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:46.610307-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Output":"--- PASS: Test_InitialStateSync (2.10s)\n"} -{"Time":"2025-06-06T14:35:46.610316-07:00","Action":"pass","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_InitialStateSync","Elapsed":2.1} -{"Time":"2025-06-06T14:35:46.61032-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_SecretsWorker"} -{"Time":"2025-06-06T14:35:46.610322-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_SecretsWorker","Output":"=== RUN Test_SecretsWorker\n"} -{"Time":"2025-06-06T14:35:46.610332-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_SecretsWorker","Output":" tests.go:91: Failed to parse CL_RUN_FLAKEY: strconv.ParseBool: parsing \"\": invalid syntax\n"} -{"Time":"2025-06-06T14:35:46.61041-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_SecretsWorker","Output":" tests.go:93: Flakey https://smartcontract-it.atlassian.net/browse/DX-732\n"} -{"Time":"2025-06-06T14:35:46.610413-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_SecretsWorker","Output":"--- SKIP: Test_SecretsWorker (0.00s)\n"} -{"Time":"2025-06-06T14:35:46.610414-07:00","Action":"skip","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_SecretsWorker","Elapsed":0} -{"Time":"2025-06-06T14:35:46.610417-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON"} -{"Time":"2025-06-06T14:35:46.610418-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":"=== RUN Test_RegistrySyncer_SkipsEventsNotBelongingToDON\n"} -{"Time":"2025-06-06T14:35:46.619339-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.619306000\tDEBUG\tLogPoller\tNew logger: LogPoller\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:46.631549-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:46.631-0700\tDEBUG\tsyncer/workflow_registry.go:245\tWaiting for DON...\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:46.631627-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.631602000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 9, \"finalized\": 7}\n"} -{"Time":"2025-06-06T14:35:46.631635-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.631616000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 7}\n"} -{"Time":"2025-06-06T14:35:46.6317-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.631678000\tDEBUG\tChainReader\tNew logger: ChainReader\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:46.631862-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.631823000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 9, \"finalized\": 7}\n"} -{"Time":"2025-06-06T14:35:46.633305-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.633285000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 7}\n"} -{"Time":"2025-06-06T14:35:46.635092-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:46.635-0700\tDEBUG\tsyncer/workflow_registry.go:415\tLoading initial workflows for DON\t{\"version\": \"unset@unset\", \"DON\": 1}\n"} -{"Time":"2025-06-06T14:35:46.635203-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.635175000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 7, \"blockHash\": \"0xb80468ad5d76ca8a478623eed267ad0f5f5b1179ec264967369a0067e75703de\", \"timestamp\": \"14:35:51.000000000\"}\n"} -{"Time":"2025-06-06T14:35:46.635404-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:46.635-0700\tDEBUG\tsyncer/workflow_registry.go:422\tRehydrating existing workflows\t{\"version\": \"unset@unset\", \"len\": 0}\n"} -{"Time":"2025-06-06T14:35:46.63541-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:46.635-0700\tDEBUG\tsyncer/workflow_registry.go:316\trunning readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:46.637005-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.636984000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 8, \"blockHash\": \"0xab967120258d73a59b9594c1c9c8bad12dbe06b05f67d6283ead621320fb8e8d\", \"timestamp\": \"14:35:52.000000000\"}\n"} -{"Time":"2025-06-06T14:35:46.638635-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.638614000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 9, \"blockHash\": \"0x24a3f7eb924c311cba18aaffd53c5c256a45e7aac9bac1f046aa62627cb72c85\", \"timestamp\": \"14:35:53.000000000\"}\n"} -{"Time":"2025-06-06T14:35:46.715368-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.715337000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:46.715686-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.715664000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:46.71655-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.716527000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 10, \"end\": 12}\n"} -{"Time":"2025-06-06T14:35:46.717978-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.717951000\tDEBUG\tLogPoller\tGot blocks from log poller\t{\"version\": \"(devel)@unset\", \"blockNumbers\": []}\n"} -{"Time":"2025-06-06T14:35:46.717984-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.717965000\tDEBUG\tLogPoller\tFalling back to RPC for blocks not found in log poller blocks table\t{\"version\": \"(devel)@unset\", \"remainingBlocks\": [10, 12]}\n"} -{"Time":"2025-06-06T14:35:46.720423-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.720398000\tDEBUG\tLogPoller\tBackfill found logs\t{\"version\": \"(devel)@unset\", \"from\": 10, \"to\": 12, \"logs\": 1, \"blocks\": [{\"EVMChainID\":null,\"BlockHash\":\"0x3459b6b2191383946e3729e23ceb8ae2343ab5316c01e04a121bb26fa1380323\",\"BlockNumber\":10,\"BlockTimestamp\":\"2025-06-06T14:35:54-07:00\",\"FinalizedBlockNumber\":10,\"CreatedAt\":\"0001-01-01T00:00:00Z\"}]}\n"} -{"Time":"2025-06-06T14:35:46.72472-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.724699000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 13, \"blockHash\": \"0x81c23320117ed919dc787696e1c6efc95b55cc5b84d47f36d88ce5ff807b0a77\", \"timestamp\": \"14:35:57.000000000\"}\n"} -{"Time":"2025-06-06T14:35:46.726916-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.726900000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 14, \"blockHash\": \"0x0f43463bccf2de24356a47a49051336f1c8435b286ddf1361bd75d5736f20a0c\", \"timestamp\": \"14:35:58.000000000\"}\n"} -{"Time":"2025-06-06T14:35:46.72821-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.728192000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 15, \"blockHash\": \"0xf94be07218ac25061222cd6a033d52e713c753d1af1213e6138ec5fddab6c0ee\", \"timestamp\": \"14:35:59.000000000\"}\n"} -{"Time":"2025-06-06T14:35:46.822397-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.822366000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:46.822625-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.822610000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:46.82264-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.822617000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:46.915509-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.915469000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:46.915757-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.915741000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:46.915764-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:46.915749000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.013486-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.013447000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.01371-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.013693000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.013715-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.013701000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.124536-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.124481000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.124625-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:47.124-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 2, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"8\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:47.124652-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:47.124-0700\tDEBUG\tsyncer/workflow_registry.go:381\tevent belongs to a different don, skipping...\t{\"version\": \"unset@unset\", \"don\": 1, \"gotDON\": \"2\"}\n"} -{"Time":"2025-06-06T14:35:47.124799-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.124781000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.124805-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.124790000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.225638-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.225580000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.225918-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.225897000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.225924-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.225909000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.323773-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.323699000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.32414-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.324106000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.324147-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.324126000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.425561-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.425500000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.425841-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.425822000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.425846-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.425832000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.5301-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.530047000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.530361-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.530343000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.530367-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.530352000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.62262-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.622569000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16}\n"} -{"Time":"2025-06-06T14:35:47.622637-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:47.622-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"8\", \"logCursor\": \"13-0-0x53c1aabcf90958101017c2e0d6df33bd4bad03a07cbf49885e8cc6f55af9f51c\"}\n"} -{"Time":"2025-06-06T14:35:47.622875-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.622859000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 15, \"finalized\": 13}\n"} -{"Time":"2025-06-06T14:35:47.622886-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 14:35:47.622867000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 16, \"latestBlockNumber\": 15}\n"} -{"Time":"2025-06-06T14:35:47.639792-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":" logger.go:146: 2025-06-06T14:35:47.639-0700\tDEBUG\tsyncer/workflow_registry.go:320\tshutting down readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:47.641398-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Output":"--- PASS: Test_RegistrySyncer_SkipsEventsNotBelongingToDON (1.03s)\n"} -{"Time":"2025-06-06T14:35:47.641404-07:00","Action":"pass","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_SkipsEventsNotBelongingToDON","Elapsed":1.03} -{"Time":"2025-06-06T14:35:47.64141-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused"} -{"Time":"2025-06-06T14:35:47.641411-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":"=== RUN Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused\n"} -{"Time":"2025-06-06T14:35:47.647993-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.647969000\tDEBUG\tLogPoller\tNew logger: LogPoller\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:47.652325-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:47.652-0700\tDEBUG\tWorkflowLimiter\tsyncerlimiter/limiter.go:58\tworkflow limits set\t{\"version\": \"unset@unset\", \"perOwner\": 200, \"global\": 200, \"overrides\": {}}\n"} -{"Time":"2025-06-06T14:35:47.658724-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.658691000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 6, \"finalized\": 4}\n"} -{"Time":"2025-06-06T14:35:47.658731-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.658712000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 4}\n"} -{"Time":"2025-06-06T14:35:47.658926-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.658907000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 6, \"finalized\": 4}\n"} -{"Time":"2025-06-06T14:35:47.660049-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.660027000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 4}\n"} -{"Time":"2025-06-06T14:35:47.660115-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.660094000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 4, \"blockHash\": \"0x3d0c0632f0c052518084db064fe991ecd70405fa0cbcf069867d09b101fa4204\", \"timestamp\": \"14:35:49.000000000\"}\n"} -{"Time":"2025-06-06T14:35:47.660228-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:47.660-0700\tDEBUG\tsyncer/workflow_registry.go:245\tWaiting for DON...\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:47.660406-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.660386000\tDEBUG\tChainReader\tNew logger: ChainReader\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:47.663497-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:47.663-0700\tDEBUG\tsyncer/workflow_registry.go:415\tLoading initial workflows for DON\t{\"version\": \"unset@unset\", \"DON\": 1}\n"} -{"Time":"2025-06-06T14:35:47.663809-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:47.663-0700\tDEBUG\tsyncer/workflow_registry.go:422\tRehydrating existing workflows\t{\"version\": \"unset@unset\", \"len\": 0}\n"} -{"Time":"2025-06-06T14:35:47.663815-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:47.663-0700\tDEBUG\tsyncer/workflow_registry.go:316\trunning readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:47.664144-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.664120000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 5, \"blockHash\": \"0x46ac6c6c6ddc164197465eebebed7036ced9615a7f0382284be285134d91ed87\", \"timestamp\": \"14:35:50.000000000\"}\n"} -{"Time":"2025-06-06T14:35:47.665532-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.665505000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 6, \"blockHash\": \"0x9c0a7ba3f70a75d0539512430e00226ff24f0885d35fbfba62ef51d23596b070\", \"timestamp\": \"14:35:51.000000000\"}\n"} -{"Time":"2025-06-06T14:35:47.742693-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.742641000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 7}\n"} -{"Time":"2025-06-06T14:35:47.743039-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.743013000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:47.743868-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.743849000\tINFO\tLogPoller\tBackfilling logs\t{\"version\": \"(devel)@unset\", \"start\": 7, \"end\": 9}\n"} -{"Time":"2025-06-06T14:35:47.744596-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.744572000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:47.7448-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.744776000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 10, \"blockHash\": \"0x052e9b6e4463dba48dfb05ea9df2aec69140e975cb1718b6d0870fc03fb63861\", \"timestamp\": \"14:35:55.000000000\"}\n"} -{"Time":"2025-06-06T14:35:47.749979-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.749957000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 11, \"blockHash\": \"0x032c0701074bb796a6d01044dfddad733883366130e8b5fecc282f8b1974ec22\", \"timestamp\": \"14:35:56.000000000\"}\n"} -{"Time":"2025-06-06T14:35:47.751548-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.751522000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 12, \"blockHash\": \"0x6a2ffa5a51ff58beca6b91acaed822eb31f62102f43103d672f14acd637808f7\", \"timestamp\": \"14:35:57.000000000\"}\n"} -{"Time":"2025-06-06T14:35:47.841159-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.841094000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:47.841415-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.841394000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:47.841423-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.841406000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:47.942456-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.942391000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:47.94274-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.942720000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:47.942746-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:47.942731000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.046434-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.046388000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.046699-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.046681000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.046704-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.046690000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.152201-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.152154000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.152251-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:48.152-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 1, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"8\", \"logCursor\": \"\"}\n"} -{"Time":"2025-06-06T14:35:48.152491-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.152461000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.152498-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.152479000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.16822-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:48.168-0700\tERROR\tsyncer/handler.go:255\tfailed to emit status changed event: unknown message type: *events.WorkflowStatusChanged\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.168231-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).Handle\n"} -{"Time":"2025-06-06T14:35:48.168233-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" \t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:255\n"} -{"Time":"2025-06-06T14:35:48.168235-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).handleWithMetrics\n"} -{"Time":"2025-06-06T14:35:48.168236-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" \t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:405\n"} -{"Time":"2025-06-06T14:35:48.168246-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).readRegistryEventsLoop\n"} -{"Time":"2025-06-06T14:35:48.168248-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" \t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:393\n"} -{"Time":"2025-06-06T14:35:48.168249-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).syncUsingEventStrategy\n"} -{"Time":"2025-06-06T14:35:48.168251-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" \t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:460\n"} -{"Time":"2025-06-06T14:35:48.168253-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).Start.func1.1\n"} -{"Time":"2025-06-06T14:35:48.168254-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" \t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:261\n"} -{"Time":"2025-06-06T14:35:48.168257-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:48.168-0700\tDEBUG\tsyncer/handler.go:258\thandled event\t{\"version\": \"unset@unset\", \"workflowID\": \"00fcae8f25b48b7c795d16e43b9b365afeffd4e3057330bea9e21d6522ee23b9\", \"workflowName\": \"test-wf\", \"workflowOwner\": \"80a7c6d91898e2c3d7ea367113bdfc385bdadac6\", \"type\": \"WorkflowRegisteredV1\"}\n"} -{"Time":"2025-06-06T14:35:48.255917-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.255872000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.256198-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.256178000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.256203-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.256188000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.348647-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.348590000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.348924-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.348905000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.34893-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.348913000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.452324-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.452265000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.452592-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.452573000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.452598-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.452582000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.549958-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.549900000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.550245-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.550220000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.550252-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.550232000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.651437-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:48.651-0700\tDEBUG\tsyncer/workflow_registry.go:344\tQueryKeys called\t{\"version\": \"unset@unset\", \"logs\": 0, \"eventTypes\": [\"WorkflowForceUpdateSecretsRequestedV1\",\"WorkflowActivatedV1\",\"WorkflowDeletedV1\",\"WorkflowPausedV1\",\"WorkflowRegisteredV1\",\"WorkflowUpdatedV1\"], \"lastReadBlockNumber\": \"8\", \"logCursor\": \"10-0-0xf1dff5a9e988c27f65f386c9e4b09fc63f54f29d7b50e6231c057c0133515b95\"}\n"} -{"Time":"2025-06-06T14:35:48.65771-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.657688000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13}\n"} -{"Time":"2025-06-06T14:35:48.657975-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.657959000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.65798-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 14:35:48.657968000\tDEBUG\tLogPoller\tNo new blocks since last poll\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 13, \"latestBlockNumber\": 12}\n"} -{"Time":"2025-06-06T14:35:48.665873-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":" logger.go:146: 2025-06-06T14:35:48.665-0700\tDEBUG\tsyncer/workflow_registry.go:320\tshutting down readRegistryEventsLoop\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.66783-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Output":"--- PASS: Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused (1.03s)\n"} -{"Time":"2025-06-06T14:35:48.667834-07:00","Action":"pass","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused","Elapsed":1.03} -{"Time":"2025-06-06T14:35:48.66784-07:00","Action":"run","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated"} -{"Time":"2025-06-06T14:35:48.667842-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"=== RUN Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated\n"} -{"Time":"2025-06-06T14:35:48.67684-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.676808000\tDEBUG\tLogPoller\tNew logger: LogPoller\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.681025-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.680-0700\tDEBUG\tWorkflowLimiter\tsyncerlimiter/limiter.go:58\tworkflow limits set\t{\"version\": \"unset@unset\", \"perOwner\": 200, \"global\": 200, \"overrides\": {}}\n"} -{"Time":"2025-06-06T14:35:48.688773-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.688-0700\tDEBUG\tsyncer/workflow_registry.go:245\tWaiting for DON...\t{\"version\": \"unset@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.688936-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.688919000\tDEBUG\tChainReader\tNew logger: ChainReader\t{\"version\": \"(devel)@unset\"}\n"} -{"Time":"2025-06-06T14:35:48.698277-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.698-0700\tDEBUG\tsyncer/workflow_registry.go:415\tLoading initial workflows for DON\t{\"version\": \"unset@unset\", \"DON\": 1}\n"} -{"Time":"2025-06-06T14:35:48.698459-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.698442000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.698464-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.698455000\tDEBUG\tLogPoller\tPolling for logs\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:48.698642-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.698624000\tDEBUG\tLogPoller\tLatest blocks read from chain\t{\"version\": \"(devel)@unset\", \"latest\": 12, \"finalized\": 10}\n"} -{"Time":"2025-06-06T14:35:48.698932-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 2025-06-06T14:35:48.698-0700\tDEBUG\tsyncer/workflow_registry.go:422\tRehydrating existing workflows\t{\"version\": \"unset@unset\", \"len\": 1}\n"} -{"Time":"2025-06-06T14:35:48.700684-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.700660000\tINFO\tLogPoller\tDo not have previous block, first poll ever on new chain\t{\"version\": \"(devel)@unset\", \"currentBlockNumber\": 10}\n"} -{"Time":"2025-06-06T14:35:48.700878-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.700849000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 1, \"currentBlockNumber\": 10, \"blockHash\": \"0x6ebee403440d3dc5db2bcc20e668b50c4c4c94eb26cab6339e9f5d17958d0a14\", \"timestamp\": \"14:35:56.000000000\"}\n"} -{"Time":"2025-06-06T14:35:48.706784-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.706765000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 11, \"blockHash\": \"0x61c3f8c8bf90f836c14ada1f98ec28567781dc29b64c14b092137d5177ae2cbb\", \"timestamp\": \"14:35:57.000000000\"}\n"} -{"Time":"2025-06-06T14:35:48.70757-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":" logger.go:146: 14:35:48.707545000\tDEBUG\tLogPoller\tUnfinalized log query\t{\"version\": \"(devel)@unset\", \"logs\": 0, \"currentBlockNumber\": 12, \"blockHash\": \"0xca9894b01ad147e02db1ddbffbd7ac7927e2d424afb39874cd6335caa507a3a8\", \"timestamp\": \"14:35:58.000000000\"}\n"} -{"Time":"2025-06-06T14:35:48.712992-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"panic: runtime error: invalid memory address or nil pointer dereference\n"} -{"Time":"2025-06-06T14:35:48.712997-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"[signal SIGSEGV: segmentation violation code=0x2 addr=0x48 pc=0x101f834bc]\n"} -{"Time":"2025-06-06T14:35:48.713-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\n"} -{"Time":"2025-06-06T14:35:48.713012-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"goroutine 56083 [running]:\n"} -{"Time":"2025-06-06T14:35:48.713015-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).ensureCapRegistryReady.func1()\n"} -{"Time":"2025-06-06T14:35:48.713017-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:791 +0x2c\n"} -{"Time":"2025-06-06T14:35:48.713026-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/internal.RunWithRetries({0x105d0b770, 0x14001102a50}, {0x14eeb3940, 0x140023141e0}, 0x1dcd6500, 0x0, 0x140025151f8)\n"} -{"Time":"2025-06-06T14:35:48.713028-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/internal/retry.go:25 +0x7c\n"} -{"Time":"2025-06-06T14:35:48.713031-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).ensureCapRegistryReady(0x1400107c800?, {0x105d0b770?, 0x14001102a50?})\n"} -{"Time":"2025-06-06T14:35:48.713037-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:784 +0x80\n"} -{"Time":"2025-06-06T14:35:48.713046-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).tryEngineCreate(0x1400107c800, {0x105d0b770, 0x14001102a50}, 0x14001306240)\n"} -{"Time":"2025-06-06T14:35:48.713049-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:700 +0x34\n"} -{"Time":"2025-06-06T14:35:48.713071-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).workflowRegisteredEvent(0x1400107c800, {0x105d0b770, 0x14001102a50}, {{0x0, 0x39, 0xa5, 0xc1, 0xbe, 0x78, 0x5e, ...}, ...})\n"} -{"Time":"2025-06-06T14:35:48.713077-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:433 +0x448\n"} -{"Time":"2025-06-06T14:35:48.713096-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*eventHandler).Handle(0x1400107c800, {0x105d0b770, 0x14001102a50}, {{0x1040ab3e3?, 0x14002515cb8?}, {0x105b80160?, 0x14003ab5a00?}})\n"} -{"Time":"2025-06-06T14:35:48.713099-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/handler.go:249 +0x1fc4\n"} -{"Time":"2025-06-06T14:35:48.713125-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).handleWithMetrics(0x14000626800, {0x105d0b770, 0x14001102a50}, {{0x1040ab3e3?, 0x0?}, {0x105b80160?, 0x14003ab5a00?}})\n"} -{"Time":"2025-06-06T14:35:48.713129-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:405 +0x84\n"} -{"Time":"2025-06-06T14:35:48.713155-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).syncUsingEventStrategy(0x14000626800, {0x105d0b770, 0x14001102a50}, {0x1, 0x0, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)\n"} -{"Time":"2025-06-06T14:35:48.713158-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:430 +0x378\n"} -{"Time":"2025-06-06T14:35:48.71316-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).Start.func1.1()\n"} -{"Time":"2025-06-06T14:35:48.713165-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:261 +0x244\n"} -{"Time":"2025-06-06T14:35:48.713168-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"created by github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer.(*workflowRegistry).Start.func1 in goroutine 55818\n"} -{"Time":"2025-06-06T14:35:48.713176-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Test":"Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated","Output":"\t/Users/erik/Documents/repos/chainlink/core/services/workflows/syncer/workflow_registry.go:241 +0xac\n"} -{"Time":"2025-06-06T14:35:48.71692-07:00","Action":"output","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Output":"FAIL\tgithub.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer\t9.915s\n"} -{"Time":"2025-06-06T14:35:48.71693-07:00","Action":"fail","Package":"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/workflows/syncer","Elapsed":9.917} diff --git a/tools/flakeguard/runner/runner.go b/tools/flakeguard/runner/runner.go deleted file mode 100644 index 1f7e0f41d..000000000 --- a/tools/flakeguard/runner/runner.go +++ /dev/null @@ -1,340 +0,0 @@ -package runner - -import ( - "errors" - "fmt" - "regexp" - "strings" - - "github.com/rs/zerolog/log" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/executor" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/parser" -) - -// Runner describes the test run parameters and manages test execution and result parsing. -// It delegates command execution to an Executor and result parsing to a Parser. -type Runner struct { - // Configuration fields - ProjectPath string - Verbose bool - RunCount int - GoTestCountFlag *int - GoTestRaceFlag bool - GoTestTimeoutFlag string - Tags []string - UseShuffle bool - ShuffleSeed string - FailFast bool - SkipTests []string - SelectTests []string - RawOutputDir string - - IgnoreParentFailuresOnSubtests bool - OmitOutputsOnSuccess bool - - // Dependencies - exec executor.Executor // Injected Executor - parser parser.Parser // Injected Parser (interface defined in parser.go) - -} - -// NewRunner creates a new Runner with the default command executor. -func NewRunner( - projectPath string, - verbose bool, - runCount int, - goTestCountFlag *int, - goTestRaceFlag bool, - goTestTimeoutFlag string, - tags []string, - useShuffle bool, - shuffleSeed string, - failFast bool, - skipTests []string, - selectTests []string, - ignoreParentFailuresOnSubtests bool, - omitOutputsOnSuccess bool, - rawOutputDir string, - exec executor.Executor, - p parser.Parser, -) *Runner { - if exec == nil { - exec = executor.NewCommandExecutor() - } - if p == nil { - p = parser.NewParser() // Use constructor from parser.go - } - return &Runner{ - ProjectPath: projectPath, - Verbose: verbose, - RunCount: runCount, - GoTestCountFlag: goTestCountFlag, - GoTestRaceFlag: goTestRaceFlag, - GoTestTimeoutFlag: goTestTimeoutFlag, - Tags: tags, - UseShuffle: useShuffle, - ShuffleSeed: shuffleSeed, - FailFast: failFast, - SkipTests: skipTests, - SelectTests: selectTests, - IgnoreParentFailuresOnSubtests: ignoreParentFailuresOnSubtests, - OmitOutputsOnSuccess: omitOutputsOnSuccess, - RawOutputDir: rawOutputDir, - exec: exec, - parser: p, - } -} - -// Helper function to create executor.Config from Runner fields -func (r *Runner) getExecutorConfig() executor.Config { - return executor.Config{ - ProjectPath: r.ProjectPath, - Verbose: r.Verbose, - GoTestCountFlag: r.GoTestCountFlag, - GoTestRaceFlag: r.GoTestRaceFlag, - GoTestTimeoutFlag: r.GoTestTimeoutFlag, - Tags: r.Tags, - UseShuffle: r.UseShuffle, - ShuffleSeed: r.ShuffleSeed, - SkipTests: r.SkipTests, - SelectTests: r.SelectTests, - RawOutputDir: r.RawOutputDir, - } -} - -// Helper function to create parser.Config from Runner fields -func (r *Runner) getParserConfig() parser.Config { - return parser.Config{ - IgnoreParentFailuresOnSubtests: r.IgnoreParentFailuresOnSubtests, - OmitOutputsOnSuccess: r.OmitOutputsOnSuccess, - } -} - -// RunTestPackages executes the tests for each provided package and aggregates all results. -func (r *Runner) RunTestPackages(packages []string) ([]reports.TestResult, error) { - rawOutputFiles := make([]string, 0) // Collect output file paths for this run - execCfg := r.getExecutorConfig() - - for _, p := range packages { - for runIdx := 0; runIdx < r.RunCount; runIdx++ { - // Delegate execution to the executor - jsonFilePath, passed, err := r.exec.RunTestPackage(execCfg, p, runIdx) - if err != nil { - // Handle executor errors (e.g., command not found, setup issues) - return nil, fmt.Errorf("executor failed for package %s on run %d: %w", p, runIdx, err) - } - if jsonFilePath != "" { // Append path even if tests failed (passed == false) - rawOutputFiles = append(rawOutputFiles, jsonFilePath) - } - if !passed && r.FailFast { - log.Warn().Msgf("FailFast enabled: Stopping run after failure in package %s", p) - goto ParseResults // Exit outer loop early - } - } - } - -ParseResults: - // Delegate parsing to the parser - if len(rawOutputFiles) == 0 { - log.Warn().Msg("No output files were generated, likely due to FailFast or an early error.") - return []reports.TestResult{}, nil // Return empty results - } - - log.Info().Int("file_count", len(rawOutputFiles)).Msg("Parsing output files") - // Create parser config and pass it - parserCfg := r.getParserConfig() - // Ignore the returned file paths here, as they aren't used in this flow - results, _, err := r.parser.ParseFiles(rawOutputFiles, "run", len(rawOutputFiles), parserCfg) - if err != nil { - // Check if it's a build error from the parser - if errors.Is(err, parser.ErrBuild) { // Updated check - // No extra wrapping needed if buildErr already provides enough context - return nil, err - } - return nil, fmt.Errorf("failed to parse test results: %w", err) - } - - return results, nil -} - -// RunTestCmd runs an arbitrary command testCmd that produces Go test JSON output. -func (r *Runner) RunTestCmd(testCmd []string) ([]reports.TestResult, error) { - rawOutputFiles := make([]string, 0) // Reset output files for this run - execCfg := r.getExecutorConfig() - - for i := 0; i < r.RunCount; i++ { - // Delegate execution to the executor - jsonOutputPath, passed, err := r.exec.RunCmd(execCfg, testCmd, i) - if err != nil { - // Handle executor errors - return nil, fmt.Errorf("executor failed for custom command on run %d: %w", i, err) - } - if jsonOutputPath != "" { - rawOutputFiles = append(rawOutputFiles, jsonOutputPath) - } - if !passed && r.FailFast { - log.Warn().Msgf("FailFast enabled: Stopping run after custom command failure") - break // Exit loop early - } - } - - // Delegate parsing to the parser - if len(rawOutputFiles) == 0 { - log.Warn().Msg("No output files were generated for custom command, likely due to FailFast or an early error.") - return []reports.TestResult{}, nil - } - - log.Info().Int("file_count", len(rawOutputFiles)).Msg("Parsing output files from custom command") - // Create parser config and pass it - parserCfg := r.getParserConfig() - // Ignore the returned file paths here as well - results, _, err := r.parser.ParseFiles(rawOutputFiles, "run", len(rawOutputFiles), parserCfg) - if err != nil { - if errors.Is(err, parser.ErrBuild) { // Updated check - return nil, err - } - return nil, fmt.Errorf("failed to parse test results from custom command: %w", err) - } - - return results, nil -} - -// RerunFailedTests reruns specific tests that failed in previous runs using the Executor and Parser. -func (r *Runner) RerunFailedTests(failedTests []reports.TestResult, rerunCount int) ([]reports.TestResult, []string, error) { - if len(failedTests) == 0 || rerunCount <= 0 { - log.Info().Msg("No failed tests provided or rerun count is zero. Skipping reruns.") - return []reports.TestResult{}, []string{}, nil // Nothing to rerun - } - - // Use a map for efficient lookup and update of currently failing tests - currentlyFailing := make(map[string]map[string]struct{}) // pkg -> testName -> exists - for _, tr := range failedTests { - if tr.TestPackage == "" || tr.TestName == "" { - log.Warn().Interface("test_result", tr).Msg("Skipping rerun for test result with missing package or name") - continue - } - if _, ok := currentlyFailing[tr.TestPackage]; !ok { - currentlyFailing[tr.TestPackage] = make(map[string]struct{}) - } - currentlyFailing[tr.TestPackage][tr.TestName] = struct{}{} - } - - if len(currentlyFailing) == 0 { - log.Warn().Msg("No valid failed tests found to rerun after filtering.") - return []reports.TestResult{}, []string{}, nil - } - - if r.Verbose { - log.Info().Int("packages", len(currentlyFailing)).Int("rerun_count", rerunCount).Msg("Starting test reruns for failed tests") - } - - rerunOutputFiles := make([]string, 0) - baseExecCfg := r.getExecutorConfig() - - // 2. Iterate Rerun Count - for i := 0; i < rerunCount; i++ { - if len(currentlyFailing) == 0 { - log.Info().Int("iteration", i).Msg("All previously failing tests passed in reruns. Stopping reruns early.") - break // Stop if no more tests are failing - } - - if r.Verbose { - log.Info().Int("iteration", i+1).Int("total", rerunCount).Int("tests_to_rerun", countMapKeys(currentlyFailing)).Msg("Running rerun iteration") - } - - failingThisIteration := make(map[string]map[string]struct{}) // Track tests still failing *after this iteration* - - // 3. Execute Rerun per Package for currently failing tests - for pkg, testsMap := range currentlyFailing { - if len(testsMap) == 0 { - continue - } - - testsToRun := make([]string, 0, len(testsMap)) - for testName := range testsMap { - testsToRun = append(testsToRun, testName) - } - - // Escape test names for regex and join with | - escapedTests := make([]string, len(testsToRun)) - for j, testName := range testsToRun { - escapedTests[j] = regexp.QuoteMeta(testName) - } - testPattern := fmt.Sprintf("^(?:%s)$", strings.Join(escapedTests, "|")) - - // Create specific executor config for this rerun invocation - rerunExecCfg := baseExecCfg // Copy base config - one := 1 - rerunExecCfg.GoTestCountFlag = &one // Force -count=1 for rerun - rerunExecCfg.SelectTests = []string{testPattern} // Target specific tests via -run - rerunExecCfg.SkipTests = nil // Ensure no tests are skipped via -skip - - if r.Verbose { - log.Info().Str("package", pkg).Str("pattern", testPattern).Int("rerun_iter", i+1).Msg("Executing package rerun") - } - - jsonOutputPath, passed, err := r.exec.RunTestPackage(rerunExecCfg, pkg, i) - if err != nil { - // If execution fails for a package, return the error immediately - log.Error().Err(err).Str("package", pkg).Int("rerun_iteration", i+1).Msg("Error executing rerun command for package") - return nil, nil, fmt.Errorf("error on rerun execution for package %s: %w", pkg, err) - } - if jsonOutputPath != "" { - rerunOutputFiles = append(rerunOutputFiles, jsonOutputPath) - } - - // If the command failed (exit code != 0), keep all tests from this package in the failing list for the next iteration. - // Otherwise (passed=true), assume tests in this run passed and remove them from the failing list. - if !passed { - if _, ok := failingThisIteration[pkg]; !ok { - failingThisIteration[pkg] = make(map[string]struct{}) - } - for testName := range testsMap { - failingThisIteration[pkg][testName] = struct{}{} - } - } - } // end loop over packages for this iteration - - // Update the set of failing tests for the next iteration - currentlyFailing = failingThisIteration - } // end loop over rerunCount - - // 4. Parse Rerun Outputs - if len(rerunOutputFiles) == 0 { - log.Warn().Msg("No output files were generated during reruns (possibly due to execution errors).") - return []reports.TestResult{}, []string{}, nil - } - - log.Info().Int("file_count", len(rerunOutputFiles)).Msg("Parsing rerun output files") - // Create parser config and pass it - parserCfg := r.getParserConfig() - // For parsing reruns, the effective number of runs *per test included in the output* is `rerunCount`. - // The parser's `expectedRuns` helps adjust for potential overcounting within each file, using `rerunCount` seems correct here. - rerunResults, parsedFilePaths, err := r.parser.ParseFiles(rerunOutputFiles, "rerun", rerunCount, parserCfg) - if err != nil { - // Check for build error specifically? - if errors.Is(err, parser.ErrBuild) { // Updated check - log.Error().Err(err).Msg("Build error occurred unexpectedly during test reruns") - // Fallthrough to return wrapped error - } - // Return the file paths even if parsing failed? No, the report wouldn't be useful. - return nil, nil, fmt.Errorf("failed to parse rerun results: %w", err) - } - - // 5. Return Results - log.Info().Int("result_count", len(rerunResults)).Msg("Finished parsing rerun results") - // Return the parsed results AND the list of files parsed. - // Note: The function signature needs to change back to return []string - return rerunResults, parsedFilePaths, nil -} - -// Helper function to count keys in the nested map for logging -func countMapKeys(m map[string]map[string]struct{}) int { - count := 0 - for _, subMap := range m { - count += len(subMap) - } - return count -} diff --git a/tools/flakeguard/runner/runner_integration_test.go b/tools/flakeguard/runner/runner_integration_test.go deleted file mode 100644 index 3c1da858d..000000000 --- a/tools/flakeguard/runner/runner_integration_test.go +++ /dev/null @@ -1,336 +0,0 @@ -// Integration tests for the runner package, executing real tests. -package runner_test - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner" -) - -var ( - flakyTestPackagePath = "./example_test_package" - debugDir = "_debug_outputs_integration" -) - -type expectedTestResult struct { - allSuccesses bool - someSuccesses bool - allFailures bool - someFailures bool - allSkips bool - testPanic bool - packagePanic bool - race bool - maximumRuns int - - exactRuns *int - minimumRuns *int - exactPassRate *float64 - minimumPassRate *float64 - maximumPassRate *float64 - - seen bool -} - -func TestRunIntegration(t *testing.T) { - var ( - zeroRuns = 0 - oneCount = 1 - defaultRunCount = 3 - successPassRate = 1.0 - failPassRate = 0.0 - ) - testCases := []struct { - name string - cfg runnerConfig - expectedTests map[string]*expectedTestResult - expectBuildErr bool - }{ - { - name: "default (integration)", - cfg: runnerConfig{ - ProjectPath: "../", - RunCount: defaultRunCount, - SkipTests: []string{"TestPanic", "TestFlakyPanic", "TestSubTestsSomePanic", "TestTimeout"}, - GoTestCountFlag: &oneCount, - OmitOutputs: true, - IgnoreSubtestErr: false, - Tags: []string{"example_package_tests"}, - }, - expectedTests: map[string]*expectedTestResult{ - "TestFlaky": {exactRuns: &defaultRunCount, someSuccesses: true, someFailures: true}, - "TestFail": {exactRuns: &defaultRunCount, allFailures: true, exactPassRate: &failPassRate}, - "TestFailLargeOutput": {exactRuns: &defaultRunCount, allFailures: true, exactPassRate: &failPassRate}, - "TestPass": {exactRuns: &defaultRunCount, allSuccesses: true, exactPassRate: &successPassRate}, - "TestSkipped": {exactRuns: &zeroRuns, allSkips: true, exactPassRate: &successPassRate}, - "TestRace": {exactRuns: &defaultRunCount, allSuccesses: true, exactPassRate: &successPassRate}, - "TestSubTestsAllPass": {exactRuns: &defaultRunCount, allSuccesses: true}, - "TestSubTestsAllPass/Pass1": {exactRuns: &defaultRunCount, allSuccesses: true}, - "TestSubTestsAllPass/Pass2": {exactRuns: &defaultRunCount, allSuccesses: true}, - "TestFailInParentAfterSubTests": {exactRuns: &defaultRunCount, allFailures: true}, - "TestFailInParentAfterSubTests/Pass1": {exactRuns: &defaultRunCount, allSuccesses: true}, - "TestFailInParentAfterSubTests/Pass2": {exactRuns: &defaultRunCount, allSuccesses: true}, - "TestFailInParentBeforeSubTests": {exactRuns: &defaultRunCount, allFailures: true}, - "TestSubTestsAllFail": {exactRuns: &defaultRunCount, allFailures: true}, - "TestSubTestsAllFail/Fail1": {exactRuns: &defaultRunCount, allFailures: true}, - "TestSubTestsAllFail/Fail2": {exactRuns: &defaultRunCount, allFailures: true}, - "TestSubTestsSomeFail": {exactRuns: &defaultRunCount, allFailures: true}, - "TestSubTestsSomeFail/Pass": {exactRuns: &defaultRunCount, allSuccesses: true}, - "TestSubTestsSomeFail/Fail": {exactRuns: &defaultRunCount, allFailures: true}, - }, - }, - { - name: "race (integration)", - cfg: runnerConfig{ - ProjectPath: "../", - RunCount: defaultRunCount, - SelectTests: []string{"TestRace"}, - GoTestRaceFlag: true, - OmitOutputs: true, - IgnoreSubtestErr: false, - Tags: []string{"example_package_tests"}, - }, - expectedTests: map[string]*expectedTestResult{ - "TestRace": {race: true, maximumRuns: defaultRunCount, allFailures: true}, - }, - }, - { - name: "always panic (integration)", - cfg: runnerConfig{ - ProjectPath: "../", - RunCount: defaultRunCount, - SelectTests: []string{"TestPanic"}, - GoTestCountFlag: &oneCount, - OmitOutputs: true, - Tags: []string{"example_package_tests"}, - }, - expectedTests: map[string]*expectedTestResult{ - "TestPanic": {packagePanic: true, testPanic: true, maximumRuns: defaultRunCount, allFailures: true}, - }, - }, - { - name: "flaky panic (integration)", - cfg: runnerConfig{ - ProjectPath: "../", - RunCount: defaultRunCount, - SelectTests: []string{"TestFlakyPanic"}, - GoTestCountFlag: &oneCount, - OmitOutputs: true, - Tags: []string{"example_package_tests"}, - }, - expectedTests: map[string]*expectedTestResult{ - // This test panics on first run, passes on second. We run 3 times. - // Expect PackagePanic=true, TestPanic=true (as it panicked at least once) - // Expect some failures (at least 1), some successes (at least 1). - // Exact runs should be defaultRunCount. - "TestFlakyPanic": {exactRuns: &defaultRunCount, packagePanic: true, testPanic: true, someSuccesses: true, someFailures: true}, - }, - }, - { - name: "subtest panic (integration)", - cfg: runnerConfig{ - ProjectPath: "../", - RunCount: defaultRunCount, - SelectTests: []string{"TestSubTestsSomePanic"}, - GoTestCountFlag: &oneCount, - OmitOutputs: true, - Tags: []string{"example_package_tests"}, - }, - expectedTests: map[string]*expectedTestResult{ - "TestSubTestsSomePanic": {exactRuns: &defaultRunCount, packagePanic: true, testPanic: true, allFailures: true}, // Parent fails due to subtest panic - "TestSubTestsSomePanic/Pass": {exactRuns: &defaultRunCount, packagePanic: true, testPanic: true, allFailures: true}, // Inherits panic, successes become failures - "TestSubTestsSomePanic/Panic": {exactRuns: &defaultRunCount, packagePanic: true, testPanic: true, allFailures: true}, // Panics directly - }, - }, - { - name: "failfast (integration)", - cfg: runnerConfig{ - ProjectPath: "../", - RunCount: defaultRunCount, // Will try 3 times, but fail-fast stops early - SelectTests: []string{"TestFail", "TestPass"}, - GoTestCountFlag: &oneCount, - FailFast: true, - OmitOutputs: true, - Tags: []string{"example_package_tests"}, - }, - expectedTests: map[string]*expectedTestResult{ - // Only one execution attempt happens because FailFast=true and TestFail fails. - "TestFail": {exactRuns: &oneCount, allFailures: true}, - "TestPass": {exactRuns: &oneCount, allSuccesses: true}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - absProjectPath, err := filepath.Abs(tc.cfg.ProjectPath) - require.NoError(t, err) - - tempDir, err := os.MkdirTemp("", "flakeguard-test") - require.NoError(t, err) - - testRunner := runner.NewRunner( - absProjectPath, - false, - tc.cfg.RunCount, - tc.cfg.GoTestCountFlag, - tc.cfg.GoTestRaceFlag, - tc.cfg.GoTestTimeoutFlag, - tc.cfg.Tags, - tc.cfg.UseShuffle, - tc.cfg.ShuffleSeed, - tc.cfg.FailFast, - tc.cfg.SkipTests, - tc.cfg.SelectTests, - tc.cfg.IgnoreSubtestErr, - tc.cfg.OmitOutputs, - tempDir, - nil, // Use default executor - nil, // Use default parser - ) - - testResults, err := testRunner.RunTestPackages([]string{"./runner/example_test_package"}) - - if tc.expectBuildErr { - require.Error(t, err) - return - } - require.NoError(t, err) - - t.Cleanup(func() { - if !t.Failed() { - return - } - if err := os.MkdirAll(debugDir, 0755); err != nil { - t.Logf("error creating directory: %v", err) - return - } - saniTName := strings.ReplaceAll(t.Name(), "/", "_") - resultsFileName := filepath.Join(debugDir, fmt.Sprintf("test_results_%s.json", saniTName)) - jsonResults, err := json.MarshalIndent(testResults, "", " ") - if err != nil { - t.Logf("error marshalling test report: %v", err) - return - } - err = os.WriteFile(resultsFileName, jsonResults, 0644) //nolint:gosec - if err != nil { - t.Logf("error writing test results: %v", err) - return - } - t.Logf("Saved failing test results to %s", resultsFileName) - }) - - checkTestResults(t, tc.expectedTests, testResults) - }) - } -} - -// Helper function to check results against expectations -func checkTestResults(t *testing.T, expectedTests map[string]*expectedTestResult, actualResults []reports.TestResult) { - t.Helper() - assert.Equal(t, len(expectedTests), len(actualResults), "unexpected number of test results recorded") - - for _, result := range actualResults { - t.Run(fmt.Sprintf("checking results of %s", result.TestName), func(t *testing.T) { - require.NotNil(t, result, "test result was nil") - expected, ok := expectedTests[result.TestName] - require.True(t, ok, "unexpected test name found in results: %s", result.TestName) - require.False(t, expected.seen, "test '%s' was seen multiple times", result.TestName) - expected.seen = true - - if !expected.testPanic { - assert.False(t, result.Panic, "test '%s' should not have panicked", result.TestName) - } - - if expected.minimumRuns != nil { - assert.GreaterOrEqual(t, result.Runs, *expected.minimumRuns, "test '%s' had fewer runs (%d) than expected minimum (%d)", result.TestName, result.Runs, *expected.minimumRuns) - } - if expected.exactRuns != nil { - assert.Equal(t, *expected.exactRuns, result.Runs, "test '%s' had an unexpected number of runs", result.TestName) - } else { - assert.LessOrEqual(t, result.Runs, expected.maximumRuns, "test '%s' had more runs (%d) than expected maximum (%d)", result.TestName, result.Runs, expected.maximumRuns) - } - if expected.exactPassRate != nil { - assert.InDelta(t, *expected.exactPassRate, result.PassRatio, 0.001, "test '%s' had an unexpected pass ratio", result.TestName) - } - if expected.minimumPassRate != nil { - assert.Greater(t, result.PassRatio, *expected.minimumPassRate, "test '%s' had a pass ratio below the minimum", result.TestName) - } - if expected.maximumPassRate != nil { - assert.Less(t, result.PassRatio, *expected.maximumPassRate, "test '%s' had a pass ratio above the maximum", result.TestName) - } - if expected.allSuccesses { - assert.Equal(t, result.Runs, result.Successes, "test '%s' has %d runs and should have passed all, only passed %d", result.TestName, result.Runs, result.Successes) - assert.Zero(t, result.Failures, "test '%s' has %d runs and should have passed all, but failed %d", result.TestName, result.Runs, result.Failures) - assert.False(t, result.Panic, "test '%s' should not have panicked", result.TestName) - assert.False(t, result.Race, "test '%s' should not have raced", result.TestName) - } - if expected.someSuccesses { - assert.Greater(t, result.Successes, 0, "test '%s' has %d runs and should have passed some runs, passed none", result.TestName, result.Runs) - } - if expected.allFailures { - assert.Equal(t, result.Runs, result.Failures, "test '%s' has %d runs and should have failed all, only failed %d", result.TestName, result.Runs, result.Failures) - assert.Zero(t, result.Successes, "test '%s' has %d runs and should have failed all, but succeeded %d", result.TestName, result.Runs, result.Successes) - } - if expected.packagePanic { - assert.True(t, result.PackagePanic, "test '%s' should have package panicked", result.TestName) - } - if expected.testPanic { - assert.True(t, result.Panic, "test '%s' should have panicked", result.TestName) - assert.True(t, result.PackagePanic, "test '%s' should have package panicked", result.TestName) - expected.someFailures = true - } - if expected.someFailures { - assert.Greater(t, result.Failures, 0, "test '%s' has %d runs and should have failed some runs, failed none", result.TestName, result.Runs) - } - if expected.allSkips { - assert.Equal(t, 0, result.Runs, "test '%s' has %d runs and should have skipped all of them, no runs expected", result.TestName, result.Runs) - assert.True(t, result.Skipped, "test '%s' should be marked skipped", result.TestName) - assert.Zero(t, result.Successes, "test '%s' should have skipped all runs, but succeeded some", result.TestName) - assert.Zero(t, result.Failures, "test '%s' should have skipped all runs, but failed some", result.TestName) - assert.False(t, result.Panic, "test '%s' should not have panicked", result.TestName) - assert.False(t, result.Race, "test '%s' should not have raced", result.TestName) - } - if expected.race { - assert.True(t, result.Race, "test '%s' should have a data race", result.TestName) - assert.GreaterOrEqual(t, result.Failures, 1, "test '%s' should have failed due to race", result.TestName) - } - }) - } - - allTestsRun := []string{} - for testName, expected := range expectedTests { - if expected.seen { - allTestsRun = append(allTestsRun, testName) - } - } - for testName, expected := range expectedTests { - require.True(t, expected.seen, "expected test '%s' not found in test runs\nAll tests run: %s", testName, strings.Join(allTestsRun, ", ")) - } -} - -type runnerConfig struct { - ProjectPath string - RunCount int - GoTestCountFlag *int - GoTestRaceFlag bool - GoTestTimeoutFlag string - Tags []string - UseShuffle bool - ShuffleSeed string - FailFast bool - SkipTests []string - SelectTests []string - OmitOutputs bool - IgnoreSubtestErr bool -} diff --git a/tools/flakeguard/runner/runner_test.go b/tools/flakeguard/runner/runner_test.go deleted file mode 100644 index f5c189b4d..000000000 --- a/tools/flakeguard/runner/runner_test.go +++ /dev/null @@ -1,466 +0,0 @@ -//go:build !integration_tests -// +build !integration_tests - -package runner_test - -import ( - "fmt" - "regexp" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/executor" - "github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/runner/parser" -) - -type mockExecutor struct { - RunTestPackageFn func(cfg executor.Config, packageName string, runIndex int) (outputFilePath string, passed bool, err error) - RunCmdFn func(cfg executor.Config, testCmd []string, runIndex int) (outputFilePath string, passed bool, err error) - - RunTestPackageCalls []executor.Config - RunCmdCalls [][]string -} - -func (m *mockExecutor) RunTestPackage(cfg executor.Config, packageName string, runIndex int) (string, bool, error) { - m.RunTestPackageCalls = append(m.RunTestPackageCalls, cfg) - if m.RunTestPackageFn != nil { - return m.RunTestPackageFn(cfg, packageName, runIndex) - } - return fmt.Sprintf("mock_output_%s_%d.json", packageName, runIndex), true, nil -} - -func (m *mockExecutor) RunCmd(cfg executor.Config, testCmd []string, runIndex int) (string, bool, error) { - m.RunCmdCalls = append(m.RunCmdCalls, testCmd) - if m.RunCmdFn != nil { - return m.RunCmdFn(cfg, testCmd, runIndex) - } - return fmt.Sprintf("mock_cmd_output_%d.json", runIndex), true, nil -} - -type mockParser struct { - ParseFilesFn func(rawFilePaths []string, runPrefix string, expectedRuns int, cfg parser.Config) ([]reports.TestResult, []string, error) - - ParseFilesCalls [][]string - LastParseCfg parser.Config -} - -func (m *mockParser) ParseFiles(rawFilePaths []string, runPrefix string, expectedRuns int, cfg parser.Config) ([]reports.TestResult, []string, error) { - m.ParseFilesCalls = append(m.ParseFilesCalls, rawFilePaths) - m.LastParseCfg = cfg - if m.ParseFilesFn != nil { - return m.ParseFilesFn(rawFilePaths, runPrefix, expectedRuns, cfg) - } - return []reports.TestResult{{TestName: "DefaultMockTest"}}, rawFilePaths, nil -} - -func TestRunner_RunTestPackages(t *testing.T) { - t.Parallel() - - testCases := []struct { - name string - runCount int - failFast bool - packages []string - executorResponses map[string]struct { - passed bool - err error - } - expectedExecCalls int - expectedParseArgs struct { - fileCount int - cfg parser.Config - } - expectedResultCount int - expectedError bool - }{ - { - name: "Happy path - 2 runs, 2 packages", - runCount: 2, - failFast: false, - packages: []string{"pkgA", "pkgB"}, - executorResponses: map[string]struct { - passed bool - err error - }{ - "pkgA-0": {passed: true, err: nil}, - "pkgA-1": {passed: true, err: nil}, - "pkgB-0": {passed: true, err: nil}, - "pkgB-1": {passed: true, err: nil}, - }, - expectedExecCalls: 4, - expectedParseArgs: struct { - fileCount int - cfg parser.Config - }{fileCount: 4, cfg: parser.Config{IgnoreParentFailuresOnSubtests: false, OmitOutputsOnSuccess: false}}, - expectedResultCount: 1, - expectedError: false, - }, - { - name: "FailFast stops execution", - runCount: 5, - failFast: true, - packages: []string{"pkgA", "pkgB"}, - executorResponses: map[string]struct { - passed bool - err error - }{ - "pkgA-0": {passed: false, err: nil}, - }, - expectedExecCalls: 1, - expectedParseArgs: struct { - fileCount int - cfg parser.Config - }{fileCount: 1, cfg: parser.Config{IgnoreParentFailuresOnSubtests: false, OmitOutputsOnSuccess: true}}, - expectedResultCount: 1, - expectedError: false, - }, - { - name: "Executor error stops execution", - runCount: 3, - failFast: false, - packages: []string{"pkgA", "pkgB"}, - executorResponses: map[string]struct { - passed bool - err error - }{ - "pkgA-0": {passed: true, err: nil}, - "pkgA-1": {passed: true, err: fmt.Errorf("executor boom")}, - }, - expectedExecCalls: 2, - expectedResultCount: 0, - expectedError: true, - }, - { - name: "Parser error propagated", - runCount: 1, - failFast: false, - packages: []string{"pkgA"}, - executorResponses: map[string]struct { - passed bool - err error - }{ - "pkgA-0": {passed: true, err: nil}, - }, - expectedExecCalls: 1, - expectedResultCount: 0, - expectedError: true, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - mockExec := &mockExecutor{ - RunTestPackageFn: func(cfg executor.Config, pkg string, idx int) (string, bool, error) { - key := fmt.Sprintf("%s-%d", pkg, idx) - resp, ok := tc.executorResponses[key] - if !ok { - return fmt.Sprintf("mock_%s_%d.json", pkg, idx), true, nil - } - return fmt.Sprintf("mock_%s_%d.json", pkg, idx), resp.passed, resp.err - }, - } - mockParse := &mockParser{} - if tc.name == "Parser error propagated" { - mockParse.ParseFilesFn = func(_ []string, _ string, _ int, _ parser.Config) ([]reports.TestResult, []string, error) { - return nil, nil, fmt.Errorf("parser failed") - } - } - - r := runner.NewRunner( - ".", - false, // Verbose - tc.runCount, - nil, // goTestCountFlag - false, // goTestRaceFlag - "", // goTestTimeoutFlag - nil, // tags - false, // useShuffle - "", // shuffleSeed - tc.failFast, - nil, // skipTests - nil, // selectTests - tc.expectedParseArgs.cfg.IgnoreParentFailuresOnSubtests, - tc.expectedParseArgs.cfg.OmitOutputsOnSuccess, - "", - mockExec, - mockParse, - ) - - actualResults, err := r.RunTestPackages(tc.packages) - - assert.Len(t, mockExec.RunTestPackageCalls, tc.expectedExecCalls, "Unexpected number of executor calls") - - if tc.expectedError { - assert.Error(t, err) - if tc.name == "Executor error stops execution" { - assert.Len(t, mockParse.ParseFilesCalls, 0, "Parser should not be called on executor error") - } - } else { - assert.NoError(t, err) - assert.Len(t, mockParse.ParseFilesCalls, 1, "Parser should be called once on success/parser error") - if len(mockParse.ParseFilesCalls) > 0 { - assert.Len(t, mockParse.ParseFilesCalls[0], tc.expectedParseArgs.fileCount, "Parser called with wrong number of files") - assert.Equal(t, tc.expectedParseArgs.cfg, mockParse.LastParseCfg, "Parser called with wrong config") - } - assert.Len(t, actualResults, tc.expectedResultCount, "Unexpected number of results returned") - } - }) - } -} - -func TestRunner_RunTestCmd(t *testing.T) { - t.Parallel() - - testCases := []struct { - name string - runCount int - failFast bool - cmd []string - executorResponses []struct { - passed bool - err error - } - expectedExecCalls int - expectedParseArgs struct { - fileCount int - cfg parser.Config - } - expectedResultCount int - expectedError bool - }{ - { - name: "Happy path - 2 runs", - runCount: 2, - failFast: false, - cmd: []string{"go", "test", "./..."}, - executorResponses: []struct { - passed bool - err error - }{ - {passed: true, err: nil}, - {passed: true, err: nil}, - }, - expectedExecCalls: 2, - expectedParseArgs: struct { - fileCount int - cfg parser.Config - }{fileCount: 2, cfg: parser.Config{IgnoreParentFailuresOnSubtests: false, OmitOutputsOnSuccess: false}}, - expectedResultCount: 1, - expectedError: false, - }, - { - name: "FailFast stops execution", - runCount: 3, - failFast: true, - cmd: []string{"go", "test", "./..."}, - executorResponses: []struct { - passed bool - err error - }{ - {passed: false, err: nil}, // Fails on first run - }, - expectedExecCalls: 1, - expectedParseArgs: struct { - fileCount int - cfg parser.Config - }{fileCount: 1, cfg: parser.Config{IgnoreParentFailuresOnSubtests: false, OmitOutputsOnSuccess: true}}, - expectedResultCount: 1, - expectedError: false, - }, - { - name: "Executor error stops execution", - runCount: 3, - failFast: false, - cmd: []string{"go", "test", "./..."}, - executorResponses: []struct { - passed bool - err error - }{ - {passed: true, err: nil}, - {passed: false, err: fmt.Errorf("exec boom")}, // Error on second run - }, - expectedExecCalls: 2, - expectedResultCount: 0, - expectedError: true, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - execCallCount := 0 - mockExec := &mockExecutor{ - RunCmdFn: func(cfg executor.Config, cmd []string, idx int) (string, bool, error) { - execCallCount++ - if idx < len(tc.executorResponses) { - resp := tc.executorResponses[idx] - return fmt.Sprintf("mock_cmd_%d.json", idx), resp.passed, resp.err - } - return fmt.Sprintf("mock_cmd_%d.json", idx), true, nil - }, - } - mockParse := &mockParser{} - - r := runner.NewRunner( - ".", tc.failFast, // other fields default/nil - tc.runCount, nil, false, "", nil, false, "", tc.failFast, nil, nil, - tc.expectedParseArgs.cfg.IgnoreParentFailuresOnSubtests, - tc.expectedParseArgs.cfg.OmitOutputsOnSuccess, - "", - mockExec, mockParse, - ) - - actualResults, err := r.RunTestCmd(tc.cmd) - - assert.Equal(t, tc.expectedExecCalls, execCallCount, "Unexpected number of executor RunCmd calls") - - if tc.expectedError { - assert.Error(t, err) - assert.Len(t, mockParse.ParseFilesCalls, 0, "Parser should not be called on executor error") - } else { - assert.NoError(t, err) - assert.Len(t, mockParse.ParseFilesCalls, 1, "Parser should be called once on success") - if len(mockParse.ParseFilesCalls) > 0 { - assert.Len(t, mockParse.ParseFilesCalls[0], tc.expectedParseArgs.fileCount, "Parser called with wrong number of files") - assert.Equal(t, tc.expectedParseArgs.cfg, mockParse.LastParseCfg, "Parser called with wrong config") - } - assert.Len(t, actualResults, tc.expectedResultCount, "Unexpected number of results returned") - } - }) - } -} - -func TestRunner_RerunFailedTests(t *testing.T) { - t.Parallel() - - testCases := []struct { - name string - initialFailedTests []reports.TestResult - rerunCount int - executorResponses map[string]struct { - passed bool - err error - } - expectedExecCalls int - expectedParseArgs struct { - fileCount int - cfg parser.Config - } - expectedFinalResultCount int - expectedError bool - }{ - { - name: "Rerun successful", - initialFailedTests: []reports.TestResult{ - {TestName: "TestFailA", TestPackage: "pkgA", Failures: 1, Runs: 1}, - {TestName: "TestFailB", TestPackage: "pkgB", Failures: 1, Runs: 1}, - }, - rerunCount: 2, - executorResponses: map[string]struct { - passed bool - err error - }{ - "pkgA-0": {passed: true, err: nil}, - "pkgB-0": {passed: false, err: nil}, - "pkgB-1": {passed: true, err: nil}, - }, - expectedExecCalls: 3, - expectedParseArgs: struct { - fileCount int - cfg parser.Config - }{fileCount: 3, cfg: parser.Config{OmitOutputsOnSuccess: false}}, - expectedFinalResultCount: 1, - expectedError: false, - }, - { - name: "No failed tests to rerun", - initialFailedTests: []reports.TestResult{}, - rerunCount: 3, - expectedExecCalls: 0, - expectedParseArgs: struct { - fileCount int - cfg parser.Config - }{fileCount: 0}, - expectedError: false, - }, - { - name: "Executor error during rerun", - initialFailedTests: []reports.TestResult{ - {TestName: "TestFailA", TestPackage: "pkgA", Failures: 1, Runs: 1}, - }, - rerunCount: 1, - executorResponses: map[string]struct { - passed bool - err error - }{ - "pkgA-0": {passed: false, err: fmt.Errorf("exec rerun boom")}, - }, - expectedExecCalls: 1, - expectedError: true, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - execCallCount := 0 - mockExec := &mockExecutor{ - RunTestPackageFn: func(cfg executor.Config, pkg string, idx int) (string, bool, error) { - execCallCount++ - key := fmt.Sprintf("%s-%d", pkg, idx) - resp, ok := tc.executorResponses[key] - if !ok { - return fmt.Sprintf("mock_rerun_%s_%d.json", pkg, idx), true, nil - } - // Check if config forces count=1 and has the right -run pattern - assert.NotNil(t, cfg.GoTestCountFlag, "Rerun should force GoTestCountFlag") - if cfg.GoTestCountFlag != nil { - assert.Equal(t, 1, *cfg.GoTestCountFlag, "Rerun should force count=1") - } - assert.Nil(t, cfg.SkipTests, "Rerun should clear SkipTests") - require.Len(t, cfg.SelectTests, 1, "Rerun should set exactly one SelectTests pattern") - // Basic check if pattern looks right (contains test names from input) - for _, failedTest := range tc.initialFailedTests { - if failedTest.TestPackage == pkg { - assert.Contains(t, cfg.SelectTests[0], regexp.QuoteMeta(failedTest.TestName)) - } - } - return fmt.Sprintf("mock_rerun_%s_%d.json", pkg, idx), resp.passed, resp.err - }, - } - mockParse := &mockParser{} - - r := runner.NewRunner(".", false, 0, nil, false, "", nil, false, "", false, nil, nil, false, false, - "", - mockExec, mockParse) - - actualResults, _, err := r.RerunFailedTests(tc.initialFailedTests, tc.rerunCount) - - assert.Equal(t, tc.expectedExecCalls, execCallCount, "Unexpected number of executor calls") - - if tc.expectedError { - assert.Error(t, err) - assert.Len(t, mockParse.ParseFilesCalls, 0, "Parser should not be called on rerun executor error") - } else { - assert.NoError(t, err) - if tc.expectedExecCalls > 0 { - assert.Len(t, mockParse.ParseFilesCalls, 1, "Parser should be called once after reruns") - if len(mockParse.ParseFilesCalls) > 0 { - assert.Len(t, mockParse.ParseFilesCalls[0], tc.expectedParseArgs.fileCount, "Parser called with wrong number of files") - assert.Equal(t, r.IgnoreParentFailuresOnSubtests, mockParse.LastParseCfg.IgnoreParentFailuresOnSubtests, "Parser IgnoreParentFailures mismatch") - assert.Equal(t, r.OmitOutputsOnSuccess, mockParse.LastParseCfg.OmitOutputsOnSuccess, "Parser OmitOutputsOnSuccess mismatch") - } - assert.Len(t, actualResults, tc.expectedFinalResultCount, "Unexpected number of results returned from rerun parse") - } else { - assert.Len(t, mockParse.ParseFilesCalls, 0, "Parser should not be called if no reruns executed") - assert.Empty(t, actualResults, "No results expected if no reruns executed") - } - } - }) - } -} diff --git a/tools/flakeguard/user_mapping.json b/tools/flakeguard/user_mapping.json deleted file mode 100644 index 2f42c04a1..000000000 --- a/tools/flakeguard/user_mapping.json +++ /dev/null @@ -1,82 +0,0 @@ -[ - { - "jira_user_id": "6175d3e016119e0069fdd14f", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "638f597c3e79f12e57253913", - "pillar_name": "Platform Services" - }, - { - "jira_user_id": "641949fb1273131f2ae1dd4e", - "pillar_name": "Data" - }, - { - "jira_user_id": "63beffc42a526608c5501530", - "pillar_name": "Foundation" - }, - { - "jira_user_id": "61c3bc0d68926d0068ad903d", - "pillar_name": "Dev Platform" - }, - { - "jira_user_id": "712020:0403445b-a590-4e71-944c-e5b3c681dafb", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "615260607a6be400718eefff", - "pillar_name": "Foundation" - }, - { - "jira_user_id": "6115c23730fe4500702c1301", - "pillar_name": "Foundation" - }, - { - "jira_user_id": "61b2b168744c4d006994b84c", - "pillar_name": "Dev Platform" - }, - { - "jira_user_id": "620a6e93bba9ca0070c98e8f", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "712020:76432787-cb4c-452a-92bf-4653a7b145ec", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "712020:f11a58b4-3503-4d4d-9983-d4161c7d27a8", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "712020:97d1a977-ba60-4d03-a15e-369daf238718", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "712020:5ab0ffd6-6baa-4ea1-ace5-a57ae20db75a", - "pillar_name": "Connectivity" - }, - { - "jira_user_id": "610c6e93ae72b2006f798c06", - "pillar_name": "Foundation" - }, - { - "jira_user_id": "610c6ea1ec92ab0070ec5c07", - "pillar_name": "Data" - }, - { - "jira_user_id": "712020:7aaa919f-fc27-42dc-9b1f-05fd49d5723b", - "pillar_name": "Integrations" - }, - { - "jira_user_id": "61452c1eeaef340069a02d4a", - "pillar_name": "Integrations" - }, - { - "jira_user_id": "712020:255a47f2-cfd0-4186-b8b3-9c502314f726", - "pillar_name": "Foundation" - }, - { - "jira_user_id": "712020:0f7e9a75-6933-4dcb-91fd-b6bf1c903d6f", - "pillar_name": "Foundation" - } -] diff --git a/tools/flakeguard/user_test_mapping.json b/tools/flakeguard/user_test_mapping.json deleted file mode 100644 index a6fa37a6c..000000000 --- a/tools/flakeguard/user_test_mapping.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "jira_user_id": "6175d3e016119e0069fdd14f", - "pattern": "github\\.com/smartcontractkit/chainlink/integration-tests/smoke/ccip.*" - }, - { - "jira_user_id": "638f597c3e79f12e57253913", - "pattern": "github\\.com/smartcontractkit/chainlink/integration-tests/smoke.*" - }, - { - "jira_user_id": "641949fb1273131f2ae1dd4e", - "pattern": "github.com/smartcontractkit/chainlink/deployment/data-streams" - }, - { - "jira_user_id": "63beffc42a526608c5501530", - "pattern": "github.com/smartcontractkit/chainlink/system-tests/tests/smoke/capabilities.*" - }, - { - "jira_user_id": "63beffc42a526608c5501530", - "pattern": "github.com/smartcontractkit/chainlink/v2/core/capabilities/integration_tests/keystone.*" - }, - { - "jira_user_id": "61c3bc0d68926d0068ad903d", - "pattern": "github.com/smartcontractkit/chainlink/v2/core/services/keeper" - }, - { - "jira_user_id": "61c3bc0d68926d0068ad903d", - "pattern": "github.com/smartcontractkit/chainlink/v2/core/services/relay.*" - }, - { - "jira_user_id": "6115c23730fe4500702c1301", - "pattern": "github.com/smartcontractkit/chainlink/v2/core/services.*" - }, - { - "jira_user_id": "6115c23730fe4500702c1301", - "pattern": "github.com/smartcontractkit/chainlink/v2/core/capabilities.*" - }, - { - "jira_user_id": "638f597c3e79f12e57253913", - "pattern": "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset" - }, - { - "jira_user_id": "712020:0403445b-a590-4e71-944c-e5b3c681dafb", - "pattern": "github.com/smartcontractkit/chainlink/deployment/ccip.*" - }, - { - "jira_user_id": "6175d3e016119e0069fdd14f", - "pattern": "github.com/smartcontractkit/chainlink/deployment.*" - }, - { - "jira_user_id": "638f597c3e79f12e57253913", - "pattern": ".*" - } -] diff --git a/tools/flakeguard/utils/cmd.go b/tools/flakeguard/utils/cmd.go deleted file mode 100644 index 1fde1d8d2..000000000 --- a/tools/flakeguard/utils/cmd.go +++ /dev/null @@ -1,20 +0,0 @@ -package utils - -import ( - "bytes" - "os/exec" -) - -type CmdOutput struct { - Stdout bytes.Buffer - Stderr bytes.Buffer -} - -func ExecuteCmd(name string, args ...string) (*CmdOutput, error) { - cmd := exec.Command(name, args...) - out := &CmdOutput{} - cmd.Stdout = &out.Stdout - cmd.Stderr = &out.Stderr - err := cmd.Run() - return out, err -} diff --git a/tools/flakeguard/utils/cmd_test.go b/tools/flakeguard/utils/cmd_test.go deleted file mode 100644 index a6dc01ff8..000000000 --- a/tools/flakeguard/utils/cmd_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package utils - -import ( - "strings" - "testing" -) - -func TestExecuteCmd(t *testing.T) { - tests := []struct { - name string - cmd string - args []string - expectedOut string - expectedErr string - expectingFail bool - }{ - { - name: "successful command", - cmd: "echo", - args: []string{"Hello, world!"}, - expectedOut: "Hello, world!\n", - expectedErr: "", - }, - { - name: "successful command with no args", - cmd: "echo", - args: []string{}, - expectedOut: "\n", - expectedErr: "", - }, - { - name: "nonexistent command", - cmd: "nonexistentcommand", - args: []string{}, - expectedOut: "", - expectingFail: true, - }, - { - name: "command with stderr", - cmd: "ls", - args: []string{"nonexistentfile"}, - expectedOut: "", - expectedErr: "No such file or directory", - expectingFail: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - output, err := ExecuteCmd(tt.cmd, tt.args...) - if (err != nil) != tt.expectingFail { - t.Fatalf("expected failure: %v, got error: %v", tt.expectingFail, err) - } - - if output.Stdout.String() != tt.expectedOut { - t.Errorf("unexpected stdout: expected %q, got %q", tt.expectedOut, output.Stdout.String()) - } - - if !strings.Contains(output.Stderr.String(), tt.expectedErr) { - t.Errorf("unexpected stderr: expected to contain %q, got %q", tt.expectedErr, output.Stderr.String()) - } - }) - } -} diff --git a/tools/flakeguard/utils/goutils.go b/tools/flakeguard/utils/goutils.go deleted file mode 100644 index 9a9de3023..000000000 --- a/tools/flakeguard/utils/goutils.go +++ /dev/null @@ -1,46 +0,0 @@ -package utils - -import ( - "fmt" - "os" - "path/filepath" - "strings" -) - -func GetGoProjectName(path string) (string, error) { - // Walk up the directory structure to find go.mod - absPath, err := filepath.Abs(path) - if err != nil { - return "", fmt.Errorf("failed to resolve absolute path: %w", err) - } - dir := absPath - for { - if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { - break - } - - parent := filepath.Dir(dir) - if parent == dir { // Reached the root without finding go.mod - return "", fmt.Errorf("go.mod not found in project path, started at %s, ended at %s", path, dir) - } - dir = parent - } - - // Read go.mod to extract the module path - goModPath := filepath.Join(dir, "go.mod") - goModData, err := os.ReadFile(goModPath) - if err != nil { - return "", fmt.Errorf("failed to read go.mod: %w", err) - } - - for _, line := range strings.Split(string(goModData), "\n") { - if strings.HasPrefix(line, "module ") { - goProject := strings.TrimSpace(strings.TrimPrefix(line, "module ")) - relativePath := strings.TrimPrefix(path, dir) - relativePath = strings.TrimLeft(relativePath, string(os.PathSeparator)) - return filepath.Join(goProject, relativePath), nil - } - } - - return "", fmt.Errorf("module path not found in go.mod") -} diff --git a/tools/flakeguard/utils/utils.go b/tools/flakeguard/utils/utils.go deleted file mode 100644 index 619e95c56..000000000 --- a/tools/flakeguard/utils/utils.go +++ /dev/null @@ -1,41 +0,0 @@ -package utils - -import ( - "path/filepath" -) - -func UniqueDirectories(files []string) []string { - dirSet := make(map[string]struct{}) - for _, file := range files { - dirname := filepath.Dir(file) - dirSet[dirname] = struct{}{} - } - var dirs []string - for dir := range dirSet { - dirs = append(dirs, dir) - } - return dirs -} - -func Deduplicate(items []string) []string { - seen := make(map[string]struct{}) - var uniqueItems []string - for _, item := range items { - if _, found := seen[item]; !found { - seen[item] = struct{}{} - uniqueItems = append(uniqueItems, item) - } - } - return uniqueItems -} - -func ResolveFullPath(projectPath string) (string, error) { - if filepath.IsAbs(projectPath) { - return filepath.Clean(projectPath), nil - } - absPath, err := filepath.Abs(projectPath) - if err != nil { - return "", err - } - return absPath, nil -} diff --git a/tools/flakeguard/utils/utils_test.go b/tools/flakeguard/utils/utils_test.go deleted file mode 100644 index 66b296d27..000000000 --- a/tools/flakeguard/utils/utils_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package utils - -import ( - "testing" -) - -func TestUniqueDirectories(t *testing.T) { - tests := []struct { - name string - input []string - expected []string - }{ - { - name: "unique directories from multiple files", - input: []string{ - "/path/to/file1.txt", - "/path/to/file2.txt", - "/another/path/file3.txt", - }, - expected: []string{ - "/path/to", - "/another/path", - }, - }, - { - name: "empty input", - input: []string{}, - expected: []string{}, - }, - { - name: "same directory multiple files", - input: []string{ - "/path/to/file1.txt", - "/path/to/file2.txt", - "/path/to/file3.txt", - }, - expected: []string{ - "/path/to", - }, - }, - { - name: "mixed directory levels", - input: []string{ - "/a/b/c/file1.txt", - "/a/b/file2.txt", - "/a/file3.txt", - }, - expected: []string{ - "/a/b/c", - "/a/b", - "/a", - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result := UniqueDirectories(tt.input) - expected := make(map[string]struct{}) - for _, dir := range tt.expected { - expected[dir] = struct{}{} - } - for _, dir := range result { - if _, found := expected[dir]; !found { - t.Errorf("unexpected directory: %v", dir) - } - delete(expected, dir) - } - if len(expected) > 0 { - t.Errorf("missing directories: %v", expected) - } - }) - } -} - -func TestDeduplicate(t *testing.T) { - tests := []struct { - name string - input []string - expected []string - }{ - { - name: "duplicates", - input: []string{"apple", "banana", "apple", "orange", "banana"}, - expected: []string{"apple", "banana", "orange"}, - }, - { - name: "no duplicates", - input: []string{"apple", "banana", "orange"}, - expected: []string{"apple", "banana", "orange"}, - }, - { - name: "empty input", - input: []string{}, - expected: []string{}, - }, - { - name: "single item", - input: []string{"apple"}, - expected: []string{"apple"}, - }, - { - name: "all duplicates", - input: []string{"apple", "apple", "apple"}, - expected: []string{"apple"}, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result := Deduplicate(tt.input) - expected := make(map[string]struct{}) - for _, item := range tt.expected { - expected[item] = struct{}{} - } - for _, item := range result { - if _, found := expected[item]; !found { - t.Errorf("unexpected item: %v", item) - } - delete(expected, item) - } - if len(expected) > 0 { - t.Errorf("missing items: %v", expected) - } - }) - } -}