예제 #1
0
        private void sendBuf(ErlTuple ctrl, ErlOutputStream payload = null)
        {
            if (!m_Connected)
            {
                throw new ErlException(StringConsts.ERL_CONN_NOT_CONNECTED_ERROR);
            }

            var header = new ErlOutputStream(writeVersion: false, capacity: HEADER_LEN);

            // preamble: 4 byte length + "PASS_THROUGH" tag + version
            header.Write4BE(0); // reserve space for length
            header.Write1(PASS_THROUGH);
            header.Write1((byte)ErlExternalTag.Version);

            // header info
            header.WriteTuple(ctrl);

            // version for payload
            //header.Write1((byte)ErlExternalTag.Version); // Note that it's already written in the payload

            if (payload == null)
            {
                header.Poke4BE(0, (int)(header.Length - 4));
                DoSend(header);
            }
            else
            {
                header.Poke4BE(0, (int)(header.Length + payload.Length - 4));
                DoSend(header, payload);
            }
        }
예제 #2
0
 /// <summary>
 /// Write Erlang tuple to stream
 /// </summary>
 public void WriteTuple(ErlTuple tup)
 {
     WriteTupleHead(tup.Count);
     foreach (var t in tup)
     {
         Write(t);
     }
 }
예제 #3
0
        /// <summary>
        /// Read Erlang tuple from the stream
        /// </summary>
        public ErlTuple ReadTuple()
        {
            int arity = readTupleHead();
            var list  = new List <IErlObject>(arity);

            for (int i = 0; i < arity; i++)
            {
                list.Add(Read());
            }
            var res = new ErlTuple();

            res.Value = list;
            return(res);
        }
예제 #4
0
        public void ErlFormatTest()
        {
            var tests = new Dictionary<string, ErlList>
              {
            {"abc 10.5",  new ErlList("abc ~w.~w", 10, 5)},
            {"xx 8",      new ErlList("xx ~i~w", 12, 8)},
            {"~z",        new ErlList("~~z", 16)},
            {"a 16",      new ErlList("~c ~w", (byte)'a', 16)},
            {"xyz 12\n",  new ErlList("xyz ~10.6.B~n", 12)},
            {"x~y21",     new ErlList("x~~y~w1", 2)},
            {"{ok, A}",   new ErlList("{ok, ~v}", "A")},
            {"{ok, A}.",  new ErlList("{ok, ~v}.", new ErlAtom("A"))},
            {"{ok, A} ",  new ErlList("{ok, ~v} ", new ErlString("A"))},
            {"{ok, A}  ", new ErlList("{ok, ~v}  ", new ErlVar("A"))},
            {
              "{ok, A::a()}",
              new ErlList("{ok, ~v::a()}", new ErlVar("A", ErlTypeOrder.ErlLong))
            },
            {"{ok, A::int()}", new ErlList("{ok, ~v}", new ErlVar("A", ErlTypeOrder.ErlLong))},
              };

              foreach (var t in tests)
            Assert.AreEqual(t.Key, ErlObject.Format(t.Value),
                        "Error in test: {0} <- format({1})".Args(t.Key, t.Value.ToString()));

              var failTests = new List<ErlList>
              {
            new ErlList("abc ~w.~w"),
            new ErlList("xx ~i~w", 12),
            new ErlList("~y",      12),
              };

              foreach (var t in failTests)
            Assert.Throws<ErlException>(
              () => ErlObject.Format(t), "Errorneously formatted term: {0}".Args(t));

              var V = new ErlVar("V", ErlTypeOrder.ErlLong);
              var expected = new ErlTuple(new ErlAtom("ok"), V).ToString();

              Assert.AreEqual(expected, "{ok, V::int()}".ToErlObject().ToString());
              Assert.AreEqual(expected, "{ok, ~w}".ToErlObject(V).ToString());
        }
