kerneltest/e32test/dll/t_nestedload.cpp
author hgs
Tue, 02 Nov 2010 15:29:23 +0000
changeset 300 1d28c8722707
permissions -rw-r--r--
201043_09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
300
1d28c8722707 201043_09
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
1d28c8722707 201043_09
hgs
parents:
diff changeset
     2
// All rights reserved.
1d28c8722707 201043_09
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
1d28c8722707 201043_09
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
1d28c8722707 201043_09
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
1d28c8722707 201043_09
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1d28c8722707 201043_09
hgs
parents:
diff changeset
     7
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
     8
// Initial Contributors:
1d28c8722707 201043_09
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    10
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
    11
// Contributors:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    12
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
    13
// Description:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    14
// e32test\dll\t_nestedload.cpp
1d28c8722707 201043_09
hgs
parents:
diff changeset
    15
// Overview:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    16
// Test that nested loading of DLLs does not cause incorrect constructor calls
1d28c8722707 201043_09
hgs
parents:
diff changeset
    17
// API Information:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    18
// n/a
1d28c8722707 201043_09
hgs
parents:
diff changeset
    19
// Details:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    20
// Platforms/Drives/Compatibility:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    21
// All.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    22
// Assumptions/Requirement/Pre-requisites:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    23
// Failures and causes:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    24
// Base Port information:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    25
// 
1d28c8722707 201043_09
hgs
parents:
diff changeset
    26
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
    27
1d28c8722707 201043_09
hgs
parents:
diff changeset
    28
/*
1d28c8722707 201043_09
hgs
parents:
diff changeset
    29
1d28c8722707 201043_09
hgs
parents:
diff changeset
    30
This EXE links to and dynamically loads seven DLLs, t_nestdll1-7.dll.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    31
The diagram below shows the structure of the linkage. Regular arrows
1d28c8722707 201043_09
hgs
parents:
diff changeset
    32
are normal static linkage, arrows marked with DY are dynamic loads with
1d28c8722707 201043_09
hgs
parents:
diff changeset
    33
RLibrary::Load.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    34
1d28c8722707 201043_09
hgs
parents:
diff changeset
    35
 +-----+      +---+      +---+
1d28c8722707 201043_09
hgs
parents:
diff changeset
    36
 | EXE |----->| 1 |--DY->| 3 |
1d28c8722707 201043_09
hgs
parents:
diff changeset
    37
 +-----+      +---+      +---+\
1d28c8722707 201043_09
hgs
parents:
diff changeset
    38
    | \                        \  EXE and 3 both link to 2
1d28c8722707 201043_09
hgs
parents:
diff changeset
    39
    D  \                        \    +---+
1d28c8722707 201043_09
hgs
parents:
diff changeset
    40
    Y   +------------------------+-->| 2 |
1d28c8722707 201043_09
hgs
parents:
diff changeset
    41
    |                                +---+
1d28c8722707 201043_09
hgs
parents:
diff changeset
    42
    v
1d28c8722707 201043_09
hgs
parents:
diff changeset
    43
  +---+
1d28c8722707 201043_09
hgs
parents:
diff changeset
    44
  | 5 |
1d28c8722707 201043_09
hgs
parents:
diff changeset
    45
  +---+\
1d28c8722707 201043_09
hgs
parents:
diff changeset
    46
    |   \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    47
    D    \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    48
    Y     \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    49
    |      \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    50
    v       \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    51
  +---+      \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    52
  | 6 |       \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    53
  +---+        \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    54
    |           \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    55
    D            \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    56
    Y             \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    57
    |              \
1d28c8722707 201043_09
hgs
parents:
diff changeset
    58
    v               \   5 and 7 both link to 4
1d28c8722707 201043_09
hgs
parents:
diff changeset
    59
  +---+              \    +---+
1d28c8722707 201043_09
hgs
parents:
diff changeset
    60
  | 7 |---------------+-->| 4 |
1d28c8722707 201043_09
hgs
parents:
diff changeset
    61
  +---+                   +---+
1d28c8722707 201043_09
hgs
parents:
diff changeset
    62
1d28c8722707 201043_09
hgs
parents:
diff changeset
    63
The result should be that the constructors are called in order from 1 to 7,
1d28c8722707 201043_09
hgs
parents:
diff changeset
    64
with no constructor being called more than once or omitted.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    65
1d28c8722707 201043_09
hgs
parents:
diff changeset
    66
*/
1d28c8722707 201043_09
hgs
parents:
diff changeset
    67
