1712 lines
		
	
	
		
			78 KiB
		
	
	
	
		
			Transact-SQL
		
	
	
	
	
	
			
		
		
	
	
			1712 lines
		
	
	
		
			78 KiB
		
	
	
	
		
			Transact-SQL
		
	
	
	
	
	
 | 
						|
/******************************************************************************/
 | 
						|
/*        WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING       */
 | 
						|
/*                                                                            */
 | 
						|
/*                This script will clean the entire database!!!!!             */
 | 
						|
/*                                                                            */
 | 
						|
/*        WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING       */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
use WMI1
 | 
						|
go
 | 
						|
 | 
						|
set nocount on
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/*  Clean up all existing test data that may have been run already.           */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from tempdb..sysobjects where name like '#Results%')
 | 
						|
BEGIN
 | 
						|
    drop table #Results
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
IF EXISTS (select * from tempdb..sysobjects where name like '#Parents%')
 | 
						|
BEGIN
 | 
						|
    drop table #Parents 
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
IF EXISTS (select * from tempdb..sysobjects where name like '#Children%')
 | 
						|
BEGIN
 | 
						|
    drop table #Children 
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
create table #Results (Result varchar(255), Succeeded bit DEFAULT 0)
 | 
						|
go
 | 
						|
create table #Parents (ClassId numeric)
 | 
						|
go
 | 
						|
create table #Children (ClassId int, SuperClassId int)
 | 
						|
go
 | 
						|
 | 
						|
print '********** B E G I N N I N G **********'
 | 
						|
print 'Creating procedures...'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* pDelete                                                                    */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  This procedure deletes a class or instance.                  */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'pDelete')
 | 
						|
BEGIN
 | 
						|
    print 'Creating procedure pDelete...'
 | 
						|
    drop procedure pDelete
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
CREATE PROCEDURE pDelete @ObjId numeric 
 | 
						|
AS
 | 
						|
BEGIN
 | 
						|
    create table #Deleted (ObjId numeric)
 | 
						|
    IF EXISTS (select * from ClassMap where ClassId = @ObjId)
 | 
						|
       exec sp_DeleteClass @ObjId
 | 
						|
    ELSE
 | 
						|
       exec sp_DeleteInstance @ObjId
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
print 'Removing old data...'
 | 
						|
 | 
						|
/* Clean up old data */
 | 
						|
declare @ClassID int
 | 
						|
select @ClassID = min(ObjectId) from ObjectMap where ClassId = 1 and ObjectId >= 5
 | 
						|
while (@ClassID is not NULL)
 | 
						|
BEGIN     
 | 
						|
     exec pDelete @ClassID
 | 
						|
     select @ClassID = min(ObjectId) from ObjectMap where ObjectId > @ClassID
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
declare @PropID int
 | 
						|
select @PropID = min(PropertyId) from PropertyMap where PropertyId > 13
 | 
						|
while (@PropID is not null)
 | 
						|
BEGIN
 | 
						|
    exec sp_DeleteClassData @PropID
 | 
						|
    select @PropID = min(PropertyId) from PropertyMap where PropertyId > @PropID
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* pResult                                                                    */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Populates the result tables for our final tabulation.         */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'pResult')
 | 
						|
BEGIN
 | 
						|
    print 'Creating procedure pResult...'
 | 
						|
    drop procedure pResult
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
CREATE PROCEDURE pResult
 | 
						|
    @Activity varchar(100),
 | 
						|
    @Details varchar(100) = "",
 | 
						|
    @Success bit = 0
 | 
						|
AS
 | 
						|
BEGIN
 | 
						|
    declare @ErrMsg varchar(255)
 | 
						|
    if (@Success=1)
 | 
						|
    begin
 | 
						|
        select @ErrMsg = " succeeded.  "
 | 
						|
    end
 | 
						|
    else
 | 
						|
    begin
 | 
						|
        select @ErrMsg = " FAILED.  "        
 | 
						|
        select @Activity = upper(@Activity)
 | 
						|
    end
 | 
						|
 | 
						|
    IF (@Details != "")
 | 
						|
        select @ErrMsg = @ErrMsg + "(" + @Details + ")"
 | 
						|
 | 
						|
    if (substring(@Activity,1,1) = "*")
 | 
						|
        select @Activity + @ErrMsg
 | 
						|
   
 | 
						|
    insert into #Results select @Activity + @ErrMsg, @Success
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* pCreateClassTest                                                           */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Shorthand method of creating a new class and instance         */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'pCreateClassTest')
 | 
						|
BEGIN
 | 
						|
    print 'Creating procedure pCreateClassTest...'
 | 
						|
    drop procedure pCreateClassTest
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
CREATE PROCEDURE pCreateClassTest
 | 
						|
    @ClassName nvarchar(450),
 | 
						|
    @KeyName nvarchar(450),
 | 
						|
    @ClassFlags int = 0,
 | 
						|
    @KeyType int = 0,
 | 
						|
    @KeyValue nvarchar(50),
 | 
						|
    @InsUpdFlags int = 0,
 | 
						|
    @ScopePath nvarchar(50) = 'root',
 | 
						|
    @ParentClass nvarchar(50) = ''
 | 
						|
AS
 | 
						|
BEGIN
 | 
						|
    declare @ClassID numeric, @KeyPropID int, @InstanceID numeric
 | 
						|
    declare @ScopeID numeric, @Key nvarchar(450)
 | 
						|
    declare @ObjPath nvarchar(450), @InstPath nvarchar(450)
 | 
						|
    select @ScopeID = ObjectId from ObjectMap 
 | 
						|
        where ObjectPath = @ScopePath 
 | 
						|
 | 
						|
    select @ObjPath = @ScopePath + ':' + @ClassName
 | 
						|
    select @Key = @ClassName + "?" + @ScopePath
 | 
						|
    select @InstPath = @ObjPath + "=" + @KeyValue
 | 
						|
 | 
						|
    exec sp_InsertClassAndData @ClassID output, @ClassName, @Key, @ObjPath, @ScopePath, @ParentClass,
 | 
						|
        @ClassFlags, @InsUpdFlags, @KeyName, @KeyType, @KeyValue, 0, 4, 0, 0, "", @KeyPropID output
 | 
						|
 | 
						|
    IF (@ClassID is not null)
 | 
						|
    BEGIN
 | 
						|
      select @Key = @KeyValue + "?" + @Key
 | 
						|
      exec @InstanceID = sp_BatchInsertProperty @InstanceID, @Key, @InstPath ,
 | 
						|
            @ClassID, @ScopeID, @InsUpdFlags, 0, @KeyPropID, @KeyValue, 0
 | 
						|
      IF (@InstanceID != 0)
 | 
						|
          BEGIN
 | 
						|
          exec pResult 'Creating instance', @InstPath, 1
 | 
						|
          END
 | 
						|
      ELSE
 | 
						|
         return 0
 | 
						|
    END
 | 
						|
 | 
						|
    return 1
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* pModifyClassTest                                                           */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Shorthand method of modifying an existing class              */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'pModifyClassTest')
 | 
						|
BEGIN
 | 
						|
    print 'Creating procedure pModifyClassTest...'
 | 
						|
    drop procedure pModifyClassTest
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
CREATE PROCEDURE pModifyClassTest
 | 
						|
    @ClassName nvarchar(450),
 | 
						|
    @KeyName nvarchar(450),
 | 
						|
    @KeyFlags int,
 | 
						|
    @KeyType int,
 | 
						|
    @DefaultValue nvarchar(255) = "",
 | 
						|
    @RefClassID int = 0,
 | 
						|
    @PropID int = 0,
 | 
						|
    @Flavor int = 0,
 | 
						|
    @ScopePath nvarchar(50) = 'root'
 | 
						|
AS
 | 
						|
BEGIN   
 | 
						|
    declare @ClassID numeric, @KeyPropID int
 | 
						|
    select @ClassID = ObjectId from ObjectMap
 | 
						|
        where ObjectKey = @ClassName + "?" + @ScopePath
 | 
						|
 | 
						|
    exec @KeyPropID = InsertPropertyDef @ClassID, @KeyName, @KeyType, @KeyFlags, @DefaultValue, 0, @RefClassID, @PropID, @Flavor
 | 
						|
    IF (@KeyPropID != 0)
 | 
						|
        exec pResult 'Creating property ', @KeyName, 1
 | 
						|
    ELSE
 | 
						|
        return 0
 | 
						|
 | 
						|
    return 1
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
print '*********** T E S T   B E G I N N I N G *************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* ABSTRACT CLASS                                                             */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: This class should not allow instances to be created.          */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create an abstract class                                             */
 | 
						|
/*     * Creating an instance should fail.                                    */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Creating abstract class...'
 | 
						|
 | 
						|
declare @CIMFlags int, @DataType int, @RetValue int
 | 
						|
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'Abstract'
 | 
						|
exec @DataType = sp_GetCIMTypeID 'uint32'
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "Abstract1", "Key1", @CIMFlags, @DataType, 1, 0
 | 
						|
 | 
						|
IF EXISTS (select * from ObjectMap where ObjectPath = 'root:Abstract1=1')
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Creating abstract class', "", 0
 | 
						|
END
 | 
						|
ELSE
 | 
						|
BEGIN
 | 
						|
    IF EXISTS (select * from ObjectMap where ObjectPath = 'root:Abstract1')
 | 
						|
        exec pResult '* Creating abstract class', "", 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Creating abstract class', "", 0
 | 
						|
END    
 | 
						|
go
 | 
						|
 | 
						|
print 'Abstract class testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* SINGLETON CLASS                                                            */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  This class should allow only one instance                    */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create a singleton class                                             */
 | 
						|
/*     * Creating an instance of a singleton class should succeed.            */
 | 
						|
/*     * Creating a second instance of a singleton class should fail.         */
 | 
						|
/*     * Creating a derived singleton class should succeed.                   */
 | 
						|
/*     * Creating an instance of a derived singleton class should fail if     */
 | 
						|
/*         there are other instances in hierarchy.                            */
 | 
						|
/*     * Creating a singleton instance when a derived instance exists should  */
 | 
						|