예제 #5
0
파일: ErlEncodingTest.cs 프로젝트: keck/nfx
    public void ErlTermSerializeTest()
    {
      {
        var b = new byte[] { 131, 100, 0, 3, 97, 98, 99 };
        var t = new ErlAtom("abc");
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131, 109, 0, 0, 0, 3, 1, 2, 3 };
        var t = new ErlBinary(new byte[] { 1, 2, 3 });
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b1 = new byte[] { 131, 100, 0, 4, 116, 114, 117, 101 };
        var t1 = new ErlBoolean(true);
        var os1 = new ErlOutputStream(t1);
        Assert.AreEqual(b1, os1.GetBuffer().TakeWhile((_, i) => i < b1.Length).ToArray());
        var es1 = new ErlInputStream(b1);
        Assert.AreEqual(t1, es1.Read());

        var b2 = new byte[] { 131, 100, 0, 5, 102, 97, 108, 115, 101 };
        var t2 = new ErlBoolean(false);
        var os2 = new ErlOutputStream(t2);
        Assert.AreEqual(b2, os2.GetBuffer().TakeWhile((_, i) => i < b2.Length).ToArray());
        var es2 = new ErlInputStream(b2);
        Assert.AreEqual(t2, es2.Read());
      }
      {
        var b = new byte[] { 131, 97, 127 };
        var t = new ErlByte(127);
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131, 70, 64, 36, 62, 249, 219, 34, 208, 229 };
        var t = new ErlDouble(10.123);
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131,108,0,0,0,3,97,1,70,64,36,61,112,163,215,10,61,108,0,0,0,2,
                             100,0,4,116,114,117,101,107,0,1,97,106,106 };
        var t = new ErlList(1, 10.12, new ErlList(true, "a"));
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b1 = new byte[] { 131, 98, 255, 255, 255, 251 };
        var t1 = new ErlLong(-5);
        var os1 = new ErlOutputStream(t1);
        Assert.AreEqual(b1, os1.GetBuffer().TakeWhile((_, i) => i < b1.Length).ToArray());
        var es1 = new ErlInputStream(b1);
        Assert.AreEqual(t1, es1.Read());

        var b2 = new byte[] { 131, 97, 5 };
        var t2 = new ErlLong(5);
        var os2 = new ErlOutputStream(t2);
        Assert.AreEqual(b2, os2.GetBuffer().TakeWhile((_, i) => i < b2.Length).ToArray());
        var es2 = new ErlInputStream(b2);
        Assert.AreEqual(t2, es2.Read());

        var b3 = new byte[] { 131, 98, 0, 16, 0, 0 };
        var t3 = new ErlLong(1024 * 1024);
        var os3 = new ErlOutputStream(t3);
        Assert.AreEqual(b3, os3.GetBuffer().TakeWhile((_, i) => i < b3.Length).ToArray());
        var es3 = new ErlInputStream(b3);
        Assert.AreEqual(t3, es3.Read());

        var b4 = new byte[] { 131, 110, 6, 0, 0, 0, 0, 0, 0, 4 };
        var t4 = new ErlLong(1024L * 1024 * 1024 * 1024 * 4);
        var os4 = new ErlOutputStream(t4);
        Assert.AreEqual(b4, os4.GetBuffer().TakeWhile((_, i) => i < b4.Length).ToArray());
        var es4 = new ErlInputStream(b4);
        Assert.AreEqual(t4, es4.Read());

        var b5 = new byte[] { 131, 110, 8, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
        var t5 = new ErlLong(1L << 63);
        var os5 = new ErlOutputStream(t5);
        Assert.AreEqual(b5, os5.GetBuffer().TakeWhile((_, i) => i < b5.Length).ToArray());
        var es5 = new ErlInputStream(b5);
        Assert.AreEqual(t5, es5.Read());

        var b6 = new byte[] { 131, 110, 8, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
        var t6 = new ErlLong(-1L << 63);
        var os6 = new ErlOutputStream(t6);
        Assert.AreEqual(b6, os6.GetBuffer().TakeWhile((_, i) => i < b6.Length).ToArray());
        var es6 = new ErlInputStream(b6);
        Assert.AreEqual(t6, es6.Read());

        var b7 = new byte[] { 131, 110, 8, 0, 255, 255, 255, 255, 255, 255, 255, 255 };
        var es7 = new ErlInputStream(b7);
        var t7 = new ErlLong(-1);
        Assert.AreEqual(t7, es7.Read());
        var bi7 = new byte[] {131, 98, 255, 255, 255, 255};
        var os7 = new ErlOutputStream(t7);
        Assert.AreEqual(bi7, os7.GetBuffer().TakeWhile((_, i) => i < bi7.Length).ToArray());
      }
      {
        var b = new byte[] { 131, 103, 100, 0, 7, 98, 64, 112, 105, 112, 105, 116, 0, 0, 0, 38, 0, 0, 0, 0, 1 };
        var t = new ErlPid("b@pipit", 38, 0, 1);
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131, 102, 100, 0, 7, 98, 64, 112, 105, 112, 105, 116, 0, 0, 0, 38, 1 };
        var t = new ErlPort("b@pipit", 38, 1);
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131, 114, 0, 3, 100, 0, 7, 98, 64, 112, 105, 112, 105, 116, 1, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0 };
        var t = new ErlRef("b@pipit", 181, 0, 0, 1);
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131, 107, 0, 3, 115, 116, 114 };
        var t = new ErlString("str");
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
      {
        var b = new byte[] { 131, 104, 3, 97, 1, 100, 0, 1, 97, 104, 2, 97, 10, 70, 63, 241, 247, 206, 217, 22, 135, 43 };
        var t = new ErlTuple(1, new ErlAtom("a"), new ErlTuple(10, 1.123));
        var os = new ErlOutputStream(t);
        Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
        var es = new ErlInputStream(b);
        Assert.AreEqual(t, es.Read());
      }
    }
예제 #6
0
 public ErlTrace(ErlTuple list) : base((ErlTupleBase)list)
 {
 }
