Exemple #1
0
        //func removeBadgerStore(store *BadgerStore, t *testing.T) {
        //    if err = store.Close(); err != nil {
        //        t.Fatal(err)
        //    }
        //    if err = os.RemoveAll(store.path); err != nil {
        //        t.Fatal(err)
        //    }
        //}

        private static async Task <LocalDbStore> CreateTestDb(string dir, ILogger logger)

        {
            var participants = new Dictionary <string, int>
            {
                {
                    "alice", 0
                },
                {
                    "bob", 1
                },

                {
                    "charlie", 2
                }
            };

            var cacheSize = 100;

            var(storeBase, err) = await LocalDbStore.New(participants, cacheSize, dir, logger);

            Assert.Null(err);

            var store = storeBase as LocalDbStore;

            Assert.NotNull(store);

            return(store);
        }
Exemple #2
0
        private static async Task <(LocalDbStore store, Pub[] pubs)> InitBadgerStore(int cacheSize, string dbPath, ILogger logger)
        {
            var n = 3;
            var participantPubs = new List <Pub>();
            var participants    = new Dictionary <string, int>();

            for (var i = 0; i < n; i++)
            {
                var key    = CryptoUtils.GenerateEcdsaKey();
                var pubKey = CryptoUtils.FromEcdsaPub(key);
                participantPubs.Add(new Pub {
                    Id = i, PrivKey = key, PubKey = pubKey, Hex = pubKey.ToHex()
                });
                participants[pubKey.ToHex()] = i;
            }

            var(storeBase, err) = await LocalDbStore.New(participants, cacheSize, dbPath, logger);

            Assert.Null(err);

            var store = storeBase as LocalDbStore;

            Assert.NotNull(store);

            return(store, participantPubs.ToArray());
        }
Exemple #3
0
        private static async Task <Node> RecycleNode(Node oldNode, ILogger logger)
        {
            var conf  = oldNode.Conf;
            var id    = oldNode.Id;
            var key   = oldNode.Controller.Key;
            var peers = oldNode.PeerSelector.Peers();

            IStore store = null;

            if (oldNode.Store is InmemStore)
            {
                store = new InmemStore(oldNode.Store.Participants().participants.Clone(), conf.CacheSize, logger);
            }

            if (oldNode.Store is LocalDbStore)
            {
                (store, _) = await LocalDbStore.Load(conf.CacheSize, conf.StorePath, logger);
            }

            Assert.NotNull(store);

            await oldNode.Trans.CloseAsync();

            var trans = await((InMemRouterTransport)oldNode.Trans).Router.Register(oldNode.LocalAddr);

            var prox = new InMemAppProxy(id, logger);

            var newNode = new Node(conf, id, key, peers, store, trans, prox, logger);

            var err = await newNode.Init(true);

            Assert.Null(err);

            return(newNode);
        }
Exemple #4
0
        private static async Task <(CngKey[] keys, Node[] nodes)> InitNodes(int n, int cacheSize, int syncLimit, string storeType, string dbPath, ILogger logger)
        {
            var(keys, peers, pmap) = InitPeers(n);

            var nodes = new List <Node>();

            var proxies = new List <InMemAppProxy>();

            var router = new InMemRouter();

            for (var i = 0; i < peers.Length; i++)
            {
                var conf = new Config(TimeSpan.FromMilliseconds(5), TimeSpan.FromSeconds(1), cacheSize, syncLimit, storeType, $"{dbPath}/db_{i}");

                var trans = await router.Register(peers[i].NetAddr);

                IStore    store = null;
                Exception err;
                switch (storeType)
                {
                case "badger":
                    (store, err) = await LocalDbStore.New(pmap, conf.CacheSize, conf.StorePath, logger);

                    Assert.Null(err);
                    break;

                case "inmem":
                    store = new InmemStore(pmap, conf.CacheSize, logger);
                    break;

                default:
                    throw new NotImplementedException();
                }

                var id    = pmap[peers[i].PubKeyHex];
                var proxy = new InMemAppProxy(id, logger);
                var node  = new Node(conf, id, keys[i], peers,
                                     store,
                                     trans,
                                     proxy, logger);

                err = await node.Init(false);

                Assert.Null(err);

                nodes.Add(node);
                proxies.Add(proxy);
            }

            return(keys.ToArray(), nodes.ToArray());
        }
Exemple #5
0
        public async Task TestLoadStore()
        {
            var dbPath = GetPath();
            //Create the test db
            var tempStore = await CreateTestDb(dbPath, logger);

            Assert.NotNull(tempStore);
            tempStore.Close();

            var cacheSize = 100;

            var(badgerStoreres, err) = await LocalDbStore.Load(cacheSize, tempStore.Path, logger);

            var badgerStore = badgerStoreres as LocalDbStore;

            Assert.NotNull(badgerStore);
            Assert.Null(err);

            Dictionary <string, int> dbParticipants;

            using (var tx = badgerStore.BeginTx())
            {
                (dbParticipants, err) = await badgerStore.DbGetParticipants();
            }

            Assert.Null(err);
            Assert.Equal(badgerStore.Participants().participants.Count, dbParticipants.Count);

            foreach (var p in dbParticipants)
            {
                var dbP  = p.Key;
                var dbId = p.Value;

                var ok = badgerStore.Participants().participants.TryGetValue(dbP, out int id);
                Assert.True(ok);
                Assert.Equal(id, dbId);
            }
        }