/*         fail.                                                              */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Creating singleton class...'
 | 
						|
 | 
						|
declare @CIMFlags int, @DataType int, @RetValue int
 | 
						|
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'Singleton'
 | 
						|
exec @DataType = sp_GetCIMTypeID 'string'
 | 
						|
exec @RetValue = pCreateClassTest "Singleton1", "Key1", @CIMFlags, @DataType, "@", 0
 | 
						|
 | 
						|
IF NOT EXISTS (select * from ObjectMap where ObjectPath = 'root:Singleton1=@')
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Creating singleton class', "", 0
 | 
						|
END
 | 
						|
ELSE
 | 
						|
BEGIN
 | 
						|
    exec @RetValue = pCreateClassTest "Singleton1", "Key1", @CIMFlags, @DataType, "X", 0
 | 
						|
    IF NOT EXISTS (select * from ObjectMap where ObjectPath = 'root:Singleton1=X')
 | 
						|
    BEGIN
 | 
						|
        exec pResult '* Creating singleton class', "", 1
 | 
						|
    END
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Creating singleton class', "", 0
 | 
						|
 | 
						|
    /* Now derive a class and make sure that it fails to add an instance!! */
 | 
						|
    exec @RetValue = pCreateClassTest "Singleton2", "Key2", @CIMFlags, @DataType, "@", 0, 'root', 'Singleton1?root'
 | 
						|
    IF (@RetValue = 1)
 | 
						|
        exec pResult 'Failing to create second derived singleton instance', '', 0
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Failing to create second derived singleton instance', '', 1
 | 
						|
 | 
						|
    /* Now delete our instance and make sure it succeeds */
 | 
						|
 | 
						|
    select @RetValue = ObjectId from ObjectMap where ObjectPath = 'root:Singleton1=@'
 | 
						|
    create table #Deleted (ObjId numeric)
 | 
						|
    exec sp_DeleteInstance @RetValue
 | 
						|
 | 
						|
    declare @ClassID numeric, @ScopeID numeric, @PropID int
 | 
						|
    select @ClassID = ClassId from ClassMap where ClassName = 'Singleton1'
 | 
						|
    select @ScopeID = ObjectId from ObjectMap where ObjectPath = 'root'
 | 
						|
    select @PropID = PropertyId from PropertyMap where PropertyName = 'Key1' and ClassId = @ClassID
 | 
						|
 | 
						|
    exec @RetValue = sp_BatchInsertProperty @RetValue, '@?Singleton2?root', 'root:Singleton2=@', @ClassID, @ScopeID,
 | 
						|
        0, 0, @PropID, "@", 0
 | 
						|
    IF (@RetValue = 0)
 | 
						|
        exec pResult 'Creating derived singleton instance', '', 0
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Creating derived singleton instance', '', 1
 | 
						|
 | 
						|
    /* Finally, recreating the first singleton should fail */
 | 
						|
    exec @RetValue = pCreateClassTest "Singleton1", "Key1", @CIMFlags, @DataType, "@", 0
 | 
						|
    IF NOT EXISTS (select * from ObjectMap where ObjectPath = 'root:Singleton1=@')
 | 
						|
        exec pResult 'Failing to create singleton class when derived exist', "", 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Failing to create singleton class when derived exist', "", 0
 | 
						|
END    
 | 
						|
go
 | 
						|
 | 
						|
print 'Singleton testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* MODIFYING EXISTING CLASSES                                                 */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Make sure we can add properties to a class, as long as        */
 | 
						|
/*              they don't modify an existing key structure.                  */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create a test class with a single numeric key and an instance.       */
 | 
						|
/*     * Adding a key to test class should fail if there are instances.       */
 | 
						|
/*     * Adding an index should succeed.                                      */
 | 
						|
/*     * Adding a new index with default data should replicate to instance.   */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Adding property to existing class...'
 | 
						|
 | 
						|
declare @CIMFlags int, @DataType int, @RetValue int
 | 
						|
 | 
						|
select @CIMFlags = 0
 | 
						|
exec @DataType = sp_GetCIMTypeID 'uint32'
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "TestClass", "Key1", @CIMFlags, @DataType, "1", 0
 | 
						|
 | 
						|
IF NOT EXISTS (select * from ObjectMap where ObjectPath = 'root:TestClass=1')
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Creating class TestClass', "", 0
 | 
						|
END
 | 
						|
ELSE
 | 
						|
BEGIN
 | 
						|
    /* Try to add another key.  This should fail as there are instances.*/
 | 
						|
    exec @RetValue = pCreateClassTest "TestClass", "Key2", @CIMFlags, @DataType, "1", 0
 | 
						|
    IF EXISTS (select * from PropertyMap where PropertyName = 'Key2' and ClassId = (select ClassId from ClassMap where ClassName = 'TestClass'))
 | 
						|
        exec pResult 'Adding key property to class', "", 0
 | 
						|
    ELSE
 | 
						|
        exec pResult '* Adding key property to class', "", 1
 | 
						|
 | 
						|
    exec @CIMFlags = sp_GetFlagFromQualifier 'indexed'
 | 
						|
    exec @RetValue = pModifyClassTest 'TestClass', 'Index1', @CIMFlags, @DataType, "123"
 | 
						|
    IF NOT EXISTS (select * from PropertyMap where PropertyName = 'Index1')
 | 
						|
    BEGIN
 | 
						|
        exec pResult 'Adding index property to class', "", 0
 | 
						|
    END
 | 
						|
    ELSE
 | 
						|
    BEGIN        
 | 
						|
        IF NOT EXISTS (select * from IndexNumericData where PropertyId = (select PropertyId from PropertyMap
 | 
						|
              where Propertyname = 'Index1'))
 | 
						|
        BEGIN
 | 
						|
           exec pResult 'Adding default index data to table', "", 0
 | 
						|
        END      
 | 
						|
        ELSE
 | 
						|
           exec pResult "* Adding default index data to table", "", 1
 | 
						|
    END
 | 
						|
 | 
						|
    exec @RetValue = pModifyClassTest 'TestClass', 'Prop1', 0, @DataType
 | 
						|
    IF (@RetValue = 1 and EXISTS (select * from PropertyMap where PropertyName = 'Prop1'))
 | 
						|
    BEGIN      
 | 
						|
        exec pResult '* Adding property to class', "", 1
 | 
						|
    END
 | 
						|
    ELSE
 | 
						|
    BEGIN        
 | 
						|
        exec pResult 'Adding property to class', "", 0
 | 
						|
    END
 | 
						|
END    
 | 
						|
go
 | 
						|
 | 
						|
print 'Property creation testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* DEFAULTS                                                                   */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  New default data should replicate to existing instances      */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Add default data to an existing class.  This should replicate to     */
 | 
						|
/*        all existing instances.                                             */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Adding default to existing property...'
 | 
						|
 | 
						|
declare @RetValue int, @DataType int, @PropertyId int
 | 
						|
select @DataType = CIMTypeId, @PropertyId = PropertyId from PropertyMap 
 | 
						|
    where ClassId = (select ClassId from ClassMap where ClassName = 'TestClass')
 | 
						|
    and PropertyName = 'Prop1'
 | 
						|
exec @RetValue = pModifyClassTest 'TestClass', 'Prop1', 0, @DataType, "123"
 | 
						|
IF (EXISTS (select * from ClassData where PropertyId = @PropertyId
 | 
						|
    and ClassId != ObjectId))
 | 
						|
    exec pResult '* Adding default to existing property', "", 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Adding default to existing property', '', 0
 | 
						|
go
 | 
						|
 | 
						|
print 'Default testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* DROPPING INDEX                                                             */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Dropping an index should succeed regardless.                 */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create a class with index data.                                      */
 | 
						|
/*     * Add a new instance and verify existence of data in index table.      */
 | 
						|
/*     * Drop the index and make sure data is removed from index table.       */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Dropping index...'
 | 
						|
 | 
						|
declare @RetValue int, @DataType int, @PropertyId1 int, @PropertyId2 int
 | 
						|
declare @ClassID numeric, @ScopeID numeric
 | 
						|
 | 
						|
select @ClassID = ClassId from ClassMap where ClassName = 'TestClass'
 | 
						|
select @DataType = CIMTypeId, @PropertyId1 = PropertyId from PropertyMap 
 | 
						|
    where ClassId = @ClassID
 | 
						|
    and PropertyName = 'Index1'
 | 
						|
select @PropertyId2 = PropertyId from PropertyMap where ClassId = @ClassID
 | 
						|
    and PropertyName = 'Key1'
 | 
						|
select @ScopeID = ObjectId from ObjectMap where ObjectPath = 'root'
 | 
						|
 | 
						|
/* Create some index data. */
 | 
						|
exec @RetValue = sp_BatchInsertProperty @RetValue, '2?TestClass?root', 'root:TestClass=2', @ClassID, @ScopeID, 0,
 | 
						|
    0, @PropertyId1, "2", 0, @PropertyId2, "2"
 | 
						|
IF (@RetValue = 0 OR NOT EXISTS (select * from IndexNumericData where PropertyId = @PropertyId1))
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Creating index data','', 0
 | 
						|
END
 | 
						|
ELSE
 | 
						|
BEGIN
 | 
						|
  exec @RetValue = pModifyClassTest 'TestClass', 'Index1', 0, @DataType
 | 
						|
  IF (@RetValue != 0 and NOT EXISTS (select * from IndexNumericData where PropertyId = @PropertyId1))
 | 
						|
  BEGIN
 | 
						|
      exec pResult '* Dropping index data', '', 1
 | 
						|
  END
 | 
						|
  ELSE
 | 
						|
      exec pResult 'Dropping index data', '', 0 
 | 
						|
  IF EXISTS (select * from ClassData where PropertyId = @PropertyId1 and ObjectId = @ClassID)
 | 
						|
     exec pResult 'Dropping default data', '', 0
 | 
						|
  ELSE
 | 
						|
     exec pResult '* Dropping default data', '', 1
 | 
						|
END
 | 
						|
go
 | 
						|
