|
|
@@ -14,7 +14,7 @@
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
-package mru
|
|
|
+package feed
|
|
|
|
|
|
import (
|
|
|
"bytes"
|
|
|
@@ -31,7 +31,7 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
"github.com/ethereum/go-ethereum/swarm/chunk"
|
|
|
"github.com/ethereum/go-ethereum/swarm/storage"
|
|
|
- "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup"
|
|
|
+ "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
@@ -40,7 +40,7 @@ var (
|
|
|
Time: uint64(4200),
|
|
|
}
|
|
|
cleanF func()
|
|
|
- resourceName = "føø.bar"
|
|
|
+ subtopicName = "føø.bar"
|
|
|
hashfunc = storage.MakeHashFunc(storage.DefaultHash)
|
|
|
)
|
|
|
|
|
|
@@ -73,7 +73,7 @@ func (f *fakeTimeProvider) Now() Timestamp {
|
|
|
}
|
|
|
|
|
|
// make updates and retrieve them based on periods and versions
|
|
|
-func TestResourceHandler(t *testing.T) {
|
|
|
+func TestFeedsHandler(t *testing.T) {
|
|
|
|
|
|
// make fake timeProvider
|
|
|
clock := &fakeTimeProvider{
|
|
|
@@ -83,18 +83,18 @@ func TestResourceHandler(t *testing.T) {
|
|
|
// signer containing private key
|
|
|
signer := newAliceSigner()
|
|
|
|
|
|
- rh, datadir, teardownTest, err := setupTest(clock, signer)
|
|
|
+ feedsHandler, datadir, teardownTest, err := setupTest(clock, signer)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
defer teardownTest()
|
|
|
|
|
|
- // create a new resource
|
|
|
+ // create a new feed
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
defer cancel()
|
|
|
|
|
|
- topic, _ := NewTopic("Mess with mru code and see what ghost catches you", nil)
|
|
|
- view := View{
|
|
|
+ topic, _ := NewTopic("Mess with Swarm feeds code and see what ghost catches you", nil)
|
|
|
+ fd := Feed{
|
|
|
Topic: topic,
|
|
|
User: signer.Address(),
|
|
|
}
|
|
|
@@ -107,14 +107,14 @@ func TestResourceHandler(t *testing.T) {
|
|
|
"clyde", // t=4285
|
|
|
}
|
|
|
|
|
|
- request := NewFirstRequest(view.Topic) // this timestamps the update at t = 4200 (start time)
|
|
|
- resourcekey := make(map[string]storage.Address)
|
|
|
+ request := NewFirstRequest(fd.Topic) // this timestamps the update at t = 4200 (start time)
|
|
|
+ chunkAddress := make(map[string]storage.Address)
|
|
|
data := []byte(updates[0])
|
|
|
request.SetData(data)
|
|
|
if err := request.Sign(signer); err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
- resourcekey[updates[0]], err = rh.Update(ctx, request)
|
|
|
+ chunkAddress[updates[0]], err = feedsHandler.Update(ctx, request)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -122,7 +122,7 @@ func TestResourceHandler(t *testing.T) {
|
|
|
// move the clock ahead 21 seconds
|
|
|
clock.FastForward(21) // t=4221
|
|
|
|
|
|
- request, err = rh.NewRequest(ctx, &request.View) // this timestamps the update at t = 4221
|
|
|
+ request, err = feedsHandler.NewRequest(ctx, &request.Feed) // this timestamps the update at t = 4221
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -136,14 +136,14 @@ func TestResourceHandler(t *testing.T) {
|
|
|
if err := request.Sign(signer); err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
- resourcekey[updates[1]], err = rh.Update(ctx, request)
|
|
|
+ chunkAddress[updates[1]], err = feedsHandler.Update(ctx, request)
|
|
|
if err == nil {
|
|
|
t.Fatal("Expected update to fail since an update in this epoch already exists")
|
|
|
}
|
|
|
|
|
|
// move the clock ahead 21 seconds
|
|
|
clock.FastForward(21) // t=4242
|
|
|
- request, err = rh.NewRequest(ctx, &request.View)
|
|
|
+ request, err = feedsHandler.NewRequest(ctx, &request.Feed)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -151,14 +151,14 @@ func TestResourceHandler(t *testing.T) {
|
|
|
if err := request.Sign(signer); err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
- resourcekey[updates[1]], err = rh.Update(ctx, request)
|
|
|
+ chunkAddress[updates[1]], err = feedsHandler.Update(ctx, request)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
// move the clock ahead 42 seconds
|
|
|
clock.FastForward(42) // t=4284
|
|
|
- request, err = rh.NewRequest(ctx, &request.View)
|
|
|
+ request, err = feedsHandler.NewRequest(ctx, &request.Feed)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -167,14 +167,14 @@ func TestResourceHandler(t *testing.T) {
|
|
|
if err := request.Sign(signer); err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
- resourcekey[updates[2]], err = rh.Update(ctx, request)
|
|
|
+ chunkAddress[updates[2]], err = feedsHandler.Update(ctx, request)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
// move the clock ahead 1 second
|
|
|
clock.FastForward(1) // t=4285
|
|
|
- request, err = rh.NewRequest(ctx, &request.View)
|
|
|
+ request, err = feedsHandler.NewRequest(ctx, &request.Feed)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -187,56 +187,56 @@ func TestResourceHandler(t *testing.T) {
|
|
|
if err := request.Sign(signer); err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
- resourcekey[updates[3]], err = rh.Update(ctx, request)
|
|
|
+ chunkAddress[updates[3]], err = feedsHandler.Update(ctx, request)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
time.Sleep(time.Second)
|
|
|
- rh.Close()
|
|
|
+ feedsHandler.Close()
|
|
|
|
|
|
// check we can retrieve the updates after close
|
|
|
clock.FastForward(2000) // t=6285
|
|
|
|
|
|
- rhparams := &HandlerParams{}
|
|
|
+ feedParams := &HandlerParams{}
|
|
|
|
|
|
- rh2, err := NewTestHandler(datadir, rhparams)
|
|
|
+ feedsHandler2, err := NewTestHandler(datadir, feedParams)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- rsrc2, err := rh2.Lookup(ctx, NewQueryLatest(&request.View, lookup.NoClue))
|
|
|
+ update2, err := feedsHandler2.Lookup(ctx, NewQueryLatest(&request.Feed, lookup.NoClue))
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
// last update should be "clyde"
|
|
|
- if !bytes.Equal(rsrc2.data, []byte(updates[len(updates)-1])) {
|
|
|
- t.Fatalf("resource data was %v, expected %v", string(rsrc2.data), updates[len(updates)-1])
|
|
|
+ if !bytes.Equal(update2.data, []byte(updates[len(updates)-1])) {
|
|
|
+ t.Fatalf("feed update data was %v, expected %v", string(update2.data), updates[len(updates)-1])
|
|
|
}
|
|
|
- if rsrc2.Level != 22 {
|
|
|
- t.Fatalf("resource epoch level was %d, expected 22", rsrc2.Level)
|
|
|
+ if update2.Level != 22 {
|
|
|
+ t.Fatalf("feed update epoch level was %d, expected 22", update2.Level)
|
|
|
}
|
|
|
- if rsrc2.Base() != 0 {
|
|
|
- t.Fatalf("resource epoch base time was %d, expected 0", rsrc2.Base())
|
|
|
+ if update2.Base() != 0 {
|
|
|
+ t.Fatalf("feed update epoch base time was %d, expected 0", update2.Base())
|
|
|
}
|
|
|
- log.Debug("Latest lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data)
|
|
|
+ log.Debug("Latest lookup", "epoch base time", update2.Base(), "epoch level", update2.Level, "data", update2.data)
|
|
|
|
|
|
// specific point in time
|
|
|
- rsrc, err := rh2.Lookup(ctx, NewQuery(&request.View, 4284, lookup.NoClue))
|
|
|
+ update, err := feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, 4284, lookup.NoClue))
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
// check data
|
|
|
- if !bytes.Equal(rsrc.data, []byte(updates[2])) {
|
|
|
- t.Fatalf("resource data (historical) was %v, expected %v", string(rsrc2.data), updates[2])
|
|
|
+ if !bytes.Equal(update.data, []byte(updates[2])) {
|
|
|
+ t.Fatalf("feed update data (historical) was %v, expected %v", string(update2.data), updates[2])
|
|
|
}
|
|
|
- log.Debug("Historical lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data)
|
|
|
+ log.Debug("Historical lookup", "epoch base time", update2.Base(), "epoch level", update2.Level, "data", update2.data)
|
|
|
|
|
|
// beyond the first should yield an error
|
|
|
- rsrc, err = rh2.Lookup(ctx, NewQuery(&request.View, startTime.Time-1, lookup.NoClue))
|
|
|
+ update, err = feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, startTime.Time-1, lookup.NoClue))
|
|
|
if err == nil {
|
|
|
- t.Fatalf("expected previous to fail, returned epoch %s data %v", rsrc.Epoch.String(), rsrc.data)
|
|
|
+ t.Fatalf("expected previous to fail, returned epoch %s data %v", update.Epoch.String(), update.data)
|
|
|
}
|
|
|
|
|
|
}
|
|
|
@@ -266,11 +266,11 @@ func TestSparseUpdates(t *testing.T) {
|
|
|
defer teardownTest()
|
|
|
defer os.RemoveAll(datadir)
|
|
|
|
|
|
- // create a new resource
|
|
|
+ // create a new feed
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
defer cancel()
|
|
|
topic, _ := NewTopic("Very slow updates", nil)
|
|
|
- view := View{
|
|
|
+ fd := Feed{
|
|
|
Topic: topic,
|
|
|
User: signer.Address(),
|
|
|
}
|
|
|
@@ -280,7 +280,7 @@ func TestSparseUpdates(t *testing.T) {
|
|
|
var epoch lookup.Epoch
|
|
|
var lastUpdateTime uint64
|
|
|
for T := uint64(0); T < today; T += 5 * Year {
|
|
|
- request := NewFirstRequest(view.Topic)
|
|
|
+ request := NewFirstRequest(fd.Topic)
|
|
|
request.Epoch = lookup.GetNextEpoch(epoch, T)
|
|
|
request.data = generateData(T) // this generates some data that depends on T, so we can check later
|
|
|
request.Sign(signer)
|
|
|
@@ -295,14 +295,14 @@ func TestSparseUpdates(t *testing.T) {
|
|
|
lastUpdateTime = T
|
|
|
}
|
|
|
|
|
|
- query := NewQuery(&view, today, lookup.NoClue)
|
|
|
+ query := NewQuery(&fd, today, lookup.NoClue)
|
|
|
|
|
|
_, err = rh.Lookup(ctx, query)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- _, content, err := rh.GetContent(&view)
|
|
|
+ _, content, err := rh.GetContent(&fd)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -321,7 +321,7 @@ func TestSparseUpdates(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- _, content, err = rh.GetContent(&view)
|
|
|
+ _, content, err = rh.GetContent(&fd)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -348,13 +348,13 @@ func TestValidator(t *testing.T) {
|
|
|
}
|
|
|
defer teardownTest()
|
|
|
|
|
|
- // create new resource
|
|
|
- topic, _ := NewTopic(resourceName, nil)
|
|
|
- view := View{
|
|
|
+ // create new feed
|
|
|
+ topic, _ := NewTopic(subtopicName, nil)
|
|
|
+ fd := Feed{
|
|
|
Topic: topic,
|
|
|
User: signer.Address(),
|
|
|
}
|
|
|
- mr := NewFirstRequest(view.Topic)
|
|
|
+ mr := NewFirstRequest(fd.Topic)
|
|
|
|
|
|
// chunk with address
|
|
|
data := []byte("foo")
|
|
|
@@ -382,7 +382,7 @@ func TestValidator(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
// tests that the content address validator correctly checks the data
|
|
|
-// tests that resource update chunks are passed through content address validator
|
|
|
+// tests that feed update chunks are passed through content address validator
|
|
|
// there is some redundancy in this test as it also tests content addressed chunks,
|
|
|
// which should be evaluated as invalid chunks by this validator
|
|
|
func TestValidatorInStore(t *testing.T) {
|
|
|
@@ -396,7 +396,7 @@ func TestValidatorInStore(t *testing.T) {
|
|
|
signer := newAliceSigner()
|
|
|
|
|
|
// set up localstore
|
|
|
- datadir, err := ioutil.TempDir("", "storage-testresourcevalidator")
|
|
|
+ datadir, err := ioutil.TempDir("", "storage-testfeedsvalidator")
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
@@ -409,10 +409,10 @@ func TestValidatorInStore(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- // set up resource handler and add is as a validator to the localstore
|
|
|
- rhParams := &HandlerParams{}
|
|
|
- rh := NewHandler(rhParams)
|
|
|
- store.Validators = append(store.Validators, rh)
|
|
|
+ // set up Swarm feeds handler and add is as a validator to the localstore
|
|
|
+ fhParams := &HandlerParams{}
|
|
|
+ fh := NewHandler(fhParams)
|
|
|
+ store.Validators = append(store.Validators, fh)
|
|
|
|
|
|
// create content addressed chunks, one good, one faulty
|
|
|
chunks := storage.GenerateRandomChunks(chunk.DefaultSize, 2)
|
|
|
@@ -420,17 +420,17 @@ func TestValidatorInStore(t *testing.T) {
|
|
|
badChunk := storage.NewChunk(chunks[1].Address(), goodChunk.Data())
|
|
|
|
|
|
topic, _ := NewTopic("xyzzy", nil)
|
|
|
- view := View{
|
|
|
+ fd := Feed{
|
|
|
Topic: topic,
|
|
|
User: signer.Address(),
|
|
|
}
|
|
|
|
|
|
- // create a resource update chunk with correct publickey
|
|
|
+ // create a feed update chunk with correct publickey
|
|
|
id := ID{
|
|
|
Epoch: lookup.Epoch{Time: 42,
|
|
|
Level: 1,
|
|
|
},
|
|
|
- View: view,
|
|
|
+ Feed: fd,
|
|
|
}
|
|
|
|
|
|
updateAddr := id.Addr()
|
|
|
@@ -438,7 +438,7 @@ func TestValidatorInStore(t *testing.T) {
|
|
|
|
|
|
r := new(Request)
|
|
|
r.idAddr = updateAddr
|
|
|
- r.ResourceUpdate.ID = id
|
|
|
+ r.Update.ID = id
|
|
|
r.data = data
|
|
|
|
|
|
r.Sign(signer)
|
|
|
@@ -451,20 +451,20 @@ func TestValidatorInStore(t *testing.T) {
|
|
|
// put the chunks in the store and check their error status
|
|
|
err = store.Put(context.Background(), goodChunk)
|
|
|
if err == nil {
|
|
|
- t.Fatal("expected error on good content address chunk with resource validator only, but got nil")
|
|
|
+ t.Fatal("expected error on good content address chunk with feed update validator only, but got nil")
|
|
|
}
|
|
|
err = store.Put(context.Background(), badChunk)
|
|
|
if err == nil {
|
|
|
- t.Fatal("expected error on bad content address chunk with resource validator only, but got nil")
|
|
|
+ t.Fatal("expected error on bad content address chunk with feed update validator only, but got nil")
|
|
|
}
|
|
|
err = store.Put(context.Background(), uglyChunk)
|
|
|
if err != nil {
|
|
|
- t.Fatalf("expected no error on resource update chunk with resource validator only, but got: %s", err)
|
|
|
+ t.Fatalf("expected no error on feed update chunk with feed update validator only, but got: %s", err)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// create rpc and resourcehandler
|
|
|
-func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler, datadir string, teardown func(), err error) {
|
|
|
+// create rpc and feeds Handler
|
|
|
+func setupTest(timeProvider timestampProvider, signer Signer) (fh *TestHandler, datadir string, teardown func(), err error) {
|
|
|
|
|
|
var fsClean func()
|
|
|
var rpcClean func()
|
|
|
@@ -478,7 +478,7 @@ func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler,
|
|
|
}
|
|
|
|
|
|
// temp datadir
|
|
|
- datadir, err = ioutil.TempDir("", "rh")
|
|
|
+ datadir, err = ioutil.TempDir("", "fh")
|
|
|
if err != nil {
|
|
|
return nil, "", nil, err
|
|
|
}
|
|
|
@@ -487,9 +487,9 @@ func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler,
|
|
|
}
|
|
|
|
|
|
TimestampProvider = timeProvider
|
|
|
- rhparams := &HandlerParams{}
|
|
|
- rh, err = NewTestHandler(datadir, rhparams)
|
|
|
- return rh, datadir, cleanF, err
|
|
|
+ fhParams := &HandlerParams{}
|
|
|
+ fh, err = NewTestHandler(datadir, fhParams)
|
|
|
+ return fh, datadir, cleanF, err
|
|
|
}
|
|
|
|
|
|
func newAliceSigner() *GenericSigner {
|