Files
evm/core/parallel/interface_test.go
T
zeekay baf5f76f3b evm: add 13 GPU bridge inversion tests
- recoverV: legacy, EIP-155, overflow chain ID/V, invalid V values
- padTo32: normal, exactly-32, oversized, zero
- secp256k1halfN constant check
- Fallback GPU/executor behavior tests
2026-03-02 23:59:00 -08:00

126 lines
3.5 KiB
Go

// Copyright (C) 2025-2026, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package parallel
import (
"runtime"
"testing"
"github.com/luxfi/geth/core/types"
"github.com/luxfi/geth/core/vm"
)
// TestDefaultExecutorReturnsNil verifies the default executor signals
// "not handled" by returning (nil, nil).
func TestDefaultExecutorReturnsNil(t *testing.T) {
exec := DefaultExecutor()
receipts, err := exec.ExecuteBlock(nil, nil, nil, nil, vm.Config{})
if err != nil {
t.Fatalf("DefaultExecutor returned error: %v", err)
}
if receipts != nil {
t.Fatalf("DefaultExecutor returned non-nil receipts: %v", receipts)
}
}
// TestGPUAutoDetect verifies GPU is auto-detected on darwin (Metal)
// and reports unavailable on other platforms.
func TestGPUAutoDetect(t *testing.T) {
gpu := DefaultGPU()
if runtime.GOOS == "darwin" {
// On macOS with CGo, the Metal GPU bridge should be registered
t.Logf("GPU available: %v (expected true on darwin with Metal)", gpu.Available())
} else {
if gpu.Available() {
t.Fatal("GPU should not be available on non-darwin")
}
}
}
// TestGPUBatchEcrecover verifies batch ecrecover handles empty/nil inputs.
func TestGPUBatchEcrecover(t *testing.T) {
gpu := DefaultGPU()
// Nil input
result, err := gpu.BatchEcrecover(nil)
if err != nil {
t.Fatalf("nil input returned error: %v", err)
}
if result != nil {
t.Fatalf("nil input returned non-nil result: %v", result)
}
// Empty input
result, err = gpu.BatchEcrecover([]*types.Transaction{})
if err != nil {
t.Fatalf("empty input returned error: %v", err)
}
if result != nil {
t.Fatalf("empty input returned non-nil result: %v", result)
}
}
// TestGPUBatchKeccakReturnsNil verifies batch keccak returns nil (not yet wired).
func TestGPUBatchKeccakReturnsNil(t *testing.T) {
gpu := DefaultGPU()
result, err := gpu.BatchKeccak([][]byte{{0x01, 0x02}})
if err != nil {
t.Fatalf("BatchKeccak returned error: %v", err)
}
if result != nil {
t.Fatalf("BatchKeccak returned non-nil result: %v", result)
}
}
// TestInterfaceCompliance verifies the types satisfy interfaces at runtime.
func TestInterfaceCompliance(t *testing.T) {
var _ BlockExecutor = DefaultExecutor()
var _ GPUAccelerator = DefaultGPU()
}
// TestFallbackGPUBatchEcrecoverReturnsNil verifies the CPU fallback returns
// nil for all inputs (signaling "not handled").
func TestFallbackGPUBatchEcrecoverReturnsNil(t *testing.T) {
gpu := fallbackGPU{}
// Non-nil but empty
result, err := gpu.BatchEcrecover([]*types.Transaction{})
if err != nil {
t.Fatalf("expected no error, got: %v", err)
}
if result != nil {
t.Fatal("fallback GPU should return nil for empty input")
}
// Nil
result, err = gpu.BatchEcrecover(nil)
if err != nil {
t.Fatalf("expected no error, got: %v", err)
}
if result != nil {
t.Fatal("fallback GPU should return nil for nil input")
}
}
// TestFallbackGPUNotAvailable verifies the fallback reports unavailable.
func TestFallbackGPUNotAvailable(t *testing.T) {
gpu := fallbackGPU{}
if gpu.Available() {
t.Fatal("fallback GPU must report not available")
}
}
// TestFallbackExecutorReturnsNilNil verifies the fallback executor
// always returns (nil, nil) for any input.
func TestFallbackExecutorReturnsNilNil(t *testing.T) {
exec := fallbackExecutor{}
receipts, err := exec.ExecuteBlock(nil, nil, nil, nil, vm.Config{})
if err != nil {
t.Fatalf("expected nil error, got: %v", err)
}
if receipts != nil {
t.Fatal("expected nil receipts from fallback executor")
}
}