print 'Index testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* DROPPING PROPERTY                                                          */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Dropping a property should be allowed if this is not a key.  */
 | 
						|
/*               Dropping keys should be allowed if there are no instances.   */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Dropping a regular property should remove the data from all tables.  */
 | 
						|
/*     * Dropping a key with instances should fail.                           */
 | 
						|
/*     * Dropping a key with no instances should succeed.                     */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
declare @RetCode int, @PropID int
 | 
						|
 | 
						|
print 'Dropping properties...'
 | 
						|
 | 
						|
/* Dropping an ordinary property should succeed */
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'Prop1'
 | 
						|
exec sp_DeleteClassData @PropID
 | 
						|
IF EXISTS (select * from ClassData where PropertyId = @PropID)
 | 
						|
OR EXISTS (select * from IndexNumericData where PropertyId = @PropID)
 | 
						|
OR EXISTS (select * from PropertyMap where PropertyId = @PropID)
 | 
						|
    exec pResult 'Dropping property', '', 0
 | 
						|
ELSE
 | 
						|
    exec pResult '* Dropping property', '', 1
 | 
						|
 | 
						|
/* Dropping a populated key should fail.*/
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'Key1'
 | 
						|
    and ClassId = (select ClassId from ClassMap where ClassName = 'TestClass')
 | 
						|
exec sp_DeleteClassData @PropID
 | 
						|
IF NOT EXISTS (select * from ClassData where PropertyId = @PropID)
 | 
						|
    exec pResult 'Dropping key','', 0
 | 
						|
ELSE
 | 
						|
    exec pResult '* Dropping key','', 1
 | 
						|
 | 
						|
/* Dropping a key on a class with no instances should succeed */
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'Key1'
 | 
						|
    and ClassId = (select ClassId from ClassMap where ClassName = 'Abstract1')
 | 
						|
exec sp_DeleteClassData @PropID
 | 
						|
IF EXISTS (select * from PropertyMap where PropertyId = @PropID)
 | 
						|
    exec pResult 'Dropping unpopulated key','', 0
 | 
						|
ELSE
 | 
						|
    exec pResult '* Dropping unpopulated key','', 1
 | 
						|
go
 | 
						|
 | 
						|
print 'Property testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* CHANGING DATATYPES OF EXISTING PROPERTY                                    */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Changing datatypes of a property is allowed as long as we    */
 | 
						|
/*               are gaining precision and are converting between numerics.   */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Lowering precision should fail.                                       */
 | 
						|
/*    * Increasing precision should succeed.                                  */
 | 
						|
/*    * Converting from real to int should fail.                              */
 | 
						|
/*    * Converting from int to equal or greater real should succeed.          */
 | 
						|
/*    * Converting from numeric to non-numeric should fail.                   */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Changing property data types...'
 | 
						|
 | 
						|
declare @CIMFlags int, @DataType int, @RetValue int
 | 
						|
 | 
						|
select @CIMFlags = 0
 | 
						|
exec @DataType = sp_GetCIMTypeID 'uint32'
 | 
						|
exec @RetValue = pCreateClassTest "TestTypes", "Key1", @CIMFlags, @DataType, "1", 0
 | 
						|
 | 
						|
IF NOT EXISTS (select * from ObjectMap where ObjectPath = 'root:TestTypes=1')
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Creating class TestTypes', "", 0
 | 
						|
END
 | 
						|
ELSE
 | 
						|
BEGIN
 | 
						|
    exec @RetValue = pModifyClassTest 'TestTypes', 'uint32prop', @CIMFlags, @DataType, "321"
 | 
						|
    IF NOT EXISTS (select * from PropertyMap where PropertyName = 'uint32prop')
 | 
						|
        exec pResult 'Adding uint32 property', "", 0
 | 
						|
    ELSE 
 | 
						|
    BEGIN
 | 
						|
        /* 32-bit to 8-bit should fail */
 | 
						|
        exec @DataType = sp_GetCIMTypeID 'uint8'
 | 
						|
        exec @RetValue = pModifyClassTest 'TestTypes', 'uint32prop', @CIMFlags, @DataType
 | 
						|
        IF (@RetValue = 0)
 | 
						|
            exec pResult 'Changing populated property from 32-bit to 8-bit', '', 1
 | 
						|
        ELSE
 | 
						|
            exec pResult 'Changing populated property from 32-bit to 8-bit', '', 0
 | 
						|
 | 
						|
        /* Int to real should succeed */
 | 
						|
        exec @DataType = sp_GetCIMTypeID 'real32'
 | 
						|
        exec @RetValue = pModifyClassTest 'TestTypes', 'uint32prop', @CIMFlags, @DataType
 | 
						|
        IF EXISTS (select PropertyRealValue from ClassData where PropertyRealValue != 0)
 | 
						|
            exec pResult 'Changing populated property from int to real', '', 1
 | 
						|
        ELSE 
 | 
						|
            exec pResult 'Changing populated property from int to real', '', 0
 | 
						|
        
 | 
						|
        /* Changing from real to int should fail!! */
 | 
						|
        exec @DataType = sp_GetCIMTypeID 'uint64'
 | 
						|
        exec @RetValue = pModifyClassTest 'TestTypes', 'uint32prop', @CIMFlags, @DataType
 | 
						|
        IF (@RetValue = 0)
 | 
						|
            exec pResult 'Changing populated property from real to uint64', '', 1
 | 
						|
        ELSE
 | 
						|
            exec pResult 'Changing populated property from real to uint64', '', 0
 | 
						|
 | 
						|
        /* Changing to greater precision should succeed. */
 | 
						|
        exec @DataType = sp_GetCIMTypeID 'real64'
 | 
						|
        exec @RetValue = pModifyClassTest 'TestTypes', 'uint32prop', @CIMFlags, @DataType
 | 
						|
        IF (@RetValue = 1)
 | 
						|
            exec pResult 'Changing populated property from real32 to real64', '', 1
 | 
						|
        ELSE 
 | 
						|
            exec pResult 'Changing populated property from real32 to real64', '', 0
 | 
						|
 | 
						|
        /* String conversion should always fail */
 | 
						|
        exec @DataType = sp_GetCIMTypeID 'string'
 | 
						|
        exec @RetValue = pModifyClassTest 'TestTypes', 'uint32prop', @CIMFlags, @DataType
 | 
						|
        IF (@RetValue = 0)
 | 
						|
            exec pResult "Changing populated property from real to string", '', 1
 | 
						|
        ELSE 
 | 
						|
            exec pResult "Changing populated property from real to string", '', 0      
 | 
						|
    END
 | 
						|
END    
 | 
						|
go
 | 
						|
print 'Datatype conversion testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* INSERT FLAGS                                                               */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: If the input specifies insert_only or update_only, these      */
 | 
						|
/*              flags should be respected and the operation should fail       */
 | 
						|
/*              accordingly.                                                  */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*   * Update_Only (1) should fail if the object does not exist.              */
 | 
						|
/*   * Insert_Only (2) should succeed if the object does not exist.           */
 | 
						|
/*   * Update_Only (1) should succeed if the object exists.                   */
 | 
						|
/*   * Insert_Only (2) should fail if the object exists.                      */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing insert/update flags...'
 | 
						|
 | 
						|
declare @CIMFlags int, @DataType int, @RetValue int
 | 
						|
select @CIMFlags = 0
 | 
						|
exec @DataType = sp_GetCIMTypeID 'uint32'
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "TestClass2", "Key1", @CIMFlags, @DataType, 1, 1 /*Update only*/
 | 
						|
IF EXISTS (select * from ObjectMap where ObjectPath = 'root:TestClass2=1')
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Using update only flag', '', 0
 | 
						|
END
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "TestClass2", "Key1", @CIMFlags, @DataType, 1, 2 /*Insert only*/
 | 
						|
IF NOT EXISTS (select * from ObjectMap where ObjectPath = 'root:TestClass2=1')
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Using insert only flag', '', 0
 | 
						|
END
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "TestClass2", "Key1", @CIMFlags, @DataType, 1, 2 /*Insert only*/
 | 
						|
IF (@RetValue = 1)
 | 
						|
    exec pResult 'Inserting existing ', '', 0
 | 
						|
else
 | 
						|
    exec pResult 'Inserting existing', '', 1
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "TestClass2", "Key1", @CIMFlags, @DataType, 1, 1 /*Update only*/
 | 
						|
IF (@RetValue = 1)
 | 
						|
    exec pResult '* Insert/Update flags', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Insert/Update flags', '', 0
 | 
						|
go
 | 
						|
 | 
						|
print 'Insert/Update flag testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* KEYHOLE PROPERTIES                                                         */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Keyholes are key properties that are supplied by the system. */
 | 
						|
/*               They are populated by a call to sp_GetNextKeyhole, and       */
 | 
						|
/*               only apply to string and numeric types.                      */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Creating a keyhole on any type other than a int or string should fail.*/
 | 
						|
/*    * Creating a keyhole on an int should succeed.                          */
 | 
						|
/*    * Obtaining a keyhole should return the next available value.           */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing keyholes...'
 | 
						|
 | 
						|
declare @CIMFlags int, @DataType int, @RetValue int, @Value int, @PropID int
 | 
						|
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'keyhole'
 | 
						|
 | 
						|
exec @DataType = sp_GetCIMTypeID 'uint16'
 | 
						|
exec @RetValue = pCreateClassTest "Keyhole1", "Key1", 4, @DataType, 1, 0
 | 
						|
exec @DataType = sp_GetCIMTypeID 'datetime'
 | 
						|
exec @RetValue = pModifyClassTest "Keyhole1", "Keyhole0", @CIMFlags, @DataType, 1, 0
 | 
						|
exec @DataType = sp_GetCIMTypeID 'real32'
 | 
						|
exec @RetValue = pModifyClassTest "Keyhole1", "Keyhole00", @CIMFlags, @DataType, 1, 0
 | 
						|
exec @DataType = sp_GetCIMTypeID 'object'
 | 
						|
exec @RetValue = pModifyClassTest "Keyhole1", "Keyhole000", @CIMFlags, @DataType, 1, 0
 | 
						|
 | 
						|
