示例#1
0
        public void GrainReference_Test1()
        {
            Guid           guid           = Guid.NewGuid();
            GrainId        regularGrainId = GrainId.GetGrainIdForTesting(guid);
            GrainReference grainRef       = this.environment.InternalGrainFactory.GetGrain(regularGrainId);

            TestGrainReference(grainRef);

            grainRef = GrainReference.FromGrainId(regularGrainId, null, "generic");
            TestGrainReference(grainRef);

            GrainId systemTragetGrainId = GrainId.NewSystemTargetGrainIdByTypeCode(2);

            grainRef = GrainReference.FromGrainId(systemTragetGrainId, null, null, SiloAddress.NewLocalAddress(1));
            this.environment.GrainFactory.BindGrainReference(grainRef);
            TestGrainReference(grainRef);

            GrainId observerGrainId = GrainId.NewClientId();

            grainRef = GrainReference.NewObserverGrainReference(observerGrainId, GuidId.GetNewGuidId(), this.environment.RuntimeClient.GrainReferenceRuntime);
            this.environment.GrainFactory.BindGrainReference(grainRef);
            TestGrainReference(grainRef);

            GrainId geoObserverGrainId = GrainId.NewClientId("clusterid");

            grainRef = GrainReference.NewObserverGrainReference(geoObserverGrainId, GuidId.GetNewGuidId(), this.environment.RuntimeClient.GrainReferenceRuntime);
            this.environment.GrainFactory.BindGrainReference(grainRef);
            TestGrainReference(grainRef);
        }
示例#2
0
        private static GrainReference MakeTestGrainReference()
        {
            GrainId        regularGrainId = GrainId.GetGrainIdForTesting(Guid.NewGuid());
            GrainReference grainRef       = GrainReference.FromGrainId(regularGrainId);

            return(grainRef);
        }
示例#3
0
        public void GrainID_AsGuid()
        {
            string  guidString  = "0699605f-884d-4343-9977-f40a39ab7b2b";
            Guid    grainIdGuid = Guid.Parse(guidString);
            GrainId grainId     = GrainId.GetGrainIdForTesting(grainIdGuid);
            //string grainIdToKeyString = grainId.ToKeyString();
            string grainIdToFullString = grainId.ToFullString();
            string grainIdToGuidString = GrainIdToGuidString(grainId);
            string grainIdKeyString    = grainId.Key.ToString();

            output.WriteLine("Guid={0}", grainIdGuid);
            output.WriteLine("GrainId={0}", grainId);
            //output.WriteLine("GrainId.ToKeyString={0}", grainIdToKeyString);
            output.WriteLine("GrainId.Key.ToString={0}", grainIdKeyString);
            output.WriteLine("GrainIdToGuidString={0}", grainIdToGuidString);
            output.WriteLine("GrainId.ToFullString={0}", grainIdToFullString);

            // Equal: Public APIs
            //Assert.Equal(guidString, grainIdToKeyString); // GrainId.ToKeyString
            Assert.Equal(guidString, grainIdToGuidString);      // GrainIdToGuidString
            // Equal: Internal APIs
            Assert.Equal(grainIdGuid, grainId.GetPrimaryKey()); // GetPrimaryKey Guid
            // NOT-Equal: Internal APIs
            Assert.NotEqual(guidString, grainIdKeyString);      // GrainId.Key.ToString
        }
示例#4
0
        private GrainReference MakeTestGrainReference()
        {
            GrainId        regularGrainId = GrainId.GetGrainIdForTesting(Guid.NewGuid());
            GrainReference grainRef       = this.ClusterFixture.InternalGrainFactory.GetGrain(regularGrainId);

            return(grainRef);
        }