예제 #7
0
        static void Main(string[] args)
        {
            
            //here we handle password requests
            ErlTransportPasswordSource.PasswordRequired += (ps) =>
            {
              Console.Write("Username: {0}\nPassword: "******"{0} ({1}): {2}", t, d, text);

                n.Start();

                var cfg = App.ConfigRoot.NavigateSection("/erlang");
                var remoteName = cfg.Children.Select(nd => nd.Name == "node" ? nd.Value : string.Empty)
                                             .FirstOrDefault(s => s.Contains("@"));

                Console.WriteLine("\n\nExecute the following code on remote node {0}:", remoteName);
                Console.WriteLine("1> F = fun F() -> receive {From, Msg} -> From ! Msg, F() end end.");
                Console.WriteLine("2> spawn_link(fun() -> register(me, self()), F() end).\n");
                Console.WriteLine("Press any key when ready...");

                Console.ReadKey();

                var m = n.CreateMbox("test");
                var a = new ErlAtom("hello");
                var msg = new ErlTuple(m.Self, a);
                var remoteNode = new ErlAtom(remoteName);

                DateTime empty = new DateTime(2000, 1, 1, 0, 0, 0);
                DateTime start = empty;
                long count = 0;
                long msgs = 30000;

                do
                {
                    var res = n.Send(m.Self, remoteNode, "me", msg);
                    if (!res)
                    {
                        Console.WriteLine("Can not send message");
                        break;
                    }

                    if (start == empty)
                        start = DateTime.UtcNow;

                    var got = m.Receive(5000);

                    if (!got.Equals((IErlObject)a))
                    {
                        Console.WriteLine("Got wrong result! Expected: {0}, Got: {1}", a, got);
                        count = -1;
                        break;
                    }

                    count++;

                    if ((count % 10000) == 0)
                        Console.WriteLine("Processed {0} messages", count);
                    //Console.ReadLine();
                } while (count < msgs);

                var end = DateTime.UtcNow;
                var diff = (end - start);

                if (count > 0)
                    Console.WriteLine("Processed {0} messages. Speed: {1:F2}msgs/s, Latency: {2}us",
                        msgs, msgs / diff.TotalSeconds, 1000.0 * diff.TotalMilliseconds / msgs);
            }

            if (Debugger.IsAttached)
                Console.ReadKey();
        }
예제 #8
0
 /// <summary>
 /// Determine if two Erlang tuples are equal
 /// </summary>
 public bool Equals(ErlTuple o)
 {
     return(m_Items.SequenceEqual(o.m_Items));
 }