IF EXISTS (select * from PropertyMap where PropertyName like 'Keyhole0%'
 | 
						|
    and (Flags & @CIMFlags) = @CIMFlags)
 | 
						|
    exec pResult 'Adding keyhole to invalid property type', '', 0
 | 
						|
ELSE
 | 
						|
    exec pResult 'Adding keyhole to invalid property type', '', 1
 | 
						|
 | 
						|
exec @DataType = sp_GetCIMTypeID 'uint32'
 | 
						|
exec @RetValue = pModifyClassTest "Keyhole1", "Keyhole1", @CIMFlags, @DataType, 1, 0
 | 
						|
IF EXISTS (select * from PropertyMap where Flags & @CIMFlags = @CIMFlags)
 | 
						|
    exec pResult 'Adding keyhole to uint32', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Adding keyhole to uint32', '', 0
 | 
						|
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'Keyhole1'
 | 
						|
exec @Value = sp_GetNextKeyhole @PropID, @Value
 | 
						|
IF (@Value > 1 AND NOT EXISTS (select * from ClassData where PropertyId = @PropID
 | 
						|
    and PropertyNumericValue = @Value))
 | 
						|
    exec pResult '* Obtaining uint32 keyhole', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Obtaining uint32 keyhole', '', 0
 | 
						|
go
 | 
						|
 | 
						|
print 'Keyhole testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* CIM DATATYPES                                                              */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  All datatypes supported by CIM should be stored correctly.   */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create a class with all datatypes.                                   */
 | 
						|
/*     * Create an instance populating all properties.  All data should be    */
 | 
						|
/*       present.                                                             */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing datatypes...'
 | 
						|
 | 
						|
declare @BooleanId int, @Char16Id int, @DatetimeId int, @EObjectId int
 | 
						|
declare @Real32Id int, @Real64Id int, @RefId int, @Sint16Id int
 | 
						|
declare @Sint32Id int, @Sint64Id int, @Sint8Id int, @StringId int
 | 
						|
declare @Uint16id int, @Uint32Id int, @Uint64Id int, @Uint8Id int
 | 
						|
 | 
						|
exec @BooleanId = sp_GetCIMTypeID 'Boolean'
 | 
						|
exec @Char16Id = sp_GetCIMTypeID 'Char16'
 | 
						|
exec @DatetimeId = sp_GetCIMTypeID 'Datetime'
 | 
						|
exec @EObjectId = sp_GetCIMTypeID 'Object'
 | 
						|
exec @Real32Id = sp_GetCIMTypeID 'Real32'
 | 
						|
exec @Real64Id  = sp_GetCIMTypeID 'Real64'
 | 
						|
exec @RefId = sp_GetCIMTypeID 'Ref'
 | 
						|
exec @Sint16Id = sp_GetCIMTypeID 'Sint16'
 | 
						|
exec @Sint32Id = sp_GetCIMTypeID 'Sint32'
 | 
						|
exec @Sint64Id = sp_GetCIMTypeID 'Sint64'
 | 
						|
exec @Sint8Id = sp_GetCIMTypeID 'Sint8'
 | 
						|
exec @StringId = sp_GetCIMTypeID 'String'
 | 
						|
exec @Uint16Id = sp_GetCIMTypeID 'Uint16'
 | 
						|
exec @Uint32Id = sp_GetCIMTypeID 'Uint32'
 | 
						|
exec @Uint64Id = sp_GetCIMTypeID 'Uint64'
 | 
						|
exec @Uint8Id = sp_GetCIMTypeID 'Uint8'
 | 
						|
 | 
						|
declare @ClassID numeric, @ObjectId numeric, @RetValue int, @ScopeID numeric
 | 
						|
select @ScopeID = objectId from ObjectMap where ObjectPath = 'root'
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "RefClass1", "Key1", 0, @Sint32Id, 1, 0
 | 
						|
exec @RetValue = pCreateClassTest "Datatype1", "Key1", 0, @Sint32Id, 1, 0
 | 
						|
IF (@RetValue = 1 and exists (select * from ObjectMap where ObjectPath = 'root:Datatype1=1'))
 | 
						|
BEGIN
 | 
						|
    exec pResult 'Creating table Datatype1', '', 1
 | 
						|
    select @ClassID = ClassId from ClassMap where ClassName = 'Datatype1'
 | 
						|
    select @ObjectId = ObjectId from ObjectMap where ObjectPath = 'root:Datatype1=1'
 | 
						|
 | 
						|
    exec sp_InsertPropertyDefs @ClassID, "Prop0", @BooleanId, "", 0, 0, 0, 0, "", @BooleanId output,
 | 
						|
        "Prop1", @Char16Id, "", 0, 0, 0, 0, "", @Char16Id output, "Prop2", @DatetimeId, "", 0, 0, 0, 0, "", @DatetimeId output,
 | 
						|
         "Prop4", @Real32Id, "", 0, 0, 0, 0, "", @Real32Id output,"Prop5", @Real64Id, "", 0, 0,0, 0, "", @Real64Id output
 | 
						|
 | 
						|
    exec sp_InsertPropertyDefs @ClassID, "Prop7", @Sint16Id, "", 0, 0, 0, 0, "", @Sint16Id output,
 | 
						|
        "Prop8", @Sint32Id, "", 0, 0, 0, 0, "", @Sint32Id output,"Prop9", @Sint64Id, "", 0, 0, 0, 0, "",  @Sint64Id output,
 | 
						|
        "Prop10", @StringId, "", 0, 0, 0,0, "",  @StringId output,"Prop11", @Uint16Id, "", 0, 0, 0, 0, "", @Uint16Id output
 | 
						|
 | 
						|
    exec sp_BatchInsertProperty @ObjectId, '1?Datatype1?root', 'root:Datatype1=1', @ClassID, @ScopeID, 0, 0, 
 | 
						|
        @BooleanId, "1", 0, @Char16Id, "255", 0, @DatetimeId, "19990101010000.000000+***", 0, 
 | 
						|
        @Real32Id, "1000000000", 0, @Real64Id, "20000000000", 0, @Sint16Id, "-23987345", 0,
 | 
						|
        @Sint32Id, "-1000000000", 0, @Sint64Id, "-100000000000", 0, @StringId, "ABCDEFGHJKLMNOo", 0,
 | 
						|
        @Uint16Id, "1000000", 0
 | 
						|
 | 
						|
    exec sp_InsertPropertyDefs @ClassID, "Prop3", @EObjectId, "", 0, 0, 0, 0, "", @EObjectId output,
 | 
						|
        "Prop6", @RefId, "", 0, 0, 0, 0, "", @RefId output,"Prop12", @Uint32Id, "", 0, 0, 0, 0, "", @Uint32Id output,
 | 
						|
        "Prop13", @Uint64Id, "", 0, 0, 0, 0, "", @Uint64Id output,"Prop14", @Sint8Id, "", 0, 0, 0, 0, "", @Sint8Id output
 | 
						|
 | 
						|
    exec sp_InsertPropertyDefs @ClassID, "Prop15", @Uint8Id, "", 0, 0, 0, 0, "", @Uint8Id output
 | 
						|
 | 
						|
    exec sp_BatchInsertProperty @ObjectId, '1?Datatype1?root', 'root:Datatype1=1', @ClassID, @ScopeID, 0, 0, 
 | 
						|
        @Uint32Id, "4000000000", 0, @Uint64Id, "4000000000", 0, @Sint8Id, "-4096", 0, 
 | 
						|
        @Uint8Id, "4096", 0, @RefId, '1?RefClass1?root', 0,
 | 
						|
        @EObjectId, '1?TestClass?root', 0
 | 
						|
 | 
						|
    /* Now make sure they all ended up in the right place */
 | 
						|
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @BooleanId and PropertyNumericValue = 1)
 | 
						|
        exec pResult 'Creating boolean data', '', 0
 | 
						|
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Char16Id and PropertyNumericValue = 255)
 | 
						|
        exec pResult 'Creating char16 data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @DatetimeId and PropertyStringValue = "19990101010000.000000+***")
 | 
						|
        exec pResult 'Creating datetime data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Real32Id and PropertyRealValue = 1000000000)
 | 
						|
        exec pResult 'Creating real32 data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Real64Id and PropertyRealValue = 20000000000)
 | 
						|
        exec pResult 'Creating real64  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Sint8Id and PropertyNumericValue = -4096)
 | 
						|
        exec pResult 'Creating sint8  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Sint16Id and PropertyNumericValue = -23987345)
 | 
						|
        exec pResult 'Creating sint16  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Sint32Id and PropertyNumericValue = -1000000000)
 | 
						|
        exec pResult 'Creating sint32  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Sint64Id and PropertyNumericValue = -100000000000)
 | 
						|
        exec pResult 'Creating sint64  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Uint8Id and PropertyNumericValue = 4096)
 | 
						|
        exec pResult 'Creating uint8  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Uint16Id and PropertyNumericValue = 1000000)
 | 
						|
        exec pResult 'Creating uint16  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Uint32Id and PropertyNumericValue = 4000000000)
 | 
						|
        exec pResult 'Creating uint32  data', '', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @Uint64Id and PropertyNumericValue = 4000000000)
 | 
						|
        exec pResult 'Creating uint64  data', '', 0
 | 
						|
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @StringId and PropertyStringValue = "ABCDEFGHJKLMNOo")
 | 
						|
        exec pResult 'Creating string data', '', 0
 | 
						|
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @RefId and RefId = (select ObjectId from ObjectMap
 | 
						|
        where ObjectKey = '1?RefClass1?root'))
 | 
						|
        exec pResult 'Creating reference data', '', 0
 | 
						|
    IF NOT EXISTS (select RefClassId from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @RefId and RefClassId = (select ClassId from ClassMap
 | 
						|
        where ClassName = 'RefClass1'))
 | 
						|
        exec pResult 'Setting RefClassId', 'RefClass1', 0
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @EObjectId and RefId = (select ObjectId from ObjectMap
 | 
						|
        where ObjectKey = '1?TestClass?root'))
 | 
						|
        exec pResult 'Creating embedded object data', '', 0
 | 
						|
    IF NOT EXISTS (select RefClassId from ClassData where ObjectId = @ObjectId 
 | 
						|
        and PropertyId = @EObjectId and RefClassId = (select ClassId from ClassMap
 | 
						|
        where ClassName = 'TestClass'))
 | 
						|
        exec pResult 'Setting RefClassId', 'TestClass1', 0
 | 
						|
 | 
						|