示例#5
0
        public void GrainReference_Test1()
        {
            Guid           guid           = Guid.NewGuid();
            GrainId        regularGrainId = GrainId.GetGrainIdForTesting(guid);
            GrainReference grainRef       = GrainReference.FromGrainId(regularGrainId);

            TestGrainReference(grainRef);

            grainRef = GrainReference.FromGrainId(regularGrainId, "generic");
            TestGrainReference(grainRef);

            GrainId systemTragetGrainId = GrainId.NewSystemTargetGrainIdByTypeCode(2);

            grainRef = GrainReference.FromGrainId(systemTragetGrainId, null, SiloAddress.NewLocalAddress(1));
            TestGrainReference(grainRef);

            GrainId observerGrainId = GrainId.NewClientId();

            grainRef = GrainReference.NewObserverGrainReference(observerGrainId, GuidId.GetNewGuidId());
            TestGrainReference(grainRef);

            GrainId geoObserverGrainId = GrainId.NewClientId("clusterid");

            grainRef = GrainReference.NewObserverGrainReference(geoObserverGrainId, GuidId.GetNewGuidId());
            TestGrainReference(grainRef);
        }
示例#6
0
        private ActivationAddress GenerateActivationAddress()
        {
            var grainId  = GrainId.GetGrainIdForTesting(Guid.NewGuid());
            var siloAddr = SiloAddress.New(new IPEndPoint(IPAddress.Loopback, 5000), ++generation);

            return(ActivationAddress.NewActivationAddress(siloAddr, grainId));
        }
示例#7
0
        public void GrainIdShouldEncodeAndDecodePrimaryKeyGuidCorrectly()
        {
            const int repeat = 100;

            for (int i = 0; i < repeat; ++i)
            {
                Guid    expected = Guid.NewGuid();
                GrainId grainId  = GrainId.GetGrainIdForTesting(expected);
                Guid    actual   = grainId.Key.PrimaryKeyToGuid();
                Assert.Equal(expected, actual); // Failed to encode and decode grain id
            }
        }
示例#8
0
        public void GrainIdShouldEncodeAndDecodePrimaryKeyGuidCorrectly()
        {
            const int repeat = 100;

            for (int i = 0; i < repeat; ++i)
            {
                Guid    expected = Guid.NewGuid();
                GrainId grainId  = GrainId.GetGrainIdForTesting(expected);
                Guid    actual   = grainId.Key.PrimaryKeyToGuid();
                Assert.AreEqual(expected, actual, string.Format("Failed to encode and decode grain id with GUID {0}", expected));
            }
        }
        public void GrainReference_Interning()
        {
            var grainId = GrainId.GetGrainIdForTesting(new Guid());
            var g1      = GrainReference.FromGrainId(grainId, null);
            var g2      = GrainReference.FromGrainId(grainId, null);

            Assert.Equal(g1, g2); // Should be equal GrainReferences
            Assert.Same(g1, g2);  // Should be same / interned GrainReference object

            // Round-trip through Serializer
            var g3 = this.HostedCluster.SerializationManager.RoundTripSerializationForTesting(g1);

            Assert.Equal(g3, g1);
            Assert.Equal(g3, g2);
            Assert.Same(g3, g1);
            Assert.Same(g3, g2);
        }