예제 #9
0
        public void ErlTermSerializeTest()
        {
            {
            var b = new byte[] { 131, 100, 0, 3, 97, 98, 99 };
            var t = new ErlAtom("abc");
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 109, 0, 0, 0, 3, 1, 2, 3 };
            var t = new ErlBinary(new byte[] { 1, 2, 3 });
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b1 = new byte[] { 131, 100, 0, 4, 116, 114, 117, 101 };
            var t1 = new ErlBoolean(true);
            var os1 = new ErlOutputStream(t1);
            Assert.AreEqual(b1, os1.GetBuffer().TakeWhile((_, i) => i < b1.Length).ToArray());
            var es1 = new ErlInputStream(b1);
            Assert.AreEqual(t1, es1.Read());

            var b2 = new byte[] { 131, 100, 0, 5, 102, 97, 108, 115, 101 };
            var t2 = new ErlBoolean(false);
            var os2 = new ErlOutputStream(t2);
            Assert.AreEqual(b2, os2.GetBuffer().TakeWhile((_, i) => i < b2.Length).ToArray());
            var es2 = new ErlInputStream(b2);
            Assert.AreEqual(t2, es2.Read());
              }
              {
            var b = new byte[] { 131, 97, 127 };
            var t = new ErlByte(127);
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 70, 64, 36, 62, 249, 219, 34, 208, 229 };
            var t = new ErlDouble(10.123);
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 108, 0, 0, 0, 2, 107, 0, 1, 1, 107, 0, 1, 2, 106 };
            var t = new ErlList(new ErlList(1), new ErlList(2));
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131,108,0,0,0,2,108,0,0,0,2,97,1,107,0,1,2,106,107,0,1,3,106 };
            var t = new ErlList(new ErlList(1, new ErlList(2)), new ErlList(3));
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131,108,0,0,0,3,97,1,70,64,36,61,112,163,215,10,61,108,0,0,0,2,
                             100,0,4,116,114,117,101,107,0,1,97,106,106 };
            var t = new ErlList(1, 10.12, new ErlList(true, "a"));
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] {
              131,108,0,0,0,3,97,23,97,4,104,1,108,0,0,0,1,104,2,109,0,0,0,5,101,118,101,
              110,116,104,1,108,0,0,0,2,104,2,109,0,0,0,10,102,108,101,101,116,95,104,97,
              115,104,109,0,0,0,36,97,54,97,50,50,100,49,52,45,56,52,56,51,45,52,49,102,99,
              45,97,52,54,98,45,50,56,51,98,57,55,55,55,99,50,97,50,104,2,109,0,0,0,4,116,
              121,112,101,109,0,0,0,13,102,108,101,101,116,95,99,104,97,110,103,101,100,
              106,106,106 };
            var t = ErlObject.Parse("[23,4,{[{<<\"event\">>,"+
                                "{[{<<\"fleet_hash\">>,<<\"a6a22d14-8483-41fc-a46b-283b9777c2a2\">>},"+
                                "{<<\"type\">>,<<\"fleet_changed\">>}]}}]}]");
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b1 = new byte[] { 131, 98, 255, 255, 255, 251 };
            var t1 = new ErlLong(-5);
            var os1 = new ErlOutputStream(t1);
            Assert.AreEqual(b1, os1.GetBuffer().TakeWhile((_, i) => i < b1.Length).ToArray());
            var es1 = new ErlInputStream(b1);
            Assert.AreEqual(t1, es1.Read());

            var b2 = new byte[] { 131, 97, 5 };
            var t2 = new ErlLong(5);
            var os2 = new ErlOutputStream(t2);
            Assert.AreEqual(b2, os2.GetBuffer().TakeWhile((_, i) => i < b2.Length).ToArray());
            var es2 = new ErlInputStream(b2);
            Assert.AreEqual(t2, es2.Read());

            var b3 = new byte[] { 131, 98, 0, 16, 0, 0 };
            var t3 = new ErlLong(1024 * 1024);
            var os3 = new ErlOutputStream(t3);
            Assert.AreEqual(b3, os3.GetBuffer().TakeWhile((_, i) => i < b3.Length).ToArray());
            var es3 = new ErlInputStream(b3);
            Assert.AreEqual(t3, es3.Read());

            var b4 = new byte[] { 131, 110, 6, 0, 0, 0, 0, 0, 0, 4 };
            var t4 = new ErlLong(1024L * 1024 * 1024 * 1024 * 4);
            var os4 = new ErlOutputStream(t4);
            Assert.AreEqual(b4, os4.GetBuffer().TakeWhile((_, i) => i < b4.Length).ToArray());
            var es4 = new ErlInputStream(b4);
            Assert.AreEqual(t4, es4.Read());

            var b5 = new byte[] { 131, 110, 8, 1, 0, 0, 0, 0, 0, 0, 0, 128 };
            var t5 = new ErlLong(1L << 63);
            var os5 = new ErlOutputStream(t5);
            Assert.AreEqual(b5, os5.GetBuffer().TakeWhile((_, i) => i < b5.Length).ToArray());
            var es5 = new ErlInputStream(b5);
            Assert.AreEqual(t5, es5.Read());

            var b6 = new byte[] { 131, 110, 8, 1, 0, 0, 0, 0, 0, 0, 0, 128 };
            var t6 = new ErlLong(-1L << 63);
            var os6 = new ErlOutputStream(t6);
            Assert.AreEqual(b6, os6.GetBuffer().TakeWhile((_, i) => i < b6.Length).ToArray());
            var es6 = new ErlInputStream(b6);
            Assert.AreEqual(t6, es6.Read());

            var b7 = new byte[] { 131, 110, 8, 0, 255, 255, 255, 255, 255, 255, 255, 255 };
            var es7 = new ErlInputStream(b7);
            var t7 = new ErlLong(-1);
            Assert.AreEqual(t7, es7.Read());
            var bi7 = new byte[] {131, 98, 255, 255, 255, 255};
            var os7 = new ErlOutputStream(t7);
            Assert.AreEqual(bi7, os7.GetBuffer().TakeWhile((_, i) => i < bi7.Length).ToArray());
              }
              {
            var b = new byte[] { 131, 103, 100, 0, 7, 98, 64, 112, 105, 112, 105, 116, 0, 0, 0, 38, 0, 0, 0, 0, 1 };
            var t = new ErlPid("b@pipit", 38, 0, 1);
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 102, 100, 0, 7, 98, 64, 112, 105, 112, 105, 116, 0, 0, 0, 38, 1 };
            var t = new ErlPort("b@pipit", 38, 1);
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 114, 0, 3, 100, 0, 7, 98, 64, 112, 105, 112, 105, 116, 1, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0 };
            var t = new ErlRef("b@pipit", 181, 0, 0, 1);
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 107, 0, 3, 115, 116, 114 };
            var t = new ErlString("str");
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
              {
            var b = new byte[] { 131, 104, 3, 97, 1, 100, 0, 1, 97, 104, 2, 97, 10, 70, 63, 241, 247, 206, 217, 22, 135, 43 };
            var t = new ErlTuple(1, new ErlAtom("a"), new ErlTuple(10, 1.123));
            var os = new ErlOutputStream(t);
            Assert.AreEqual(b, os.GetBuffer().TakeWhile((_, i) => i < b.Length).ToArray());
            var es = new ErlInputStream(b);
            Assert.AreEqual(t, es.Read());
              }
        }