END
 | 
						|
ELSE
 | 
						|
    exec pResult 'Creating table Datatype1', '', 0
 | 
						|
 | 
						|
print 'Datatype testing complete.'
 | 
						|
print '***************************************'
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* NULLS                                                                      */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Null data should consist of that properties' absence.        */
 | 
						|
/*               Not_Null properties with no defaults should be disallowed    */
 | 
						|
/*               if the class has instances.                                  */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Adding a not-null property with no default to a class with instances */
 | 
						|
/*       should fail.                                                         */
 | 
						|
/*     * Adding a not-null property with a default to same class should be OK */
 | 
						|
/*     * Updating the default to null should fail.                            */
 | 
						|
/*     * Updating a key value to null should fail.                            */
 | 
						|
/*     * Updating a nullable property to null should remove all rows.         */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing nulls...'
 | 
						|
 | 
						|
declare @RetValue int
 | 
						|
declare @CIMFlags int, @Type int, @ObjId numeric, @ClassID numeric, @ScopeID numeric, @PropID int
 | 
						|
exec @Type = sp_GetCIMTypeID 'uint32'
 | 
						|
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'not_null'
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "Null1", "NullKey", 0, @Type, 1, 0
 | 
						|
IF (@RetValue = 1)
 | 
						|
BEGIN
 | 
						|
    /* This should fail, since there are instances */
 | 
						|
    exec @RetValue = pModifyClassTest 'Null1', 'NoNulls', @CIMFlags, @Type
 | 
						|
    IF (@RetValue = 0)
 | 
						|
        exec pResult 'Adding new not-null property', 'no default', 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Adding new not-null property', 'no default', 0
 | 
						|
 | 
						|
    /* Now, if we add a default, it should succeed */
 | 
						|
    exec @RetValue = pModifyClassTest 'Null1', 'NoNulls', @CIMFlags, @Type, '0'
 | 
						|
    IF (@RetValue = 1)
 | 
						|
        exec pResult '* Adding new not-null property', 'setting default', 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Adding new not-null property', 'setting default', 0
 | 
						|
    
 | 
						|
    /* Try to update this property to null, and it should fail. */
 | 
						|
    select @ObjId =  ObjectId from ObjectMap where ObjectPath = 'root:Null1=1'
 | 
						|
    select @PropID = PropertyId from PropertyMap where PropertyName = 'NoNulls'
 | 
						|
    
 | 
						|
    exec sp_DeleteInstanceData @ObjId, @PropID
 | 
						|
    IF EXISTS (select * from ClassData where ObjectId = @ObjId and PropertyId = @PropID)
 | 
						|
        exec pResult 'Failing to nullify not_null property', '', 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Failing to nullify not_null property', '', 0
 | 
						|
    
 | 
						|
    /* Try to update the key to null, and it should fail. */
 | 
						|
    select @PropID = PropertyId from PropertyMap where PropertyName = 'NullKey'
 | 
						|
    exec sp_DeleteInstanceData @ObjId, @PropID
 | 
						|
    IF EXISTS (select * from ClassData where ObjectId = @ObjId and PropertyId = @PropID)
 | 
						|
        exec pResult 'Failing to nullify key property', '', 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Failing to nullify key property', '', 0
 | 
						|
 | 
						|
    exec @RetValue = pModifyClassTest 'Null1', 'NullsOK', 0, @Type, "0"
 | 
						|
    IF (@RetValue = 1)
 | 
						|
        exec pResult 'Adding new nullable property', '', 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Adding new nullable property', '', 0
 | 
						|
 | 
						|
    /* Set the property to null.  It should remove all rows */    
 | 
						|
    select @PropID = PropertyId from PropertyMap where PropertyName = 'NullsOK'
 | 
						|
    exec sp_DeleteInstanceData @ObjId, @PropID
 | 
						|
    IF NOT EXISTS (select * from ClassData where ObjectId = @ObjId and PropertyId = @PropID)
 | 
						|
        exec pResult '* Nullifying nullable property', '', 1
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Nullifying nullable property', '', 0
 | 
						|
 | 
						|
END
 | 
						|
ELSE
 | 
						|
    exec pResult 'Creating table', 'Null1', 0
 | 
						|
 | 
						|
print 'Null testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* REFERENCES                                                                 */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Adding/removing references should modify the refcount of the  */
 | 
						|
/*              referenced object.  Adding a reference to a non-existent      */
 | 
						|
/*              object should insert it with a 'deleted' state.  Removing the */
 | 
						|
/*              last reference to a deleted object should remove the object.  */
 | 
						|
/*                                                                            */
 | 
						|
/* Test:                                                                      */
 | 
						|
/*    * Adding a new reference should increase the ref count.                 */
 | 
						|
/*    * Updating the reference should decrease the original ref count and     */
 | 
						|
/*       increase the new one.                                                */
 | 
						|
/*    * Deleting a reference should decrease the ref count.                   */
 | 
						|
/*    * Deleting a referenced object should not affect the reference and      */
 | 
						|
/*       preserve the row with a 'deleted' state.                             */
 | 
						|
/*    * Deleting the last reference to a deleted object should remove it.     */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from tempdb..sysobjects where name like '#Deleted%')
 | 
						|
   drop table #Deleted
 | 
						|
 | 
						|
create table #Deleted (ObjId numeric)
 | 
						|
go
 | 
						|
 | 
						|
print 'Testing references ...'
 | 
						|
 | 
						|
/* Create a reference.  See if ref count is OK on add, change value, delete
 | 
						|
   value, delete property */
 | 
						|
 | 
						|
declare @RefID int, @RefCount int, @ScopeID int
 | 
						|
declare @ClassID numeric, @ObjectId numeric, @PropID int
 | 
						|
 | 
						|
select @ClassID = ClassId from ClassMap where CLassName = "Datatype1"
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = "Prop6" and ClassId = @ClassID
 | 
						|
select @ObjectId = ObjectId from ObjectMap where ClassId = @ClassID
 | 
						|
select @ScopeID = ObjectId from ObjectMap where ObjectPath = 'root'
 | 
						|
 | 
						|
/* Reference count should be one */
 | 
						|
select @RefID = RefId
 | 
						|
from ClassData where ObjectId = @ObjectId
 | 
						|
and PropertyId = @PropID
 | 
						|
 | 
						|
select @RefCount = ReferenceCount from ObjectMap where ObjectId = @RefID
 | 
						|
IF (@RefCount = 0)
 | 
						|
    exec pResult 'Reference count on reference properties', '', 0
 | 
						|
else
 | 
						|
    exec pResult 'Reference count on reference properties', '', 1
 | 
						|
 | 
						|
/* Now move the reference to another Object.  The reference count should follow.*/
 | 
						|
exec sp_BatchInsertProperty @ObjectId , '1?Datatype1?root', 'root:Datatype1=1', @ClassID, @ScopeID, 0, 0, 
 | 
						|
    @PropID, '1?Keyhole1?root', 0
 | 
						|
 | 
						|
select @RefCount = ReferenceCount from ObjectMap where ObjectId = @RefID
 | 
						|
IF (@RefCount = 0)
 | 
						|
    exec pResult 'Reference count on updated property', 'original', 1
 | 
						|
else
 | 
						|
    exec pResult 'Reference count on updated property', 'original', 0
 | 
						|
 | 
						|
select @RefID = ObjectId, @RefCount = ReferenceCount from ObjectMap where ObjectKey = '1?Keyhole1?root'
 | 
						|
IF (@RefCount = 0)
 | 
						|
    exec pResult 'Reference count on reference properties', 'new', 0
 | 
						|
else
 | 
						|
    exec pResult 'Reference count on reference properties', 'new', 1
 | 
						|
 | 
						|
/* Make sure we can delete the object without hurting the reference */
 | 
						|
 | 
						|
exec sp_DeleteInstance @RefID
 | 
						|
 | 
						|
IF EXISTS (select * from ObjectMap where ObjectId = @RefID)
 | 
						|
    exec pResult 'Reference remains after deleting reference object.', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Reference remains after deleting reference object', '', 0
 | 
						|
 | 
						|
/* If we delete the owning object, it should also remove the reference object */
 | 
						|
 | 
						|
create table #Deleted (ObjId numeric)
 | 
						|
exec sp_DeleteInstance @ObjectId
 | 
						|
 | 
						|
IF NOT EXISTS (select * from ObjectMap where ObjectId = @RefID)
 | 
						|
    exec pResult 'Reference gone after deleting parent object.', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Reference gone after deleting parent object.', '', 0
 | 
						|
 | 
						|
print 'Reference testing complete.'
 | 
						|
print '***************************************'
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* CLASS AND PROPERTY QUALIFIERS                                              */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Validate that we can create qualifiers on classes and         */
 | 
						|
/*              properties.                                                   */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Create a qualifier on a class.                                        */
 | 
						|
/*    * Create qualifiers on properties of the class.                         */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing class qualifiers...'
 | 
						|
 | 
						|
declare @RetCode int, @CIMFlags int, @Type int, @PropID int
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'Qualifier'
 | 
						|
declare @ClsId numeric
 | 
						|
 | 
						|
select @ClsId = ClassId from ClassMap where ClassName = 'Null1'
 | 
						|
 | 
						|
exec @Type = sp_GetCIMTypeID 'string'
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'NullKeys'
 | 
						|
 | 
						|
exec sp_InsertPropertyDefs @ClsId, 'ClsQfr1', @Type, 'This is a class qualifier',
 | 
						|
    0, 2, 0, 3, "", @PropID output
 | 
						|
IF (@PropID != 0)
 | 
						|
    exec pResult 'Class qualifier creation', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Class qualifier creation', '', 0
 | 
						|
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'NullKeys'
 | 
						|