1d28c8722707 201043_09
hgs
parents:
diff changeset
    68
#define __E32TEST_EXTENSION__
1d28c8722707 201043_09
hgs
parents:
diff changeset
    69
1d28c8722707 201043_09
hgs
parents:
diff changeset
    70
#include <e32test.h>
1d28c8722707 201043_09
hgs
parents:
diff changeset
    71
#include <e32svr.h>
1d28c8722707 201043_09
hgs
parents:
diff changeset
    72
1d28c8722707 201043_09
hgs
parents:
diff changeset
    73
IMPORT_C TInt DataForDLL1();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    74
IMPORT_C TInt DataForDLL2();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    75
1d28c8722707 201043_09
hgs
parents:
diff changeset
    76
TInt E32Main()
1d28c8722707 201043_09
hgs
parents:
diff changeset
    77
	{
1d28c8722707 201043_09
hgs
parents:
diff changeset
    78
	RTest test(_L("T_NESTEDLOAD"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    79
	test.Title();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    80
1d28c8722707 201043_09
hgs
parents:
diff changeset
    81
	test.Start(_L("Test nested loading"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    82
1d28c8722707 201043_09
hgs
parents:
diff changeset
    83
	test.Next(_L("Dummy calls to static dependencies"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    84
	DataForDLL1();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    85
	DataForDLL2();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    86
1d28c8722707 201043_09
hgs
parents:
diff changeset
    87
	test.Next(_L("Load library triggering nested load"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    88
	RLibrary lib;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    89
	test_KErrNone(lib.Load(_L("t_nestdll5.dll")));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    90
1d28c8722707 201043_09
hgs
parents:
diff changeset
    91
	test.Next(_L("Retrieve load order array"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    92
	TInt* loadOrder = (TInt*)UserSvr::DllTls(0);
1d28c8722707 201043_09
hgs
parents:
diff changeset
    93
	test_NotNull(loadOrder);
1d28c8722707 201043_09
hgs
parents:
diff changeset
    94
1d28c8722707 201043_09
hgs
parents:
diff changeset
    95
	test.Next(_L("Load order:"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    96
	TInt i;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    97
	for (i = 0; i < 100; ++i)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    98
		{
1d28c8722707 201043_09
hgs
parents:
diff changeset
    99
		if (loadOrder[i] == 0)
1d28c8722707 201043_09
hgs
parents:
diff changeset
   100
			break;
1d28c8722707 201043_09
hgs
parents:
diff changeset
   101
		test.Printf(_L("%d "), loadOrder[i]);
1d28c8722707 201043_09
hgs
parents:
diff changeset
   102
		}
1d28c8722707 201043_09
hgs
parents:
diff changeset
   103
	test.Printf(_L("\n"));
1d28c8722707 201043_09
hgs
parents:
diff changeset
   104
1d28c8722707 201043_09
hgs
parents:
diff changeset
   105
	// We expect DLLs 1-7 to be loaded in numerical order, with no repeats.
1d28c8722707 201043_09
hgs
parents:
diff changeset
   106
	for (i = 0; i < 7; ++i)
1d28c8722707 201043_09
hgs
parents:
diff changeset
   107
		test_Equal(i+1, loadOrder[i]);
1d28c8722707 201043_09
hgs
parents:
diff changeset
   108
	test_Equal(0, loadOrder[7]);
1d28c8722707 201043_09
hgs
parents:
diff changeset
   109
1d28c8722707 201043_09
hgs
parents:
diff changeset
   110
	test.End();
1d28c8722707 201043_09
hgs
parents:
diff changeset
   111
	return(KErrNone);
1d28c8722707 201043_09
hgs
parents:
diff changeset
   112
	}
1d28c8722707 201043_09
hgs
parents:
diff changeset
   113