예제 #10
0
파일: ErlTuple.cs 프로젝트: sergey-msu/nfx
 public ErlTuple(ErlTuple list) : base((ErlTupleBase)list) {}
예제 #11
0
파일: SchemaMap.cs 프로젝트: yhhno/nfx
    /// <summary>
    /// Converts CLR row data into ErlTuple
    /// </summary>
    public ErlTuple RowToErlTuple(Row row, bool keysOnly = false)
    {
      var result = new ErlTuple();
      
      result.Add(new ErlAtom(row.Schema.Name));

      var keys = new List<IErlObject>();

      foreach(var def in row.Schema)
      {
        var atr = def[m_Store.TargetName];

        if (keysOnly && !atr.Key) break;

        if (keys!=null && !atr.Key)
        {
          if (keys.Count>1)
            result.Add( new ErlTuple(keys, false) );
          else
            foreach(var key in keys) result.Add( key ); 
          keys = null;
        }


        IErlObject erlValue = ErlAtom.Undefined;

        var clrValue = row.GetFieldValue(def);
        if (clrValue!=null)
          erlValue = ClrToErlValue(atr.BackendType, clrValue);
        
        if (keys!=null)
          keys.Add( erlValue );
        else
          result.Add( erlValue );
      }

      if (keys!=null)
      {
        if (keys.Count>1)
         result.Add( new ErlTuple(keys, false) );
        else
         foreach(var key in keys) result.Add( key ); 
      }

      return result;
    }
예제 #12
0
        private void sendBuf(ErlTuple ctrl, ErlOutputStream payload = null)
        {
            if (!m_Connected)
            throw new ErlException(StringConsts.ERL_CONN_NOT_CONNECTED_ERROR);

              var header = new ErlOutputStream(writeVersion: false, capacity: HEADER_LEN);

              // preamble: 4 byte length + "PASS_THROUGH" tag + version
              header.Write4BE(0); // reserve space for length
              header.Write1(PASS_THROUGH);
              header.Write1((byte)ErlExternalTag.Version);

              // header info
              header.WriteTuple(ctrl);

              // version for payload
              //header.Write1((byte)ErlExternalTag.Version); // Note that it's already written in the payload

              if (payload == null)
              {
            header.Poke4BE(0, (int)(header.Length - 4));
            DoSend(header);
              }
              else
              {
            header.Poke4BE(0, (int)(header.Length + payload.Length - 4));
            DoSend(header, payload);
              }
        }
예제 #13
0
파일: Program.cs 프로젝트: saleyn/nfx.ssh
    private static void Main(string[] args)
    {
      //here we handle password requests
      ErlTransportPasswordSource.PasswordRequired += ps =>
      {
        Console.Write("Username: {0}\nPassword: "******"batch"].AttrByIndex(0).ValueAsInt(1);
        var totalMsgs = cfg["count"].AttrByIndex(0).ValueAsInt(100000);
        var traceAttr = cfg["trace"].AttrByIndex(0);
        var trace     = traceAttr.ValueAsEnum(ErlTraceLevel.Handshake);
        var noSSH     = cfg["nossh"].Exists;
        var noTrace   = cfg["notrace"].Exists;
        var user      = cfg["user"].AttrByIndex(0).ValueAsString("");
        var privkey   = cfg["sshkey"].AttrByIndex(0).ValueAsString("");

        if (cfg["h", "help"].Exists)
        {
          Console.WriteLine(
            "Usage: {0} [-batch BatchSize] [-count Iterations] [-trace wire|handshake|send] [-notrace]\n" +
            "       [-nossh] [-user User] [-sshkey SSHKeyFile]",
            MiscUtils.EntryExeName(false));
          Environment.ExitCode = 1;
          return;
        }

        var n = ErlApp.Node;
        n.AcceptConnections = false;
        n.TraceLevel        = traceAttr.Exists && n.TraceLevel == ErlTraceLevel.Off
                            ? trace : n.TraceLevel;
        if (noTrace)
          n.TraceLevel = ErlTraceLevel.Off;

        n.Trace += (_n, t, d, text) =>
          Console.WriteLine("{0,-9} {1} {2}", t, d == Direction.Inbound ? "<-" : "->", text);

        //n.Start();

        cfg            = App.ConfigRoot["erlang"];
        var remote     = cfg.Children
                            .FirstOrDefault(nd => nd.IsSameName("node") && nd.Value.Contains("@"));
        var remoteName = remote.ValueAsString(string.Empty);

        if (noSSH)
        {
          var mmm = remote.Attributes.FirstOrDefault(c => c.IsSameName("transport-type"));
          if (mmm.Exists)
            mmm.Delete();
        }

        if (user.IsNotNullOrWhiteSpace())
          remote.AttrByName("ssh-user-name").Value = user;

        if (privkey.IsNotNullOrWhiteSpace())
        {
          remote.AttrByName("ssh-private-key-file").Value    = privkey;
          remote.AttrByName("ssh-authentication-type").Value = "PublicKey";
        }

        Console.WriteLine(
          "\n\nCopy echo_server.erl to remote node {0}, and execute in the same directory:",
          remoteName);
        Console.WriteLine("1> c(echo_server).");
        Console.WriteLine("2> echo_server:run({0}).\n", batchSize == 1 ? "1" : "");
        Console.WriteLine("Press <Enter> when ready...");

        Console.ReadLine();

        var m = n.CreateMbox("test");
        var a = new ErlAtom("hello");
        var msg = new ErlTuple(m.Self, a);
        var remoteNode = new ErlAtom(remoteName);

        DateTime empty = new DateTime(2000, 1, 1, 0, 0, 0);
        DateTime start = empty;
        long count = 0;

        do
        {
          int i = 0;
          for (; i < batchSize && count < totalMsgs; ++i, ++count)
          {
            var res = n.Send(m.Self, remoteNode, "me", msg);
            if (!res)
            {
              Console.WriteLine("Can not send message");
              goto DONE;
            }

            if (start == empty)
            {
              Console.WriteLine("\nTurning off tracing");
              n.TraceLevel = ErlTraceLevel.Off;
              start = DateTime.UtcNow;
            }
          }

          for (int j = 0; j < i; ++j)
          {
            var got = m.Receive(5000);

            if (got == null)
            {
              Console.WriteLine("Timeout waiting for reply (count = {0})".Args(count));
              goto DONE;
            }

            if (!got.Equals(a))
            {
              Console.WriteLine("Got wrong result! Expected: {0}, Got: {1}", a, got);
              count = -1;
              goto DONE;
            }
          }

          if ((count%10000) == 0)
            Console.WriteLine("Processed {0} messages", count);
        } while (count < totalMsgs);

      DONE:
        var end = DateTime.UtcNow;
        var diff = (end - start);

        if (count > 0)
          Console.WriteLine("Processed {0} messages. Speed: {1:F2}msgs/s, Latency: {2}us",
                            totalMsgs, totalMsgs/diff.TotalSeconds,
                            1000.0*diff.TotalMilliseconds/totalMsgs);
      }

      if (Debugger.IsAttached)
      {
        Console.WriteLine("Press <Enter> when ready...");
        Console.Read();
      }
    }