exec sp_InsertPropertyDefs @ClsId, 'PropQfr1', @Type, 'This is a property qualifier',
 | 
						|
    @PropID, 2, 0, 3, "", @PropID output
 | 
						|
IF (@PropID != 0)
 | 
						|
    exec pResult 'Property qualifier creation', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Property qualifier creation', '', 0
 | 
						|
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'NullKeys'
 | 
						|
exec sp_InsertPropertyDefs @ClsId, 'PropQfr2', @Type, 'This is a another property qualifier',
 | 
						|
    @PropID, 2, 0, 3, "", @PropID output
 | 
						|
 | 
						|
IF (@PropID != 0)
 | 
						|
    exec pResult 'Property qualifier creation', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Property qualifier creation', '', 0
 | 
						|
 | 
						|
IF ((select count(*) from ClassData where PropertyStringValue like 'This is a%')>=3)
 | 
						|
    exec pResult '* Class qualifiers', '', 1
 | 
						|
   
 | 
						|
print 'Class qualifier testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* INSTANCE QUALIFIERS                                                        */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Validate that we can create qualifiers on instances and       */
 | 
						|
/*              their properties.                                             */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Create a qualifier on an instance.                                    */
 | 
						|
/*    * Create qualifiers on instance properties.                             */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing instance qualifiers ...'
 | 
						|
 | 
						|
declare @RetCode int, @CIMFlags int, @Type int, @PropID int, @ObjID numeric
 | 
						|
declare @Qfr1ID int, @Qfr2ID int, @Qfr3ID int
 | 
						|
 | 
						|
select @ObjID = ObjectId from ObjectMap where ObjectPath = 'root:Null1=1'
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'Qualifier'
 | 
						|
 | 
						|
exec @Type = sp_GetCIMTypeID 'string'
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'NullKeys'
 | 
						|
select @Qfr1ID = PropertyId from PropertyMap where PropertyName = 'ClsQfr1'
 | 
						|
select @Qfr2ID = PropertyId from PropertyMap where PropertyName = 'PropQfr1'
 | 
						|
select @Qfr3ID = PropertyId from PropertyMap where PropertyName = 'PropQfr2'
 | 
						|
 | 
						|
exec @RetCode = sp_BatchInsert @ObjID, 0, 0, @Qfr1ID, "Here is an instance qualifier.",
 | 
						|
    0, 0, 0
 | 
						|
 | 
						|
exec @RetCode = sp_BatchInsert @ObjID, 0, 0, @Qfr2ID, "Here is an instance property qualifier.",
 | 
						|
    0, @PropID, 0
 | 
						|
 | 
						|
exec @RetCode = sp_BatchInsert @ObjID, 0, 0, @Qfr3ID, "Here is another instance property qualifier.",
 | 
						|
    0, @PropID, 0
 | 
						|
 | 
						|
IF ((select count(*) from ClassData where PropertyStringValue like 'Here is%')>=3)
 | 
						|
    exec pResult '* Instance qualifiers', '', 1
 | 
						|
 | 
						|
print 'Instance qualifier testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* UNKEYED CLASS                                                              */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Validate that we cannot create a key on this class, and      */
 | 
						|
/*               that the path is generated uniquely.                         */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Adding a key to an unkeyed class should fail.                         */
 | 
						|
/*    * Obtaining an unkeyed path should generate a new unique path.          */
 | 
						|
/*    * Obtaining another unkeyed path and inserting identical properties     */
 | 
						|
/*       should succeed.                                                      */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing unkeyed classes...'
 | 
						|
 | 
						|
declare @CIMFlags int, @RetValue int, @Path nvarchar(450)
 | 
						|
declare @ClassID numeric, @ScopeID numeric, @PropID int
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'Unkeyed'
 | 
						|
select @ScopeID = ObjectId from ObjectMap where ObjectPath = 'root'
 | 
						|
 | 
						|
exec @RetValue = pCreateClassTest "Unkeyed", "", @CIMFlags, 0, 0, 0
 | 
						|
IF (@RetValue = 1)
 | 
						|
BEGIN
 | 
						|
    select @ClassID = ClassId from ClassMap where ClassName = 'Unkeyed'    
 | 
						|
    exec @CIMFlags = sp_GetFlagFromQualifier 'key'
 | 
						|
    exec @RetValue = pModifyClassTest 'Unkeyed', 'Prop0', @CIMFlags, 19 
 | 
						|
    IF (@RetValue = 1 or exists (select * from PropertyMap where 
 | 
						|
       PropertyName = 'Prop0' and ClassId = @ClassID))
 | 
						|
        exec pResult 'Adding key property to unkeyed class', '', 0
 | 
						|
    else
 | 
						|
        exec pResult 'Adding key property to unkeyed class', '', 1
 | 
						|
 | 
						|
    exec @RetValue = pModifyClassTest 'Unkeyed', 'Prop1',0, 19 
 | 
						|
    IF (@RetValue = 0)
 | 
						|
        exec pResult 'Adding property to unkeyed class', '', 0
 | 
						|
    else
 | 
						|
        exec pResult 'Adding property to unkeyed class', '', 1
 | 
						|
 | 
						|
    select @PropID = PropertyId from PropertyMap where ClassId = @ClassID
 | 
						|
        and PropertyName = 'Prop1'
 | 
						|
    
 | 
						|
    /* Generate a unique key */
 | 
						|
    create table #Path (NextPath nvarchar(450))
 | 
						|
    insert into #Path exec sp_GetNextUnkeyedPath @ClassID, @Path, 1
 | 
						|
    select @Path = NextPath from #Path
 | 
						|
    truncate table #Path
 | 
						|
 | 
						|
    /* Update it, by ID */
 | 
						|
    exec @RetValue = sp_BatchInsertProperty @RetValue, @Path, @Path, @ClassID, @ScopeID, 0, 0, @PropID,
 | 
						|
        "1", 0
 | 
						|
    select @Path
 | 
						|
   
 | 
						|
    IF (not exists (select * from ObjectMap where ObjectPath = @Path))
 | 
						|
        exec pResult 'Adding instance to unkeyed class', @Path, 0
 | 
						|
    else
 | 
						|
        exec pResult '* Adding instance to unkeyed class', @Path, 1
 | 
						|
 
 | 
						|
    /* Generate another, with same values */
 | 
						|
 | 
						|
    insert into #Path exec sp_GetNextUnkeyedPath @ClassID, @Path
 | 
						|
    select @Path = NextPath from #Path
 | 
						|
 | 
						|
    exec @RetValue = sp_BatchInsertProperty @RetValue, @Path, @Path, @ClassID, @ScopeID, 0, 0, @PropID,
 | 
						|
        "1", 0
 | 
						|
    IF (@RetValue = 0 or NOT EXISTS (select * from ObjectMap where ObjectPath = @Path))
 | 
						|
        exec pResult 'Adding instance to unkeyed class', @Path, 0
 | 
						|
    else
 | 
						|
        exec pResult 'Adding second instance to unkeyed class', @Path, 1
 | 
						|
    drop table #Path
 | 
						|
END
 | 
						|
ELSE
 | 
						|
   exec pResult 'Unkeyed class', '', 0
 | 
						|
 | 
						|
print 'Unkeyed class testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* REDUNDANT QUALIFIERS                                                       */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Qualifiers are scoped to the property, instance or class      */
 | 
						|
/*              that they are associated with.  Therefore, the same qualifier */
 | 
						|
/*              name should be usable in multiple places on the same object.  */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Creating a qualifier on an instance should succeed.                   */
 | 
						|
/*    * Creating the same qualifier on a property of the instance should      */
 | 
						|
/*       succeed.                                                             */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing redundant qualifiers ...'
 | 
						|
 | 
						|
declare @RetCode int, @CIMFlags int, @Type int, @PropID int, @ObjID numeric
 | 
						|
declare @Qfr1ID int
 | 
						|
 | 
						|
select @ObjID = ObjectId from ObjectMap where ObjectPath = 'root:Null1=1'
 | 
						|
exec @CIMFlags = sp_GetFlagFromQualifier 'Qualifier'
 | 
						|
 | 
						|
exec @Type = sp_GetCIMTypeID 'string'
 | 
						|
select @PropID = PropertyId from PropertyMap where PropertyName = 'NullKey'
 | 
						|
select @Qfr1ID = PropertyId from PropertyMap where PropertyName = 'PropQfr1'
 | 
						|
 | 
						|
exec @RetCode = sp_BatchInsert @ObjID, 0, 0, @Qfr1ID, "Description1",
 | 
						|
    0, 0, 0
 | 
						|
 | 
						|
exec @RetCode = sp_BatchInsert @ObjID, 0, 0, @Qfr1ID, "Description2",
 | 
						|
    0, @PropID, 0
 | 
						|
 | 
						|
IF ((select count(*) from ClassData where PropertyStringValue like 'Description%')=2)
 | 
						|
    exec pResult '* Redundant qualifiers', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Redundant qualifiers', '', 0
 | 
						|
 | 
						|
print 'Redundant qualifier testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* METHODS                                                                    */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Methods consist of a method name, zero to many in parameters,*/
 | 
						|
/*               zero to many out parameters, and qualifiers on any of the    */
 | 
						|
/*               above.  Verify that all are stored correctly.                */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create a method and method qualifier                                 */
 | 
						|
/*     * Create an in parameter and qualifier                                 */
 | 
						|
/*     * Create an out parameter and qualifier.                               */
 | 
						|
/*     * Verify that the parameter defaults exist                             */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing methods & method qualifiers...'
 | 
						|
 | 
						|
declare @RetCode int, @QfrFlag int, @Type int, @PropID int
 | 
						|
declare @MethodFlag int, @InParamFlag int, @OutParamFlag int
 | 
						|
declare @Flags int, @Prop1ID int
 | 
						|
 | 
						|
exec @QfrFlag = sp_GetFlagFromQualifier 'Qualifier'
 | 
						|
exec @MethodFlag = sp_GetFlagFromQualifier 'Method'
 | 
						|
