2019-08-27 19:22:09 +00:00
|
|
|
// VulcanizeDB
|
|
|
|
// Copyright © 2019 Vulcanize
|
|
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2019-10-02 14:10:37 +00:00
|
|
|
package super_node_test
|
2019-08-27 19:22:09 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
|
|
. "github.com/onsi/gomega"
|
|
|
|
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
|
|
|
|
"github.com/vulcanize/vulcanizedb/pkg/ipfs"
|
|
|
|
"github.com/vulcanize/vulcanizedb/pkg/ipfs/mocks"
|
2019-10-02 14:10:37 +00:00
|
|
|
"github.com/vulcanize/vulcanizedb/pkg/super_node"
|
2019-08-27 19:22:09 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var _ = Describe("Repository", func() {
|
2019-11-01 19:03:28 +00:00
|
|
|
var (
|
|
|
|
db *postgres.DB
|
|
|
|
err error
|
|
|
|
repo super_node.CIDRepository
|
|
|
|
)
|
2019-08-27 19:22:09 +00:00
|
|
|
BeforeEach(func() {
|
2019-10-02 14:10:37 +00:00
|
|
|
db, err = super_node.SetupDB()
|
2019-08-27 19:22:09 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2019-10-02 14:10:37 +00:00
|
|
|
repo = super_node.NewCIDRepository(db)
|
2019-08-27 19:22:09 +00:00
|
|
|
})
|
|
|
|
AfterEach(func() {
|
2019-10-02 14:10:37 +00:00
|
|
|
super_node.TearDownDB(db)
|
2019-08-27 19:22:09 +00:00
|
|
|
})
|
2019-08-28 22:07:36 +00:00
|
|
|
|
2019-08-27 19:22:09 +00:00
|
|
|
Describe("Index", func() {
|
|
|
|
It("Indexes CIDs and related metadata into vulcanizedb", func() {
|
|
|
|
err = repo.Index(mocks.MockCIDPayload)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2020-01-16 23:21:30 +00:00
|
|
|
pgStr := `SELECT cid, td FROM header_cids
|
2019-10-08 20:31:07 +00:00
|
|
|
WHERE block_number = $1 AND uncle IS FALSE`
|
2019-08-27 19:22:09 +00:00
|
|
|
// check header was properly indexed
|
2020-01-16 23:21:30 +00:00
|
|
|
type res struct {
|
|
|
|
CID string
|
|
|
|
TD string
|
|
|
|
}
|
|
|
|
headers := new(res)
|
|
|
|
err = db.QueryRowx(pgStr, 1).StructScan(headers)
|
2019-08-27 19:22:09 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2020-01-16 23:21:30 +00:00
|
|
|
Expect(headers.CID).To(Equal("mockHeaderCID"))
|
|
|
|
Expect(headers.TD).To(Equal("1337"))
|
2019-08-27 19:22:09 +00:00
|
|
|
// check trxs were properly indexed
|
|
|
|
trxs := make([]string, 0)
|
|
|
|
pgStr = `SELECT transaction_cids.cid FROM transaction_cids INNER JOIN header_cids ON (transaction_cids.header_id = header_cids.id)
|
|
|
|
WHERE header_cids.block_number = $1`
|
|
|
|
err = db.Select(&trxs, pgStr, 1)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(len(trxs)).To(Equal(2))
|
2019-10-02 14:10:37 +00:00
|
|
|
Expect(super_node.ListContainsString(trxs, "mockTrxCID1")).To(BeTrue())
|
|
|
|
Expect(super_node.ListContainsString(trxs, "mockTrxCID2")).To(BeTrue())
|
2019-08-27 19:22:09 +00:00
|
|
|
// check receipts were properly indexed
|
|
|
|
rcts := make([]string, 0)
|
|
|
|
pgStr = `SELECT receipt_cids.cid FROM receipt_cids, transaction_cids, header_cids
|
|
|
|
WHERE receipt_cids.tx_id = transaction_cids.id
|
|
|
|
AND transaction_cids.header_id = header_cids.id
|
|
|
|
AND header_cids.block_number = $1`
|
|
|
|
err = db.Select(&rcts, pgStr, 1)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(len(rcts)).To(Equal(2))
|
2019-10-02 14:10:37 +00:00
|
|
|
Expect(super_node.ListContainsString(rcts, "mockRctCID1")).To(BeTrue())
|
|
|
|
Expect(super_node.ListContainsString(rcts, "mockRctCID2")).To(BeTrue())
|
2019-08-27 19:22:09 +00:00
|
|
|
// check that state nodes were properly indexed
|
|
|
|
stateNodes := make([]ipfs.StateNodeCID, 0)
|
|
|
|
pgStr = `SELECT state_cids.cid, state_cids.state_key, state_cids.leaf FROM state_cids INNER JOIN header_cids ON (state_cids.header_id = header_cids.id)
|
|
|
|
WHERE header_cids.block_number = $1`
|
|
|
|
err = db.Select(&stateNodes, pgStr, 1)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(len(stateNodes)).To(Equal(2))
|
2019-08-28 18:41:49 +00:00
|
|
|
for _, stateNode := range stateNodes {
|
|
|
|
if stateNode.CID == "mockStateCID1" {
|
|
|
|
Expect(stateNode.Leaf).To(Equal(true))
|
|
|
|
Expect(stateNode.Key).To(Equal(mocks.ContractLeafKey.Hex()))
|
|
|
|
}
|
|
|
|
if stateNode.CID == "mockStateCID2" {
|
|
|
|
Expect(stateNode.Leaf).To(Equal(true))
|
|
|
|
Expect(stateNode.Key).To(Equal(mocks.AnotherContractLeafKey.Hex()))
|
|
|
|
}
|
|
|
|
}
|
2019-08-27 19:22:09 +00:00
|
|
|
// check that storage nodes were properly indexed
|
|
|
|
storageNodes := make([]ipfs.StorageNodeCID, 0)
|
|
|
|
pgStr = `SELECT storage_cids.cid, state_cids.state_key, storage_cids.storage_key, storage_cids.leaf FROM storage_cids, state_cids, header_cids
|
|
|
|
WHERE storage_cids.state_id = state_cids.id
|
|
|
|
AND state_cids.header_id = header_cids.id
|
|
|
|
AND header_cids.block_number = $1`
|
|
|
|
err = db.Select(&storageNodes, pgStr, 1)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(len(storageNodes)).To(Equal(1))
|
|
|
|
Expect(storageNodes[0]).To(Equal(ipfs.StorageNodeCID{
|
|
|
|
CID: "mockStorageCID",
|
|
|
|
Leaf: true,
|
|
|
|
Key: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
|
|
StateKey: mocks.ContractLeafKey.Hex(),
|
|
|
|
}))
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|