예제 #14
0
        public void ErlTupleTest()
        {
            var l = new ErlTuple("test", 1, 1.1, true, (byte)255, 'x', new ErlAtom("a"));
              var r = new ErlTuple("test", 1, 1.1, true, (byte)255, 'x', new ErlAtom("a"));

              Assert.AreEqual(7, l.Count);
              Assert.AreEqual(ErlTypeOrder.ErlString, l[0].TypeOrder);
              Assert.AreEqual("test", l[0].ValueAsString);
              Assert.AreEqual(ErlTypeOrder.ErlLong, l[1].TypeOrder);
              Assert.AreEqual(1, l[1].ValueAsInt);
              Assert.AreEqual(ErlTypeOrder.ErlDouble, l[2].TypeOrder);
              Assert.AreEqual(1.1, l[2].ValueAsDouble);
              Assert.AreEqual(ErlTypeOrder.ErlBoolean, l[3].TypeOrder);
              Assert.AreEqual(true, l[3].ValueAsBool);
              Assert.AreEqual(ErlTypeOrder.ErlByte, l[4].TypeOrder);
              Assert.AreEqual(255, l[4].ValueAsInt);
              Assert.AreEqual(ErlTypeOrder.ErlByte, l[5].TypeOrder);
              Assert.AreEqual('x', l[5].ValueAsChar);
              Assert.AreEqual(ErlTypeOrder.ErlAtom, l[6].TypeOrder);
              Assert.AreEqual("a", l[6].ValueAsString);

              Assert.IsTrue(l.Matches(r));
              Assert.AreEqual(new ErlVarBind(), l.Match(r));

              Assert.AreEqual(l, r);
              Assert.IsTrue(l.Equals(r));
              Assert.AreEqual("{\"test\",1,1.1,true,255,120,a}", l.ToString());
              Assert.IsFalse(l.IsScalar);
              Assert.AreEqual(ErlTypeOrder.ErlTuple, l.TypeOrder);

              IErlObject temp = null;
              Assert.IsFalse(l.Subst(ref temp, new ErlVarBind()));
              Assert.AreEqual(1, l.Visit(0, (acc, o) => acc + (o is ErlAtom ? 1 : 0)));
              Assert.IsTrue(new ErlTuple(new ErlVar(X), true, 1).Subst(ref temp, new ErlVarBind { { X, new ErlLong(10) } }));
              Assert.AreEqual("{10,true,1}", temp.ToString());

              var d = new DateTime(2013, 1, 2);
              var ts = new TimeSpan(1, 2, 3);

              Assert.DoesNotThrow(() => { var x = l.ValueAsObject; });
              Assert.AreEqual(1, new ErlList("1")[0].ValueAsInt);
              Assert.AreEqual(1, new ErlList("1")[0].ValueAsLong);
              Assert.AreEqual(1, new ErlList("1")[0].ValueAsDecimal);
              Assert.AreEqual(d, new ErlList(d.ToString())[0].ValueAsDateTime);
              Assert.AreEqual(ts, new ErlList(ts.ToString())[0].ValueAsTimeSpan);
              Assert.AreEqual(1.0, new ErlList("1.0")[0].ValueAsDouble);
              Assert.AreEqual("a", new ErlList("a")[0].ValueAsString);
              Assert.IsTrue(new ErlList("true")[0].ValueAsBool);
              Assert.IsFalse(new ErlList("xxxx")[0].ValueAsBool);

              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsInt; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsLong; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsDecimal; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsDateTime; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsTimeSpan; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsDouble; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsString; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsBool; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsChar; });
              Assert.Throws<ErlIncompatibleTypesException>(() => { var x = l.ValueAsByteArray; });

              List<IErlObject> s = l;
              Assert.AreEqual(l.Value, s);

              Assert.IsFalse(new ErlList(1, 1.0, "a").Equals(new ErlTuple(1, 1.0, "a")));
              Assert.IsFalse(new ErlList(1, 1.0, "a") == new ErlTuple(1, 1.0, "a"));
              Assert.IsTrue(new ErlList(1, 1.0, "a") == new ErlList(1, 1.0, "a"));
        }