exec @InParamFlag = sp_GetFlagFromQualifier 'In Parameter'
 | 
						|
exec @OutParamFlag = sp_GetFlagFromQualifier 'Out Parameter'
 | 
						|
 | 
						|
exec @Type = sp_GetCIMTypeID 'string'
 | 
						|
 | 
						|
exec @RetCode = pCreateClassTest 'Method1', 'Key1', 0, @Type, "1"
 | 
						|
IF (@RetCode = 1)
 | 
						|
BEGIN
 | 
						|
    exec @RetCode = pModifyClassTest "Method1", "M1", @MethodFlag, @Type,
 | 
						|
        "", 0, 0, 0
 | 
						|
    select @PropID = PropertyId from PropertyMap where PropertyName = 'M1'
 | 
						|
    IF (@PropID is not null)
 | 
						|
    BEGIN
 | 
						|
        select @Flags = @MethodFlag|@QfrFlag
 | 
						|
 | 
						|
        /* Method qualifier */
 | 
						|
        exec @RetCode = pModifyClassTest 'Method1', 'MethodQfr', @Flags,
 | 
						|
            @Type, "This is a method qualifier.", 0, @PropID, 0
 | 
						|
        IF (@RetCode = 0 OR not exists (select * from PropertyMap where PropertyName = 'MethodQfr'))
 | 
						|
            exec pResult 'Method qualifier', 'MethodQfr', 0
 | 
						|
        
 | 
						|
        /* In parameter */
 | 
						|
        
 | 
						|
        select @Flags = @InParamFlag 
 | 
						|
        exec @RetCode = pModifyClassTest 'Method1', 'InParam1', @Flags,
 | 
						|
            @Type, "In", 0, @PropID, 0
 | 
						|
        IF (@RetCode = 0 OR not exists (select * from PropertyMap where PropertyName = 'InParam1'))
 | 
						|
            exec pResult 'Method in parameter', 'InParam1', 0
 | 
						|
 | 
						|
        /* In parameter qualifier */
 | 
						|
        select @Prop1ID = PropertyId from PropertyMap where PropertyName = 'InParam1'
 | 
						|
        select @Flags = @InParamFlag|@QfrFlag
 | 
						|
        exec @RetCode = pModifyClassTest 'Method1', 'InParamQfr', @Flags, @Type,
 | 
						|
            "This is an in parameter qualifier.", 0, @Prop1ID, 3
 | 
						|
        IF (@RetCode = 0 OR not exists (select * from PropertyMap where PropertyName = 'InParamQfr'))
 | 
						|
            exec pResult 'Method in parameter qualifier', 'InParamQfr', 0
 | 
						|
 | 
						|
        /* Out parameter */
 | 
						|
 | 
						|
        select @Flags = @InParamFlag 
 | 
						|
        exec @RetCode = pModifyClassTest 'Method1', 'OutParam1', @Flags,
 | 
						|
            @Type, "Out", 0, @PropID, 0
 | 
						|
        IF (@RetCode = 0 OR not exists (select * from PropertyMap where PropertyName = 'OutParam1'))
 | 
						|
            exec pResult 'Method out parameter', 'OutParam1', 0
 | 
						|
 | 
						|
        /* Out parameter qualifier */
 | 
						|
 | 
						|
        select @Prop1ID = PropertyId from PropertyMap where PropertyName = 'OutParam1'
 | 
						|
        select @Flags = @OutParamFlag|@QfrFlag
 | 
						|
        exec @RetCode = pModifyClassTest 'Method1', 'OutParamQfr', @Flags, @Type,
 | 
						|
            "This is an out parameter qualifier.", 0, @Prop1ID, 3
 | 
						|
        IF (@RetCode = 0 OR not exists (select * from PropertyMap where PropertyName = 'OutParamQfr'))
 | 
						|
            exec pResult 'Method out parameter', 'OutParamQfr', 0
 | 
						|
 | 
						|
        IF ((select count(*) from ClassData as c inner join PropertyMap as p on p.PropertyId = c.PropertyId
 | 
						|
             inner join ClassMap as m on m.ClassId = p.ClassId where ClassName = 'Method1') < 3 
 | 
						|
            OR (select count(*) from ClassData where PropertyStringValue like 'This is an % parameter %') != 2)
 | 
						|
            exec pResult 'Methods', '', 0
 | 
						|
        else
 | 
						|
            exec pResult '* Methods', '', 1
 | 
						|
    END
 | 
						|
    else
 | 
						|
        exec pResult 'Creating method', 'M1', 0    
 | 
						|
END
 | 
						|
ELSE
 | 
						|
    exec pResult 'Method class creation', '', 0
 | 
						|
 | 
						|
print 'Method testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* HIERARCHY CHANGES                                                          */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Hierarchy changes are generally only allowed if there are no  */
 | 
						|
/*              instances.  Derived classes can override parents' properties  */
 | 
						|
/*              but should retain the parent's property ID (only overriding   */
 | 
						|
/*              the default value.                                            */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Create child class that overrides parent's default.  This should      */
 | 
						|
/*       preserve the property ID, but insert a custom default.               */
 | 
						|
/*    * Adding a key to a derived class should succeed (per NOVA, not CIM!!)  */
 | 
						|
/*    * Modifying the parent class should fail if there are instances.        */
 | 
						|
/*    * Adding a property to a parent that exists in a child class should     */
 | 
						|
/*       fail.                                                                */
 | 
						|
/*    * Modifying the object key when there are instances or derived in-      */
 | 
						|
/*       stances should fail.                                                 */
 | 
						|
/*    * Adding a property to a parent that does not exist in a child class    */
 | 
						|
/*       should succeed.                                                      */
 | 
						|
/*    * Modifying the object key should succeed if there are no instances.    */
 | 
						|
/*    * Changing the parent class to a derived class or the current class     */
 | 
						|
/*       should fail.                                                         */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from tempdb..sysobjects where name like '#Deleted%')
 | 
						|
BEGIN
 | 
						|
    drop table #Deleted
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
create table #Deleted (ObjId numeric)
 | 
						|
go
 | 
						|
 | 
						|
print 'Testing hierarchy changes ...'
 | 
						|
 | 
						|
declare @ClassId numeric, @RetCode int
 | 
						|
declare @Type int, @ObjId numeric, @PropID int
 | 
						|
 | 
						|
select @Type = CIMTypeId  from CIMTypes where CIMType = 'uint32'
 | 
						|
 | 
						|
exec @RetCode = pCreateClassTest 'Parent1', 'Key1', 4, @Type, "1"
 | 
						|
 | 
						|
/* Adding a child class with the same key should override the default, but use existing property ID.*/
 | 
						|
exec @RetCode = pCreateClassTest 'Child1', 'Key1', 4, @Type, "2", 0, 'root', 'Parent1?root'
 | 
						|
IF NOT EXISTS (select * from PropertyMap where ClassId = (select ClassId from ClassMap where ClassName = 'Child1')
 | 
						|
            and PropertyName = 'Key1')
 | 
						|
    exec pResult 'Creating existing key on child class', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Creating existing key on child class', '', 0
 | 
						|
 | 
						|
/* Adding a brand new key should succeed */
 | 
						|
exec @RetCode = pCreateClassTest 'Child1', 'Key2', 4, @Type, "2", 0, 'root', 'Parent1?root'
 | 
						|
IF (@RetCode = 1)
 | 
						|
    exec pResult 'Adding new key to child class', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Adding new key to child class', '', 0
 | 
						|
 | 
						|
/* Changing the parent, since there is an instance, should fail.*/
 | 
						|
exec @RetCode = sp_InsertClassAndData @ObjId output, 'Child1', 'Child1?root', 'root:Child1', 'root',
 | 
						|
    'TestClass?root', 0, 0
 | 
						|
IF (@RetCode = 0)
 | 
						|
    exec pResult 'Changing parent class with instances', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Changing parent class with instances', '', 0
 | 
						|
 | 
						|
/* Key migration should fail.  Create derived instance as parent */
 | 
						|
/**** THIS WILL BE DONE AT API LEVEL ***
 | 
						|
exec @RetCode = pCreateClassTest 'Parent1', 'Key1', 4, @Type, "2"
 | 
						|
IF (@RetCode = 0)
 | 
						|
    exec pResult 'Key migration', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Key migration', '', 0
 | 
						|
****/
 | 
						|
 | 
						|
/* Try to add an existing property to a parent class.  Should fail. */
 | 
						|
exec @RetCode = pModifyClassTest 'Parent1', 'Key2', 4, @Type
 | 
						|
IF (@RetCode = 0)
 | 
						|
    exec pResult 'Adding property to parent that exists in child', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Adding property to parent that exists in child', '', 0
 | 
						|
 | 
						|
/* Add a property that doesn't exist in child class.  Should succeed */
 | 
						|
exec @RetCode = pModifyClassTest 'Parent1', 'Prop1', 0, @Type
 | 
						|
IF (@RetCode = 1)
 | 
						|
    exec pResult 'Adding property to parent ', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Adding property to parent ', '', 0
 | 
						|
 | 
						|
/* Delete the parent object, and try to change its key.  This should fail, 
 | 
						|
   since the child class has instances */
 | 
						|
 | 
						|
select @ObjId = ObjectId from ObjectMap where ObjectPath = 'root:Parent1=1'
 | 
						|
exec sp_DeleteInstance @ObjId
 | 
						|
 | 
						|
/* We need to ensure that the key is populated for child instance */
 | 
						|
select @PropID = PropertyId, @ClassId = ClassId from PropertyMap where PropertyName = 'Key1'
 | 
						|
    and ClassId = (select ClassId from ClassMap where ClassName = 'Parent1')
 | 
						|
 | 
						|
exec sp_DeleteClassData @PropID
 | 
						|
IF EXISTS (select * from PropertyMap where PropertyId = @PropID)
 | 
						|
    exec pResult 'Changing parent class key with derived instances', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Changing parent class key with derived instances', '', 0
 | 
						|
 | 
						|
/* Delete the child instance and see if we can do stuff now */
 | 
						|
 | 
						|
