Tests rendering the stylesheets.

Fichier

tests/advagg.test, line 189

Classe

AdvAggCascadingStylesheetsTestCase
Test the Drupal CSS system.

Code

public function testRenderFile() {
    foreach ($this->themes as $theme => $test_values) {
        variable_set('theme_default', $theme);
        $settings_path = 'admin/appearance/settings/' . $theme;
        $this->drupalLogin($this->bigUser);
        $this->drupalGet($settings_path);
        $this->assertResponse(200);
        $edit['scheme'] = '';
        $edit[$test_values['palette_input']] = '#123456';
        $this->drupalPost($settings_path, $edit, t('Save configuration'));
        // Reset drupal_add_css() before each test.
        $GLOBALS['conf']['advagg_convert_absolute_to_relative_path'] = FALSE;
        $GLOBALS['conf']['advagg_convert_absolute_to_protocol_relative_path'] = FALSE;
        advagg_test_reset_statics();
        // Add the css file.
        $stylesheets = variable_get('color_' . $theme . '_stylesheets', array());
        drupal_add_css($stylesheets[0]);
        $css = file_create_url($stylesheets[0]);
        // Get the render array.
        $full_css = advagg_get_css();
        $styles = drupal_render($full_css);
        $this->assertTrue(strpos($styles, $css) !== FALSE, "Rendered CSS includes the added stylesheet ({$css}).");
    }
    // Reset drupal_add_css() before each test.
    advagg_test_reset_statics();
    // Add the css file.
    $css = drupal_get_path('module', 'simpletest') . '/simpletest.css';
    drupal_add_css($css);
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    $this->assertTrue(strpos($styles, $css) > 0, "Rendered CSS includes the added stylesheet ({$css}).");
    // Verify that newlines are properly added inside style tags.
    $query_string = variable_get('css_js_query_string', '0');
    $css_processed = "<style type=\"text/css\" media=\"all\">\n@import url(\"" . check_plain(file_create_url($css)) . "?" . $query_string . "\");\n</style>";
    $this->assertEqual(trim($styles), $css_processed, 'Rendered CSS includes newlines inside style tags for JavaScript use.');
    //
    // Tests rendering an external stylesheet.
    advagg_test_reset_statics();
    // Add the css file.
    $css = 'http://example.com/style.css';
    drupal_add_css($css, 'external');
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    // Stylesheet URL may be the href of a LINK tag or in an @import statement
    // of a STYLE tag.
    $this->assertTrue(strpos($styles, 'href="' . $css) > 0 || strpos($styles, '@import url("' . $css . '")') > 0, 'Rendering an external CSS file.');
    //
    // Tests rendering inline stylesheets with preprocessing on.
    advagg_test_reset_statics();
    // Add the inline css.
    $css = 'body { padding: 0px; }';
    list($embed_prefix, $embed_suffix) = advagg_get_css_prefix_suffix();
    $css_preprocessed = '<style type="text/css" media="all">' . $embed_prefix . advagg_load_stylesheet_content($css, TRUE) . $embed_suffix . '</style>';
    drupal_add_css($css, array(
        'type' => 'inline',
    ));
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    $this->assertEqual(trim($styles), $css_preprocessed, 'Rendering preprocessed inline CSS adds it to the page.');
    //
    // Tests removing charset when rendering stylesheets with preprocessing on.
    advagg_test_reset_statics();
    $cases = array(
        array(
            'asset' => '@charset "UTF-8";html{font-family:"sans-serif";}',
            'expected' => 'html{font-family:"sans-serif";}',
        ),
        // This asset contains extra \n character.
array(
            'asset' => "@charset 'UTF-8';\nhtml{font-family:'sans-serif';}",
            'expected' => "\nhtml{font-family:'sans-serif';}",
        ),
    );
    foreach ($cases as $case) {
        $this->assertEqual($case['expected'], advagg_load_stylesheet_content($case['asset']), 'CSS optimizing correctly removes the charset declaration.');
    }
    //
    // Tests rendering inline stylesheets with preprocessing off.
    advagg_test_reset_statics();
    // Add the inline css.
    $css = 'body { padding: 0px; }';
    drupal_add_css($css, array(
        'type' => 'inline',
        'preprocess' => FALSE,
    ));
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    $this->assertTrue(strpos($styles, $css) > 0, 'Rendering non-preprocessed inline CSS adds it to the page.');
    //
    // Test CSS ordering.
    advagg_test_reset_statics();
    // A module CSS file.
    drupal_add_css(drupal_get_path('module', 'simpletest') . '/simpletest.css');
    // A few system CSS files, ordered in a strange way.
    $system_path = drupal_get_path('module', 'system');
    drupal_add_css($system_path . '/system.menus.css', array(
        'group' => CSS_SYSTEM,
    ));
    drupal_add_css($system_path . '/system.base.css', array(
        'group' => CSS_SYSTEM,
        'weight' => -10,
    ));
    drupal_add_css($system_path . '/system.theme.css', array(
        'group' => CSS_SYSTEM,
    ));
    $expected = array(
        $system_path . '/system.base.css',
        $system_path . '/system.menus.css',
        $system_path . '/system.theme.css',
        drupal_get_path('module', 'simpletest') . '/simpletest.css',
    );
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    // Stylesheet URL may be the href of a LINK tag or in an @import statement
    // of a STYLE tag.
    if (preg_match_all('/(href="|url\\(")' . preg_quote($GLOBALS['base_url'] . '/', '/') . '([^?]+)\\?/', $styles, $matches)) {
        $result = $matches[2];
    }
    else {
        $result = array();
    }
    $this->assertIdentical($result, $expected, 'The CSS files are in the expected order.');
    //
    // Test CSS override.
    advagg_test_reset_statics();
    $system = drupal_get_path('module', 'system');
    $simpletest = drupal_get_path('module', 'simpletest');
    drupal_add_css($system . '/system.base.css');
    drupal_add_css($simpletest . '/tests/system.base.css');
    // The dummy stylesheet should be the only one included.
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    $this->assert(strpos($styles, $simpletest . '/tests/system.base.css') !== FALSE, 'The overriding CSS file is output.');
    $this->assert(strpos($styles, $system . '/system.base.css') === FALSE, 'The overridden CSS file is not output.');
    // The reset is needed here until this is fixed
    // https://www.drupal.org/node/1388546
    advagg_test_reset_statics();
    drupal_add_css($simpletest . '/tests/system.base.css');
    drupal_add_css($system . '/system.base.css');
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    // The standard stylesheet should be the only one included.
    $this->assert(strpos($styles, $system . '/system.base.css') !== FALSE, 'The overriding CSS file is output.');
    $this->assert(strpos($styles, $simpletest . '/tests/system.base.css') === FALSE, 'The overridden CSS file is not output.');
    //
    //  Tests Locale module's CSS Alter to include RTL overrides.
    advagg_test_reset_statics();
    // Switch the language to a right to left language and add system.base.css.
    global $language;
    $language->direction = LANGUAGE_RTL;
    $path = drupal_get_path('module', 'system');
    drupal_add_css($path . '/system.base.css', array(
        'group' => CSS_SYSTEM,
    ));
    drupal_add_css($path . '/system.menus.css', array(
        'group' => CSS_SYSTEM,
    ));
    drupal_add_css($path . '/system.theme.css', array(
        'group' => CSS_SYSTEM,
    ));
    // Get the render array.
    $full_css = advagg_get_css();
    // Render the CSS.
    $styles = drupal_render($full_css);
    // Check to see if system.base-rtl.css was also added.
    $base_pos = strpos($styles, $path . '/system.base.css');
    $base_rtl_pos = strpos($styles, $path . '/system.base-rtl.css');
    $this->assert($base_rtl_pos !== FALSE, 'CSS is alterable as right to left overrides are added.');
    $this->assert($base_pos < $base_rtl_pos, 'system.base-rtl.css is added after system.base.css.');
    // Check to see if system.menus-rtl.css was also added.
    $menus_pos = strpos($styles, $path . '/system.menus.css');
    $menus_rtl_pos = strpos($styles, $path . '/system.menus-rtl.css');
    $this->assert($menus_rtl_pos !== FALSE, 'CSS is alterable as right to left overrides are added.');
    $this->assert($menus_pos < $menus_rtl_pos, 'system.menus-rtl.css is added after system.menus.css.');
    // Check to see if system.theme-rtl.css was also added.
    $theme_pos = strpos($styles, $path . '/system.theme.css');
    $theme_rtl_pos = strpos($styles, $path . '/system.theme-rtl.css');
    $this->assert($theme_rtl_pos !== FALSE, 'CSS is alterable as right to left overrides are added.');
    $this->assert($theme_pos < $theme_rtl_pos, 'system.theme-rtl.css is added after system.theme.css.');
    // Change the language back to left to right.
    $language->direction = LANGUAGE_LTR;
    //
    // Tests rendering inline stylesheets through a full page request.
    advagg_test_reset_statics();
    $css = 'body { font-size: 254px; }';
    // Inline CSS is minified unless 'preprocess' => FALSE is passed as a
    // drupal_add_css() option.
    $expected = 'body{font-size:254px;}';
    // Create a node, using the PHP filter that tests drupal_add_css().
    $php_format_id = 'php_code';
    $settings = array(
        'type' => 'page',
        'body' => array(
            LANGUAGE_NONE => array(
                array(
                    'value' => t('This tests the inline CSS!') . "<?php drupal_add_css('{$css}', 'inline'); ?>",
                    'format' => $php_format_id,
                ),
            ),
        ),
        'promote' => 1,
    );
    $node = $this->drupalCreateNode($settings);
    // Fetch the page.
    $this->drupalGet('node/' . $node->nid);
    $this->assertRaw($expected, 'Inline stylesheets appear in the full page rendering.');
    //
    // Tests that the query string remains intact when adding CSS files that
    // have query string parameters.
    advagg_test_reset_statics();
    $this->drupalGet('common-test/query-string');
    $query_string = variable_get('css_js_query_string', '0');
    $this->assertRaw(drupal_get_path('module', 'node') . '/node.css?' . $query_string, 'Query string was appended correctly to css.');
    $this->assertRaw(drupal_get_path('module', 'node') . '/node-fake.css?arg1=value1&amp;arg2=value2', 'Query string not escaped on a URI.');
    //
    // Make the tests below more robust by explicitly setting the default theme
    // and administrative theme that they expect.
    theme_enable(array(
        'bartik',
    ));
    variable_set('theme_default', 'bartik');
    variable_set('admin_theme', 'seven');
    // Test the theme callback when it is set to use an administrative theme.
    advagg_test_reset_statics();
    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
    $this->assertText('Custom theme: seven. Actual theme: seven.', 'The administrative theme can be correctly set in a theme callback.');
    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
    //
    // Test that the theme callback is properly inherited.
    advagg_test_reset_statics();
    $this->drupalGet('menu-test/theme-callback/use-admin-theme/inheritance');
    $this->assertText('Custom theme: seven. Actual theme: seven. Theme callback inheritance is being tested.', 'Theme callback inheritance correctly uses the administrative theme.');
    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
    //
    // Test the theme callback when the site is in maintenance mode.
    advagg_test_reset_statics();
    variable_set('maintenance_mode', TRUE);
    // For a regular user, the fact that the site is in maintenance mode means
    // we expect the theme callback system to be bypassed entirely.
    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
    $this->assertRaw('bartik/css/style.css', "The maintenance theme's CSS appears on the page.");
    // An administrator, however, should continue to see the requested theme.
    $admin_user = $this->drupalCreateUser(array(
        'access site in maintenance mode',
    ));
    $this->drupalLogin($admin_user);
    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
    $this->assertText('Custom theme: seven. Actual theme: seven.', 'The theme callback system is correctly triggered for an administrator when the site is in maintenance mode.');
    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
    variable_set('maintenance_mode', FALSE);
    //
    // Test the theme callback when it is set to use an optional theme.
    advagg_test_reset_statics();
    // Request a theme that is not enabled.
    $this->drupalGet('menu-test/theme-callback/use-stark-theme');
    $this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that is not enabled is requested.');
    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
    // Now enable the theme and request it again.
    theme_enable(array(
        'stark',
    ));
    $this->drupalGet('menu-test/theme-callback/use-stark-theme');
    $this->assertText('Custom theme: stark. Actual theme: stark.', 'The theme callback system uses an optional theme once it has been enabled.');
    $this->assertRaw('stark/layout.css', "The optional theme's CSS appears on the page.");
    // Test the theme callback when it is set to use a theme that does not
    // exist.
    $this->drupalGet('menu-test/theme-callback/use-fake-theme');
    $this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that does not exist is requested.');
    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
    //
    // Test the theme callback when no theme is requested.
    advagg_test_reset_statics();
    $this->drupalGet('menu-test/theme-callback/no-theme-requested');
    $this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when no theme is requested.');
    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
    //
    // Test that hook_custom_theme() can control the theme of a page.
    advagg_test_reset_statics();
    // Trigger hook_custom_theme() to dynamically request the Stark theme for
    // the requested page.
    variable_set('menu_test_hook_custom_theme_name', 'stark');
    theme_enable(array(
        'stark',
    ));
    // Visit a page that does not implement a theme callback. The above request
    // should be honored.
    $this->drupalGet('menu-test/no-theme-callback');
    $this->assertText('Custom theme: stark. Actual theme: stark.', 'The result of hook_custom_theme() is used as the theme for the current page.');
    $this->assertRaw('stark/layout.css', "The Stark theme's CSS appears on the page.");
    //
    // Test that the theme callback wins out over hook_custom_theme().
    advagg_test_reset_statics();
    // Trigger hook_custom_theme() to dynamically request the Stark theme for
    // the requested page.
    variable_set('menu_test_hook_custom_theme_name', 'stark');
    theme_enable(array(
        'stark',
    ));
    // The menu "theme callback" should take precedence over a value set in
    // hook_custom_theme().
    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
    $this->assertText('Custom theme: seven. Actual theme: seven.', 'The result of hook_custom_theme() does not override what was set in a theme callback.');
    $this->assertRaw('seven/style.css', "The Seven theme's CSS appears on the page.");
    //
    // Test css split file processing.
    // Generate a massive css file.
    $css_string = advagg_test_generate_selector_css(1000);
    $css_string .= '@media print {' . advagg_test_generate_selector_css(1000) . '}';
    $css_string .= advagg_test_generate_selector_css(1000);
    $css_string .= '@media screen {' . advagg_test_generate_selector_css(1000) . '}';
    $css_string .= advagg_test_generate_selector_css(1000);
    $css_string .= '@media print {' . advagg_test_generate_selector_css(1000) . '}';
    $css_string .= advagg_test_generate_selector_css(9000);
    $css_string .= '@media print {' . advagg_test_generate_selector_css(9000) . '}';
    $css_string .= advagg_test_generate_selector_css(9000);
    $css_string .= '@media screen {' . advagg_test_generate_selector_css(9000) . '}';
    $css_string .= '@media print {' . advagg_test_generate_selector_css(50) . '}';
    $css_string .= '@media screen {' . advagg_test_generate_selector_css(50) . '}';
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= '@media print {' . advagg_test_generate_selector_css(50) . '}';
    $css_string .= '@media screen {' . advagg_test_generate_selector_css(50) . '}';
    $css_string .= '@media print {' . advagg_test_generate_selector_css(50) . '}';
    $css_string .= '@media screen {' . advagg_test_generate_selector_css(50) . '}';
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(15000);
    $css_string .= '@media print {' . advagg_test_generate_selector_css(15000) . '}';
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $css_string .= advagg_test_generate_selector_css(10);
    $file_info = array(
        // Use a file that exists but isn't actually being used here.
'data' => drupal_get_path('module', 'advagg') . '/tests/css_test_files/advagg.css',
    );
    $before_selector_count = advagg_count_css_selectors($css_string);
    // Split the huge css file.
    $parts = advagg_split_css_file($file_info, $css_string);
    $after = '';
    foreach ($parts as $part) {
        // Get written file.
        $after .= "\n" . (string) @advagg_file_get_contents($part['data']);
        // Cleanup.
        unlink($part['data']);
    }
    // Note that a diff of the text can not be used for this test. Counting
    // selectors is close enough for now.
    $after_selector_count = advagg_count_css_selectors($after);
    $this->assertEqual($before_selector_count, $after_selector_count, t('Expected %before selectors, got %after.', array(
        '%before' => $before_selector_count,
        '%after' => $after_selector_count,
    )));
    //
    // Test css file processing.
    advagg_test_reset_statics();
    // Array of files to test living in 'advagg/tests/css_test_files/'.
    // - Original: name.css
    // - Unoptimized expected content: name.css.unoptimized.css
    // - Optimized expected content: name.css.optimized.css
    //
    // File. Tests: css_input_without_import.css.
    // - Stripped comments and white-space.
    // - Retain white-space in selectors. (http://drupal.org/node/472820)
    // - Retain pseudo-selectors. (http://drupal.org/node/460448)
    //
    // File. Tests: css_input_with_import.css.
    // - Proper URLs in imported files. (http://drupal.org/node/265719)
    // - A background image with relative paths, which must be rewritten.
    // - The rewritten background image path must also be passed through
    //   file_create_url(). (https://drupal.org/node/1961340)
    // - Imported files that are external (protocol-relative URL or not)
    //   should not be expanded. (https://drupal.org/node/2014851)
    //
    // File in sub-folder. Tests: css_subfolder/css_input_with_import.css.
    // - CSS import path interpreted. (https://drupal.org/node/1198904)
    // - Don't adjust data URIs (https://drupal.org/node/2142441)
    //
    // File. Tests: comment_hacks.css.
    // - Retain comment hacks.
    $testfiles = array(
        'css_input_without_import.css',
        'css_input_with_import.css',
        'css_subfolder/css_input_with_import.css',
        'comment_hacks.css',
    );
    $path = drupal_get_path('module', 'advagg') . '/tests/css_test_files';
    foreach ($testfiles as $file) {
        $file_path = $path . '/' . $file;
        $file_url = $GLOBALS['base_url'] . '/' . $file_path;
        $expected = advagg_file_get_contents($file_path . '.unoptimized.css');
        $unoptimized_output = advagg_load_stylesheet($file_path, FALSE);
        $this->assertEqual($unoptimized_output, $expected, format_string('Unoptimized CSS file has expected contents (@file)', array(
            '@file' => $file,
        )));
        $expected = advagg_file_get_contents($file_path . '.optimized.css');
        $expected = advagg_test_remove_sniffer_comments($expected);
        $optimized_output = advagg_load_stylesheet($file_path, TRUE);
        $this->assertEqual($optimized_output, $expected, format_string('Optimized CSS file has expected contents (@file)', array(
            '@file' => $file,
        )));
        // Repeat the tests by accessing the stylesheets by URL.
        $expected = advagg_file_get_contents($file_path . '.unoptimized.css');
        $unoptimized_output_url = advagg_load_stylesheet($file_url, FALSE);
        $this->assertEqual($unoptimized_output_url, $expected, format_string('Unoptimized CSS file (loaded from an URL) has expected contents (@file)', array(
            '@file' => $file,
        )));
        $expected = advagg_file_get_contents($file_path . '.optimized.css');
        $expected = advagg_test_remove_sniffer_comments($expected);
        $optimized_output_url = advagg_load_stylesheet($file_url, TRUE);
        $this->assertEqual($optimized_output_url, $expected, format_string('Optimized CSS file (loaded from an URL) has expected contents (@file)', array(
            '@file' => $file,
        )));
    }
    // File. Tests: charset*.css
    // - Any @charaset declaration at the beginning of a file should be
    //   removed without breaking subsequent CSS.
    $testfiles = array(
        'charset.css',
        'charset_newline.css',
        'charset_sameline.css',
    );
    $path = drupal_get_path('module', 'advagg') . '/tests/css_test_files';
    foreach ($testfiles as $file) {
        $file_path = $path . '/' . $file;
        $file_url = $GLOBALS['base_url'] . '/' . $file_path;
        $expected = advagg_file_get_contents($file_path . '.optimized.css');
        $expected = advagg_test_remove_sniffer_comments($expected);
        $optimized_output = advagg_load_stylesheet($file_path, TRUE);
        $this->assertEqual($optimized_output, $expected, format_string('Optimized CSS file has expected contents (@file)', array(
            '@file' => $file,
        )));
        $expected = advagg_file_get_contents($file_path . '.optimized.css');
        $expected = advagg_test_remove_sniffer_comments($expected);
        $optimized_output_url = advagg_load_stylesheet($file_url, TRUE);
        $this->assertEqual($optimized_output_url, $expected, format_string('Optimized CSS file (loaded from an URL) has expected contents (@file)', array(
            '@file' => $file,
        )));
    }
    // Set all to FALSE.
    $GLOBALS['conf']['advagg_convert_absolute_to_relative_path'] = FALSE;
    $GLOBALS['conf']['advagg_convert_absolute_to_protocol_relative_path'] = FALSE;
    $GLOBALS['conf']['advagg_force_https_path'] = FALSE;
    $GLOBALS['conf']['advagg_skip_file_create_url_inside_css'] = FALSE;
    $settings_to_change = array(
        '' => '',
        'advagg_skip_file_create_url_inside_css' => TRUE,
        'advagg_convert_absolute_to_relative_path' => TRUE,
        'advagg_convert_absolute_to_protocol_relative_path' => TRUE,
        'advagg_force_https_path' => TRUE,
    );
    $advagg_path = drupal_get_path('module', 'advagg');
    $path = $advagg_path . '/tests/css_test_files';
    foreach ($settings_to_change as $name => $value) {
        $before = '';
        if (!empty($name)) {
            $before = variable_get($name, defined(strtoupper($name)) ? constant(strtoupper($name)) : NULL);
            $GLOBALS['conf'][$name] = $value;
        }
        // File. Tests: advagg.css
        // - Various url() tests.
        //   https://www.drupal.org/node/1514182
        //   https://www.drupal.org/node/1961340
        //   https://www.drupal.org/node/2362643
        //   https://www.drupal.org/node/2112067
        $testfiles = array(
            'advagg.css',
        );
        foreach ($testfiles as $testfile) {
            $base_url_before = $GLOBALS['base_url'];
            $GLOBALS['base_url'] = advagg_force_http_path($GLOBALS['base_url']);
            $aggregate_settings = array(
                'variables' => array(
                    'is_https' => FALSE,
                    'base_path' => $GLOBALS['base_path'] === '/checkout/' ? $GLOBALS['base_path'] : $GLOBALS['base_path'] . 'advagg_base_path_test/',
                    'advagg_convert_absolute_to_relative_path' => $GLOBALS['conf']['advagg_convert_absolute_to_relative_path'],
                    'advagg_convert_absolute_to_protocol_relative_path' => $GLOBALS['conf']['advagg_convert_absolute_to_protocol_relative_path'],
                    'advagg_force_https_path' => $GLOBALS['conf']['advagg_force_https_path'],
                    'advagg_skip_file_create_url_inside_css' => $GLOBALS['conf']['advagg_skip_file_create_url_inside_css'],
                ),
            );
            if (module_exists('cdn')) {
                $aggregate_settings['variables'][CDN_MODE_VARIABLE] = CDN_DISABLED;
                $aggregate_settings['variables'][CDN_STATUS_VARIABLE] = CDN_DISABLED;
            }
            $file_path = $path . '/' . $testfile;
            $files = array(
                'file' => $file_path,
                'external' => $GLOBALS['base_url'] . '/' . $file_path,
            );
            $expected = advagg_test_remove_sniffer_comments(advagg_file_get_contents($file_path . '.optimized.css'));
            foreach ($files as $type => $file) {
                $optimized_output = advagg_load_css_stylesheet($file, TRUE, $aggregate_settings);
                $mode = 0;
                if ($aggregate_settings['variables']['advagg_skip_file_create_url_inside_css'] && $type !== 'external') {
                    $mode = "01";
                    $optimized_output = str_replace($aggregate_settings['variables']['base_path'] . $advagg_path . '/', '', $optimized_output);
                }
                elseif (!$aggregate_settings['variables']['advagg_convert_absolute_to_relative_path'] && !$aggregate_settings['variables']['advagg_convert_absolute_to_protocol_relative_path'] && !$aggregate_settings['variables']['advagg_force_https_path']) {
                    $mode = 4;
                    $optimized_output = str_replace('http://' . $_SERVER['HTTP_HOST'] . $aggregate_settings['variables']['base_path'] . $advagg_path . '/', '', $optimized_output);
                }
                elseif ($aggregate_settings['variables']['advagg_convert_absolute_to_protocol_relative_path']) {
                    $mode = 2;
                    $optimized_output = str_replace('//' . $_SERVER['HTTP_HOST'] . $aggregate_settings['variables']['base_path'] . $advagg_path . '/', '', $optimized_output);
                }
                elseif ($aggregate_settings['variables']['advagg_force_https_path']) {
                    $mode = 3;
                    $optimized_output = str_replace('https://' . $_SERVER['HTTP_HOST'] . $aggregate_settings['variables']['base_path'] . $advagg_path . '/', '', $optimized_output);
                }
                else {
                    $mode = 1;
                    $optimized_output = str_replace($aggregate_settings['variables']['base_path'] . $advagg_path . '/', '', $optimized_output);
                }
                $this->assertEqual($optimized_output, $expected, format_string("Optimized CSS file has expected contents (@file). Setting tested: @name; value before: @before, value after: @after.<br>mode: @mode. <p>!replacements</p> <p><code>!debug</code></p>", array(
                    '@file' => $file,
                    '@name' => $name,
                    '@before' => is_bool($before) || strlen((string) $before) == 0 ? strtoupper(var_export($before, TRUE)) : $before,
                    '@after' => is_bool($value) || strlen((string) $value) == 0 ? strtoupper(var_export($value, TRUE)) : $value,
                    '@mode' => $mode,
                    '!replacements' => "1: {$aggregate_settings['variables']['base_path']}{$advagg_path}/ <br> 2: //{$_SERVER['HTTP_HOST']}{$aggregate_settings['variables']['base_path']}{$advagg_path}/ <br> 3: https://{$_SERVER['HTTP_HOST']}{$aggregate_settings['variables']['base_path']}{$advagg_path}/ <br> 4: http://{$_SERVER['HTTP_HOST']}{$aggregate_settings['variables']['base_path']}{$advagg_path}/",
                    '!debug' => nl2br(str_replace(' ', '&nbsp;', $optimized_output)),
                )));
                $GLOBALS['base_url'] = $base_url_before;
            }
        }
        if (!empty($name)) {
            $GLOBALS['conf'][$name] = $before;
        }
    }
}