예제 #15
0
파일: SchemaMap.cs 프로젝트: vlapchenko/nfx
      private IEnumerable<IErlObject> enumErlResponseTuple(ErlTuple tuple, bool singleKey)
      {
         if (singleKey)
         {
           foreach(var elm in tuple)
            yield return elm;

           yield break;
         }
         
         for(var i=0; i<tuple.Count; i++)
         {
            var elm = tuple[i];
            if (i==1)
            {
              var ktuple = elm as ErlTuple;
              if (ktuple==null)
               throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"key tuple is missing");

              foreach(var keye in ktuple)
               yield return keye;
              continue;
            }
            yield return elm;
         }
      }
예제 #16
0
파일: SchemaMap.cs 프로젝트: vlapchenko/nfx
    /// <summary>
    /// Converts CLR row data into ErlTuple
    /// </summary>
    public ErlTuple RowToErlTuple(Row row, bool keysOnly = false)
    {
      var result = new ErlTuple();
      
      result.Add(new ErlAtom(row.Schema.Name));

      var keys = new List<IErlObject>();

      foreach(var def in row.Schema)
      {
        var atr = def[m_Store.TargetName];

        if (keysOnly && !atr.Key) break;

        if (keys!=null && !atr.Key)
        {
          if (keys.Count>1)
            result.Add( new ErlTuple(keys, false) );
          else
            foreach(var key in keys) result.Add( key ); 
          keys = null;
        }


        IErlObject erlValue = ErlAtom.Undefined;

        var clrValue = row.GetFieldValue(def);
        if (clrValue!=null)
        {
           Func<object, IErlObject> fconv;
           if (!CLR_TO_ERL_TYPEMAP.TryGetValue(atr.BackendType, out fconv))
            throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"erltype'{0}' not matched in the dict".Args(atr.BackendType));

           erlValue = fconv(clrValue);
        }
        
        if (keys!=null)
          keys.Add( erlValue );
        else
          result.Add( erlValue );
      }

      if (keys!=null)
      {
        if (keys.Count>1)
         result.Add( new ErlTuple(keys, false) );
        else
         foreach(var key in keys) result.Add( key ); 
      }

      return result;
    }
예제 #17
0
파일: SchemaMap.cs 프로젝트: vlapchenko/nfx
    /// <summary>
    /// Maps ErlRow to CLR row supplied by schema, either Dynamic or TypedRow 
    /// </summary>
    public Row ErlTupleToRow(string schemaName, ErlTuple tuple, Schema schema)
    {
      var singleKey = schema.ExtraData[SCHEMA_KEY_COUNT].AsInt(0) < 2;

      var row = Row.MakeRow(schema, schema.TypedRowType);

      var i = -1;
      foreach(var elm in enumErlResponseTuple(tuple, singleKey))
      {
        i++;
        if (i==0)
        {
          var thisname = tuple[0].ValueAsString;
          if (!schemaName.EqualsOrdSenseCase(thisname))
            throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESPONSE_SCHEMA_MISMATCH_ERROR.Args(thisname, schemaName));
          continue;
        }

        //map fields now
        if (i-1 >= schema.FieldCount)
          throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESPONSE_SCHEMA_FLD_COUNT_MISMATCH_ERROR.Args(schemaName, schema.Name));
        var fdef = schema[i-1];
        var atr = fdef[m_Store.TargetName];

        var erlType = atr.BackendType;
        if (erlType.IsNullOrWhiteSpace())
          throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"fielddef('{0}') has no backend type".Args(fdef.Name));


        if (elm.IsNull())
        {
          row.SetFieldValue(fdef, null);
          continue;
        }

        Tuple<Type, Func<IErlObject, object>> mapping;
        if (ERL_TO_CLR_TYPEMAP.TryGetValue(erlType, out mapping))
        {
          var clrValue = mapping.Item2(elm);
          row.SetFieldValue(fdef, clrValue);
        }
        else throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"erltype'{0}' not matched in the dict".Args(erlType));
      }
  
      return row;
    }