select @ObjId = ObjectId from ObjectMap where ObjectPath = 'root:Child1=2'
 | 
						|
 | 
						|
create table #Deleted (ObjId numeric)
 | 
						|
 | 
						|
exec sp_DeleteInstance @ObjId
 | 
						|
 | 
						|
/* Try again to add an existing property to a parent class.  Should still fail. */
 | 
						|
exec @RetCode = pModifyClassTest 'Parent1', 'Key2', 0, @Type
 | 
						|
IF (@RetCode = 0)
 | 
						|
    exec pResult 'Adding property to parent that exists in child', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Adding property to parent that exists in child', '', 0
 | 
						|
 | 
						|
/* Try to delete the key */
 | 
						|
exec sp_DeleteClassData @PropID
 | 
						|
IF EXISTS (select * from PropertyMap where PropertyId = @PropID)
 | 
						|
    exec pResult 'Changing parent class key with no derived instances', '', 0
 | 
						|
else
 | 
						|
    exec pResult 'Changing parent class key with no derived instances', '', 1
 | 
						|
 | 
						|
exec @RetCode = sp_InsertClassAndData @ObjId output, 'Child1', 'Child1?root', 'root:Child1', 'root',
 | 
						|
    'TestClass?root', 0
 | 
						|
IF (@RetCode != 0)
 | 
						|
    exec pResult 'Changing parent class with no instances', '', 1
 | 
						|
else
 | 
						|
    exec pResult 'Changing parent class with no instances', '', 0
 | 
						|
 | 
						|
/* Changing parent to be its own parent should fail */
 | 
						|
exec @RetCode = pCreateClassTest 'Parent1', 'Key1', 0, @Type, "1", 0, 'root', 'Parent1?root'
 | 
						|
IF NOT EXISTS (select * from ClassMap where ClassName = 'Parent1' and ClassId = SuperClassId)
 | 
						|
    exec pResult 'Circular parent relationship', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Circular parent relationship', '', 0
 | 
						|
 | 
						|
print 'Hierarchy change testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* SCOPING OBJECTS                                                            */
 | 
						|
/*                                                                            */
 | 
						|
/* Description: Subscopes should be automatically removed when we delete the  */
 | 
						|
/*              scoping object.                                               */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Create a scoping object and a subscoped object.                      */
 | 
						|
/*     * Deleting the scoping object should remove both.                      */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
IF EXISTS (select * from tempdb..sysobjects where name like '#Deleted%')
 | 
						|
   drop table #Deleted
 | 
						|
 | 
						|
print 'Testing scopes ...'
 | 
						|
 | 
						|
declare @RetCode int
 | 
						|
declare @ScopeID numeric
 | 
						|
declare @ClassID numeric
 | 
						|
declare @TypeID int, @PropID1 int, @PropID2 int
 | 
						|
exec @TypeID = sp_GetCIMTypeID 'uint32'
 | 
						|
select @ScopeID = ObjectId from ObjectMap where ObjectPath = 'root'
 | 
						|
select @ClassID = ClassId from ClassMap where ClassName = 'TestClass'
 | 
						|
select @PropID1 = PropertyId from PropertyMap where ClassId = @ClassID and PropertyName = 'Key1'
 | 
						|
select @PropID2 = PropertyId from PropertyMap where ClassId = @ClassID and PropertyName = 'Key2'
 | 
						|
 | 
						|
exec @RetCode = sp_BatchInsertProperty @RetCode, '99?1?TestClass?root', 'root:TestClass=99,1', @ClassID,
 | 
						|
    @ScopeID, 0, 0, @PropID1, "99", 0, @PropID2, "1", 0
 | 
						|
IF (@RetCode = 0)
 | 
						|
    exec pResult 'Creating scoping object', '', 0
 | 
						|
else
 | 
						|
begin
 | 
						|
    select @ScopeID = ObjectId from ObjectMap where ObjectPath = 'root:TestClass=99,1'
 | 
						|
    exec @RetCode = sp_BatchInsertProperty @RetCode, '100?1?TestClass?99?1?TestClass?root', 'root:TestClass=99,1\TestClass=100,1', @ClassID,
 | 
						|
        @ScopeID, 0, 0, @PropID1, "100", 0, @PropID2, "2", 0
 | 
						|
    IF (@RetCode = 0)
 | 
						|
        exec pResult 'Creating scoped object','', 0
 | 
						|
    else
 | 
						|
        exec pResult 'Creating scoped object','', 1
 | 
						|
    IF ((select ReferenceCount from ObjectMap where ObjectId = @ScopeID) > 0)
 | 
						|
        exec pResult 'Scope''s reference count', '', 0
 | 
						|
    create table #Deleted (ObjId numeric)
 | 
						|
    exec sp_DeleteInstance @ScopeID
 | 
						|
    IF EXISTS (select * from ObjectMap where ObjectId = @ScopeID or
 | 
						|
        ObjectScopeId = @ScopeID)      
 | 
						|
        exec pResult 'Removing scoping object', '', 0
 | 
						|
    ELSE
 | 
						|
        exec pResult 'Removing scoping object', '', 1    
 | 
						|
End
 | 
						|
print 'Scope testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* DELETING INSTANCES                                                         */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Deleting instances should remove the object as long as the   */
 | 
						|
/*               reference count is zero.                                     */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*     * Delete the first instance of each class.                             */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing deletions of instances...'
 | 
						|
 | 
						|
declare @ClassID int, @ObjId numeric
 | 
						|
select @ClassID = min(ClassId) from ClassMap where SuperClassId = 1
 | 
						|
while (@ClassID is not NULL)
 | 
						|
BEGIN
 | 
						|
 | 
						|
/* Just try the first instance from each class.  We've already
 | 
						|
   been doing deletion testing on weird scenarios */
 | 
						|
     IF EXISTS (select * from tempdb..sysobjects where name like '#Deleted%')
 | 
						|
        drop table #Deleted
 | 
						|
 | 
						|
     create table #Deleted (ObjId numeric)
 | 
						|
     select @ObjId = min(ObjectId) from ObjectMap where ClassId = @ClassID
 | 
						|
     IF (isnull(@ObjId,-1) != -1)
 | 
						|
     BEGIN
 | 
						|
         exec sp_DeleteInstance @ObjId
 | 
						|
         IF EXISTS (select * from ObjectMap where ObjectId = @ObjId)
 | 
						|
             exec pResult 'Deleting instance', '', 0
 | 
						|
     END
 | 
						|
     select @ClassID = min(ClassId) from ClassMap where ClassId > @ClassID
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
print 'Deleting instance testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* DELETING CLASSES                                                           */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  Deleting classes should remove all instances, as long as     */
 | 
						|
/*               the reference count is zero.  Class should not be removed    */
 | 
						|
/*               if there are instances.                                      */
 | 
						|
/*                                                                            */
 | 
						|
/* Tests:                                                                     */
 | 
						|
/*    * Delete all classes.  None should remain except system classes.        */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing deletions of classes...'
 | 
						|
 | 
						|
declare @ClassID int
 | 
						|
select @ClassID = min(ClassId) from ClassMap where SuperClassId = 1
 | 
						|
while (@ClassID is not NULL)
 | 
						|
BEGIN
 | 
						|
     IF EXISTS (select * from tempdb..sysobjects where name like '#Deleted%')
 | 
						|
        drop table #Deleted
 | 
						|
     create table #Deleted (ObjId numeric)
 | 
						|
     exec sp_DeleteClass @ClassID
 | 
						|
 | 
						|
     /* Do some validation here? */     
 | 
						|
 | 
						|
     IF EXISTS (select * from ObjectMap where ObjectId = @ClassID)
 | 
						|
         exec pResult 'Deleting class', '', 0
 | 
						|
     select @ClassID = min(ClassId) from ClassMap where ClassId > @ClassID
 | 
						|
END
 | 
						|
go
 | 
						|
 | 
						|
IF NOT EXISTS (select * from ClassMap where SuperClassId = 1)
 | 
						|
    exec pResult '* Deleting classes', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Deleting classes', '', 0
 | 
						|
 | 
						|
print 'Deletion testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
/******************************************************************************/
 | 
						|
/*                                                                            */
 | 
						|
/* SP_REINDEX                                                                 */
 | 
						|
/*                                                                            */
 | 
						|
/* Description:  This procedure rebuilds indexes.  There is nothing to test   */
 | 
						|
/*               except to validate that it works.                            */
 | 
						|
/*                                                                            */
 | 
						|
/******************************************************************************/
 | 
						|
 | 
						|
print 'Testing sp_reindex...'
 | 
						|
 | 
						|
exec sp_reindex
 | 
						|
go
 | 
						|
IF (@@error = 0)
 | 
						|
    exec pResult 'Executing sp_reindex', '', 1
 | 
						|
ELSE
 | 
						|
    exec pResult 'Executing sp_reindex', '', 0
 | 
						|
go
 | 
						|
 | 
						|
print 'sp_reindex testing complete.'
 | 
						|
print '***************************************'
 | 
						|
 | 
						|
print ''
 | 
						|
 | 
						|
print '*********** R E S U L T S *************'
 | 
						|
 | 
						|
select * from #Results
 | 
						|
 | 
						|
set nocount on 
 | 
						|
declare @Total float, @Succeeded float, @Failed float
 | 
						|
select @Total = count(*) from #Results
 | 
						|
select @Succeeded = count(*) from #Results where Succeeded = 1
 | 
						|
select @Failed = @Total-@Succeeded
 | 
						|
 | 
						|
print '*********** S U M M A R Y *************'
 | 
						|
print ''
 | 
						|
select convert(int,@Succeeded/@Total *100) PASS_RATE, convert(int,@Failed/@Total *100) FAIL_RATE
 | 
						|
print ''
 | 
						|
 | 
						|
drop table #Results
 | 
						|
drop table #Parents
 | 
						|
drop table #Children
 | 
						|
 | 
						|
print '************** D O N E ****************'
 | 
						|
 | 
						|
go
 | 
						|
 | 
						|
 | 
						|
 | 
						|
set nocount off
 | 
						|
go
 |