示例#10
0
        public void GrainId_ToFromPrintableString()
        {
            Guid    guid         = Guid.NewGuid();
            GrainId grainId      = GrainId.GetGrainIdForTesting(guid);
            GrainId roundTripped = RoundTripGrainIdToParsable(grainId);

            Assert.Equal(grainId, roundTripped); // GrainId.ToPrintableString -- Guid key

            string extKey = "Guid-ExtKey-1";

            guid         = Guid.NewGuid();
            grainId      = GrainId.GetGrainId(0, guid, extKey);
            roundTripped = RoundTripGrainIdToParsable(grainId);
            Assert.Equal(grainId, roundTripped); // GrainId.ToPrintableString -- Guid key + Extended Key

            grainId      = GrainId.GetGrainId(0, guid, null);
            roundTripped = RoundTripGrainIdToParsable(grainId);
            Assert.Equal(grainId, roundTripped); // GrainId.ToPrintableString -- Guid key + null Extended Key

            long key = random.Next();

            guid         = UniqueKey.NewKey(key).PrimaryKeyToGuid();
            grainId      = GrainId.GetGrainIdForTesting(guid);
            roundTripped = RoundTripGrainIdToParsable(grainId);
            Assert.Equal(grainId, roundTripped); // GrainId.ToPrintableString -- Int64 key

            extKey       = "Long-ExtKey-2";
            key          = random.Next();
            guid         = UniqueKey.NewKey(key).PrimaryKeyToGuid();
            grainId      = GrainId.GetGrainId(0, guid, extKey);
            roundTripped = RoundTripGrainIdToParsable(grainId);
            Assert.Equal(grainId, roundTripped); // GrainId.ToPrintableString -- Int64 key + Extended Key

            guid         = UniqueKey.NewKey(key).PrimaryKeyToGuid();
            grainId      = GrainId.GetGrainId(0, guid, null);
            roundTripped = RoundTripGrainIdToParsable(grainId);
            Assert.Equal(grainId, roundTripped); // GrainId.ToPrintableString -- Int64 key + null Extended Key
        }
        /// <summary>
        /// Returns a grain reference.
        /// </summary>
        /// <typeparam name="TGrainInterface">
        /// The grain interface type.
        /// </typeparam>
        /// <returns>
        /// The <see cref="GrainReference"/>.
        /// </returns>
        public GrainReference GetGrainReference <TGrainInterface>()
        {
            var grainType = typeof(TGrainInterface);
            var typeInfo  = grainType.GetTypeInfo();

            if (typeInfo.IsGenericTypeDefinition)
            {
                throw new ArgumentException("Cannot create grain reference for non-concrete grain type");
            }

            if (typeInfo.IsConstructedGenericType)
            {
                grainType = typeInfo.GetGenericTypeDefinition();
            }

            var type = typeInfo.Assembly.DefinedTypes.First(
                _ =>
            {
                var attr = _.GetCustomAttribute <GrainReferenceAttribute>();
                return(attr != null && attr.TargetType == grainType);
            }).AsType();

            if (typeInfo.IsConstructedGenericType)
            {
                type = type.MakeGenericType(typeInfo.GetGenericArguments());
            }

            var regularGrainId = GrainId.GetGrainIdForTesting(Guid.NewGuid());
            var grainRef       = this.fixture.InternalGrainFactory.GetGrain(regularGrainId);

            return
                ((GrainReference)
                 type.GetConstructor(
                     BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance,
                     null,
                     new[] { typeof(GrainReference) },
                     null).Invoke(new object[] { grainRef }));
        }
        /// <summary>
        /// Returns a grain reference.
        /// </summary>
        /// <typeparam name="TGrainInterface">
        /// The grain interface type.
        /// </typeparam>
        /// <returns>
        /// The <see cref="GrainReference"/>.
        /// </returns>
        public GrainReference GetGrainReference <TGrainInterface>()
        {
            var originalGrainType = typeof(TGrainInterface);

            if (originalGrainType.IsGenericTypeDefinition)
            {
                throw new ArgumentException("Cannot create grain reference for non-concrete grain type");
            }

            // The type used in attributes will not be a constructed generic type, so if this is a constructed generic type then we need to
            // get its corresponding unconstructed type definition.
            var searchGrainType = originalGrainType.IsConstructedGenericType ? originalGrainType.GetGenericTypeDefinition() : originalGrainType;

            var type = originalGrainType.Assembly.DefinedTypes.First(
                _ =>
            {
                var attr = _.GetCustomAttribute <GrainReferenceAttribute>();
                return(attr != null && attr.TargetType == searchGrainType);
            }).AsType();

            if (originalGrainType.IsConstructedGenericType)
            {
                type = type.MakeGenericType(originalGrainType.GetGenericArguments());
            }

            var regularGrainId = GrainId.GetGrainIdForTesting(Guid.NewGuid());
            var grainRef       = this.fixture.InternalGrainFactory.GetGrain(regularGrainId);

            return
                ((GrainReference)
                 type.GetConstructor(
                     BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance,
                     null,
                     new[] { typeof(GrainReference) },
                     null).Invoke(new object[] { grainRef }));
        }