15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <set>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/file_util.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace extensions {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochtypedef testing::Test ExtensionFileUtilTest;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Test that a browser action extension returns a path to an icon.
22a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(ExtensionFileUtilTest, GetBrowserImagePaths) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_dir;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_dir = install_dir.AppendASCII("extensions")
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                    .AppendASCII("api_test")
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                    .AppendASCII("browser_action")
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                    .AppendASCII("basics");
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_refptr<Extension> extension(file_util::LoadExtension(
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      install_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(extension.get());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The extension contains one icon.
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::set<base::FilePath> paths =
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      extension_file_util::GetBrowserImagePaths(extension.get());
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(1u, paths.size());
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("icon.png", paths.begin()->BaseName().AsUTF8Unsafe());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that extensions with zero-length action icons will not load.
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ExtensionFileUtilTest, CheckZeroLengthActionIconFiles) {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath install_dir;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Try to install an extension with a zero-length browser action icon file.
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath ext_dir = install_dir.AppendASCII("extensions")
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               .AppendASCII("bad")
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               .AppendASCII("Extensions")
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               .AppendASCII("gggggggggggggggggggggggggggggggg");
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string error;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension2(file_util::LoadExtension(
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ext_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(extension2.get());
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ("Could not load icon 'icon.png' for browser action.",
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               error.c_str());
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Try to install an extension with a zero-length page action icon file.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ext_dir = install_dir.AppendASCII("extensions")
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                .AppendASCII("bad")
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                .AppendASCII("Extensions")
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                .AppendASCII("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Extension> extension3(file_util::LoadExtension(
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ext_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(extension3.get());
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ("Could not load icon 'icon.png' for page action.",
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               error.c_str());
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace extensions
74