예제 #18
0
    /// <summary>
    /// Maps ErlRow to CLR row supplied by schema, either Dynamic or TypedRow 
    /// </summary>
    public Row ErlTupleToRow(string schemaName, ErlTuple tuple, Schema schema)
    {
      var singleKey = schema.ExtraData[SCHEMA_KEY_COUNT].AsInt(0) < 2;

      var row = Row.MakeRow(schema, schema.TypedRowType);

      var i = -1;
      foreach(var elm in enumErlResponseTuple(tuple, singleKey))
      {
        i++;
        if (i==0)
        {
          var thisname = tuple[0].ValueAsString;
          if (!schemaName.EqualsOrdSenseCase(thisname))
            throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESPONSE_SCHEMA_MISMATCH_ERROR.Args(thisname, schemaName));
          continue;
        }

        //map fields now
        if (i-1 >= schema.FieldCount)
          throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESPONSE_SCHEMA_FLD_COUNT_MISMATCH_ERROR.Args(schemaName, schema.Name));
        var fdef = schema[i-1];
        var atr = fdef[m_Store.TargetName];

        var erlType = atr.BackendType;
        if (erlType.IsNullOrWhiteSpace())
          throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"fielddef('{0}') has no backend type".Args(fdef.Name));


        if (elm.IsNull())
        {
          row.SetFieldValue(fdef, null);
          continue;
        }

        Tuple<Type, Func<IErlObject, object>> mapping;
        if (ERL_TO_CLR_TYPEMAP.TryGetValue(erlType, out mapping))
        {
          object clrValue = null;

          try
          {
            clrValue = mapping.Item2(elm);
          }
          catch(Exception error)
          {
            App.Log.Write( new Log.Message
            {
              Type = Log.MessageType.TraceErl,
              Topic = CoreConsts.ERLANG_TOPIC,
              From = "SchemaMap.ErlTupleToRow({0})".Args(schemaName),
              Text = "Error converting element '{0}'->'{1}': {2}".Args(erlType, elm.GetType(), error.ToMessageWithType()),
              Exception = error
            });
            throw;
          }
          row.SetFieldValue(fdef, clrValue);
        }
        else throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"erltype'{0}' not matched in the dict".Args(erlType));
      }
  
      return row;
    }
예제 #19
0
 /// <summary>
 /// Read Erlang tuple from the stream
 /// </summary>
 public ErlTuple ReadTuple()
 {
     int arity = readTupleHead();
     var list = new List<IErlObject>(arity);
     for (int i = 0; i < arity; i++)
       list.Add(Read());
     var res = new ErlTuple();
     res.Value = list;
     return res;
 }
예제 #20
0
파일: ErlTuple.cs 프로젝트: sergey-msu/nfx
 /// <summary>
 /// Determine if two Erlang tuples are equal
 /// </summary>
 public bool Equals(ErlTuple o) { return m_Items.SequenceEqual(o.m_Items); }
예제 #21
0
 /// <summary>
 /// Write Erlang tuple to stream
 /// </summary>
 public void WriteTuple(ErlTuple tup)
 {
   WriteTupleHead(tup.Count);
   foreach (var t in tup)
     Write(t);
 }
예제 #22
0
파일: SchemaMap.cs 프로젝트: yhhno/nfx
    /// <summary>
    /// Maps ErlRow to CLR row supplied by schema, either Dynamic or TypedRow 
    /// </summary>
    public Row ErlTupleToRow(string schemaName, ErlTuple tuple, Schema schema)
    {
      var singleKey = schema.ExtraData[SCHEMA_KEY_COUNT].AsInt(0) < 2;

      var row = Row.MakeRow(schema, schema.TypedRowType);

      var i = -1;
      foreach(var elm in enumErlResponseTuple(tuple, singleKey))
      {
        i++;
        if (i==0)
        {
          var thisname = tuple[0].ValueAsString;
          if (!schemaName.EqualsOrdSenseCase(thisname))
            throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESP_SCH_MISMATCH_ERROR.Args(thisname, schemaName));
          continue;
        }

        //map fields now
        if (i-1 >= schema.FieldCount)
          throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESP_SCH_FLD_COUNT_ERROR.Args(schemaName, schema.Name));
        var fdef = schema[i-1];
        var atr = fdef[m_Store.TargetName];

        var erlType = atr.BackendType;
        if (erlType.IsNullOrWhiteSpace())
          throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR+"fielddef('{0}') has no backend type".Args(fdef.Name));

        var clrValue = ErlToClrValue(elm, schema, fdef, m_Store.TargetName, tuple);
        row.SetFieldValue(fdef, clrValue);
      }
  
      return row;
    }