package client import ( "fmt" "net/url" "os" "testing" "time" "github.com/btcsuite/btcd/rpcclient" "github.com/fiatjaf/opentimestamps" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) const envvarRPCURL = "GOTS_TEST_BITCOIN_RPC" func newTestBTCConn() (*rpcclient.Client, error) { val := os.Getenv(envvarRPCURL) if val == "" { return nil, fmt.Errorf("envvar %q unset", envvarRPCURL) } connData, err := url.Parse(val) if err != nil { return nil, fmt.Errorf( "could not parse %q=%q: %v", envvarRPCURL, val, err, ) } host := connData.Host if connData.User == nil { return nil, fmt.Errorf("no Userinfo in parsed url") } username := connData.User.Username() password, ok := connData.User.Password() if !ok { return nil, fmt.Errorf("no password given in RPC URL") } connCfg := &rpcclient.ConnConfig{ Host: host, User: username, Pass: password, HTTPPostMode: true, DisableTLS: true, } return rpcclient.New(connCfg, nil) } func TestVerifyHelloWorld(t *testing.T) { if os.Getenv(envvarRPCURL) == "" { t.Skipf("envvar %s unset, skipping", envvarRPCURL) } // Format RFC3339 expectedTime := "2015-05-28T15:41:18Z" helloWorld, err := opentimestamps.NewDetachedTimestampFromPath( "../examples/hello-world.txt.ots", ) require.NoError(t, err) ts := helloWorld.Timestamp btcConn, err := newTestBTCConn() require.NoError(t, err) verifier := BitcoinAttestationVerifier{btcConn} // using BitcoinVerifications() results := verifier.BitcoinVerifications(ts) assert.Equal(t, 1, len(results)) result0 := results[0] require.NoError(t, result0.Error) assert.Equal( t, expectedTime, result0.AttestationTime.Format(time.RFC3339), ) // using Verify() verifiedTime, err := verifier.Verify(ts) require.NoError(t, err) require.NotNil(t, verifiedTime) assert.Equal(t, expectedTime, verifiedTime.Format(time.RFC3339)) }